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

<!DOCTYPE html>
<html lang="ru">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no, width=device-width">
        <meta name="generator" content="joDoc">

        <title>Документация API Apache Cordova</title>

        <link rel="stylesheet" type="text/css" href="index.css">
        <link rel="stylesheet" type="text/css" href="mobile.css" media="only screen and (max-device-width: 1024px)">
        <style type="text/css">
            [lang='ru'] #home ul li {
                height: 160px;
            }
        </style>
        <link rel="stylesheet" type="text/css" href="prettify/prettify.css" />
    </head>
    <body>
        <div id="header">
            <h1><a href="index.html">Документация Apache <strong>Cordova</strong></a></h1>
            <small>
                <select></select>
            </small>
        </div>
        <div id="subheader">
            <h1>Geolocation</h1>
            <small></small>
        </div>

        <div id="sidebar">
            <div class="vertical_divider"></div>
        </div>

        <div id="scrollable">
            <div id="content">
                $body
            </div>
        </div>

        <!-- Functionality and Syntax Highlighting -->
        <script type="text/javascript" src="index.js"></script>
        <script type="text/javascript" src="prettify/prettify.js"></script>
    </body>
</html>
