// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Getting Started with Cordova Applications
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Getting Started with Cordova Applications - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Getting Started with Cordova Applications

This document demonstrates how to create an HTML5 project in the IDE that is packaged as a mobile application and run in a mobile device simulator. When you create an HTML5 application you have the option to create the application using an Apache Cordova site template. Apache Cordova provides a group of APIs that enable you to develop an application with HTML, CSS and JavaScript that is packaged as a native mobile application. The application runs on the mobile device and can access the native functions of the device such as the GPS or camera. By using the Cordova APIs a developer can build a mobile application without writing any native code.

This document demonstrates how to install the software that is necessary to install and develop an application with Cordova. After you install Cordova you will use the Cordova template in the New Project wizard to create a Cordova application. You will then add some code and run the application in the mobile device simulator. This tutorial will use the iOS simulator, but the steps are similar if you want to use an Android device emulator.

To watch a screencast that demonstrates deploying a Cordova application to the Android emulator, see link:../web/html5-cordova-screencast.html[+Video of Getting Started with Cordova Development+].


=== Contents

image::images/netbeans-stamp.png[title="Content on this page applies to the NetBeans IDE 7.3"]

* <<installcordova,Installing Cordova>>
* <<createproject,Creating a Cordova HTML5 Project>>
* <<editapp,Modifying the Source Code>>
* <<edithtml,Editing the HTML File>>
* <<editconfig,Modifying the Cordova Configuration>>
* <<editjs,Editing the JavaScript File>>
* <<debug,Debugging the Application>>
* <<summary,Summary>>
* <<seealso,See Also>>


==== To complete this tutorial, you will need the following resources.

|===
|Software or Resource |Version Required 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE, Java+] |8.0 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java Development Kit (JDK)+] |version 7 

|link:http://cordova.apache.org/[+Apache Cordova+] |-- 

|link:http://nodejs.com/[+NodeJS+] |-- 

|link:http://git-scm.com/[+Git+] |-- 

|Mobile Platform SDK
 |Android or
iOS 
|===

*Notes:*

* This document assumes that a compatible target mobile platform SDK and device emulator is already installed.
* This document assumes that you have some basic knowledge of, or programming experience with HTML, CSS, and JavaScript. For more details on HTML5 support in NetBeans IDE, see link:html5-gettingstarted.html[+Getting Started with HTML5 Applications+]


== Installing Cordova

You need to install Cordova on your local system to package an HTML5 application as a native mobile application with NetBeans IDE. You will use *npm*, the NodeJS package manager, to install and to update Cordova. You will also need to confirm that Git is installed on your local system and configured properly. Cordova uses Git to retrieve any required Cordova source files from a repository when you package the application as a native mobile application.

You will perform most of the following steps in this exercise in your terminal window.

1. Download and install Node.js, if not already installed.

You can download the installer from the link:http://nodejs.org[+Node.js site+].

2. Open a terminal window.
3. Run the following command to confirm that Node.js is installed.

[source,shell]
----

$ node -v
----

If node.js is installed you will see a version printed in the terminal window.

*Notes.*

* If you are behind a proxy you will need to configure node.js to use the proxy to access the network. You can run the following commands to set the proxy, replacing  ``http://proxy:8080``  with your proxy.

[source,shell]
----

$ sudo npm config set proxy http://proxy:8080
$ sudo npm config set https-proxy http://proxy:8080
----

You can run the following command to view the current configuration settings.


[source,shell]
----

$ npm config list
----
* For additional information about configuring node.js, see link:https://npmjs.org/doc/config.html[+https://npmjs.org/doc/config.html+].
4. Run the following command to install Cordova.

[source,shell]
----

$ npm install -g cordova
----

*Notes.*

* Confirm that your proxy configuration is correct if you see an error message in the terminal window when you run the install command.
* You can run the following command to update Cordova to the most recent version.

[source,shell]
----

$ npm update -g cordova
----
5. Run the following command to confirm that Cordova is installed and to view the version.

[source,shell]
----

$ cordova --version
----

If Cordova is installed you will see a version printed in the terminal window.

6. Download and install the Git version control system, if not already installed.

You can download the installer from the link:http://git-scm.com/[+Git site+].

*Note.* You need to add Git to your Path environment.

7. Run the following command to confirm that Git is installed.

[source,shell]
----

$ git --version
----

If Git is installed you will see a version printed in the terminal window.

*Notes.*

* If you are behind a proxy you will need to configure Git to use the proxy to access the network. You can run the following commands to set the proxy, replacing  ``http://proxy:8080``  with your proxy.

[source,shell]
----

$ git config --global http.proxy http://proxy:8080
$ git config --global https.proxy http://proxy:8080
----

You can run the following command to view the current configuration settings.


[source,shell]
----

$ git config --list
----
* For additional information about configuring Git, see the setup instructions at link:http://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup[+http://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup+].

You now have all the tools that you need to develop and package a native mobile application in the IDE. In the next exercise you will use the New Project wizard to create the application.


== Creating a Cordova Application

In this exercise you will use the New Project wizard in the IDE to create a new Cordova application. You create a Cordova application by selecting the Cordova Hello World template as the site template in the New Project wizard. A Cordova application is an HTML5 application with some additional libraries and configuration files. If you have an existing HTML5 application you can use the Project Properties window in the IDE to add the Cordova sources and other files required to package the application as a Cordova application.

For this tutorial you will create a very basic HTML5 project that has an  ``index.html``  file and some some JavaScript and CSS files. You will select some jQuery JavaScript libraries when you create the project in the wizard.

1. Select File > New Project (Ctrl-Shift-N; ⌘-Shift-N on Mac) in the main menu to open the New Project wizard.
2. Select the *HTML5* category and then select *Cordova Application*. Click Next.
image::images/cordova-newproject-wizard1.png[title="Cordova Application template in the New Project wizard"]
3. Type *CordovaMapApp* for the Project Name and specify the directory on your computer where you want to save the project. Click Next.
4. In Step 3. Site Template, confirm that Download Online Template is selected and that the Cordova Hello World template is selected in the list. Click Next.
image::images/cordova-newproject-wizard2.png[title="Site Templates panel in the New HTML5 Application wizard"]

*Note:* You must be online to create a project that is based on one of the online templates in the list.

5. In Step 4. JavaScript Files, select the  ``jquery``  and  ``jquery-mobile``  JavaScript libraries in the Available pane and click the right-arrow button ( > ) to move the selected libraries to the Selected pane of the wizard. By default the libraries are created in the  ``js/libraries``  folder of the project. For this tutorial you will use the "minified" versions of the JavaScript libraries.

You can use the text field in the panel to filter the list of JavaScript libraries. For example, type *jq* in the field to help you find the  ``jquery``  libraries. You can Ctrl-click the names of the libraries to select multiple libraries.

image::images/cordova-newproject-wizard3.png[title="JavaScript Libraries panel in the New HTML5 Application wizard"]

*Notes.*

* You can click on the library version number in the Version column to open a popup window that enables you to select older versions of the library. By default the wizard displays the most recent version.
* The minimized versions of the JavaScript libraries are compressed versions and the code is not comprehensible when viewed in an editor.
6. In Step 5. Cordova Support, use the default values. Click *Finish* to complete the wizard.

When you click Finish the IDE creates the project and displays a node for the project in the Projects window and opens the  ``index.html``  file in the editor.

image::images/cordova-projects-window1.png[title="Projects window"]

If you expand the  ``js/libs``  folder in the Projects window you can see that the JavaScript libraries that you specified in the New Project wizard were automatically added to the project. You can remove a JavaScript library from a project by right-clicking the JavaScript file and choosing Delete in the popup menu.

To add a JavaScript library to a project, right-click the project node and choose Properties to open the Project Properties window. You can add libraries in the JavaScript Libraries panel of the Project Properties window. Alternatively, you can copy a JavaScript file that is on your local system directly into the  ``js``  folder.

You can now test that your project runs and is deployed to the emulator for your target mobile device.

7. Click the browser select icon in the toolbar and confirm that your target mobile device emulator is selected in the Cordova column in the table. In the Cordova column you can select the Android Emulator or iOS Simulator (requires OS X and XCode). 
image::images/cordova-select-browser.png[title="Browser selected in dropdown list in toolbar"]
8. Click the Run icon in the toolbar.

When you choose Run the IDE deploys the Cordova application to the emulator.

image::images/cordova-ios7-run.png[title="Application in the iOS Simulator"]

*Note.* If you are deploying to the iOS Simulator the simulator should open automatically. If you are deploying the application to an Android emulator you will need to configure and start the emulator before you run the application. To watch a screencast that demonstrates deploying a Cordova application to the Android emulator, see link:../web/html5-cordova-screencast.html[+Video of Getting Started with Cordova Development+].


== Modifying the Application

In this exercise you will edit the  ``index.html``  and  ``index.js``  files. You will replace the code generated by the Cordova Hello World template with code to display a map of your current location in the application. You will also modify the default Cordova configuration to remove the Cordova plugins that are not necessary in the application.


=== Editing the HTML File

In this exercise you edit the HTML file in the source editor to add references to the libraries and CSS files and to add the page elements.

1. Open `index.html` in the editor (if it is not already open).

In the editor you can see that the IDE generated some code based on the Cordova Hello World template.

2. In the editor, add references to the jQuery JavaScript libraries and CSS files that you added when you created the project. Add the following code (in *bold*) between the opening and closing  ``<head>``  tags.

[source,xml]
----

<html>
    <head>
        <meta charset=UTF-8">
        <meta name="format-detection" content="telephone=no" />
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi">
        <link rel="stylesheet" type="text/css" href="css/index.css" />
        
        *<link rel="stylesheet" href="js/libs/jquery-mobile/jquery.mobile.min.css"/>
        <script type="text/javascript" src="js/libs/jquery/jquery.min.js"></script>
        <script type="text/javascript" src="js/libs/jquery-mobile/jquery.mobile.min.js"></script>*
        <title>Hello World</title>
    </head>
    <body>
    ...
</html>
----

You can see the path to the files in the Projects window and you can use the code completion in the editor to help you.

image::images/cordova-code-completion.png[title="Code completion in the editor"]
3. Add the following link to the Google Maps JavaScript API between the `<head>` tags.

[source,xml]
----

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
----

*Note.* This is a link to the deprecated v2 of the JavaScript API. This JavaScript will work for the purpose of demonstration in this tutorial but you should use the newer version in a real application.

4. Remove all the code between the `<body>` tags except for the following links to the `index.js` and `cordova.js` JavaScript files.

[source,xml]
----

   <body>
        
        *<script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>*
        
    </body> 
</html>
----

The `index.js` file was generated automatically when you created the project. You can see the file under the `js` node in the Projects window. You will modify the code in `index.js` later in the tutorial.

The `cordova.js` is not visible in the Projects window because it is generated when you build the Cordova application.

5. Add the following code (in *bold*) between the  ``body``  tags.

[source,html]
----

   <body>
        *<div data-dom-cache="false" data-role="page" id="mylocation">
            <div data-role="header" data-theme="b">
                <h1 id="header">Searching for GPS</h1>
                <a data-role="button" class="ui-btn-right" onclick="showAbout()">About</a>
            </div>
            
            <div data-role="content" style="padding:0;">
                <div id="map" style="width:100%;height:100%; z-index:50">
                </div>

            </div>
            <div data-role="footer" data-theme="b" data-position="fixed" >
                <h4>Google Maps</h4>
            </div>
        </div>
        <div data-dom-cache="false" data-role="page" id="about">
            <div data-role="header" data-theme="b">
                <a data-role="button" data-rel="back" href="#mylocation" data-icon="arrow-l" data-iconpos="left" class="ui-btn-left">Back</a>
                <h1>About</h1></div>
            <div data-role="content" id="aboutContent">
            </div> 
            <div data-role="footer" data-theme="b" data-position="fixed" >
                <h4>Created with NetBeans IDE</h4>
            </div>
        </div>
        *
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
    </body>
</html>
----


=== Modifying the Cordova Configuration

In this exercise you will modify the list of Cordova plugins that are installed in the application.

1. Right-click the project node in the Projects window and choose Properties in the popup menu.
2. Select *Cordova* in the list of categories. 
image::images/cordova-properties-application.png[title="Cordova Plugins tab in the Project Properties window"]

You can use the Application tab to view and edit the Cordova configuration details about the application that are specified in `config.xml`.

3. Click the Plugins tab in the Cordova panel.

The Plugins tab contains two panes. The Available pane displays a list of the Cordova plugins that are currently available.

The Selected pane displays a list of the plugins that are installed in the application. All plugins are installed by default when you use the Cordova Hello World template to create the application. Most applications do not require all the plugins. You can use the Plugins tab in the Project Properties window to remove the plugins that are not required by your application.

*Note.* You can also edit the plugins that are installed by editing the `nbproject/plugins.properties` file in the editor.

4. Remove all plugins except Device API, Dialogs (Notifications) and Geolocation. Click OK. 
image::images/cordova-properties-plugins.png[title="Cordova Plugins tab in the Project Properties window"]


=== Editing the JavaScript File

In this exercise you will remove the JavaScript code generated by the template and add some simple methods to display the map of your current location.

1. Open `index.js` in the editor.

The IDE generated some boilerplate code in `index.js` when you created the project. For this application you can remove all the generated code.

2. Replace the generated code with the following code. Save your changes.

[source,java]
----

var map;
var marker;
var watchID;

$(document).ready(function() {
    document.addEventListener("deviceready", onDeviceReady, false);
    //uncomment for testing in Chrome browser
//    onDeviceReady();
});

function onDeviceReady() {
    $(window).unbind();
    $(window).bind('pageshow resize orientationchange', function(e) {
        max_height();
    });
    max_height();
    google.load("maps", "3.8", {"callback": map, other_params: "sensor=true&amp;language=en"});
}

function max_height() {
    var h = $('div[data-role="header"]').outerHeight(true);
    var f = $('div[data-role="footer"]').outerHeight(true);
    var w = $(window).height();
    var c = $('div[data-role="content"]');
    var c_h = c.height();
    var c_oh = c.outerHeight(true);
    var c_new = w - h - f - c_oh + c_h;
    var total = h + f + c_oh;
    if (c_h < c.get(0).scrollHeight) {
        c.height(c.get(0).scrollHeight);
    } else {
        c.height(c_new);
    }
}

function map() {
    var latlng = new google.maps.LatLng(50.08, 14.42);
    var myOptions = {
        zoom: 15,
        center: latlng,
        streetViewControl: true,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        zoomControl: true
    };
    map = new google.maps.Map(document.getElementById("map"), myOptions);

    google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
        watchID = navigator.geolocation.watchPosition(gotPosition, null, {maximumAge: 5000, timeout: 60000, enableHighAccuracy: true});
    });
}

// Method to open the About dialog
function showAbout() {
    showAlert("Google Maps", "Created with NetBeans 7.4");
}
;

function showAlert(message, title) {
    if (window.navigator.notification) {
        window.navigator.notification.alert(message, null, title, 'OK');
    } else {
        alert(title ? (title + ": " + message) : message);
    }
}

function gotPosition(position) {
    map.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));

    var point = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
    if (!marker) {
        //create marker
        marker = new google.maps.Marker({
            position: point,
            map: map
        });
    } else {
        //move marker to new position
        marker.setPosition(point);
    }
}
----

*Note.* For this tutorial the call to the `onDeviceReady` method is commented out because the method is not necessary when you are deploying the application to a mobile device emulator. If you want to run the application in a web browser you should uncomment the call to the `onDeviceReady` method.

3. Reset your emulator by either restarting the emulator or resetting the settings.
4. Click Run in the toolbar to deploy the application to the emulator. 

On the iOS Simulator you are prompted to allow the application to use your current location.

image::images/cordova-ios7-run1.png[title="Prompt for location in the application"]

You can test a simulated location in the iOS Simulator by selecting Debug > Location > Custom Location from the main menu of the iOS Simulator to open the Custom Location dialog box.

image::images/cordova-ios-customlocation.png[title="Custom Location dialog box in iOS Simulator"]

If you enter 48.8582 in the Latitude field and 2.2945 in the Longitude field for your current location the application will display your location as the Eiffel Tower on the map.

image::images/cordova-ios7-run3.png[title="Application when using a custom location in the iOS Simulator"]


== Debugging the Application

In this exercise you will set a breakpoint in the JavaScript file and run the application again.

1. Reset or relaunch the emulator.
2. Open `index.js` in the editor.
3. Place a breakpoint by clicking in the left margin in the following line in the `gotPosition` method.

[source,java]
----

var point = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
----
4. Click Run in the toolbar to run the application again.

When you run the application the debugger will hit the breakpoint when the application tries to determine your current location.

image::images/cordova-debug-breakpoint1.png[title="Debugger stopped on breakpoint"]

If you hover your cursor over the variables you can see a tooltip that displays details about the variable. If your cursor is over the `latitude` variable the value of the variable is displayed in the tooltip.

image::images/cordova-debug-variables1b.png[title="Tooltip showing variables"]

If your cursor is over `position` or `coords` the tooltip contains an arrow that you can click to expand the tooltip.

image::images/cordova-debug-variables1a.png[title="Tooltip showing variables"]

The expanded tooltip enables you to see the values in greater detail.

image::images/cordova-debug-variables2.png[title="Tooltip showing variables"]

In this case it is easier to view the values in the Variables window. In the Variables window you can see the latitude and longitude of your current location.

image::images/cordova-debug-variables.png[title="Variables window"]

In the Network Monitor window you can see a list of the application requests.

image::images/cordova-network-monitor.png[title="Variables window"]


[[summary]]
== Summary

In this tutorial you have learned how to install and setup the required software to create a Cordova application in the IDE. You also learned how to create a Cordova application and modify some of the Cordova configuration settings.

link:/about/contact_form.html?to=3&subject=Feedback:%20Getting%20Started%20with%20Creating%20a%20Cordova%20Applications[+Send Feedback on This Tutorial+]




[[seealso]]
== See Also

For more information about support for HTML5 applications in the IDE on link:https://netbeans.org/[+netbeans.org+], see the following resources:

* [Video] link:../web/html5-cordova-screencast.html[+Getting Started with Cordova Development+]
* link:html5-editing-css.html[+Working with CSS Style Sheets in HTML5 Applications+]. A document that continues with the application that you created in this tutorial that demonstrates how to use some of the CSS wizards and windows in the IDE and how to use the Inspect mode in the Chrome browser to visually locate elements in your project sources.
* link:html5-js-support.html[+Debugging and Testing JavaScript in HTML5 Applications+]. A document that demonstrates how the IDE provides tools that can help you debug and test JavaScript files in the IDE.
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG2272[+Creating JavaScript Files+] in _Developing Applications with NetBeans IDE_.

For more information about jQuery, refer to the official documentation:

* Official Home Page: link:http://jquery.com[+http://jquery.com+]
* UI Home Page: link:http://jqueryui.com/[+http://jqueryui.com/+]
* Tutorials: link:http://docs.jquery.com/Tutorials[+http://docs.jquery.com/Tutorials+]
* Documentation Main Page: link:http://docs.jquery.com/Main_Page[+http://docs.jquery.com/Main_Page+]
* UI Demos and Documentation: link:http://jqueryui.com/demos/[+http://jqueryui.com/demos/+]
