﻿<!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"/>


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


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


    // last captured media file
    var mediaFile = null;

    function clearMediaPlaceholder() {
        document.getElementById('audio_player').setAttribute('style', 'visibility:hidden;display:none;');

        var img = document.getElementById('camera_image');
        img.style.visibility = "hidden";
        img.style.display = "none";
        img.src = "";
    }

    //-------------------------------------------------------------------------
    // Capture
    //-------------------------------------------------------------------------

    /**
    * Capture image
    */
    function captureImage() {

        navigator.device.capture.captureImage(
            function (mediaFiles) {

                document.getElementById('capture_status').innerHTML = "Success. Captured " + mediaFiles.length + " media file(s).";

                if (mediaFiles.length <= 0) return;

                mediaFile = mediaFiles[0];

                document.getElementById('name').innerHTML = mediaFile.name;
                document.getElementById('fullPath').innerHTML = mediaFile.fullPath;
                document.getElementById('size').innerHTML = mediaFile.size;
                document.getElementById('lastModifiedDate').innerHTML = mediaFile.lastModifiedDate;
                document.getElementById('type').innerHTML = mediaFile.type;

                clearMediaPlaceholder();

                var img = document.getElementById('camera_image');
                img.style.visibility = "visible";
                img.style.display = "block";
                img.src = mediaFile.fullPath;
            },
            function (e) {
                console.log("Error getting picture: " + e);
                document.getElementById('capture_status').innerHTML = "Error getting picture.";
            },
            { limit: 1 });
    };

    /**
    * Capture Audio
    */
    function captureAudio() {

        navigator.device.capture.captureAudio(
            function (mediaFiles) {

                document.getElementById('capture_status').innerHTML = "Success. Captured " + mediaFiles.length + " media file(s).";

                if (mediaFiles.length <= 0) return;

                mediaFile = mediaFiles[0];

                document.getElementById('name').innerHTML = mediaFile.name;
                document.getElementById('fullPath').innerHTML = mediaFile.fullPath;
                document.getElementById('size').innerHTML = mediaFile.size;
                document.getElementById('lastModifiedDate').innerHTML = mediaFile.lastModifiedDate;
                document.getElementById('type').innerHTML = mediaFile.type;

                clearMediaPlaceholder();

                var player = document.getElementById('audio_player');
                player.setAttribute('style', 'visibility:visible;');
                player.src = mediaFile.fullPath;
                //player.play();
            },
            function (e) {
                console.log("Error getting audio: " + e);
                document.getElementById('capture_status').innerHTML = "Error getting audio.";
            },
            { limit: 1 });
    };

    /**
    * Capture Video
    */
    function captureVideo() {

        navigator.device.capture.captureVideo(
            function (mediaFiles) {

                document.getElementById('capture_status').innerHTML = "Success. Captured " + mediaFiles.length + " media file(s).";

                if (mediaFiles.length <= 0) return;

                mediaFile = mediaFiles[0];

                document.getElementById('name').innerHTML = mediaFile.name;
                document.getElementById('fullPath').innerHTML = mediaFile.fullPath;
                document.getElementById('size').innerHTML = mediaFile.size;
                document.getElementById('lastModifiedDate').innerHTML = mediaFile.lastModifiedDate;
                document.getElementById('type').innerHTML = mediaFile.type;

                clearMediaPlaceholder();

                var player = document.getElementById('video_player');
                player.setAttribute('style', 'visibility:visible;');
                player.src = mediaFile.fullPath;
                console.log("src: " + mediaFile.fullPath);
            },
            function (e) {
                console.log("Error getting video: " + e);
                document.getElementById('capture_status').innerHTML = "Error getting video.";
            },
            { limit: 1 });
    };

    /**
    * Function called when page has finished loading.
    */
    function init() {
        document.addEventListener("deviceready", function () {
            console.log("Device=" + device.platform + " " + device.version);
        }, false);
    }

    /**
    * Function to play last captured media.
    */
    function playMedia() {
        if (typeof mediaFile !== 'undefined') {
            mediaFile.play(
                null,
                function (e) {
                    console.log("Error playing media: " + e);
                    document.getElementById('capture_status').innerHTML = "Error playing media.";
                });
        }
    }

</script>

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

    <h1>Capture</h1>
    <div id="info">
        Status: <span id="capture_status"></span><br/>
        <img style="width:120px;height:120px;visibility:hidden;display:none;" id="camera_image" src="" />
        <audio style="visibility:hidden;display:none;" id="audio_player" src="" controls />
        <video style="visibility:hidden;display:none;"  width="150" height="150" id="video_player" src=""
            onclick="playMedia();" >
            Browser does not support the video tag.
        </video>


        <div><table width="100%">
            <tr><td width="20%">Name:</td><td id="name"> </td></tr>
            <tr><td width="20%">FullPath:</td><td id="fullPath"> </td></tr>
            <tr><td width="20%">Type:</td><td id="type"> </td></tr>
            <tr><td width="20%">Size:</td><td id="size"> </td></tr>
            <tr><td width="20%">Modified:</td><td id="lastModifiedDate"> </td></tr>
        </table></div>

    </div>
    <h2>Actions</h2>
    <a href="#" class="btn large" onclick="captureImage();">Capture Image</a>
    <a href="#" class="btn large" onclick="captureAudio();">Capture Audio</a>
    <a href="#" class="btn large" onclick="captureVideo();">Capture Video</a>
    <h2> </h2><a href="index.html" class="backBtn">Back</a>
  </body>
</html>
