<!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=no,maximum-scale=1.0,initial-scale=1.0" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <!-- ISO-8859-1 -->
    <title>Cordova Mobile Spec</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-incl.js"></script>      

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

    var deviceReady = false;

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

    var beep = function(){
        navigator.notification.beep(3);
    };

    var vibrate = function(){
      navigator.notification.vibrate(1000);
    };

    var alertDialog = function(message, title, button) {
        console.log("alertDialog()");
        navigator.notification.alert(message,
            function(){
                console.log("Alert dismissed.");
            },
            title, button);
        console.log("After alert");
    };

    var confirmDialogA = function(message, title, buttons) {
        navigator.notification.confirm(message,
            function(r) {
                if(r===0){
                    console.log("Dismissed dialog without making a selection.");
                    alert("Dismissed dialog without making a selection.");
                }else{
                    console.log("You selected " + r);
                    alert("You selected " + (buttons.split(","))[r-1]);
                }
            },
            title,
            buttons);
    };

    var confirmDialogB = function(message, title, buttons) {
        navigator.notification.confirm(message,
            function(r) {
                if(r===0){
                    console.log("Dismissed dialog without making a selection.");
                    alert("Dismissed dialog without making a selection.");
                }else{
                    console.log("You selected " + r);
                    alert("You selected " + buttons[r-1]);
                }
            },
            title,
            buttons);
    };

    var promptDialog = function(message, title, buttons) {
        navigator.notification.prompt(message,
            function(r) {
                if(r && r.buttonIndex===0){
                    var msg = "Dismissed dialog";
                    if( r.input1 ){
                        msg+=" with input: " + r.input1
                    }
                    console.log(msg);
                    alert(msg);
                }else{
                    console.log("You selected " + r.buttonIndex + " and entered: " + r.input1);
                    alert("You selected " + buttons[r.buttonIndex-1] + " and entered: " + r.input1);
                }
            },
            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) {
                alert("Error: Apache Cordova did not initialize.  Demo will not run correctly.");
            }
        },1000);
    }

</script>

  </head>
  <body onload="init();" id="stage" class="theme">
  
    <h1>Notifications and Dialogs</h1>
    <div id="info">
    </div>
    
    <h2>Action</h2>
    <div class="btn large" onclick="beep();">Beep</div>
    <div class="btn large" onclick="vibrate();">Vibrate</div>
    <div class="btn large" onclick="alertDialog('You pressed alert.', 'Alert Dialog', 'Continue');">Alert Dialog</div>
    <div class="btn large" onclick="confirmDialogA('You pressed confirm.', 'Confirm Dialog', 'Yes,No,Maybe');">Confirm Dialog - Deprecated</div>
    <div class="btn large" onclick="confirmDialogB('You pressed confirm.', 'Confirm Dialog', ['Yes', 'No', 'Maybe, Not Sure']);">Confirm Dialog</div>
    <div class="btn large" onclick="promptDialog('You pressed prompt.', 'Prompt Dialog', ['Yes', 'No', 'Maybe, Not Sure']);">Prompt Dialog</div>
    
    <div class="btn large" onclick="alert('You pressed alert.');">Built-in Alert Dialog</div>
    <div class="btn large" onclick="confirm('You selected confirm');">Built-in Confirm Dialog</div>
    <div class="btn large" onclick="prompt('This is a prompt.', 'Default value');">Built-in Prompt Dialog</div>
    <h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
  </body>
</html>      
