<!DOCTYPE html>
<!--
 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. 
-->
<html>
  <head>
    <!-- meta name="viewport" content="width=device-width, height=device-height, user-scalable=yes, initial-scale=2.0, maximum-scale=4.0, minimum-scale=1.0" / -->
    <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <!-- ISO-8859-1 -->
    <title>Cordova</title>
    <link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title" charset="utf-8"/>


    <script type="text/javascript" charset="utf-8" src="cordova-current.js"></script>

    <script type="text/javascript" charset="utf-8">

      var deviceReady = false;

      //-------------------------------------------------------------------------
      // Notifications
      //-------------------------------------------------------------------------

      function doBeep(x)
      {

      navigator.notification.beep(x || 1);
      };

      function doVibrate()
      {
      navigator.notification.vibrate(0);
      };

      function doAlert()
      {
      var message = "This is an Alert dialog";
      var title = "Attention!";

      navigator.notification.alert(message,
      function()
      {
      console.log("Alert dismissed.");
      },
      title);

      console.log("After alert");
      };

      function doConfirm()
      {
      var message = "This is a confirm dialog";
      var title = "Please Confirm";
      var buttons = "OK,Cancel";
      navigator.notification.confirm(message,
      function(r) {
      console.log("You selected " + r);

      },
      title,
      buttons);
      }


      /**
      * Function called when page has finished loading.
      */
      function init() {
      document.addEventListener("deviceready", function() {
      deviceReady = true;
      console.log("Device="+device.platform+" "+device.version);
      }, false);
      window.setTimeout(function() {
      if (!deviceReady) {
      console.log("Error: Cordova did not initialize.  Demo will not run correctly.");
      }
      },3000);
      }

    </script>

  </head>
  <body onLoad="init();" id="stage" class="theme">

    <h1>Notifications and Dialogs</h1>
    <div id="info">
    </div>

    <h2>Action</h2>
    <a class="btn large" onClick="doBeep();">Beep Once</a>
    <a class="btn large" onClick="doBeep(3);">Beep 3X</a>
    <a class="btn large" onClick="doVibrate();">Vibrate</a>
    <a class="btn large" onClick="doAlert();">Show Alert Dialog</a>
    <a class="btn large" onClick="doConfirm();">Show Confirm Dialog</a>
    <h2> </h2><a href="index.html" class="backBtn">Back</a>
  </body>
</html>
