--- /dev/null +++ b/betweenpoint.add.php @@ -1,1 +1,50 @@ +<?php + /* + * GeoPo Encode in PHP + * @author : Shintaro Inagaki + * @param $location (Array) + * @return $geopo (String) + */ + function geopoEncode($lat, $lng) + { + // 64characters (number + big and small letter + hyphen + underscore) + $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; + + $geopo = ""; + $scale = 7; + + // Change a degree measure to a decimal number + $lat = ($lat + 90) / 180 * pow(8, 10); + $lng = ($lng + 180) / 360 * pow(8, 10); + // Compute a GeoPo code from head and concatenate + for ($i = 0; $i < $scale; $i++) { + $geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1); + } + return $geopo; + } + + $conn = pg_connect("dbname=bus user=postgres password=snmc"); + if (!$conn) { + echo "An error occured.\n"; + exit; + } + if ($_REQUEST['newlatlng']) { + $latlng = explode(";", $_REQUEST['newlatlng']); + $lat = (float)$latlng[0]; + $lng = (float)$latlng[1]; + + $geoPo = geopoEncode($lat, $lng); + $nodelat = (int)($lat * 10000000); + $nodelon = (int)($lng * 10000000); + echo($nodelat . "," . $nodelon . "=$geoPo<br>"); + $sql = "INSERT INTO stops (geohash,lat,lng) VALUES ('$geoPo', '$nodelat', '$nodelon')"; + $result = pg_query($conn, $sql); + if (!$result) { + echo("Error in SQL query: " . pg_last_error() . "<br>\n"); + } else { + echo "Inserted new point at $geoPo <br>"; + } + } + flush(); +?>
--- /dev/null +++ b/betweenpoint.delete.php @@ -1,1 +1,19 @@ - +<?php + + $conn = pg_connect("dbname=bus user=postgres password=snmc"); + if (!$conn) { + echo "An error occured.\n"; + exit; + } + if ($_REQUEST['oldgeopo']) { + + $sql = " DELETE from stops WHERE geohash = '{$_REQUEST['oldgeopo']}'"; + $result = pg_query($conn, $sql); + if (!$result) { + echo("Error in SQL query: " . pg_last_error() . "<br>\n"); + } else { + echo "Deleted {$_REQUEST['oldgeopo']}<br>"; + } + } + flush(); +?>
--- /dev/null +++ b/betweenpoint.move.php @@ -1,1 +1,92 @@ - +<?php + /* + * GeoPo Encode in PHP + * @author : Shintaro Inagaki + * @param $location (Array) + * @return $geopo (String) + */ + function geopoEncode($lat, $lng) + { + // 64characters (number + big and small letter + hyphen + underscore) + $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; + + $geopo = ""; + $scale = 7; + + // Change a degree measure to a decimal number + $lat = ($lat + 90) / 180 * pow(8, 10); + $lng = ($lng + 180) / 360 * pow(8, 10); + // Compute a GeoPo code from head and concatenate + for ($i = 0; $i < $scale; $i++) { + $geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1); + } + return $geopo; + } + + /* + * GeoPo Decode in PHP + * @author : Shintaro Inagaki + * @param $geopo (String) + * @return $location (Array) + */ + function geopoDecode($geopo) + { + // 64characters (number + big and small letter + hyphen + underscore) + $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; + // Array for geolocation + $location = array(); + + for ($i = 0; $i < strlen($geopo); $i++) { + // What number of character that equal to a GeoPo code (0-63) + $order = strpos($chars, substr($geopo, $i, 1)); + // Lat/Lng plus geolocation value of scale + $location['lat'] = $location['lat'] + floor($order % 8) * pow(8, 9 - $i); + $location['lng'] = $location['lng'] + floor($order / 8) * pow(8, 9 - $i); + } + + // Change a decimal number to a degree measure, and plus revised value that shift center of area + $location['lat'] = $location['lat'] * 180 / pow(8, 10) + 180 / pow(8, strlen($geopo)) / 2 - 90; + $location['lng'] = $location['lng'] * 360 / pow(8, 10) + 360 / pow(8, strlen($geopo)) / 2 - 180; + $location['scale'] = strlen($geopo); + + return $location; + } + + $conn = pg_connect("dbname=bus user=postgres password=snmc"); + if (!$conn) { + echo "An error occured.\n"; + exit; + } + if ($_REQUEST['newlatlng']) { + $latlng = explode(";", $_REQUEST['newlatlng']); + $lat = (float)$latlng[0]; + $lng = (float)$latlng[1]; + + $geoPo = geopoEncode($lat, $lng); + $nodelat = (int)($lat * 10000000); + $nodelon = (int)($lng * 10000000); + echo($nodelat . "," . $nodelon . "=$geoPo<br>"); + $sql = "UPDATE stops SET geohash='$geoPo', lat='$nodelat', lng='$nodelon', name=null, suburb=null WHERE geohash = '{$_REQUEST['oldgeopo']}'"; + $result = pg_query($conn, $sql); + if (!$result) { + echo("Error in SQL query: " . pg_last_error() . "<br>\n"); + } else if (pg_affected_rows($result) == 0) { + echo ("Error 0 points moved, please refresh page and try again"); + } else { + echo $_REQUEST['oldgeopo'] . " replaced with $geoPo <br>"; + $updatedroutes = 0; + $result_outdatedroutes = pg_query($conn, "Select * FROM between_stops where points LIKE '%" . $_REQUEST['oldgeopo'] . ";%'"); + while ($outdatedroute = pg_fetch_assoc($result_outdatedroutes)) { + $newpoints = str_replace($_REQUEST['oldgeopo'], $geoPo, $outdatedroute['points']); + $sql = "UPDATE between_stops set points='$newpoints' where fromlocation = '{$outdatedroute['fromlocation']}' AND tolocation = '{$outdatedroute['tolocation']}' "; + $result = pg_query($conn, $sql); + if (!$result) { + echo("Error in SQL query: " . pg_last_error() . "<br>\n"); + } + $updatedroutes++; + } + echo "updated $updatedroutes routes<br>"; + } + } + flush(); +?>
--- a/betweenpoint.php +++ b/betweenpoint.php @@ -10,11 +10,46 @@ // create the ol map object var map = new OpenLayers.Map('map'); - var osmtiles = new OpenLayers.Layer.OSM("local", "http://127.0.0.1/tiles/${z}/${x}/${y}.png") + var osmtiles = new OpenLayers.Layer.OSM("local", "http://10.0.1.154/tiles/${z}/${x}/${y}.png") // use http://open.atlas.free.fr/GMapsTransparenciesImgOver.php and http://code.google.com/p/googletilecutter/ to make tiles markers = new OpenLayers.Layer.Markers("Between Stop Markers"); - + //hanlde mousedown on regions that are not points by reporting latlng +OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { + defaultHandlerOptions: { + 'single': true, + 'double': false, + 'pixelTolerance': 0, + 'stopSingle': false, + 'stopDouble': false + }, + + initialize: function(options) { + this.handlerOptions = OpenLayers.Util.extend( + {}, this.defaultHandlerOptions + ); + OpenLayers.Control.prototype.initialize.apply( + this, arguments + ); + this.handler = new OpenLayers.Handler.Click( + this, { + 'click': this.trigger + }, this.handlerOptions + ); + }, + + trigger: function(e) { + var lonlat = map.getLonLatFromViewPortPx(e.xy).transform( + new OpenLayers.Projection("EPSG:900913"), + new OpenLayers.Projection("EPSG:4326") + ); + $('form input[name="newlatlng"]').val(lonlat.lat + ";" + lonlat.lon ); + } + + }); + var click = new OpenLayers.Control.Click(); + map.addControl(click); + click.activate(); <?php $conn = pg_connect("dbname=bus user=postgres password=snmc"); if (!$conn) { @@ -34,7 +69,9 @@ marker.id="' . $stop['geohash'] . '"; markers.addMarker(marker); marker.events.register("mousedown", marker, function() { + document.getElementById("between_points").innerHTML += this.id+";"; +$(\'form input[name="oldgeopo"]\').val(this.id); }); '; } @@ -55,7 +92,27 @@ return false; }); }; - +function submitMove () { + $.post("betweenpoint.move.php", $("#moveform").serialize(), function(html){ + $("#response").html(html); + clearForms(); + return false; + }); +}; +function submitDelete () { + $.post("betweenpoint.delete.php", $("#moveform").serialize(), function(html){ + $("#response").html(html); + clearForms(); + return false; + }); +}; +function submitAdd () { + $.post("betweenpoint.add.php", $("#moveform").serialize(), function(html){ + $("#response").html(html); + clearForms(); + return false; + }); +}; function OnChange(dropdown) { var myindex = dropdown.selectedIndex @@ -178,6 +235,13 @@ <br> <textarea name="between_points" id="between_points" rows="1" cols="120"></textarea> </form> + <form id="moveform"> +oldgeopo <input type="text" name="oldgeopo" id="oldgeopo"/> +newlatlng <input type="text" name="newlatlng" id="newlatlng" size="60"/> + <input type="button" onclick="javascript:submitMove()" value="Move!"> + <input type="button" onclick="javascript:submitAdd()" value="Add!"> + <input type="button" onclick="javascript:submitDelete()" value="Delete!"> +</form> <div id="response"> <!-- Our message will be echoed out here --> </div>
--- a/betweenpoint.submit.php +++ b/betweenpoint.submit.php @@ -6,8 +6,8 @@ } print_r($_REQUEST); $reverse=$_REQUEST["reverse"]; -$from=$_REQUEST["from"]; -$to=$_REQUEST["to"]; +$from=pg_escape_string($_REQUEST["from"]); +$to=pg_escape_string($_REQUEST["to"]); $routes=$_REQUEST["routes"] ; $points=$_REQUEST["between_points"]; $sql = "INSERT INTO between_stops (fromLocation, toLocation, points, routes) VALUES('$from','$to','$points','$routes')";
--- a/busui/common.inc.php +++ b/busui/common.inc.php @@ -2,37 +2,91 @@ date_default_timezone_set('Australia/ACT'); $APIurl = "http://localhost:8765"; error_reporting(E_ALL ^ E_NOTICE); + // you have to open the session to be able to modify or remove it + session_start(); + function isDebug() { - return true; -} - + return $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME']; +} + +function debug($msg) { + if (isDebug()) echo "<!-- $msg -->"; +} function isFastDevice() { return true; } function include_header($pageTitle, $opendiv = true, $geolocate = false) { + // this starts the session + session_start(); + // if (isDebug()) // set php error level high echo ' <!DOCTYPE html> <html> <head> <title>bus.lambdacomplex.org - '.$pageTitle.'</title> - <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.css" /> + '; + if (isDebug()) echo '<link rel="stylesheet" href="jquery-mobile-1.0a2.css" /> + <script type="text/javascript" src="jquery-mobile-1.0a2.js"></script>'; + else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.css" /> + <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script>'; +echo ' <style type="text/css"> .ui-navbar { padding-bottom: 18px; width: 100%; } </style> - <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script><script type="text/javascript" -src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script> - <meta name="apple-mobile-web-app-capable" content="yes" /> +<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <link rel="apple-touch-startup-image" href="startup.png" /> - <link rel="apple-touch-icon" href="apple-touch-icon.png" /> -</head> + <link rel="apple-touch-icon" href="apple-touch-icon.png" />'; + if ($geolocate) { +echo "<script> + +function setCookie(c_name,value,expiredays) +{ +var exdate=new Date(); +exdate.setDate(exdate.getDate()+expiredays); +document.cookie=c_name+ \"=\" +escape(value)+ +((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString()); +} + +function getCookie(c_name) +{ +if (document.cookie.length>0) + { + c_start=document.cookie.indexOf(c_name + \"=\"); + if (c_start!=-1) + { + c_start=c_start + c_name.length+1; + c_end=document.cookie.indexOf(\";\",c_start); + if (c_end==-1) c_end=document.cookie.length; + return unescape(document.cookie.substring(c_start,c_end)); + } + } +return \"\"; +} + +function success(position) { +$('#geolocate').val(position.coords.latitude+','+position.coords.longitude); +setCookie('geolocate',position.coords.latitude+','+position.coords.longitude,1); +} + +function error(msg) { + console.log(msg); +} + +if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(success, error); +} + +</script> "; + } +echo '</head> <body> '; if ($opendiv) echo '<div data-role="page"> @@ -48,8 +102,12 @@ echo '</div>'; } +$service_periods = Array ('sunday','saturday','weekday'); + function service_period() { +if (isset($_SESSION['service_period'])) return $_SESSION['service_period']; + switch (date('w')){ case 0: @@ -61,11 +119,19 @@ } } +function remove_spaces($string) +{ + return str_replace(' ','',$string); +} + function midnight_seconds() { // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html - $secs = (date("G") * 3600) + (date("i") * 60) + date("s"); - return $secs; +if (isset($_SESSION['time'])) { + $time = mkdate($_SESSION['time']); + return (date("G",$time) * 3600) + (date("i",$time) * 60) + date("s",$time); + } + return (date("G") * 3600) + (date("i") * 60) + date("s"); } function midnight_seconds_to_time($seconds)
--- a/busui/index.php +++ b/busui/index.php @@ -1,30 +1,61 @@ <?php include('common.inc.php'); -include_header("bus.lambdacomplex.org",false) + // remove all the variable in the session + session_unset(); + + //destroy the session + session_destroy(); + if (isset($_REQUEST['service_period'])) $_SESSION['service_period'] = $_REQUEST['service_period']; + if (isset($_REQUEST['time'])) $_SESSION['time'] = $_REQUEST['time']; + // todo take in cellids and crossreference with http://realtimeblog.free.fr/latest/cellular/processed/sqlite/505_sqlite_zones.zip to estimate location +include_header("bus.lambdacomplex.org",false, true) ?> <div data-role="page" data-theme="b" id="jqm-home" class="ui-page ui-body-b ui-page-active"> <div id="jqm-homeheader"> - <center><h1 id="jqm-logo"><img src="apple-touch-icon.png" alt="jQuery Mobile Framework" width="64" height="64" /> + <center><h1 id="jqm-logo"><img src="apple-touch-icon.png" alt="logo" width="64" height="64" /><br> bus.lambdacomplex.org</h1></center> </div> - <div data-role="content"> + <div data-role="content"> + <a href="tripPlanner.php" data-role="button">Launch Trip Planner...</a> <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> - <li data-role="list-divider">Stops</li> - <li><a href="stopList.php">All stops List</a></li> - <li class="nearby"><a href="stopList.php?nearby=yes">Nearby List</a></li> - <li><a href="stopList.php?favourites=yes">Favourites List</a></li> + <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?nearbyfavs=yes">Nearby/Favourite Stops</a></li> </ul> <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> - <li data-role="list-divider">Routes</li> - <li><a href="routeList.php">All Routes List</a></li> - <li class="nearby"><a href="routeList.php?nearby=yes">Nearby List</a></li> - <li><a href="routeList.php?favourites=yes">Favourites List</a></li> + <li data-role="list-divider">Timetables - Routes</li> + <li><a href="routeList.php">Routes By Final Destination</a></li> + <li><a href="routeList.php?bynumber=yes">Routes By Number</a></li> + <li><a href="routeList.php?nearbyfavs=yes">Nearby/Favourites Routes</a></li> </ul> - <div class="ui-body ui-body-c info"> - <p class="latlng"></p> - Time: <?php echo date("H:m"); ?> <br> - Service Period: <?php echo ucwords(service_period()); ?> + <div class="ui-body ui-body-c"> + <h3>Time/Place Settings</h3> + <div data-role="fieldcontain"> + <label for="geolocate"> Current Location: </label> + <input type="text" id="geolocate" name="geolocate"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a> + </div> + <div data-role="fieldcontain"> + <label for="time"> Time: </label> + <input type="time" value="<?php echo date("H:m"); ?>"/> <a href="#" style="display:none" name="currentTime" id="currentTime"/>Current Time?</a> + </div> + <div data-role="fieldcontain"> + <label for="service_period"> Service Period: </label> + <select name="service_period"> + <?php + foreach ($service_periods as $service_period) { + echo "<option value=\"$service_period\"".(service_period() === $service_period ? "SELECTED" : "").'>'.ucwords($service_period).'</option>'; + }?> + </select> + <a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a> + </div> + + <input type="submit" value="Update"/> </div> + <script> +$('#here').click(function(event) { $('#geolocate').val(getCookie('geolocate')); return false;}); +$('#here').show(); + </script> </div> </div> </body>
--- /dev/null +++ b/busui/jquery-mobile-1.0a2.css @@ -1,1 +1,890 @@ + +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* Note: Code is in draft form and is subject to change +*/ + + + +/* theme bar,body,btn containers +----------------------------------*/ +.ui-bar-a { border: 1px solid #2A2A2A; background: #111111; color: #fff; font-weight: bold; text-shadow: 0 -1px 1px #000; background-image: -moz-linear-gradient(top, #3c3c3c, #111111); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #3c3c3c),color-stop(1, #111111)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#3c3c3c', EndColorStr='#111111')"; } +.ui-bar-a, .ui-bar-a input, .ui-bar-a select, .ui-bar-a textarea, .ui-bar-a button { font-family: Helvetica, Arial, sans-serif; } +.ui-bar-a .ui-link-inherit { color: #fff; } +.ui-bar-a .ui-link { color: #7cc4e7; font-weight: bold; } + +.ui-body-a { border: 1px solid #2A2A2A; background: #222222; color: #fff; text-shadow: 0 1px 0 #000; font-weight: normal; background-image: -moz-linear-gradient(top, #666666, #222222); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #666666),color-stop(1, #222222)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#666666', EndColorStr='#222222)')"; } +.ui-body-a, .ui-body-a input, .ui-body-a select, .ui-body-a textarea, .ui-body-a button { font-family: Helvetica, Arial, sans-serif; } +.ui-body-a .ui-link-inherit { color: #fff; } +.ui-body-a .ui-link { color: #2489CE; font-weight: bold; } +.ui-br { border-bottom: 1px solid rgba(130,130,130,.3); } + +.ui-btn-up-a { border: 1px solid #222; background: #333333; font-weight: bold; color: #fff; cursor: pointer; text-shadow: 0 -1px 1px #000; text-decoration: none; background-image: -moz-linear-gradient(top, #555555, #333333); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #555555),color-stop(1, #333333)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#555555', EndColorStr='#333333')"; } +.ui-btn-up-a a.ui-link-inherit { color: #fff; } +.ui-btn-hover-a { border: 1px solid #000; background: #444444; font-weight: bold; color: #fff; text-shadow: 0 -1px 1px #000; text-decoration: none; background-image: -moz-linear-gradient(top, #666666, #444444); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #666666),color-stop(1, #444444)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#666666', EndColorStr='#444444')"; } +.ui-btn-hover-a a.ui-link-inherit { color: #fff; } +.ui-btn-down-a { border: 1px solid #000; background: #3d3d3d; font-weight: bold; color: #fff; text-shadow: 0 -1px 1px #000; background-image: -moz-linear-gradient(top, #333333, #5a5a5a); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #333333),color-stop(1, #5a5a5a)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#333333', EndColorStr='#5a5a5a')"; } +.ui-btn-down-a a.ui-link-inherit { color: #fff; } +.ui-btn-up-a, .ui-btn-hover-a, .ui-btn-down-a { font-family: Helvetica, Arial, sans-serif; } + + + + +.ui-bar-b { border: 1px solid #456f9a; background: #5e87b0; color: #fff; font-weight: bold; text-shadow: 0 -1px 1px #254f7a; background-image: -moz-linear-gradient(top, #81a8ce, #5e87b0); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #81a8ce),color-stop(1, #5e87b0)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#81a8ce', EndColorStr='#5e87b0')"; } +.ui-bar-b, .ui-bar-b input, .ui-bar-b select, .ui-bar-b textarea, .ui-bar-b button { font-family: Helvetica, Arial, sans-serif; } +.ui-bar-b .ui-link-inherit { color: #fff; } +.ui-bar-b .ui-link { color: #7cc4e7; font-weight: bold; } + +.ui-body-b { border: 1px solid #C6C6C6; background: #cccccc; color: #333333; text-shadow: 0 1px 0 #fff; font-weight: normal; background-image: -moz-linear-gradient(top, #e6e6e6, #cccccc); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #e6e6e6),color-stop(1, #cccccc)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#e6e6e6', EndColorStr='#cccccc')"; } +.ui-body-b, .ui-body-b input, .ui-body-b select, .ui-body-b textarea, .ui-body-b button { font-family: Helvetica, Arial, sans-serif; } +.ui-body-b .ui-link-inherit { color: #333333; } +.ui-body-b .ui-link { color: #2489CE; font-weight: bold; } + +.ui-btn-up-b { border: 1px solid #145072; background: #2567ab; font-weight: bold; color: #fff; cursor: pointer; text-shadow: 0 -1px 1px #145072; text-decoration: none; background-image: -moz-linear-gradient(top, #4e89c5, #2567ab); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #5f9cc5),color-stop(1, #396b9e)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#4e89c5', EndColorStr='#2567ab')"; } +.ui-btn-up-b a.ui-link-inherit { color: #fff; } +.ui-btn-hover-b { border: 1px solid #00516e; background: #4b88b6; font-weight: bold; color: #fff; text-shadow: 0 -1px 1px #014D68; background-image: -moz-linear-gradient(top, #72b0d4, #4b88b6); text-decoration: none; background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #72b0d4),color-stop(1, #4b88b6)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#72b0d4', EndColorStr='#4b88b6')"; } +.ui-btn-hover-b a.ui-link-inherit { color: #fff; } +.ui-btn-down-b { border: 1px solid #225377; background: #4e89c5; font-weight: bold; color: #fff; text-shadow: 0 -1px 1px #225377; background-image: -moz-linear-gradient(top, #396b9e, #4e89c5); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #396b9e),color-stop(1, #4e89c5)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#396b9e', EndColorStr='#4e89c5')"; } +.ui-btn-down-b a.ui-link-inherit { color: #fff; } +.ui-btn-up-b, .ui-btn-hover-b, .ui-btn-down-b { font-family: Helvetica, Arial, sans-serif; } + + + + +.ui-bar-c { border: 1px solid #B3B3B3; background: #e9eaeb; color: #3E3E3E; font-weight: bold; text-shadow: 0 1px 1px #fff; background-image: -moz-linear-gradient(top, #f0f0f0, #e9eaeb); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f0f0f0),color-stop(1, #e9eaeb)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#f0f0f0', EndColorStr='#e9eaeb')"; } +.ui-bar-c, .ui-bar-c input, .ui-bar-c select, .ui-bar-c textarea, .ui-bar-c button { font-family: Helvetica, Arial, sans-serif; } + +.ui-body-c { border: 1px solid #B3B3B3; color: #333333; text-shadow: 0 1px 0 #fff; background: #f0f0f0; background-image: -moz-linear-gradient(top, #fff, #f0f0f0); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #f0f0f0)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#f0f0f0')"; } +.ui-body-c, .ui-body-c input, .ui-body-c select, .ui-body-c textarea, .ui-body-c button { font-family: Helvetica, Arial, sans-serif; } +.ui-body-c .ui-link-inherit { color: #333333; } +.ui-body-c .ui-link { color: #2489CE; font-weight: bold; } + +.ui-btn-up-c { border: 1px solid #ccc; background: #eee; font-weight: bold; color: #444; cursor: pointer; text-shadow: 0 1px 1px #f6f6f6; text-decoration: none; background-image: -moz-linear-gradient(top, #fdfdfd, #eeeeee); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fdfdfd),color-stop(1, #eeeeee)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fdfdfd', EndColorStr='#eeeeee')"; } +.ui-btn-up-c a.ui-link-inherit { color: #2F3E46; } + +.ui-btn-hover-c { border: 1px solid #aaa; background: #f5f5f5; font-weight: bold; color: #111111; text-decoration: none; text-shadow: 0 1px 1px #fff; background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #ffffff),color-stop(1, #f5f5f5)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#f5f5f5')"; } +.ui-btn-hover-c a.ui-link-inherit { color: #2F3E46; } + +.ui-btn-down-c { border: 1px solid #808080; background: #fdfdfd; font-weight: bold; color: #111111; text-shadow: 0 1px 1px #ffffff; background-image: -moz-linear-gradient(top, #eeeeee, #fdfdfd); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #eeeeee),color-stop(1, #fdfdfd)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#fdfdfd')"; } +.ui-btn-down-c a.ui-link-inherit { color: #2F3E46; } +.ui-btn-up-c, .ui-btn-hover-c, .ui-btn-down-c { font-family: Helvetica, Arial, sans-serif; } + + +.ui-bar-d { border: 1px solid #ccc; background: #bbb; color: #333; text-shadow: 0 1px 0 #eee; background-image: -moz-linear-gradient(top, #ddd, #bbb); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #ddd),color-stop(1, #bbb)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ddd', EndColorStr='#bbb')"; } +.ui-bar-d, .ui-bar-d input, .ui-bar-d select, .ui-bar-d textarea, .ui-bar-d button { font-family: Helvetica, Arial, sans-serif; } +.ui-bar-d .ui-link-inherit { color: #333; } +.ui-bar-d .ui-link { color: #2489CE; font-weight: bold; } + +.ui-body-d { border: 1px solid #ccc; color: #333333; text-shadow: 0 1px 0 #fff; background: #ffffff; } +.ui-body-d, .ui-body-d input, .ui-body-d select, .ui-body-d textarea, .ui-body-d button { font-family: Helvetica, Arial, sans-serif; } +.ui-body-d .ui-link-inherit { color: #333333; } +.ui-body-d .ui-link { color: #2489CE; font-weight: bold; } + +.ui-btn-up-d { border: 1px solid #ccc; background: #fff; font-weight: bold; color: #444; text-decoration: none; text-shadow: 0 1px 1px #fff; } +.ui-btn-up-d a.ui-link-inherit { color: #333; } +.ui-btn-hover-d { border: 1px solid #aaa; background: #eeeeee; font-weight: bold; color: #222; cursor: pointer; text-shadow: 0 1px 1px #fff; text-decoration: none; background-image: -moz-linear-gradient(top, #fdfdfd, #eeeeee); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fdfdfd),color-stop(1, #eeeeee)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fdfdfd', EndColorStr='#eeeeee')"; } +.ui-btn-hover-d a.ui-link-inherit { color: #222; } + +.ui-btn-down-d { border: 1px solid #aaaaaa; background: #ffffff; font-weight: bold; color: #111; text-shadow: 0 1px 1px #ffffff; background-image: -moz-linear-gradient(top, #eeeeee, #ffffff); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #eeeeee),color-stop(1, #ffffff)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#ffffff')"; } +.ui-btn-down-d a.ui-link-inherit { border: 1px solid #808080; background: #ced0d2; font-weight: bold; color: #111; text-shadow: none; background-image: -moz-linear-gradient(top, #cccccc, #eeeeee); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #cccccc),color-stop(1, #eeeeee)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#cccccc', EndColorStr='#eeeeee')"; } +.ui-btn-up-d, .ui-btn-hover-d, .ui-btn-down-d { font-family: Helvetica, Arial, sans-serif; } + + +.ui-bar-e { border: 1px solid #F7C942; background: #fadb4e; color: #333; text-shadow: 0 1px 0 #fff; background-image: -moz-linear-gradient(top, #fceda7, #fadb4e); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fceda7),color-stop(1, #fadb4e)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fceda7', EndColorStr='#fadb4e')"; } +.ui-bar-e, .ui-bar-e input, .ui-bar-e select, .ui-bar-e textarea, .ui-bar-d button { font-family: Helvetica, Arial, sans-serif; } +.ui-bar-e .ui-link-inherit { color: #333; } +.ui-bar-e .ui-link { color: #2489CE; font-weight: bold; } + +.ui-body-e { border: 1px solid #F7C942; color: #333333; text-shadow: 0 1px 0 #fff; background: #faeb9e; background-image: -moz-linear-gradient(top, #fff, #faeb9e); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #faeb9e)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#faeb9e')"; } +.ui-body-e, .ui-body-e input, .ui-body-e select, .ui-body-e textarea, .ui-body-e button { font-family: Helvetica, Arial, sans-serif; } +.ui-body-e .ui-link-inherit { color: #333333; } +.ui-body-e .ui-link { color: #2489CE; font-weight: bold; } + + +.ui-btn-up-e { border: 1px solid #F7C942; background: #fadb4e; font-weight: bold; color: #333; cursor: pointer; text-shadow: 0 1px 1px #fe3; text-decoration: none; text-shadow: 0 1px 0 #fff; background-image: -moz-linear-gradient(top, #fceda7, #fadb4e); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fceda7),color-stop(1, #fadb4e)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fceda7', EndColorStr='#fadb4e')"; } +.ui-btn-up-e a.ui-link-inherit { color: #333; } + +.ui-btn-hover-e { border: 1px solid #e79952; background: #fbe26f; font-weight: bold; color: #111; text-decoration: none; text-shadow: 0 1px 1px #fff; background-image: -moz-linear-gradient(top, #fcf0b5, #fbe26f); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fcf0b5),color-stop(1, #fbe26f)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fcf0b5', EndColorStr='#fbe26f')"; } + +.ui-btn-hover-e a.ui-link-inherit { color: #333; } +.ui-btn-down-e { border: 1px solid #F7C942; background: #fceda7; font-weight: bold; color: #111; text-shadow: 0 1px 1px #ffffff; background-image: -moz-linear-gradient(top, #fadb4e, #fceda7); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fadb4e),color-stop(1, #fceda7)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fadb4e', EndColorStr='#fceda7')"; } +.ui-btn-down-e a.ui-link-inherit { color: #333; } +.ui-btn-up-e, .ui-btn-hover-e, .ui-btn-down-e { font-family: Helvetica, Arial, sans-serif; } + + +/* links within "buttons" */ +a.ui-link-inherit { text-decoration: none !important; } + +/* Active class used as the "on" state across all themes */ +.ui-btn-active { border: 1px solid #155678; background: #4596ce; font-weight: bold; color: #fff; cursor: pointer; text-shadow: 0 -1px 1px #145072; text-decoration: none; background-image: -moz-linear-gradient(top, #85bae4, #5393c5); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #85bae4),color-stop(1, #5393c5)); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#85bae4', EndColorStr='#5393c5')"; } +.ui-btn-active a.ui-link-inherit { color: #fff; } + +/* button inner top highlight */ +.ui-btn-inner { border-top: 1px solid