<!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;

    function roundNumber(num) {
        var dec = 3;
        var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
        return result;
    }
    
    /**
     * 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>Display Other Content</h1>
    <div id="info">
    </div>
    <h2>Action</h2>
    <div class="btn large" onclick="document.location='tel:5551212';" >Call 411</div>
    <a href="mailto:bob@abc.org?subject=My Subject&body=This is the body.%0D%0ANew line." class="btn large">Send Mail</a>
    <a href="sms:5125551234?body=The SMS message." class="btn large">Send SMS</a>
    <a href="http://www.google.com" class="btn large">Load Web Site</a>
    <!--  Need new URL -->
    <!-- a href="http://handle.library.cornell.edu/control/authBasic/authTest/" class="btn large">Basic Auth: test/this</a -->
    <a href="page2.html" class="btn large">Load a page with iframes</a>
    <a href="page2.html?me=test" class="btn large">Load page with query param</a>
    <a href="page3.html#foo" class="btn large">Page with hash</a>
    <a href="page3.html?hash1#gah" class="btn large">Page with hash change on load</a>
    <a href="page3.html?hash2#gah" class="btn large">Page with hash replace on load</a>
    <a href="page3.html?hash1&changeURL#gah" class="btn large">Page with replaceState & hash change</a>
    <a href="page3.html?iframe#gah" class="btn large">Page iframe hash change</a>
    <h2>Android Only</h2>
    <a href="geo:0,0?q=11400 Burnet Rd, Austin, TX" class="btn large">Map IBM</a>
    <a href="market://search?q=google" class="btn large">Search Android market</a>
    <a href="content://media/external/images/media" class="btn large">View image app</a>

    <h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
  </body>
</html>      
