--- a/feedback.php +++ b/feedback.php @@ -1,11 +1,11 @@ <?php -include ('include/common.inc.php'); +include ("include/common.inc.php"); include_header("Feedback", "feedback"); function sendEmail($topic, $message) { $address = "maxious@lambdacomplex.org"; if (file_exists("/tmp/aws.php")) { - include_once ('lib/ses.php'); + include_once ("lib/ses.php"); include_once ("/tmp/aws.php"); $con = new SimpleEmailService($accessKey, $secretKey); //$con->verifyEmailAddress($address); @@ -24,16 +24,29 @@ mail($address, $topic, $message); } } + +$stopid = ""; +$stopcode = ""; +$urlparts = explode("?",$_SERVER["HTTP_REFERER"]); +if (isset($urlparts[1])) { + $getparams = explode("&",$urlparts[1]); + foreach ($getparams as $param) { + $paramparts=explode("=",$param); + if ($paramparts[0] == "stopid") $stopid = $paramparts[1]; + if ($paramparts[0] == "stopcode") $stopcode = $paramparts[1]; + } +} + ?> <h3>Add/Move/Delete a Bus Stop Location</h3> -StopID: -or StopCode: -<small> if you click on feedback from a stop page, these will get filled in automatically. else describe the location/street of the stop <input type="text" name="stoplocation" /> </small> +StopID: <input type="text" name="stopid" value="<?php echo $stopid ?>"/><br> +or StopCode: <input type="text" name="stopcode" value="<?php echo $stopcode ?>"/><br> +<small> if you click on feedback from a stop page, these will get filled in automatically. else describe the location/street of the stop in one of these boxes </small><br> -Suggested Stop Location (lat/long or words): -<small> if your device supports javascript, you can pick a location from the map above</small> +Suggested Stop Location (lat/long or words): <input type="text" name="newlocation"/><br> +<small> if your device supports javascript, you can pick a location from the map above</small><br> -Submit! +<input type="submit" value="Submit!"/> <h3>Bug Report/Feedback</h3> Please leave feedback about bugs/errors or general suggestions about improvements that could be made to the way the data is presented! @@ -41,14 +54,15 @@ </textarea> <textarea id="extrainfo"> <?php - echo ' Referrer URL - User Agent - User host/IP - Server host/IP - Current date/time - Dump of $_SESSION '; + echo "Referrer URL: ".$_SERVER["HTTP_REFERER"]; + echo "\nUser Agent: ".$_SERVER["HTTP_USER_AGENT"]; + echo "\nUser host/IP: ".$_SERVER["HTTP_X_FORWARDED_FOR"]." ".$_SERVER["REMOTE_ADDR"]; + echo "\nServer host/IP: ".php_uname("n"); + echo "\nCurrent date/time: ". date("c"); + echo "\nDump of session: ".print_r($_SESSION,true); ?> </textarea> -Submit! +<input type="submit" value="Submit!"/> +
--- a/include/common-template.inc.php +++ b/include/common-template.inc.php @@ -36,9 +36,17 @@ if ($datepicker) echo '<link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" />'; if (isDebugServer()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" /> <script type="text/javascript" src="js/jquery-1.5.js"></script> + <script>$(document).bind("mobileinit", function(){ + $.mobile.ajaxEnabled = false; +}); +</script> <script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>'; else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.css" /> <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js"></script> + <script>$(document).bind("mobileinit", function(){ + $.mobile.ajaxEnabled = false; +}); +</script> <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.js"></script>'; if ($datepicker) echo '<script> //reset type=date inputs to text @@ -81,6 +89,10 @@ .min-width-480px .viaPoints { display: block; } + #extrainfo { + visibility: hidden; + display: none; + } // source http://webaim.org/techniques/skipnav/ #skip a, #skip a:hover, #skip a:visited { @@ -110,14 +122,14 @@ function success(position) { $('#geolocate').val(position.coords.latitude+','+position.coords.longitude); -$.ajax({ url: \"common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); -$('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;}); -$('#here').show(); +$.ajax({ url: \"include/common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); +location.reload(true); } function error(msg) { console.log(msg); } +function geolocate() { if (navigator.geolocation) { var options = { enableHighAccuracy: false, @@ -126,8 +138,14 @@ } navigator.geolocation.getCurrentPosition(success, error, options); } - -</script> "; +} +$(document).ready(function() { + $('#here').click(function(event) { $('#geolocate').val(geolocate()); return false;}); +$('#here').show(); +}); +"; +if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") echo "geolocate();"; +echo "</script> "; } if (isAnalyticsOn()) echo ' <script type="text/javascript">'." @@ -159,12 +177,6 @@ } function include_footer() { - if ($geolocate && isset($_SESSION['lat'])) { - echo "<script> - $('#here').click(function(event) { $('#geolocate').val(doAJAXrequestForGeolocSessionHere()); return false;}); -$('#here').show(); -</script>"; - } echo '<div id="footer"><a href="about.php">About/Contact Us</a> <a href="feedback.php">Feedback/Bug Report</a></a>'; echo '</div>'; if (isAnalyticsOn()) { @@ -175,9 +187,9 @@ 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })();"; + })();</script>"; $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); - echo '<img src="' . $googleAnalyticsImageUrl . '" />'; + echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" /></noscript>'; } } function timePlaceSettings($geolocate = false) @@ -194,7 +206,7 @@ } echo '<div data-role="collapsible" data-collapsed="' . !$geoerror . '"> <h3>Change Time/Place (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...</h3> - <form action="'.basename($_SERVER['PHP_SELF']).'" method="post"> + <form action="'.basename($_SERVER['PHP_SELF'])."?".$_SERVER['QUERY_STRING'].'" method="post"> <div class="ui-body"> <div data-role="fieldcontain"> <label for="geolocate"> Current Location: </label> @@ -202,7 +214,8 @@ </div> <div data-role="fieldcontain"> <label for="time"> Time: </label> - <input type="time" name="time" id="time" value="' . (isset($_SESSION['time']) ? $_SESSION['time'] : date("H:i")) . '"/> <a href="#" name="currentTime" id="currentTime">Current Time?</a> + <input type="time" name="time" id="time" value="' . (isset($_SESSION['time']) ? $_SESSION['time'] : date("H:i")) . '"/> + <a href="#" name="currentTime" id="currentTime" onClick="var d = new Date();'. "$('#time').val(d.getHours() +':'+ d.getMinutes());".'">Current Time?</a> </div> <div data-role="fieldcontain"> <label for="service_period"> Service Period: </label> @@ -220,7 +233,7 @@ } function trackEvent($category, $action, $label = "", $value = -1) { if (isAnalyticsOn()) { - echo "<script> _gaq.push(['_trackEvent', $category, $action".($label != "" ? ", $label" : "").($value != -1 ? ", $value" : "")."]);"; + echo "<script> _gaq.push(['_trackEvent', $category, $action".($label != "" ? ", $label" : "").($value != -1 ? ", $value" : "")."]);</script>"; } } ?>
--- a/include/common.inc.php +++ b/include/common.inc.php @@ -59,7 +59,7 @@ } } } - if ($_SESSION['lat'] != "" && isMetricsOn()) { + if ($_SESSION['lat'] != "" && isAnalyticsOn()) { trackEvent("Geolocation","Updated Location", "Geocoded - ".($geocoded ? "Yes" : "No")); } }
--- a/index.php +++ b/index.php @@ -1,6 +1,6 @@ <?php include ('include/common.inc.php'); -include_header("bus.lambdacomplex.org", "index", false, true) +include_header("bus.lambdacomplex.org", "index", false) ?> <div data-role="page"> <div data-role="content"> @@ -12,7 +12,7 @@ <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> <li data-role="list-divider">Timetables - Stops</li> <li><a href="stopList.php">Major (Timing Point) Stops</a></li> - <li><a href="stopList.php">All Stops</a></li> + <li><a href="stopList.php?allstops=yes">All Stops</a></li> <li><a href="stopList.php?suburbs=yes">Stops By Suburb</a></li> <li><a class="nearby" href="stopList.php?nearby=yes">Nearby Stops</a></li> </ul>
--- /dev/null +++ b/labs/googlemaps.php @@ -1,1 +1,29 @@ - +<!DOCTYPE html> +<html> +<head> +<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> +<style type="text/css"> + html { height: 100% } + body { height: 100%; margin: 0px; padding: 0px } + #map_canvas { height: 100% } +</style> +<script type="text/javascript" + src="http://maps.google.com/maps/api/js?sensor=false"> +</script> +<script type="text/javascript"> + function initialize() { + var latlng = new google.maps.LatLng(-35.25, 149.125); + var myOptions = { + zoom: 10, + center: latlng, + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + var map = new google.maps.Map(document.getElementById("map_canvas"), + myOptions); + } +</script> +</head> +<body onload="initialize()"> + <div id="map_canvas" style="width:100%; height:100%"></div> +</body> +</html>
--- /dev/null +++ b/labs/myway_api.json.php @@ -1,1 +1,125 @@ +<?php +function cleanString($subject) +{ + $subject = str_replace(" ", " ", $subject); + $subject = str_replace("&", "&", $subject); + $subject = preg_replace('/[^\r\n\t\x20-\x7E\xA0-\xFF]/', '', $subject); + $subject = str_replace(" ", " ", $subject); + return trim($subject); +} +$return = Array(); +/*if (file_exists("mywayresponse.txt")) { + @$fh = fopen("mywayresponse.txt", 'r'); + if ($fh) { + $pageHTML = fread($fh, filesize("mywayresponse.txt")); + fclose($fh); + } +}*/ +//set POST variables +$url = 'https://www.action.act.gov.au/ARTS/use_Funcs.asp'; +$field_mapping = Array( + "card_number" => "SRNO", + "DOBmonth" => "month", + "DOBday" => "day", + "DOByear" => "year", + "secret_answer" => "pwrd", + "button" => "button" +); +foreach (Array( + "card_number", + "DOBday", + "DOBmonth", + "DOByear" +) as $field_name) { + if (isset($_REQUEST[$field_name])) { + $fields[$field_name] = filter_var($_REQUEST[$field_name], FILTER_SANITIZE_NUMBER_INT); + } + else { + $return["error"][] = $field_name. " parameter invalid or unspecified"; + } +} +if (isset($_REQUEST['secret_answer'])) { + $fields['secret_answer'] = filter_var($_REQUEST['secret_answer'], FILTER_SANITIZE_STRING, Array( + FILTER_FLAG_NO_ENCODE_QUOTES, + FILTER_FLAG_STRIP_HIGH, + FILTER_FLAG_STRIP_LOW + )); +} +else { + $return["error"][] = "secret_answer parameter invalid or unspecified"; +} +$fields['button'] = 'Submit'; +$fields_string = ""; +//url-ify the data for the POST +foreach ($fields as $key => $value) { + if (sizeof($value) === 0) $return['error'][] = $key . " parameter invalid or unspecified"; + $fields_string.= $field_mapping[$key] . '=' . $value . '&'; +} +$fields_string = rtrim($fields_string, '&'); +if (!isset($return['error'])) { + //open connection + $ch = curl_init(); + //set the url, number of POST vars, POST data + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, count($fields)); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + //execute post + $pageHTML = curl_exec($ch); + if (curl_errno($ch)) $return["error"][] = "Network error " . curl_errno($ch) . " " . curl_error($ch) . " " . $url . $fields_string; + //close connection + curl_close($ch); +} +if (!isset($return['error'])) { + include_once ('simple_html_dom.php'); + $page = str_get_html($pageHTML); + $pageAlerts = $page->find(".smartCardAlert"); + if (sizeof($pageAlerts) > 0) { + $return['error'][] = $pageAlerts[0]->plaintext; + } + if (!isset($return['error'])) { + $tableNum = 0; + $tableName = Array( + 1 => "myway_carddetails", + 2 => "myway_transactions" + ); + foreach ($page->find("table") as $table) { + $tableNum++; + $tableColumns = Array(); + $tableColumnNum = 0; + foreach ($table->find("th") as $th) { + $tableColumns[$tableColumnNum] = cleanString($th->plaintext); + $tableColumnNum++; + } + $tableRowNum = 0; + foreach ($table->find("tr") as $tr) { + $tableColumnNum = 0; + foreach ($tr->find("td") as $td) { + if ($tableNum == 1) $return[$tableName[$tableNum]][$tableColumns[$tableColumnNum]] = cleanString($td->plaintext); + else $return[$tableName[$tableNum]][$tableRowNum][$tableColumns[$tableColumnNum]] = cleanString($td->plaintext); + $tableColumnNum++; + } + $tableRowNum++; + } + } + } +} +if (sizeof($return) == 0) { +$return['error'][] = "No data extracted from MyWay website - API may be out of date"; +} + +header('Content-Type: text/javascript; charset=utf8'); +// header('Access-Control-Allow-Origin: http://bus.lambdacomplex.org/'); +header('Access-Control-Max-Age: 3628800'); +header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); +if (isset($_GET['callback'])) { + $json = '(' . json_encode($return) . ');'; //must wrap in parens and end with semicolon + print_r($_GET['callback'] . $json); //callback is prepended for json-p + +} +else echo json_encode($return); +?> +
--- /dev/null +++ b/labs/mywaybalance.php @@ -1,1 +1,64 @@ +<?php +include ('../include/common.inc.php'); +include_header("MyWay Balance", "mywayBalance", true, false, true); +$return = Array(); +function printBalance($cardNumber, $date, $pwrd) +{ + global $return; + $return = json_decode(getPage(curPageURL() . "/myway_api.json.php?card_number=$cardNumber&DOBday={$date[0]}&DOBmonth={$date[1]}&DOByear={$date[2]}&secret_answer=$pwrd"), true); + + if (isset($return['error'])) { + echo "<font color=red>" . var_dump($return['error']) . "</font>"; + } else { + echo "<h2>Balance: " . $return['myway_carddetails']['Card Balance'] . "</h2>"; + echo '<ul data-role="listview" data-inset="true"><li data-role="list-divider"> Recent Transactions </li>'; + foreach ($return['myway_transactions'] as $transaction) { + echo "<li><b>" . $transaction["Date / Time"] . "</b>"; + echo "<br><small>" . $transaction["TX Reference No / Type"]. "</small>"; + echo '<p class="ui-li-aside">'.$transaction["TX Amount"].'</p>'; + echo "</li>"; + } + echo "</ul>"; + } +} +if (isset($_REQUEST['card_number']) && isset($_REQUEST['date']) && isset($_REQUEST['secret_answer'])) { + $cardNumber = $_REQUEST['card_number']; + $date = explode("/", $_REQUEST['date']); + $pwrd = $_REQUEST['secret_answer']; + if ($_REQUEST['remember'] == true) { + $_COOKIE['card_number'] = $cardNumber; + $_COOKIE['date'] = $date; + $_COOKIE['secret_answer'] = $pwrd; + } + printBalance($cardNumber, $date, $pwrd); +} +else if (isset($_COOKIE['card_number']) && isset($_COOKIE['date']) && isset($_COOKIE['secret_answer'])) { + $cardNumber = $_COOKIE['card_number']; + $date = explode("/", $_COOKIE['date']); + $pwrd = $_COOKIE['secret_answer']; + printBalance($cardNumber, $date, $pwrd); +} +else { + $date = (isset($_REQUEST['date']) ? filter_var($_REQUEST['date'], FILTER_SANITIZE_STRING) : date("m/d/Y")); + echo '<form action="" method="post"> + <div data-role="fieldcontain"> + <label for="card_number">Card number</label> + <input type="text" name="card_number" id="card_number" value="' . $card_number . '" /> + </div> + <div data-role="fieldcontain"> + <label for="date"> Date of birth </label> + <input type="text" name="date" id="date" value="' . $date . '" /> + </div> + <div data-role="fieldcontain"> + <label for="secret_answer"> Secret question answer </label> + <input type="text" name="secret_answer" id="secret_answer" value="' . $secret_answer . '" /> + </div> + <div data-role="fieldcontain"> + <label for="remember"> Remember these details? </label> + <input type="checkbox" name="remember" id="remember" checked="yes" /> + </div> + <input type="submit" value="Go!"></form>'; +} +include_footer(); +?>
--- /dev/null +++ b/labs/openlayers/OpenLayers.js @@ -1,1 +1,2553 @@ +/* + OpenLayers.js -- OpenLayers Map Viewer Library + + Copyright 2005-2010 OpenLayers Contributors, released under the Clear BSD + license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt + for the full text of the license. + + Includes compressed code under the following licenses: + + (For uncompressed versions of the code used please see the + OpenLayers SVN repository: <http://openlayers.org/>) + +*/ + +/* Contains portions of Prototype.js: + * + * Prototype JavaScript framework, version 1.4.0 + * (c) 2005 Sam Stephenson <sam@conio.net> + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://prototype.conio.net/ + * + *--------------------------------------------------------------------------*/ + +/** +* +* Contains portions of Rico <http://openrico.org/> +* +* Copyright 2005 Sabre Airline Solutions +* +* Licensed 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. +* +**/ + +/** + * Contains XMLHttpRequest.js <http://code.google.com/p/xmlhttprequest/> + * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com) + * + * Licensed 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 + */ + +/** + * Contains portions of Gears <http://code.google.com/apis/gears/> + * + * Copyright 2007, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of Google Inc. nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Sets up google.gears.*, which is *the only* supported way to access Gears. + * + * Circumvent this file at your own risk! + * + * In the future, Gears may automatically define google.gears.* without this + * file. Gears may use these objects to transparently fix bugs and compatibility + * issues. Applications that use the code below will continue to work seamlessly + * when that happens. + */ +var OpenLayers={singleFile:true};(function(){var singleFile=(typeof OpenLayers=="object"&&OpenLayers.singleFile);var scriptLocation;window.OpenLayers={_scriptName:(!singleFile)?"lib/OpenLayers.js":"OpenLayers.js",_getScriptLocation:function(){if(scriptLocation!=undefined){return scriptLocation;} +scriptLocation="";var isOL=new RegExp("(^|(.*?\\/))("+OpenLayers._scriptName+")(\\?|$)");var scripts=document.getElementsByTagName('script');for(var i=0,len=scripts.length;i<len;i++){var src=scripts[i].getAttribute('src');if(src){var match=src.match(isOL);if(match){scriptLocation=match[1];break;}}} +return scriptLocation;}};if(!singleFile){var jsfiles=new Array("OpenLayers/Util.js","OpenLayers/BaseTypes.js","OpenLayers/BaseTypes/Class.js","OpenLayers/BaseTypes/Bounds.js","OpenLayers/BaseTypes/Element.js","OpenLayers/BaseTypes/LonLat.js","OpenLayers/BaseTypes/Pixel.js","OpenLayers/BaseTypes/Size.js","OpenLayers/Console.js","OpenLayers/Tween.js","Rico/Corner.js","Rico/Color.js","OpenLayers/Ajax.js","OpenLayers/Events.js","OpenLayers/Request.js","OpenLayers/Request/XMLHttpRequest.js","OpenLayers/Projection.js","OpenLayers/Map.js","OpenLayers/Layer.js","OpenLayers/Icon.js","OpenLayers/Marker.js","OpenLayers/Marker/Box.js","OpenLayers/Popup.js","OpenLayers/Tile.js","OpenLayers/Tile/Image.js","OpenLayers/Tile/Image/IFrame.js","OpenLayers/Tile/WFS.js","OpenLayers/Layer/Image.js","OpenLayers/Layer/SphericalMercator.js","OpenLayers/Layer/EventPane.js","OpenLayers/Layer/FixedZoomLevels.js","OpenLayers/Layer/Google.js","OpenLayers/Layer/Google/v3.js","OpenLayers/Layer/VirtualEarth.js","OpenLayers/Layer/Yahoo.js","OpenLayers/Layer/HTTPRequest.js","OpenLayers/Layer/Grid.js","OpenLayers/Layer/MapGuide.js","OpenLayers/Layer/MapServer.js","OpenLayers/Layer/MapServer/Untiled.js","OpenLayers/Layer/KaMap.js","OpenLayers/Layer/KaMapCache.js","OpenLayers/Layer/MultiMap.js","OpenLayers/Layer/Markers.js","OpenLayers/Layer/Text.js","OpenLayers/Layer/WorldWind.js","OpenLayers/Layer/ArcGIS93Rest.js","OpenLayers/Layer/WMS.js","OpenLayers/Layer/WMS/Untiled.js","OpenLayers/Layer/WMS/Post.js","OpenLayers/Layer/WMTS.js","OpenLayers/Layer/ArcIMS.js","OpenLayers/Layer/GeoRSS.js","OpenLayers/Layer/Boxes.js","OpenLayers/Layer/XYZ.js","OpenLayers/Layer/TMS.js","OpenLayers/Layer/TileCache.js","OpenLayers/Layer/Zoomify.js","OpenLayers/Popup/Anchored.js","OpenLayers/Popup/AnchoredBubble.js","OpenLayers/Popup/Framed.js","OpenLayers/Popup/FramedCloud.js","OpenLayers/Feature.js","OpenLayers/Feature/Vector.js","OpenLayers/Feature/WFS.js","OpenLayers/Handler.js","OpenLayers/Handler/Click.js","OpenLayers/Handler/Hover.js","OpenLayers/Handler/Point.js","OpenLayers/Handler/Path.js","OpenLayers/Handler/Polygon.js","OpenLayers/Handler/Feature.js","OpenLayers/Handler/Drag.js","OpenLayers/Handler/RegularPolygon.js","OpenLayers/Handler/Box.js","OpenLayers/Handler/MouseWheel.js","OpenLayers/Handler/Keyboard.js","OpenLayers/Control.js","OpenLayers/Control/Attribution.js","OpenLayers/Control/Button.js","OpenLayers/Control/ZoomBox.js","OpenLayers/Control/ZoomToMaxExtent.js","OpenLayers/Control/DragPan.js","OpenLayers/Control/Navigation.js","OpenLayers/Control/MouseDefaults.js","OpenLayers/Control/MousePosition.js","OpenLayers/Control/OverviewMap.js","OpenLayers/Control/KeyboardDefaults.js","OpenLayers/Control/PanZoom.js","OpenLayers/Control/PanZoomBar.js","OpenLayers/Control/ArgParser.js","OpenLayers/Control/Permalink.js","OpenLayers/Control/Scale.js","OpenLayers/Control/ScaleLine.js","OpenLayers/Control/Snapping.js","OpenLayers/Control/Split.js","OpenLayers/Control/LayerSwitcher.js","OpenLayers/Control/DrawFeature.js","OpenLayers/Control/DragFeature.js","OpenLayers/Control/ModifyFeature.js","OpenLayers/Control/Panel.js","OpenLayers/Control/SelectFeature.js","OpenLayers/Control/NavigationHistory.js","OpenLayers/Control/Measure.js","OpenLayers/Control/WMSGetFeatureInfo.js","OpenLayers/Control/WMTSGetFeatureInfo.js","OpenLayers/Control/Graticule.js","OpenLayers/Control/TransformFeature.js","OpenLayers/Control/SLDSelect.js","OpenLayers/Geometry.js","OpenLayers/Geometry/Rectangle.js","OpenLayers/Geometry/Collection.js","OpenLayers/Geometry/Point.js","OpenLayers/Geometry/MultiPoint.js","OpenLayers/Geometry/Curve.js","OpenLayers/Geometry/LineString.js","OpenLayers/Geometry/LinearRing.js","OpenLayers/Geometry/Polygon.js","OpenLayers/Geometry/MultiLineString.js","OpenLayers/Geometry/MultiPolygon.js","OpenLayers/Geometry/Surface.js","OpenLayers/Renderer.js","OpenLayers/Renderer/Elements.js","OpenLayers/Renderer/SVG.js","OpenLayers/Renderer/Canvas.js","OpenLayers/Renderer/VML.js","OpenLayers/Layer/Vector.js","OpenLayers/Layer/Vector/RootContainer.js","OpenLayers/Strategy.js","OpenLayers/Strategy/Filter.js","OpenLayers/Strategy/Fixed.js","OpenLayers/Strategy/Cluster.js","OpenLayers/Strategy/Paging.js","OpenLayers/Strategy/BBOX.js","OpenLayers/Strategy/Save.js","OpenLayers/Strategy/Refresh.js","OpenLayers/Filter.js","OpenLayers/Filter/FeatureId.js","OpenLayers/Filter/Logical.js","OpenLayers/Filter/Comparison.js","OpenLayers/Filter/Spatial.js","OpenLayers/Protocol.js","OpenLayers/Protocol/HTTP.js","OpenLayers/Protocol/SQL.js","OpenLayers/Protocol/SQL/Gears.js","OpenLayers/Protocol/WFS.js","OpenLayers/Protocol/WFS/v1.js","OpenLayers/Protocol/WFS/v1_0_0.js","OpenLayers/Protocol/WFS/v1_1_0.js","OpenLayers/Protocol/SOS.js","OpenLayers/Protocol/SOS/v1_0_0.js","OpenLayers/Layer/PointTrack.js","OpenLayers/Layer/GML.js","OpenLayers/Style.js","OpenLayers/Style2.js","OpenLayers/StyleMap.js","OpenLayers/Rule.js","OpenLayers/Format.js","OpenLayers/Format/XML.js","OpenLayers/Format/Context.js","OpenLayers/Format/ArcXML.js","OpenLayers/Format/ArcXML/Features.js","OpenLayers/Format/GML.js","OpenLayers/Format/GML/Base.js","OpenLayers/Format/GML/v2.js","OpenLayers/Format/GML/v3.js","OpenLayers/Format/Atom.js","OpenLayers/Format/KML.js","OpenLayers/Format/GeoRSS.js","OpenLayers/Format/WFS.js","OpenLayers/Format/WFSCapabilities.js","OpenLayers/Format/WFSCapabilities/v1.js","OpenLayers/Format/WFSCapabilities/v1_0_0.js","OpenLayers/Format/WFSCapabilities/v1_1_0.js","OpenLayers/Format/WFSDescribeFeatureType.js","OpenLayers/Format/WMSDescribeLayer.js","OpenLayers/Format/WMSDescribeLayer/v1_1.js","OpenLayers/Format/WKT.js","OpenLayers/Format/OSM.js","OpenLayers/Format/GPX.js","OpenLayers/Format/Filter.js","OpenLayers/Format/Filter/v1.js","OpenLayers/Format/Filter/v1_0_0.js","OpenLayers/Format/Filter/v1_1_0.js","OpenLayers/Format/SLD.js","OpenLayers/Format/SLD/v1.js","OpenLayers/Format/SLD/v1_0_0.js","OpenLayers/Format/OWSCommon/v1.js","OpenLayers/Format/OWSCommon/v1_0_0.js","OpenLayers/Format/OWSCommon/v1_1_0.js","OpenLayers/Format/CSWGetDomain.js","OpenLayers/Format/CSWGetDomain/v2_0_2.js","OpenLayers/Format/CSWGetRecords.js","OpenLayers/Format/CSWGetRecords/v2_0_2.js","OpenLayers/Format/WFST.js","OpenLayers/Format/WFST/v1.js","OpenLayers/Format/WFST/v1_0_0.js","OpenLayers/Format/WFST/v1_1_0.js","OpenLayers/Format/Text.js","OpenLayers/Format/JSON.js","OpenLayers/Format/GeoJSON.js","OpenLayers/Format/WMC.js","OpenLayers/Format/WMC/v1.js","OpenLayers/Format/WMC/v1_0_0.js","OpenLayers/Format/WMC/v1_1_0.js","OpenLayers/Format/WMSCapabilities.js","OpenLayers/Format/WMSCapabilities/v1.js","OpenLayers/Format/WMSCapabilities/v1_1.js","OpenLayers/Format/WMSCapabilities/v1_1_0.js","OpenLayers/Format/WMSCapabilities/v1_1_1.js","OpenLayers/Format/WMSCapabilities/v1_3.js","OpenLayers/Format/WMSCapabilities/v1_3_0.js","OpenLayers/Format/WMSGetFeatureInfo.js","OpenLayers/Format/SOSCapabilities.js","OpenLayers/Format/SOSCapabilities/v1_0_0.js","OpenLayers/Format/SOSGetObservation.js","OpenLayers/Format/SOSGetFeatureOfInterest.js","OpenLayers/Format/OWSContext.js","OpenLayers/Format/OWSContext/v0_3_1.js","OpenLayers/Format/WMTSCapabilities.js","OpenLayers/Format/WMTSCapabilities/v1_0_0.js","OpenLayers/Layer/WFS.js","OpenLayers/Control/GetFeature.js","OpenLayers/Control/MouseToolbar.js","OpenLayers/Control/NavToolbar.js","OpenLayers/Control/PanPanel.js","OpenLayers/Control/Pan.js","OpenLayers/Control/ZoomIn.js","OpenLayers/Control/ZoomOut.js","OpenLayers/Control/ZoomPanel.js","OpenLayers/Control/EditingToolbar.js","OpenLayers/Symbolizer.js","OpenLayers/Symbolizer/Point.js","OpenLayers/Symbolizer/Line.js","OpenLayers/Symbolizer/Polygon.js","OpenLayers/Symbolizer/Text.js","OpenLayers/Symbolizer/Raster.js","OpenLayers/Lang.js","OpenLayers/Lang/en.js");var agent=navigator.userAgent;var docWrite=(agent.match("MSIE")||agent.match("Safari"));if(docWrite){var allScriptTags=new Array(jsfiles.length);} +var host=OpenLayers._getScriptLocation()+"lib/";for(var i=0,len=jsfiles.length;i<len;i++){if(docWrite){allScriptTags[i]="<script src='"+host+jsfiles[i]+"'></script>";}else{var s=document.createElement("script");s.src=host+jsfiles[i];var h=document.getElementsByTagName("head").length?document.getElementsByTagName("head")[0]:document.body;h.appendChild(s);}} +if(docWrite){document.write(allScriptTags.join(""));}}})();OpenLayers.VERSION_NUMBER="OpenLayers 2.10 -- $Revision: 10721 $";OpenLayers.String={startsWith:function(str,sub){return(str.indexOf(sub)==0);},contains:function(str,sub){return(str.indexOf(sub)!=-1);},trim:function(str){return str.replace(/^\s\s*/,'').replace(/\s\s*$/,'');},camelize:function(str){var oStringList=str.split('-');var camelizedString=oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);} +return camelizedString;},format:function(template,context,args){if(!context){context=window;} +var replacer=function(str,match){var replacement;var subs=match.split(/\.+/);for(var i=0;i<subs.length;i++){if(i==0){replacement=context;} +replacement=replacement[subs[i]];} +if(typeof replacement=="function"){replacement=args?replacement.apply(null,args):replacement();} +if(typeof replacement=='undefined'){return'undefined';}else{return replacement;}};return template.replace(OpenLayers.String.tokenRegEx,replacer);},tokenRegEx:/\$\{([\w.]+?)\}/g,numberRegEx:/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/,isNumeric:function(value){return OpenLayers.String.numberRegEx.test(value);},numericIf:function(value){return OpenLayers.String.isNumeric(value)?parseFloat(value):value;}};if(!String.prototype.startsWith){String.prototype.startsWith=function(sStart){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.startsWith'}));return OpenLayers.String.startsWith(this,sStart);};} +if(!String.prototype.contains){String.prototype.contains=function(str){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.contains'}));return OpenLayers.String.contains(this,str);};} +if(!String.prototype.trim){String.prototype.trim=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.trim'}));return OpenLayers.String.trim(this);};} +if(!String.prototype.camelize){String.prototype.camelize=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.camelize'}));return OpenLayers.String.camelize(this);};} +OpenLayers.Number={decimalSeparator:".",thousandsSeparator:",",limitSigDigs:function(num,sig){var fig=0;if(sig>0){fig=parseFloat(num.toPrecision(sig));} +return fig;},format:function(num,dec,tsep,dsep){dec=(typeof dec!="undefined")?dec:0;tsep=(typeof tsep!="undefined")?tsep:OpenLayers.Number.thousandsSeparator;dsep=(typeof dsep!="undefined")?dsep:OpenLayers.Number.decimalSeparator;if(dec!=null){num=parseFloat(num.toFixed(dec));} +var parts=num.toString().split(".");if(parts.length==1&&dec==null){dec=0;} +var integer=parts[0];if(tsep){var thousands=/(-?[0-9]+)([0-9]{3})/;while(thousands.test(integer)){integer=integer.replace(thousands,"$1"+tsep+"$2");}} +var str;if(dec==0){str=integer;}else{var rem=parts.length>1?parts[1]:"0";if(dec!=null){rem=rem+new Array(dec-rem.length+1).join("0");} +str=integer+dsep+rem;} +return str;}};if(!Number.p