Date picker and bylines for platforms`
Date picker and bylines for platforms`

  <?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();
  ?>
  <?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>";
  $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'].';', '', $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");
  }
  echo "updated ".$outdatedroute['fromlocation']."->".$outdatedroute['tolocation']."<br>";
 
  $updatedroutes++;
  }
  echo "updated $updatedroutes routes<br>";
  }
  }
  flush();
  ?>
  <?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 = '".pg_escape_string($outdatedroute['fromlocation']).
  "' AND tolocation = '".pg_escape_string($outdatedroute['tolocation'])."' ";
  $result = pg_query($conn, $sql);
  if (!$result) {
  echo("Error in SQL query: " . pg_last_error() . "<br>\n");
  }
  echo "updated ".$outdatedroute['fromlocation']."->".$outdatedroute['tolocation']."<br>";
  $updatedroutes++;
  }
  echo "updated $updatedroutes routes<br>";
  }
  }
  flush();
  ?>
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<script src="openlayers/OpenLayers.js"></script> <script src="openlayers/OpenLayers.js"></script>
<SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT>
<script type="text/javascript" src="jquery.1.3.2.min.js"></script> <script type="text/javascript" src="jquery.1.3.2.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
   
function init() function init()
{ {
// create the ol map object // create the ol map object
var map = new OpenLayers.Map('map'); 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", "/tiles/${z}/${x}/${y}.png")
// use http://open.atlas.free.fr/GMapsTransparenciesImgOver.php and http://code.google.com/p/googletilecutter/ to make tiles // 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"); 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 <?php
$conn = pg_connect("dbname=bus user=postgres password=snmc"); $conn = pg_connect("dbname=bus user=postgres password=snmc");
if (!$conn) { if (!$conn) {
echo "An error occured.\n"; echo "An error occured.\n";
exit; exit;
} }
$result_stops = pg_query($conn, "Select * FROM stops"); $result_stops = pg_query($conn, "Select * FROM stops");
while ($stop = pg_fetch_assoc($result_stops)) { while ($stop = pg_fetch_assoc($result_stops)) {
echo 'marker = new OpenLayers.Marker(new OpenLayers.LonLat(' . ($stop['lng'] / 10000000) . "," . ($stop['lat'] / 10000000) . ') echo 'marker = new OpenLayers.Marker(new OpenLayers.LonLat(' . ($stop['lng'] / 10000000) . "," . ($stop['lat'] / 10000000) . ')
.transform( .transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984 new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection
));'; ));';
echo ' echo '
marker.id="' . $stop['geohash'] . '"; marker.id="' . $stop['geohash'] . '";
markers.addMarker(marker); markers.addMarker(marker);
marker.events.register("mousedown", marker, function() { marker.events.register("mousedown", marker, function() {
   
document.getElementById("between_points").innerHTML += this.id+";"; document.getElementById("between_points").innerHTML += this.id+";";
  $(\'form input[name="oldgeopo"]\').val(this.id);
}); });
'; ';
} }
?> ?>
var timeicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png",new OpenLayers.Size(32,32)); var timeicon = new OpenLayers.Icon("icong.png",new OpenLayers.Size(16,16));
var timepoints = new OpenLayers.Layer.GeoRSS("Timing Points", "displaytimepoints.georss.php", { icon: timeicon }); var timepoints = new OpenLayers.Layer.GeoRSS("Timing Points", "displaytimepoints.georss.php", { icon: timeicon });
   
map.addLayers([osmtiles, markers,timepoints]); map.addLayers([osmtiles, markers,timepoints]);
map.addControl(new OpenLayers.Control.LayerSwitcher()); map.addControl(new OpenLayers.Control.LayerSwitcher());
map.zoomToExtent(markers.getDataExtent()); map.zoomToExtent(markers.getDataExtent());
} }
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
function submitBetween () { function submitBetween () {
$.post("betweenpoint.submit.php", $("#inputform").serialize(), function(html){ $.post("betweenpoint.submit.php", $("#inputform").serialize(), function(html){
$("#response").html(html); $("#response").html(html);
//clearForms(); clearForms();
return false; 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) function OnChange(dropdown)
{ {
var myindex = dropdown.selectedIndex var myindex = dropdown.selectedIndex
var selValue = dropdown.options[myindex].value; var selValue = dropdown.options[myindex].value;
$("#routes").val(selValue.split(":",2)[0]); $("#routes").val(selValue.split(":",2)[0]);
fromto = selValue.split(":",2)[1]; fromto = selValue.split(":",2)[1];
$("#from").val(fromto.split("->",2)[0]); $("#from").val(fromto.split("->",2)[0]);
$("#to").val(fromto.split("->",2)[1]); $("#to").val(fromto.split("->",2)[1]);
document.getElementById("between_points").innerHTML = ""; document.getElementById("between_points").innerHTML = "";
return true; return true;
} }
   
// function will clear input elements on each form // function will clear input elements on each form
function clearForms(){ function clearForms(){
document.getElementById("between_points").innerHTML = ""; document.getElementById("between_points").innerHTML = "";
// declare element type // declare element type
var type = null; var type = null;
// loop through forms on HTML page // loop through forms on HTML page
for (var x=0; x<document.forms.length; x++){ for (var x=0; x<document.forms.length; x++){
// loop through each element on form // loop through each element on form
for (var y=0; y<document.forms[x].elements.length; y++){ for (var y=0; y<document.forms[x].elements.length; y++){
// define element type // define element type
type = document.forms[x].elements[y].type type = document.forms[x].elements[y].type
// alert before erasing form element // alert before erasing form element
//alert('form='+x+' element='+y+' type='+type); //alert('form='+x+' element='+y+' type='+type);
// switch on element type // switch on element type
switch(type){ switch(type){
case "text": case "text":
case "textarea": case "textarea":
case "password": case "password":
//case "hidden": //case "hidden":
document.forms[x].elements[y].value = ""; document.forms[x].elements[y].value = "";
break; break;
case "radio": case "radio":
case "checkbox": case "checkbox":
document.forms[x].elements[y].checked = true; document.forms[x].elements[y].checked = true;
break; break;
case "select-one": case "select-one":
document.forms[x].elements[y].options[0].selected = true; document.forms[x].elements[y].options[0].selected = true;
break; break;
case "select-multiple": case "select-multiple":
for (z=0; z<document.forms[x].elements[y].options.length; z++){ for (z=0; z<document.forms[x].elements[y].options.length; z++){
document.forms[x].elements[y].options[z].selected = false; document.forms[x].elements[y].options[z].selected = false;
} }
break; break;
} }
} }
} }
} }
</script> </script>
   
</head> </head>
<body onload="init()"> <body onload="init()">
<div id="inputpane"><form id="inputform"> <div id="inputpane"><form id="inputform">
<select name=selectPair onchange='OnChange(this.form.selectPair);'> <select name=selectPair onchange='OnChange(this.form.selectPair);'>
<option>Select a from/to pair...</option> <option>Select a from/to pair...</option>
<?php <?php
include('spyc/spyc.php'); include('spyc/spyc.php');
//$timetable = Spyc::YAMLLoad('../spyc.yaml'); //$timetable = Spyc::YAMLLoad('../spyc.yaml');
$path = "maxious-canberra-transit-feed/output/"; $path = "maxious-canberra-transit-feed/output/";
$dhandle = opendir("maxious-canberra-transit-feed/output/"); $dhandle = opendir("maxious-canberra-transit-feed/output/");
// define an array to hold the files // define an array to hold the files
$files = array(); $files = array();
$paths = array(); $paths = array();
if ($dhandle) { if ($dhandle) {
// loop through all of the files // loop through all of the files
while (false !== ($fname = readdir($dhandle))) { while (false !== ($fname = readdir($dhandle))) {
if (($fname != '.') && ($fname != '..')) { if (($fname != '.') && ($fname != '..')) {
$timetable = Spyc::YAMLLoad("maxious-canberra-transit-feed/output/" . $fname); $timetable = Spyc::YAMLLoad("maxious-canberra-transit-feed/output/" . $fname);
// Strip off individual platforms because it usually doesn't matter for routes // Strip off individual platforms because it usually doesn't matter for routes
$timetable["time_points"] = preg_replace("/\(Platform.*/","",$timetable["time_points"]); $timetable["time_points"] = preg_replace("/\(Platform.*/","",$timetable["time_points"]);
for ($i = 0; $i < sizeof($timetable["time_points"]) - 1; $i++) { for ($i = 0; $i < sizeof($timetable["time_points"]) - 1; $i++) {
$key = trim($timetable["time_points"][$i]) . "->" . trim($timetable["time_points"][$i + 1]); $key = trim($timetable["time_points"][$i]) . "->" . trim($timetable["time_points"][$i + 1]);
if (strstr($paths[$key],";" . $timetable["short_name"] . ";") === false) if (strstr($paths[$key],";" . $timetable["short_name"] . ";") === false)
@$paths[$key] .= $timetable["short_name"] . ";"; @$paths[$key] .= $timetable["short_name"] . ";";
} }
} }
} }
} }
ksort($paths); ksort($paths);
$completedPaths = array(); $completedPaths = array();
$result_betweenstops = pg_query($conn, "Select * FROM between_stops"); $result_betweenstops = pg_query($conn, "Select * FROM between_stops");
while ($path = pg_fetch_assoc($result_betweenstops)) { while ($path = pg_fetch_assoc($result_betweenstops)) {
$key = trim($path['fromlocation']) . "->" . trim($path['tolocation']); $key = trim($path['fromlocation']) . "->" . trim($path['tolocation']);
$completedPaths[$key].= trim($path['routes']); $completedPaths[$key].= trim($path['routes']);
} }
   
  $processed = 0;
foreach ($paths as $path => $routes) { foreach ($paths as $path => $routes) {
if (!in_array($path, array_keys($completedPaths))) { if (!in_array($path, array_keys($completedPaths))) {
echo "<option value=\"$routes:$path\">" . sizeof(explode(";", $routes)) . " $path</option>\n"; echo "<option value=\"$routes:$path\"> $path ($routes) </option>\n";
  $processed++;
} else { } else {
$completedRoutes = explode(";", $completedPaths[$path]); $completedRoutes = explode(";", $completedPaths[$path]);
$incompleteRoutes = ""; $incompleteRoutes = "";
foreach (explode(";", $routes) as $route) { foreach (explode(";", $routes) as $route) {
   
if (!in_array($route,$completedRoutes) && strstr($incompleteRoutes,';'.$route.';') === false) { if (!in_array($route,$completedRoutes) && strstr($incompleteRoutes,';'.$route.';') === false) {
$incompleteRoutes .= $route.';'; $incompleteRoutes .= $route.';';
} }
} }
if ($incompleteRoutes != "") { if ($incompleteRoutes != "") {
echo "<option value=\"$incompleteRoutes:$path\">" . sizeof(explode(";", $incompleteRoutes)) . " $path</option>\n"; echo "<option value=\"$incompleteRoutes:$path\"> $path ($incompleteRoutes) </option>\n";
  $processed++;
} }
} }
} }
  echo "</select>$processed";
?> ?>
</select>  
from <input type="text" name="from" id="from"/> from <input type="text" name="from" id="from"/>
to <input type="text" name="to" id="to"/> to <input type="text" name="to" id="to"/>
<br> <br>
on routes <input type="text" name="routes" id="routes"/> on routes <input type="text" name="routes" id="routes"/>
Reverse? <input type="checkbox" name="reverse" id="reverse" checked="true"/> Reverse? <input type="checkbox" name="reverse" id="reverse" checked="true"/>
<input type="button" onclick="javascript:submitBetween()" value="Submit!"> <input type="button" onclick="javascript:submitBetween()" value="Submit!">
<input type="button" value="Clear" onclick="javascript:clearForms()" title="Start clearForms() JavaScript function"> <input type="button" value="Clear" onclick="javascript:clearForms()" title="Start clearForms() JavaScript function">
<br> <br>
<textarea name="between_points" id="between_points" rows="1" cols="120"></textarea> <textarea name="between_points" id="between_points" rows="1" cols="120"></textarea>
</form> </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"> <div id="response">
<!-- Our message will be echoed out here --> <!-- Our message will be echoed out here -->
</div> </div>
</div> </div>
<div id="map" width="100%" height="100%"></div> <div id="map" width="100%" height="100%"></div>
</body> </body>
</html> </html>
   
<?php <?php
$conn = pg_connect("dbname=bus user=postgres password=snmc"); $conn = pg_connect("dbname=bus user=postgres password=snmc");
if (!$conn) { if (!$conn) {
echo "An error occured.\n"; echo "An error occured.\n";
exit; exit;
} }
print_r($_REQUEST); print_r($_REQUEST);
$reverse=$_REQUEST["reverse"]; $reverse=(isset($_REQUEST["reverse"]) ? $_REQUEST["reverse"] : "off");
$from=pg_escape_string($_REQUEST["from"]); $from=pg_escape_string($_REQUEST["from"]);
$to=pg_escape_string($_REQUEST["to"]); $to=pg_escape_string($_REQUEST["to"]);
$routes=$_REQUEST["routes"] ; $routes=$_REQUEST["routes"] ;
$points=$_REQUEST["between_points"]; $points=$_REQUEST["between_points"];
$sql = "INSERT INTO between_stops (fromLocation, toLocation, points, routes) VALUES('$from','$to','$points','$routes')"; $sql = "INSERT INTO between_stops (fromLocation, toLocation, points, routes) VALUES('$from','$to','$points','$routes')";
$result = pg_query($conn, $sql); $result = pg_query($conn, $sql);
if (!$result) { if (!$result) {
echo("Error in SQL query: " . pg_last_error() ."<br>\n"); echo("Error in SQL query: " . pg_last_error() ."<br>\n");
} }
if ($reverse === "on") { if ($reverse === "on") {
$ep = explode(";",$points); $ep = explode(";",$points);
$epr = array_reverse($ep); $epr = array_reverse($ep);
$p = implode(";",$epr).";"; $p = implode(";",$epr).";";
$pointsString = substr($p,1); $pointsString = substr($p,1);
$sql = "INSERT INTO between_stops ( toLocation, fromLocation, points, routes) VALUES('$from','$to','$pointsString','$routes')"; $sql = "INSERT INTO between_stops ( toLocation, fromLocation, points, routes) VALUES('$from','$to','$pointsString','$routes')";
$result = pg_query($conn, $sql); $result = pg_query($conn, $sql);
if (!$result) { if (!$result) {
echo("Error in SQL query: " . pg_last_error() ."<br>\n"); echo("Error in SQL query: " . pg_last_error() ."<br>\n");
} }
} }
flush(); flush();
?> ?>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
?> ?>
<p> <p>
  Busness Time - An ACT bus timetable webapp
  Based on the maxious-canberra-transit-feed
  Uses jQuery Mobile, PHP, Ruby, Python, Google Transit Feed Specification tools, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder and Tile Service
   
  Feedback encouraged; contact maxious@lambdacomplex.org
   
Some icons by Joseph Wain / glyphish.com Some icons by Joseph Wain / glyphish.com
   
   
  Disclaimer: The content of this website is of a general and informative nature. Please check with printed timetables or those available on http://action.act.gov.au before your trip.
  Whilst every effort has been made to ensure the high quality and accuracy of the Site, the Author makes no warranty,
  express or implied concerning the topicality, correctness, completeness or quality of the information, which is provided
  "as is". The Author expressly disclaims all warranties, including but not limited to warranties of fitness for a particular purpose and warranties of merchantability.
  All offers are not binding and without obligation. The Author expressly reserves the right, in his discretion, to suspend,
  change, modify, add or remove portions of the Site and to restrict or terminate the use and accessibility of the Site
  without prior notice.
<? <?
include_footer(); include_footer();
?> ?>
   
<?php <?php
date_default_timezone_set('Australia/ACT'); date_default_timezone_set('Australia/ACT');
$APIurl = "http://localhost:8765"; $APIurl = "http://localhost:8765";
error_reporting(E_ALL ^ E_NOTICE); error_reporting(E_ALL ^ E_NOTICE);
// you have to open the session to be able to modify or remove it // you have to open the session to be able to modify or remove it
session_start(); session_start();
   
function isDebug() function isDebug()
{ {
return $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME']; return $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME'];
} }
   
function debug($msg) { function debug($msg) {
if (isDebug()) echo "<!-- $msg -->"; if (isDebug()) echo "<!-- $msg -->";
} }
function isFastDevice() { function isFastDevice() {
return true; return true;
} }
   
function include_header($pageTitle, $opendiv = true, $geolocate = false) { function include_header($pageTitle, $opendiv = true, $geolocate = false) {
// this starts the session // this starts the session
session_start(); session_start();
// if (isDebug()) // set php error level high // if (isDebug()) // set php error level high
echo ' echo '
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>bus.lambdacomplex.org - '.$pageTitle.'</title> <title>busness time - '.$pageTitle.'</title>
'; ';
if (isDebug()) echo '<link rel="stylesheet" href="jquery-mobile-1.0a2.css" /> if (isDebug()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" />
<script type="text/javascript" src="jquery-mobile-1.0a2.js"></script>'; <script type="text/javascript" src="js/jquery-1.5.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="js/jquery-mobile-1.0a3.js"></script>';
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a2/jquery.mobile-1.0a2.min.js"></script>'; else echo '<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.css" />
  <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.js"></script>
  <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.js"></script>';
echo ' echo '
  <link rel="stylesheet" href="css/jquery.ui.datepicker.mobile.css" />
  <script>
  //reset type=date inputs to text
  $( document ).bind( "mobileinit", function(){
  $.mobile.page.prototype.options.degradeInputs.date = true;
  });
  </script>
  <script src="js/jQuery.ui.datepicker.js"></script>
  <script src="js/jquery.ui.datepicker.mobile.js"></script>
<style type="text/css"> <style type="text/css">
.ui-navbar { .ui-navbar {
padding-bottom: 18px; padding-bottom: 18px;
width: 100%; width: 100%;
} }
</style> </style>
<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" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-startup-image" href="startup.png" /> <link rel="apple-touch-startup-image" href="startup.png" />
<link rel="apple-touch-icon" href="apple-touch-icon.png" />'; <link rel="apple-touch-icon" href="apple-touch-icon.png" />';
if ($geolocate) { if ($geolocate) {
echo "<script> echo "<script>
   
function setCookie(c_name,value,expiredays) function setCookie(c_name,value,expiredays)
{ {
var exdate=new Date(); var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays); exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ \"=\" +escape(value)+ document.cookie=c_name+ \"=\" +escape(value)+
((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString()); ((expiredays==null) ? \"\" : \";expires=\"+exdate.toUTCString());
} }
   
function getCookie(c_name) function getCookie(c_name)
{ {
if (document.cookie.length>0) if (document.cookie.length>0)
{ {
c_start=document.cookie.indexOf(c_name + \"=\"); c_start=document.cookie.indexOf(c_name + \"=\");
if (c_start!=-1) if (c_start!=-1)
{ {
c_start=c_start + c_name.length+1; c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(\";\",c_start); c_end=document.cookie.indexOf(\";\",c_start);
if (c_end==-1) c_end=document.cookie.length; if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end)); return unescape(document.cookie.substring(c_start,c_end));
} }
} }
return \"\"; return \"\";
} }
   
function success(position) { function success(position) {
$('#geolocate').val(position.coords.latitude+','+position.coords.longitude); $('#geolocate').val(position.coords.latitude+','+position.coords.longitude);
setCookie('geolocate',position.coords.latitude+','+position.coords.longitude,1); setCookie('geolocate',position.coords.latitude+','+position.coords.longitude,1);
} }
   
function error(msg) { function error(msg) {
console.log(msg); console.log(msg);
} }
   
if (navigator.geolocation) { if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success, error); navigator.geolocation.getCurrentPosition(success, error);
} }
   
</script> "; </script> ";
} }
echo '</head> echo '</head>
<body> <body>
'; ';
if ($opendiv) echo '<div data-role="page"> if ($opendiv) echo '<div data-role="page">
<div data-role="header"> <div data-role="header">
<h1>'.$pageTitle.'</h1> <h1>'.$pageTitle.'</h1>
</div><!-- /header --> </div><!-- /header -->
<div data-role="content"> '; <div data-role="content"> ';
} }
   
function include_footer() function include_footer()
{ {
echo '</div>'; echo '</div>';
} }
   
$service_periods = Array ('sunday','saturday','weekday'); $service_periods = Array ('sunday','saturday','weekday');
   
function service_period() function service_period()
{ {
if (isset($_SESSION['service_period'])) return $_SESSION['service_period']; if (isset($_SESSION['service_period'])) return $_SESSION['service_period'];
   
switch (date('w')){ switch (date('w')){
   
case 0: case 0:
return 'sunday'; return 'sunday';
case 6: case 6:
return 'saturday'; return 'saturday';
default: default:
return 'weekday'; return 'weekday';
} }
} }
   
function remove_spaces($string) function remove_spaces($string)
{ {
return str_replace(' ','',$string); return str_replace(' ','',$string);
} }
   
function midnight_seconds() function midnight_seconds()
{ {
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html
if (isset($_SESSION['time'])) { if (isset($_SESSION['time'])) {
$time = mkdate($_SESSION['time']); $time = mkdate($_SESSION['time']);
return (date("G",$time) * 3600) + (date("i",$time) * 60) + date("s",$time); return (date("G",$time) * 3600) + (date("i",$time) * 60) + date("s",$time);
} }
return (date("G") * 3600) + (date("i") * 60) + date("s"); return (date("G") * 3600) + (date("i") * 60) + date("s");
} }
   
function midnight_seconds_to_time($seconds) function midnight_seconds_to_time($seconds)
{ {
  if ($seconds > 0) {
$midnight = mktime (0, 0, 0, date("n"), date("j"), date("Y")); $midnight = mktime (0, 0, 0, date("n"), date("j"), date("Y"));
return date("h:ia",$midnight+$seconds); return date("h:ia",$midnight+$seconds);
  } else {
  return "";
  }
} }
function getPage($url) function getPage($url)
{ {
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_HEADER, 0 ); curl_setopt( $ch, CURLOPT_HEADER, 0 );
  curl_setopt($ch,CURLOPT_TIMEOUT,30);
$page = curl_exec($ch); $page = curl_exec($ch);
  if(curl_errno($ch)) echo "<font color=red> Database temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch)."</font>";
curl_close($ch); curl_close($ch);
return $page; return $page;
} }
function array_flatten($a,$f=array()){ function array_flatten($a,$f=array()){
if(!$a||!is_array($a))return ''; if(!$a||!is_array($a))return '';
foreach($a as $k=>$v){ foreach($a as $k=>$v){
if(is_array($v))$f=array_flatten($v,$f); if(is_array($v))$f=array_flatten($v,$f);
else $f[$k]=$v; else $f[$k]=$v;
} }
return $f; return $f;
} }
   
function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb") function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb")
{ {
$width = 300; $width = 300;
$height = 300; $height = 300;
$metersperpixel[9]=305.492*$width; $metersperpixel[9]=305.492*$width;
$metersperpixel[10]=152.746*$width; $metersperpixel[10]=152.746*$width;
$metersperpixel[11]=76.373*$width; $metersperpixel[11]=76.373*$width;
$metersperpixel[12]=38.187*$width; $metersperpixel[12]=38.187*$width;
$metersperpixel[13]=19.093*$width; $metersperpixel[13]=19.093*$width;
$metersperpixel[14]=9.547*$width; $metersperpixel[14]=9.547*$width;
$metersperpixel[15]=4.773*$width; $metersperpixel[15]=4.773*$width;
$metersperpixel[16]=2.387*$width; $metersperpixel[16]=2.387*$width;
// $metersperpixel[17]=1.193*$width; // $metersperpixel[17]=1.193*$width;
$center = ""; $center = "";
$markers = ""; $markers = "";
$minlat = 999; $minlat = 999;
$minlon = 999; $minlon = 999;
$maxlat = 0; $maxlat = 0;
$maxlon = 0; $maxlon = 0;
   
if (sizeof($mapPoints) < 1) return "map error"; if (sizeof($mapPoints) < 1) return "map error";
if (sizeof($mapPoints) === 1) { if (sizeof($mapPoints) === 1) {
if ($zoom == 0) $zoom = 14; if ($zoom == 0) $zoom = 14;
$markers .= "{$mapPoints[0][0]},{$mapPoints[0][1]},$markerimage"; $markers .= "{$mapPoints[0][0]},{$mapPoints[0][1]},$markerimage";
$center = "{$mapPoints[0][0]},{$mapPoints[0][1]}"; $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}";
} else { } else {
foreach ($mapPoints as $index => $mapPoint) { foreach ($mapPoints as $index => $mapPoint) {
$markers .= $mapPoint[0].",".$mapPoint[1].",".$markerImage.($index+1); $markers .= $mapPoint[0].",".$mapPoint[1].",".$markerImage.($index+1);
if ($index+1 != sizeof($mapPoints)) $markers .= "|"; if ($index+1 != sizeof($mapPoints)) $markers .= "|";
if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0]; if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0];
if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0]; if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0];
if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1]; if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1];
if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1]; if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1];
$totalLat += $mapPoint[0]; $totalLat += $mapPoint[0];
$totalLon += $mapPoint[1]; $totalLon += $mapPoint[1];
} }
if ($zoom == 0) { if ($zoom == 0) {
$mapwidthinmeters = distance($minlat,$minlon,$minlat,$maxlon); $mapwidthinmeters = distance($minlat,$minlon,$minlat,$maxlon);
foreach (array_reverse($metersperpixel,true) as $zoomLevel => $maxdistance) foreach (array_reverse($metersperpixel,true) as $zoomLevel => $maxdistance)
{ {
if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel; if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel;
} }
} }
$center = $totalLat/sizeof($mapPoints).",".$totalLon/sizeof($mapPoints); $center = $totalLat/sizeof($mapPoints).",".$totalLon/sizeof($mapPoints);
} }
return '<img src="staticmaplite/staticmap.php?center='.$center.'&zoom='.$zoom.'&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width='.$width.' height='.$height.'>'; return '<img src="staticmaplite/staticmap.php?center='.$center.'&zoom='.$zoom.'&size='.$width.'x'.$height.'&maptype=mapnik&markers='.$markers.'" width='.$width.' height='.$height.'>';
} }
   
function distance($lat1, $lng1, $lat2, $lng2) function distance($lat1, $lng1, $lat2, $lng2)
{ {
$pi80 = M_PI / 180; $pi80 = M_PI / 180;
$lat1 *= $pi80; $lat1 *= $pi80;
$lng1 *= $pi80; $lng1 *= $pi80;
$lat2 *= $pi80; $lat2 *= $pi80;
$lng2 *= $pi80; $lng2 *= $pi80;
   
$r = 6372.797; // mean radius of Earth in km $r = 6372.797; // mean radius of Earth in km
$dlat = $lat2 - $lat1; $dlat = $lat2 - $lat1;
$dlng = $lng2 - $lng1; $dlng = $lng2 - $lng1;
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a)); $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = $r * $c; $km = $r * $c;
   
return $km * 1000; return $km * 1000;
} }
   
function decodePolylineToArray($encoded) function decodePolylineToArray($encoded)
{ {
// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 // source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5
$length = strlen($encoded); $length = strlen($encoded);
$index = 0; $index = 0;
$points = array(); $points = array();
$lat = 0; $lat = 0;
$lng = 0; $lng = 0;
   
while ($index < $length) while ($index < $length)
{ {
// Temporary variable to hold each ASCII byte. // Temporary variable to hold each ASCII byte.
$b = 0; $b = 0;
   
// The encoded polyline consists of a latitude value followed by a // The encoded polyline consists of a latitude value followed by a
// longitude value. They should always come in pairs. Read the // longitude value. They should always come in pairs. Read the
// latitude value first. // latitude value first.
$shift = 0; $shift = 0;
$result = 0; $result = 0;
do do
{ {
// The `ord(substr($encoded, $index++))` statement returns the ASCII // The `ord(substr($encoded, $index++))` statement returns the ASCII
// code for the character at $index. Subtract 63 to get the original // code for the character at $index. Subtract 63 to get the original
// value. (63 was added to ensure proper ASCII characters are displayed // value. (63 was added to ensure proper ASCII characters are displayed
// in the encoded polyline string, which is `human` readable) // in the encoded polyline string, which is `human` readable)
$b = ord(substr($encoded, $index++)) - 63; $b = ord(substr($encoded, $index++)) - 63;
   
// AND the bits of the byte with 0x1f to get the original 5-bit `chunk. // AND the bits of the byte with 0x1f to get the original 5-bit `chunk.
// Then left shift the bits by the required amount, which increases // Then left shift the bits by the required amount, which increases
// by 5 bits each time. // by 5 bits each time.
// OR the value into $results, which sums up the individual 5-bit chunks // OR the value into $results, which sums up the individual 5-bit chunks
// into the original value. Since the 5-bit chunks were reversed in // into the original value. Since the 5-bit chunks were reversed in
// order during encoding, reading them in this way ensures proper // order during encoding, reading them in this way ensures proper
// summation. // summation.
$result |= ($b & 0x1f) << $shift; $result |= ($b & 0x1f) << $shift;
$shift += 5; $shift += 5;
} }
// Continue while the read byte is >= 0x20 since the last `chunk` // Continue while the read byte is >= 0x20 since the last `chunk`
// was not OR'd with 0x20 during the conversion process. (Signals the end) // was not OR'd with 0x20 during the conversion process. (Signals the end)
while ($b >= 0x20); while ($b >= 0x20);
   
// Check if negative, and convert. (All negative values have the last bit // Check if negative, and convert. (All negative values have the last bit
// set) // set)
$dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1));
   
// Compute actual latitude since value is offset from previous value. // Compute actual latitude since value is offset from previous value.
$lat += $dlat; $lat += $dlat;
   
// The next values will correspond to the longitude for this point. // The next values will correspond to the longitude for this point.
$shift = 0; $shift = 0;
$result = 0; $result = 0;
do do
{ {
$b = ord(substr($encoded, $index++)) - 63; $b = ord(substr($encoded, $index++)) - 63;
$result |= ($b & 0x1f) << $shift; $result |= ($b & 0x1f) << $shift;
$shift += 5; $shift += 5;
} }
while ($b >= 0x20); while ($b >= 0x20);
   
$dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1));
$lng += $dlng; $lng += $dlng;
   
// The actual latitude and longitude values were multiplied by // The actual latitude and longitude values were multiplied by
// 1e5 before encoding so that they could be converted to a 32-bit // 1e5 before encoding so that they could be converted to a 32-bit
// integer representation. (With a decimal accuracy of 5 places) // integer representation. (With a decimal accuracy of 5 places)
// Convert back to original values. // Convert back to original values.
$points[] = array($lat * 1e-5, $lng * 1e-5); $points[] = array($lat * 1e-5, $lng * 1e-5);
} }
   
return $points; return $points;
} }
   
function object2array($object) { function object2array($object) {
if (is_object($object)) { if (is_object($object)) {
foreach ($object as $key => $value) { foreach ($object as $key => $value) {
$array[$key] = $value; $array[$key] = $value;
} }
} }
else { else {
$array = $object; $array = $object;
} }
return $array; return $array;
} }
   
function geocode($query, $giveOptions) { function geocode($query, $giveOptions) {
$url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?query=".$query."&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true"; $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?query=".$query."&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true";
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
if ($giveOptions) return $contents->features; if ($giveOptions) return $contents->features;
elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1]; elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1];
else return ""; else return "";
} }
   
function reverseGeocode($lat,$lng) { function reverseGeocode($lat,$lng) {
$url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".$lat.",".$lng."&distance=closest&object_type=road"; $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".$lat.",".$lng."&distance=closest&object_type=road";
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
return $contents->features[0]->properties->name; return $contents->features[0]->properties->name;
} }
   
function startsWith($haystack,$needle,$case=true) { function startsWith($haystack,$needle,$case=true) {
if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);} if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0); return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
} }
   
function endsWith($haystack,$needle,$case=true) { function endsWith($haystack,$needle,$case=true) {
if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);} if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0); return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
} }
  function bracketsMeanNewLine($input) {
  return str_replace(")","</small>",str_replace("(","<br><small>",$input));
  }
?> ?>
   
  /*!
  * jQuery Mobile v1.0a3
  * http://jquerymobile.com/
  *
  * Copyright 2010, jQuery Project
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  */
  /*!
  * jQuery Mobile v1.0a3
  * http://jquerymobile.com/
  *
  * Copyright 2010, jQuery Project
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  */.ui-bar-a{border:1px solid #2a2a2a;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-moz-linear-gradient(top,#3c3c3c,#111);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3c3c3c),color-stop(1,#111));-msfilter:"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:#222;color:#fff;text-shadow:0 1px 0 #000;font-weight:normal;background-image:-moz-linear-gradient(top,#666,#222);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#666),color-stop(1,#222));-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:#333;font-weight:bold;color:#fff;cursor:pointer;text-shadow:0 -1px 1px #000;text-decoration:none;background-image:-moz-linear-gradient(top,#555,#333);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#555),color-stop(1,#333));-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:#444;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;text-decoration:none;background-image:-moz-linear-gradient(top,#666,#444);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#666),color-stop(1,#444));-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,#333,#5a5a5a);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#333),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:#ccc;color:#333;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-moz-linear-gradient(top,#e6e6e6,#ccc);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#e6e6e6),color-stop(1,#ccc));-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:#333}.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:#333;text-shadow:0 1px 0 #fff;background:#f0f0f0;background-image:-moz-linear-gradient(top,#eee,#ddd);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eee),color-stop(1,#ddd));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#dddddd')"}.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:#333}.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,#fefefe,#eee);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fdfdfd),color-stop(1,#eee));-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 #bbb;background:#dadada;font-weight:bold;color:#101010;text-decoration:none;text-shadow:0 1px 1px #fff;background-image:-moz-linear-gradient(top,#ededed,#dadada);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ededed),color-stop(1,#dadada));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr='#ededed', EndColorStr='#dadada')"}.ui-btn-hover-c a.ui-link-inherit{color:#2f3e46}.ui-btn-down-c{border:1px solid #808080;background:#fdfdfd;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-moz-linear-gradient(top,#eee,#fdfdfd);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eee),color-stop(1,#fdfdfd));-msfilter:"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='#dddddd', EndColorStr='#bbbbbb')"}.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:#333;text-shadow:0 1px 0 #fff;background:#fff}.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:#333}.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:#eee;font-weight:bold;color:#222;cursor:pointer;text-shadow:0 1px 1px #fff;text-decoration:none;background-image:-moz-linear-gradient(top,#fdfdfd,#eee);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fdfdfd),color-stop(1,#eee));-msfilter:"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 #aaa;background:#fff;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-moz-linear-gradient(top,#eee,#fff);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#eee),color-stop(1,#fff));-msfilter:"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,#ccc,#eee);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ccc),color-stop(1,#eee));-msfilter:"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));-msfilter:"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:#333;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));-msfilter:"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:#333}.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));-msfilter:"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 #fff;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}a.ui-link-inherit{text-decoration:none!important}.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));-msfilter:"progid:DXImageTransform.Microsoft.gradient(startColorStr='#85bae4', EndColorStr='#5393c5')";outline:0}.ui-btn-active a.ui-link-inherit{color:#fff}.ui-btn-inner{border-top:1px solid #fff;border-color:rgba(255,255,255,.3)}.ui-corner-tl{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em}.ui-corner-tr{-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em}.ui-corner-bl{-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em}.ui-corner-br{-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-top{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em;-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em}.ui-corner-bottom{-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em;-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-right{-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em;-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-left{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em;-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em}.ui-corner-all{-moz-border-radius:.6em;-webkit-border-radius:.6em;border-radius:.6em}.ui-disabled{opacity:.3}.ui-disabled,.ui-disabled a{cursor:default!important}.ui-icon{background-image:url(images/icons-18-white.png);background-repeat:no-repeat;background-color:#666;background-color:rgba(0,0,0,.4);-moz-border-radius:9px;-webkit-border-radius:9px;border-radius:9px}.ui-icon-disc{background-color:#666;background-color:rgba(0,0,0,.3);-moz-border-radius:9px;-webkit-border-radius:9px;border-radius:9px}.ui-icon-black{background-image:url(images/icons-18-black.png)}.ui-icon-black-disc{background-color:#fff;background-color:rgba(255,255,255,.3);-moz-border-radius:9px;-webkit-border-radius:9px;border-radius:9px}@media screen and (-webkit-min-device-pixel-ratio:2),screen and (max--moz-device-pixel-ratio:2){.ui-icon{background-image:url(images/icons-36-white.png);background-size:630px 18px}.ui-icon-black{background-image:url(images/icons-36-black.png)}}.ui-icon-plus{background-position:-0 0}.ui-icon-minus{background-position:-36px 0}.ui-icon-delete{background-position:-72px 0}.ui-icon-arrow-r{background-position:-108px 0}.ui-icon-arrow-l{background-position:-144px 0}.ui-icon-arrow-u{background-position:-180px 0}.ui-icon-arrow-d{background-position:-216px 0}.ui-icon-check{background-position:-252px 0}.ui-icon-gear{background-position:-288px 0}.ui-icon-refresh{background-position:-324px 0}.ui-icon-forward{background-position:-360px 0}.ui-icon-back{background-position:-396px 0}.ui-icon-grid{background-position:-432px 0}.ui-icon-star{background-position:-468px 0}.ui-icon-alert{background-position:-504px 0}.ui-icon-info{background-position:-540px 0}.ui-icon-home{background-position:-576px 0}.ui-icon-search{background-position:-612px 0}.ui-icon-checkbox-off,.ui-icon-checkbox-on,.ui-icon-radio-off,.ui-icon-radio-on{background-color:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;background-size:20px 20px}.ui-icon-checkbox-off{background-image:url(images/form-check-off.png)}.ui-icon-checkbox-on{background-image:url(images/form-check-on.png)}.ui-icon-radio-off{background-image:url(images/form-radio-off.png)}.ui-icon-radio-on{background-image:url(images/form-radio-on.png)}.ui-icon-searchfield{background-image:url(images/icon-search-black.png);background-size:16px 16px}.ui-icon-loading{background-image:url(images/ajax-loader.png);width:40px;height:40px;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background-size:35px 35px}.ui-btn-corner-tl{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em}.ui-btn-corner-tr{-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em}.ui-btn-corner-bl{-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em}.ui-btn-corner-br{-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-top{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em;-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em}.ui-btn-corner-bottom{-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em;-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-right{-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em;-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-left{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em;-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em}.ui-btn-corner-all{-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.ui-corner-tl,.ui-corner-tr,.ui-corner-bl,.ui-corner-br,.ui-corner-top,.ui-corner-bottom,.ui-corner-right,.ui-corner-left,.ui-corner-all,.ui-btn-corner-tl,.ui-btn-corner-tr,.ui-btn-corner-bl,.ui-btn-corner-br,.ui-btn-corner-top,.ui-btn-corner-bottom,.ui-btn-corner-right,.ui-btn-corner-left,.ui-btn-corner-all{-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.ui-overlay{background:#666;opacity:.5;filter:Alpha(Opacity=50);position:absolute;width:100%;height:100%}.ui-overlay-shadow{-moz-box-shadow:0 0 12px rgba(0,0,0,.6);-webkit-box-shadow:0 0 12px rgba(0,0,0,.6);box-shadow:0 0 12px rgba(0,0,0,.6)}.ui-shadow{-moz-box-shadow:0 1px 4px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 4px rgba(0,0,0,.3);box-shadow:0 1px 4px rgba(0,0,0,.3)}.ui-bar-a .ui-shadow,.ui-bar-b .ui-shadow,.ui-bar-c .ui-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.ui-shadow-inset{-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);box-shadow:inset 0 1px 4px rgba(0,0,0,.2)}.ui-icon-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.4);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.4);box-shadow:0 1px 0 rgba(255,255,255,.4)}.ui-focus{-moz-box-shadow:0 0 12px #387bbe;-webkit-box-shadow:0 0 12px #387bbe;box-shadow:0 0 12px #387bbe}.ui-mobile-nosupport-boxshadow *{-moz-box-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui-mobile-nosupport-boxshadow .ui-focus{outline-width:2px}.ui-mobile fieldset,.ui-page{padding:0;margin:0}.ui-mobile a img,.ui-mobile fieldset{border:0}.ui-mobile-viewport{margin:0;overflow-x:hidden;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}[data-role=page],[data-role=dialog],.ui-page{top:0;left:0;width:100%;min-height:100%;position:absolute;display:none;border:0}.ui-page-active{display:block;overflow:visible}.portrait,.portrait .ui-page{min-height:480px}.landscape,.landscape .ui-page{min-height:320px}.ui-loading .ui-mobile-viewport{overflow:hidden!important}.ui-loading .ui-loader{display:block}.ui-loading .ui-page{overflow:hidden}.ui-loader{display:none;position:absolute;opacity:.85;z-index:10;left:50%;width:200px;margin-left:-130px;margin-top:-35px;padding:10px 30px}.ui-loader h1{font-size:15px;text-align:center}.ui-loader .ui-icon{position:static;display:block;opacity:.9;margin:0 auto;width:35px;height:35px;background-color:transparent}.ui-mobile-rendering>*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{display:block}.ui-page .ui-header,.ui-page .ui-footer{position:relative}.ui-header .ui-btn-left{position:absolute;left:10px;top:.4em}.ui-header .ui-title,.ui-footer .ui-title{text-align:center;font-size:16px;display:block;margin:.6em 90px .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-header .ui-btn-right{position:absolute;right:10px;top:.4em}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.fade.out{z-index:0;-webkit-animation-name:fadeout}.ui-mobile-viewport-perspective{-webkit-perspective:1000;position:absolute}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.flip{-webkit-animation-duration:.65s;-webkit-backface-visibility:hidden;-webkit-transform:translateX(0)}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(-180deg) scale(.8)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(180deg) scale(.8)}}@-webkit-keyframes dontmove{from{opacity:1}to{opacity:1}}.pop{-webkit-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);opacity:1;-webkit-animation-name:popin;z-index:10}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.2);opacity:0}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header,.ui-footer,.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{position:absolute;overflow:hidden;width:100%;border-left-width:0;border-right-width:0}.ui-header-fixed,.ui-footer-fixed{z-index:1000;-webkit-transform:translateZ(0)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar li.ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;font-size:12px;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar li .ui-btn,.ui-header .ui-navbar .ui-navbar-toggle .ui-btn,.ui-footer .ui-navbar li .ui-btn,.ui-footer .ui-navbar .ui-navbar-toggle .ui-btn{border-top-width:0;border-bottom-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons li .ui-btn .ui-btn-inner,.ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded li .ui-btn .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.ui-btn:focus,.ui-btn:active{outline:0}.ui-header .ui-btn,.ui-footer .ui-btn,.ui-bar .ui-btn{display:inline-block;font-size:13px;margin:0}.ui-btn-inline{display:inline-block}.ui-btn-inner{padding:.6em 25px;display:block;height:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{display:inline-block;width:20px;height:20px;padding:2px 1px 2px 3px;text-indent:-9999px}.ui-btn-icon-notext .ui-btn-inner{padding:0}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-999px}.ui-btn-icon-left .ui-btn-inner{padding-left:33px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-bar .ui-btn-icon-left .ui-btn-inner{padding-left:27px}.ui-btn-icon-right .ui-btn-inner{padding-right:33px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-bar .ui-btn-icon-right .ui-btn-inner{padding-right:27px}.ui-btn-icon-top .ui-btn-inner{padding-top:33px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner,.ui-bar .ui-btn-icon-top .ui-btn-inner{padding-top:27px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:33px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner,.ui-bar .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:27px}.ui-btn-icon-notext .ui-icon{display:block}.ui-btn-icon-left .ui-icon,.ui-btn-icon-right .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-icon,.ui-btn-icon-bottom .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-bar .ui-btn-icon-left .ui-icon{left:4px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-bar .ui-btn-icon-right .ui-icon{right:4px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-bar .ui-btn-icon-top .ui-icon{top:4px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-bar .ui-btn-icon-bottom .ui-icon{bottom:4px}.ui-btn-icon-top .ui-icon{top:5px}.ui-btn-icon-bottom .ui-icon{bottom:5px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:0;cursor:pointer}.ui-collapsible-contain{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -8px;padding:0;border-width:0 0 1px 0;position:relative}.ui-collapsible-heading a{text-align:left;margin:0}.ui-collapsible-heading a .ui-btn-inner{padding-left:40px}.ui-collapsible-heading a span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;left:-9999px}.ui-collapsible-content{display:block;padding:10px 0 10px 8px}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible-contain{margin:-1px 0 0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0 1em}.ui-bar .ui-controlgroup{margin:0 .3em}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em}.ui-controlgroup-controls{display:block;width:95%}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{margin:0 -5px 0 0;display:inline-block}.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup-horizontal .ui-controlgroup-last{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}.min-width-480px .ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.min-width-480px .ui-controlgroup-controls{width:60%;display:inline-block}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{margin:15px;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{z-index:10;width:auto}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.ui-checkbox,.ui-radio{position:relative;margin:.2em 0 .5em;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin:0;text-align:left;z-index:2}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain{background:0;padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}.min-width-480px .ui-field-contain{border-width:0;padding:0;margin:1em 0}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;height:100%;opacity:.001}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:inline-block;min-height:1em}.ui-select .ui-btn-text{text-overflow:ellipsis;overflow:hidden;width:85%}.ui-selectmenu{position:absolute;padding:0;z-index:100!important;width:80%;max-width:350px;padding:6px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.min-width-480px label.ui-select{display:inline-block;width:20%;margin:0 2% 0 0}.min-width-480px .ui-select{width:60%;display:inline-block}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;line-height:1.4;font-size:16px;display:block;width:95%}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;width:77%;background-position:8px 50%;background-repeat:no-repeat;position:relative}.ui-input-search input.ui-input-text{border:0;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-14px}.ui-input-search .ui-input-clear-hidden{display:none}.min-width-480px label.ui-input-text{vertical-align:top}.min-width-480px label.ui-input-text{display:inline-block;width:20%;margin:0 2% 0 0}.min-width-480px input.ui-input-text,.min-width-480px textarea.ui-input-text,.min-width-480px .ui-input-search{width:60%;display:inline-block}.min-width-480px .ui-input-search{width:50%}.ui-listview{margin:0;counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-listview,.ui-li{list-style:none;padding:0;zoom:1}.ui-li{display:block;margin:0;position:relative;overflow:hidden;text-align:left;border-width:0;border-top-width:1px}.ui-li .ui-btn-text{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-divider,.ui-li-static{padding:.5em 15px;font-size:14px;font-weight:bold;counter-reset:listnumbering}ol.ui-listview .ui-link-inherit:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li:last-child{border-bottom-width:1px}.ui-li .ui-btn-inner{display:block;position:relative;padding:.7em 75px .7em 15px}.ui-li-has-thumb .ui-btn-inner{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner{min-height:20px;padding-left:40px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}.min-width-480px .ui-li-aside{width:45%}.ui-li-has-alt .ui-btn-inner{padding-right:95px}.ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:38px}.ui-li-divider .ui-li-count{right:10px}.ui-li-has-alt .ui-li-count{right:55px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px}.ui-li-link-alt .ui-btn-inner{padding:0;position:static}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{display:block}input.ui-slider-input,.min-width-480px input.ui-slider-input{display:inline-block;width:50px}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:66%}a.ui-slider-handle{position:absolute;z-index:10;top:50%;width:28px;height:28px;margin-top:-15px;margin-left:-15px}a.ui-slider-handle .ui-btn-inner{padding-left:0;padding-right:0}.min-width-480px label.ui-slider{display:inline-block;width:20%;margin:0 2% 0 0}.min-width-480px div.ui-slider{width:45%}div.ui-slider-switch{height:32px;overflow:hidden;margin-left:0}div.ui-slider-inneroffset{margin-left:50%;position:absolute;top:1px;height:100%;width:50%}div.ui-slider-handle-snapping{-webkit-transition:left 100ms linear}div.ui-slider-labelbg{position:absolute;top:0;margin:0;border-width:0}div.ui-slider-switch div.ui-slider-labelbg-a{width:60%;height:100%;left:0}div.ui-slider-switch div.ui-slider-labelbg-b{width:60%;height:100%;right:0}.ui-slider-switch-a div.ui-slider-labelbg-a,.ui-slider-switch-b div.ui-slider-labelbg-b{z-index:1}.ui-slider-switch-a div.ui-slider-labelbg-b,.ui-slider-switch-b div.ui-slider-labelbg-a{z-index:10}div.ui-slider-switch a.ui-slider-handle{z-index:20;width:101%;height:32px;margin-top:-18px;margin-left:-101%}span.ui-slider-label{width:100%;position:absolute;height:32px;font-size:16px;text-align:center;line-height:2;background:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px}
  /*
  * jQuery UI Datepicker @VERSION
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Datepicker#theming
  */
  div.hasDatepicker{ display: block; padding: 0; overflow: visible; margin: 8px 0; }
  .ui-datepicker { overflow: visible; margin: 0; max-width: 500px; }
  .ui-datepicker .ui-datepicker-header { position:relative; padding:.4em 0; border-bottom: 0; font-weight: bold; }
  .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { padding: 1px 0 1px 2px; position:absolute; top: .5em; margin-top: 0; text-indent: -9999px; }
 
  .ui-datepicker .ui-datepicker-prev { left:6px; }
  .ui-datepicker .ui-datepicker-next { right:6px; }
  .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
  .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
  .ui-datepicker select.ui-datepicker-month-year {width: 100%;}
  .ui-datepicker select.ui-datepicker-month,
  .ui-datepicker select.ui-datepicker-year { width: 49%;}
  .ui-datepicker table {width: 100%; border-collapse: collapse; margin:0; }
  .ui-datepicker td { border-width: 1px; padding: 0; text-align: center; }
  .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em 0; font-weight: bold; margin: 0; border-width: 0; text-align: center; text-decoration: none; }
 
  .ui-datepicker-calendar th { padding-top: .3em; padding-bottom: .3em; }
  .ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default { opacity: .3; }
  .ui-datepicker-calendar td a { padding-top: .5em; padding-bottom: .5em; }
 
  .min-width-480px div.hasDatepicker { width: 63%; display: inline-block; margin: 0; }
<?php <?php
include('common.inc.php'); include('common.inc.php');
// remove all the variable in the session // remove all the variable in the session
session_unset(); session_unset();
   
//destroy the session //destroy the session
session_destroy(); session_destroy();
if (isset($_REQUEST['service_period'])) $_SESSION['service_period'] = $_REQUEST['service_period']; if (isset($_REQUEST['service_period'])) $_SESSION['service_period'] = $_REQUEST['service_period'];
if (isset($_REQUEST['time'])) $_SESSION['time'] = $_REQUEST['time']; 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) 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 data-role="page">
<div id="jqm-homeheader"> <div data-role="content">
<center><h1 id="jqm-logo"><img src="apple-touch-icon.png" alt="logo" width="64" height="64" /><br> <div id="jqm-homeheader">
bus.lambdacomplex.org</h1></center> <center><h3 id="jqm-logo"><img src="apple-touch-icon.png" alt="logo" width="64" height="64" /><br>
  busness time</h3></center>
</div> </div>
<div data-role="content">  
<a href="tripPlanner.php" data-role="button">Launch Trip Planner...</a> <a href="tripPlanner.php" data-role="button">Launch Trip Planner...</a>
<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
<li data-role="list-divider">Timetables - Stops</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">Major (Timing Point) Stops</a></li>
<li><a href="stopList.php">All Stops</a></li> <li><a href="stopList.php">All Stops</a></li>
<li><a href="stopList.php?nearbyfavs=yes">Nearby/Favourite Stops</a></li> <li><a href="stopList.php?nearbyfavs=yes">Nearby/Favourite Stops</a></li>
</ul> </ul>
<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b"> <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
<li data-role="list-divider">Timetables - Routes</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">Routes By Final Destination</a></li>
<li><a href="routeList.php?bynumber=yes">Routes By Number</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> <li><a href="routeList.php?nearbyfavs=yes">Nearby/Favourites Routes</a></li>
</ul> </ul>
<div class="ui-body ui-body-c"> <div class="ui-body ui-body-c">
<h3>Time/Place Settings</h3> <h3>Time/Place Settings</h3>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="geolocate"> Current Location: </label> <label for="geolocate"> Current Location: </label>
<input type="text" id="geolocate" name="geolocate"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a> <input type="text" id="geolocate" name="geolocate"/> <a href="#" style="display:none" name="here" id="here"/>Here?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="time"> Time: </label> <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> <input type="time" value="<?php echo date("H:m"); ?>"/> <a href="#" style="display:none" name="currentTime" id="currentTime"/>Current Time?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="service_period"> Service Period: </label> <label for="service_period"> Service Period: </label>
<select name="service_period"> <select name="service_period">
<?php <?php
foreach ($service_periods as $service_period) { foreach ($service_periods as $service_period) {
echo "<option value=\"$service_period\"".(service_period() === $service_period ? "SELECTED" : "").'>'.ucwords($service_period).'</option>'; echo "<option value=\"$service_period\"".(service_period() === $service_period ? "SELECTED" : "").'>'.ucwords($service_period).'</option>';
}?> }?>
</select> </select>
<a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a> <a href="#" style="display:none" name="currentPeriod" id="currentPeriod"/>Current Period?</a>
</div> </div>
<input type="submit" value="Update"/> <input type="submit" value="Update"/>
</div> </div>
<script> <script>
$('#here').click(function(event) { $('#geolocate').val(getCookie('geolocate')); return false;}); $('#here').click(function(event) { $('#geolocate').val(getCookie('geolocate')); return false;});
$('#here').show(); $('#here').show();
</script> </script>
</div> </div>
</div> </div>
</body> </body>
</html> </html>
   
 
 
/*  
* 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 #fff; border-color: rgba(255,255,255,.3); }  
 
 
/* Container Corner radius */  
.ui-corner-tl { -moz-border-radius-topleft: .6em; -webkit-border-top-left-radius: .6em; border-top-left-radius: .6em; }  
.ui-corner-tr { -moz-border-radius-topright: .6em; -webkit-border-top-right-radius: .6em; border-top-right-radius: .6em; }  
.ui-corner-bl { -moz-border-radius-bottomleft: .6em; -webkit-border-bottom-left-radius: .6em; border-bottom-left-radius: .6em; }  
.ui-corner-br { -moz-border-radius-bottomright: .6em; -webkit-border-bottom-right-radius: .6em; border-bottom-right-radius: .6em; }  
.ui-corner-top { -moz-border-radius-topleft: .6em; -webkit-border-top-left-radius: .6em; border-top-left-radius: .6em; -moz-border-radius-topright: .6em; -webkit-border-top-right-radius: .6em; border-top-right-radius: .6em; }  
.ui-corner-bottom { -moz-border-radius-bottomleft: .6em; -webkit-border-bottom-left-radius: .6em; border-bottom-left-radius: .6em; -moz-border-radius-bottomright: .6em; -webkit-border-bottom-right-radius: .6em; border-bottom-right-radius: .6em; }  
.ui-corner-right { -moz-border-radius-topright: .6em; -webkit-border-top-right-radius: .6em; border-top-right-radius: .6em; -moz-border-radius-bottomright: .6em; -webkit-border-bottom-right-radius: .6em; border-bottom-right-radius: .6em; }  
.ui-corner-left { -moz-border-radius-topleft: .6em; -webkit-border-top-left-radius: .6em; border-top-left-radius: .6em; -moz-border-radius-bottomleft: .6em; -webkit-border-bottom-left-radius: .6em; border-bottom-left-radius: .6em; }  
.ui-corner-all { -moz-border-radius: .6em; -webkit-border-radius: .6em; border-radius: .6em; }  
 
 
 
/* Interaction Cues  
----------------------------------*/  
.ui-disabled { cursor: default !important; opacity: .3; }  
 
/* Icons  
----------------------------------*/  
/* .ui-icon { background-position: 50% 50%; background-repeat: no-repeat; background-color: #fff; background-color: rgba(0,0,0,.4); -moz-border-radius: 9px; -webkit-border-radius: 9px; border-radius: 9px; } */  
 
.ui-icon { background-image: url(images/icons-18-white.png); background-repeat: no-repeat; background-color: #666; background-color: rgba(0,0,0,.4); -moz-border-radius: 9px; -webkit-border-radius: 9px; border-radius: 9px; }  
.ui-icon-disc { background-color: #666; background-color: rgba(0,0,0,.3); -moz-border-radius: 9px; -webkit-border-radius: 9px; border-radius: 9px; }  
 
/* alt color */  
.ui-icon-black { background-image: url(images/icons-18-black.png); }  
.ui-icon-black-disc { background-color: #fff; background-color: rgba(255,255,255,.3); -moz-border-radius: 9px; -webkit-border-radius: 9px; border-radius: 9px; }  
 
/* retina */  
@media screen and (-webkit-min-device-pixel-ratio: 2), screen and (max--moz-device-pixel-ratio: 2) {  
.ui-icon { background-image: url(images/icons-36-white.png); background-size: 558px 18px; }  
.ui-icon-black { background-image: url(images/icons-36-black.png); }  
}  
 
/*plus minus*/  
.ui-icon-plus { background-position: -0 0; }  
.ui-icon-minus { background-position: -36px 0; }  
 
/* delete/close */  
.ui-icon-delete { background-position: -72px 0; }  
 
/*arrows*/  
.ui-icon-arrow-r { background-position: -108px 0; }  
.ui-icon-arrow-l { background-position: -144px 0; }  
.ui-icon-arrow-u { background-position: -180px 0; }  
.ui-icon-arrow-d { background-position: -216px 0; }  
 
.ui-icon-check { background-position: -252px 0; }  
.ui-icon-gear { background-position: -288px 0; }  
.ui-icon-refresh { background-position: -324px 0; }  
.ui-icon-forward { background-position: -360px 0; }  
.ui-icon-back { background-position: -396px 0; }  
 
.ui-icon-grid { background-position: -432px 0; }  
.ui-icon-star { background-position: -468px 0; }  
.ui-icon-alert { background-position: -504px 0; }  
.ui-icon-info { background-position: -540px 0; }  
 
/*checks,radios*/  
.ui-icon-checkbox-off,  
.ui-icon-checkbox-on,  
.ui-icon-radio-off,  
.ui-icon-radio-on { background-color: transparent; -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; background-size: 20px 20px; }  
 
.ui-icon-checkbox-off { background-image: url(images/form-check-off.png); }  
.ui-icon-checkbox-on { background-image: url(images/form-check-on.png); }  
.ui-icon-radio-off { background-image: url(images/form-radio-off.png);}  
.ui-icon-radio-on { background-image: url(images/form-radio-on.png); }  
 
.ui-icon-search { background-image: url(images/icon-search-black.png); background-size: 16px 16px; }  
 
/* loading icon */  
.ui-icon-loading { background-image: url(images/ajax-loader.png); width: 40px; height: 40px; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; background-size: 35px 35px; }  
 
/* btn Corner radius */  
.ui-btn-corner-tl { -moz-border-radius-topleft: 1em; -webkit-border-top-left-radius: 1em; border-top-left-radius: 1em; }  
.ui-btn-corner-tr { -moz-border-radius-topright: 1em; -webkit-border-top-right-radius: 1em; border-top-right-radius: 1em; }  
.ui-btn-corner-bl { -moz-border-radius-bottomleft: 1em; -webkit-border-bottom-left-radius: 1em; border-bottom-left-radius: 1em; }  
.ui-btn-corner-br { -moz-border-radius-bottomright: 1em; -webkit-border-bottom-right-radius: 1em; border-bottom-right-radius: 1em; }  
.ui-btn-corner-top { -moz-border-radius-topleft: 1em; -webkit-border-top-left-radius: 1em; border-top-left-radius: 1em; -moz-border-radius-topright: 1em; -webkit-border-top-right-radius: 1em; border-top-right-radius: 1em; }  
.ui-btn-corner-bottom { -moz-border-radius-bottomleft: 1em; -webkit-border-bottom-left-radius: 1em; border-bottom-left-radius: 1em; -moz-border-radius-bottomright: 1em; -webkit-border-bottom-right-radius: 1em; border-bottom-right-radius: 1em; }  
.ui-btn-corner-right { -moz-border-radius-topright: 1em; -webkit-border-top-right-radius: 1em; border-top-right-radius: 1em; -moz-border-radius-bottomright: 1em; -webkit-border-bottom-right-radius: 1em; border-bottom-right-radius: 1em; }  
.ui-btn-corner-left { -moz-border-radius-topleft: 1em; -webkit-border-top-left-radius: 1em; border-top-left-radius: 1em; -moz-border-radius-bottomleft: 1em; -webkit-border-bottom-left-radius: 1em; border-bottom-left-radius: 1em; }  
.ui-btn-corner-all { -moz-border-radius: 1em; -webkit-border-radius: 1em; border-radius: 1em;}  
 
/* radius clip */  
.ui-corner-tl, .ui-corner-tr, .ui-corner-bl,  
.ui-corner-br, .ui-corner-top, .ui-corner-bottom,  
.ui-corner-right, .ui-corner-left, .ui-corner-all,  
.ui-btn-corner-tl, .ui-btn-corner-tr, .ui-btn-corner-bl,  
.ui-btn-corner-br, .ui-btn-corner-top, .ui-btn-corner-bottom,  
.ui-btn-corner-right, .ui-btn-corner-left, .ui-btn-corner-all {  
-webkit-background-clip: padding-box;  
-moz-background-clip: padding-box;  
background-clip: padding-box;  
}  
 
/* Overlays */  
.ui-overlay { background: #666; opacity: .5; filter:Alpha(Opacity=50); position: absolute; width: 100%; height: 100%; }  
.ui-overlay-shadow { -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6); -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6); box-shadow: 0px 0px 12px rgba(0,0,0,.6); }  
 
.ui-shadow { -moz-box-shadow: 0px 1px 4px rgba(0,0,0,.3); -webkit-box-shadow: 0px 1px 4px rgba(0,0,0,.3); box-shadow: 0px 1px 4px rgba(0,0,0,.3); }  
.ui-bar-a .ui-shadow, .ui-bar-b .ui-shadow , .ui-bar-c .ui-shadow { -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3); -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3); box-shadow: 0px 1px 0 rgba(255,255,255,.3); }  
.ui-shadow-inset { -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); }  
.ui-icon-shadow { -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4); -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4); box-shadow: 0px 1px 0 rgba(255,255,255,.4); }  
 
/* set focus state last */  
.ui-focus { outline-width: 0; -moz-box-shadow: 0px 0px 12px #387bbe; -webkit-box-shadow: 0px 0px 12px #387bbe; box-shadow: 0px 0px 12px #387bbe; }  
 
/* unset box shadow in browsers that don't do it right */  
.ui-mobile-nosupport-boxshadow * { -moz-box-shadow: none !important; -webkit-box-shadow: none !important; box-shadow: none !important; }  
.ui-mobile-nosupport-boxshadow .ui-focus { outline-width: 2px; }  
 
 
/*  
* 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  
*/  
 
/* some unsets - more probably needed */  
.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; }  
.ui-mobile a img, .ui-mobile fieldset { border: 0; }  
 
/* responsive page widths */  
.ui-mobile-viewport { margin: 0; overflow-x: hidden; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }  
 
/*orientations from js are available */  
.portrait { }  
.landscape { }  
 
/* "page" containers - full-screen views, one should always be in view post-pageload */  
.ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; }  
.ui-page-active { display: block; overflow: visible; min-height: 100%; }  
 
/* loading screen */  
.ui-loading .ui-mobile-viewport { overflow: hidden !important; }  
.ui-loading .ui-loader { display: block; }  
.ui-loading .ui-page { overflow: hidden; }  
.ui-loader { display: none; position: absolute; opacity: .85; z-index: 10; top: 75px; left: 50%; width: 200px; margin-left: -130px; padding: 20px 30px; }  
.ui-loader h1 { font-size: 15px; text-align: center; }  
.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; }  
 
/*fouc*/  
.ui-mobile-rendering > * { visibility: hidden; }  
 
/*headers, content panels*/  
.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; }  
.ui-bar { font-size: 16px; margin: 0; }  
.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; }  
 
.ui-header, .ui-footer { display: block; }  
.ui-page .ui-header, .ui-page .ui-footer { position: relative; }  
.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; }  
.ui-header .ui-title, .ui-footer .ui-title { text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; }  
.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; }  
 
/*content area*/  
.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; }  
.ui-page-fullscreen .ui-content { padding:0; }  
 
/* icons sizing */  
.ui-icon { width: 18px; height: 18px; }  
 
/* fullscreen class on ui-content div */  
.ui-fullscreen { }  
.ui-fullscreen img { max-width: 100%; }  
 
/* non-js content hiding */  
.ui-nojs { position: absolute; left: -9999px; }  
 
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.spin {  
-webkit-transform: rotate(360deg);  
-webkit-animation-name: spin;  
-webkit-animation-duration: 1s;  
-webkit-animation-iteration-count: infinite;  
}  
@-webkit-keyframes spin {  
from {-webkit-transform: rotate(0deg);}  
to {-webkit-transform: rotate(360deg);}  
}  
 
/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/  
Built by David Kaneda and maintained by Jonathan Stark.  
*/  
.in, .out {  
-webkit-animation-timing-function: ease-in-out;  
-webkit-animation-duration: 350ms;  
}  
 
.slide.in {  
-webkit-transform: translateX(0);  
-webkit-animation-name: slideinfromright;  
}  
 
.slide.out {  
-webkit-transform: translateX(-100%);  
-webkit-animation-name: slideouttoleft;  
}  
 
.slide.in.reverse {  
-webkit-transform: translateX(0);  
-webkit-animation-name: slideinfromleft;  
}  
 
.slide.out.reverse {  
-webkit-transform: translateX(100%);  
-webkit-animation-name: slideouttoright;  
}  
 
.slideup.in {  
-webkit-transform: translateY(0);  
-webkit-animation-name: slideinfrombottom;  
z-index: 10;  
}  
 
.slideup.out {  
-webkit-animation-name: dontmove;  
z-index: 0;  
}  
 
.slideup.out.reverse {  
-webkit-transform: translateY(100%);  
z-index: 10;  
-webkit-animation-name: slideouttobottom;  
}  
 
.slideup.in.reverse {  
z-index: 0;  
-webkit-animation-name: dontmove;  
}  
.slidedown.in {  
-webkit-transform: translateY(0);  
-webkit-animation-name: slideinfromtop;  
z-index: 10;  
}  
 
.slidedown.out {  
-webkit-animation-name: dontmove;  
z-index: 0;  
}  
 
.slidedown.out.reverse {  
-webkit-transform: translateY(-100%);  
z-index: 10;  
-webkit-animation-name: slideouttotop;  
}  
 
.slidedown.in.reverse {  
z-index: 0;  
-webkit-animation-name: dontmove;  
}  
 
@-webkit-keyframes slideinfromright {  
from { -webkit-transform: translateX(100%); }  
to { -webkit-transform: translateX(0); }  
}  
 
@-webkit-keyframes slideinfromleft {  
from { -webkit-transform: translateX(-100%); }  
to { -webkit-transform: translateX(0); }  
}  
 
@-webkit-keyframes slideouttoleft {  
from { -webkit-transform: translateX(0); }  
to { -webkit-transform: translateX(-100%); }  
}  
 
@-webkit-keyframes slideouttoright {  
from { -webkit-transform: translateX(0); }  
to { -webkit-transform: translateX(100%); }  
}  
 
 
@-webkit-keyframes slideinfromtop {  
from { -webkit-transform: translateY(-100%); }  
to { -webkit-transform: translateY(0); }  
}  
 
@-webkit-keyframes slideinfrombottom {  
from { -webkit-transform: translateY(100%); }  
to { -webkit-transform: translateY(0); }  
}  
 
@-webkit-keyframes slideouttobottom {  
from { -webkit-transform: translateY(0); }  
to { -webkit-transform: translateY(100%); }  
}  
 
@-webkit-keyframes slideouttotop {  
from { -webkit-transform: translateY(0); }  
to { -webkit-transform: translateY(-100%); }  
}  
@-webkit-keyframes fadein {  
from { opacity: 0; }  
to { opacity: 1; }  
}  
 
@-webkit-keyframes fadeout {  
from { opacity: 1; }  
to { opacity: 0; }  
}  
 
.fade.in {  
opacity: 1;  
z-index: 10;  
-webkit-animation-name: fadein;  
}  
.fade.out {  
z-index: 0;  
}  
 
/* The properties in this body rule are only necessary for the 'flip' transition.  
* We need specify the perspective to create a projection matrix. This will add  
* some depth as the element flips. The depth number represents the distance of  
* the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate  
* value.  
*/  
.ui-mobile-viewport-transitioning {  
-webkit-perspective: 1000;  
position: absolute;  
}  
 
.ui-mobile-viewport-transitioning,  
.ui-mobile-viewport-transitioning .ui-page {  
width: 100%;  
height: 100%;  
overflow: hidden;  
}  
 
.flip {  
-webkit-animation-duration: .65s;  
-webkit-backface-visibility:hidden;  
-webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */  
}  
 
.flip.in {  
-webkit-transform: rotateY(0) scale(1);  
-webkit-animation-name: flipinfromleft;  
}  
 
.flip.out {  
-webkit-transform: rotateY(-180deg) scale(.8);  
-webkit-animation-name: flipouttoleft;  
}  
 
/* Shake it all about */  
 
.flip.in.reverse {  
-webkit-transform: rotateY(0) scale(1);  
-webkit-animation-name: flipinfromright;  
}  
 
.flip.out.reverse {  
-webkit-transform: rotateY(180deg) scale(.8);  
-webkit-animation-name: flipouttoright;  
}  
 
@-webkit-keyframes flipinfromright {  
from { -webkit-transform: rotateY(-180deg) scale(.8); }  
to { -webkit-transform: rotateY(0) scale(1); }  
}  
 
@-webkit-keyframes flipinfromleft {  
from { -webkit-transform: rotateY(180deg) scale(.8); }  
to { -webkit-transform: rotateY(0) scale(1); }  
}  
 
@-webkit-keyframes flipouttoleft {  
from { -webkit-transform: rotateY(0) scale(1); }  
to { -webkit-transform: rotateY(-180deg) scale(.8); }  
}  
 
@-webkit-keyframes flipouttoright {  
from { -webkit-transform: rotateY(0) scale(1); }  
to { -webkit-transform: rotateY(180deg) scale(.8); }  
}  
 
 
/* Hackish, but reliable. */  
 
@-webkit-keyframes dontmove {  
from { opacity: 1; }  
to { opacity: 1; }  
}  
 
.pop {  
-webkit-transform-origin: 50% 50%;  
}  
 
.pop.in {  
-webkit-transform: scale(1);  
opacity: 1;  
-webkit-animation-name: popin;  
z-index: 10;  
}  
 
.pop.out.reverse {  
-webkit-transform: scale(.2);  
opacity: 0;  
-webkit-animation-name: popout;  
z-index: 10;  
}  
 
.pop.in.reverse {  
z-index: 0;  
-webkit-animation-name: dontmove;  
}  
 
@-webkit-keyframes popin {  
from {  
-webkit-transform: scale(.2);  
opacity: 0;  
}  
to {  
-webkit-transform: scale(1);  
opacity: 1;  
}  
}  
 
@-webkit-keyframes popout {  
from {  
-webkit-transform: scale(1);  
opacity: 1;  
}  
to {  
-webkit-transform: scale(.2);  
opacity: 0;  
}  
}  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
 
/* content configurations. */  
.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }  
.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; }  
 
/* grid a: 50/50 */  
.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; }  
.ui-grid-a .ui-block-a { clear: left; }  
 
/* grid b: 33/33/33 */  
.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; }  
.ui-grid-b .ui-block-a { clear: left; }  
 
/* grid c: 25/25/25/25 */  
.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; }  
.ui-grid-c .ui-block-a { clear: left; }  
 
/* grid d: 20/20/20/20/20 */  
.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; }  
.ui-grid-d .ui-block-a { clear: left; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
/* fixed page header & footer configuration */  
.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; }  
.ui-header-fixed, .ui-footer-fixed {  
z-index: 1000;  
-webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */  
}  
.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; }  
.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; }  
 
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-navbar { overflow: hidden; }  
.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;}  
.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; }  
.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; }  
.ui-navbar li.ui-navbar-truncate { position: absolute; left: -99999px; top: -99999px; }  
.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; outline: none; border-right-width: 0; }  
.ui-navbar li .ui-btn { margin-right: -1px; }  
.ui-navbar li .ui-btn:last-child { margin-right: 0; }  
.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn,  
.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; }  
.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; }  
.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; }  
/*expanded page styles*/  
.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; }  
.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; }  
.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; }  
.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; }  
.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; }  
.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; }  
.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; }  
.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; }  
.ui-btn:focus, .ui-btn a:focus { outline: none; }  
.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; }  
.ui-btn-inline { display: inline-block; }  
.ui-btn-inner { padding: .6em 25px; display: block; height: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; }  
.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; }  
.ui-btn-icon-notext { display: inline-block; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }  
.ui-btn-icon-notext .ui-btn-inner { padding: 0; }  
.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -999px; }  
.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; }  
.ui-header .ui-btn-icon-left .ui-btn-inner,  
.ui-footer .ui-btn-icon-left .ui-btn-inner,  
.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; }  
.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; }  
.ui-header .ui-btn-icon-right .ui-btn-inner,  
.ui-footer .ui-btn-icon-right .ui-btn-inner,  
.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; }  
.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; }  
.ui-header .ui-btn-icon-top .ui-btn-inner,  
.ui-footer .ui-btn-icon-top .ui-btn-inner,  
.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; }  
.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; }  
.ui-header .ui-btn-icon-bottom .ui-btn-inner,  
.ui-footer .ui-btn-icon-bottom .ui-btn-inner,  
.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; }  
 
/*btn icon positioning*/  
.ui-btn-icon-notext .ui-icon { display: block; }  
.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; }  
.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; }  
.ui-btn-icon-left .ui-icon { left: 10px; }  
.ui-btn-icon-right .ui-icon {right: 10px; }  
.ui-header .ui-btn-icon-left .ui-icon,  
.ui-footer .ui-btn-icon-left .ui-icon,  
.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; }  
.ui-header .ui-btn-icon-right .ui-icon,  
.ui-footer .ui-btn-icon-right .ui-icon,  
.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; }  
.ui-header .ui-btn-icon-top .ui-icon,  
.ui-footer .ui-btn-icon-top .ui-icon,  
.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; }  
.ui-header .ui-btn-icon-bottom .ui-icon,  
.ui-footer .ui-btn-icon-bottom .ui-icon,  
.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; }  
.ui-btn-icon-top .ui-icon { top: 5px; }  
.ui-btn-icon-bottom .ui-icon { bottom: 5px; }  
/*hiding native button,inputs */  
.ui-btn-hidden { position: absolute; left: -9999px; }  
 
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-collapsible-contain { margin: .5em 0; }  
.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; }  
.ui-collapsible-heading a { text-align: left; margin: 0; }  
.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; }  
.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }  
.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 0; }  
.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; }  
.ui-collapsible-heading-status { position:absolute; left:-99999px; }  
.ui-collapsible-content { display: block; padding: 10px 0 10px 8px; }  
.ui-collapsible-content-collapsed { display: none; }  
 
.ui-collapsible-set { margin: .5em 0; }  
.ui-collapsible-set .ui-collapsible-contain { margin: -1px 0 0; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; }  
.ui-bar .ui-controlgroup { margin: 0 .3em; }  
.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; }  
.ui-controlgroup-controls { display: block; width: 95%;}  
.ui-controlgroup li { list-style: none; }  
.ui-controlgroup-vertical .ui-btn,  
.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; }  
.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; }  
.ui-controlgroup-horizontal { padding: 0; }  
.ui-controlgroup-horizontal .ui-btn,  
.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { margin: 0 -5px 0 0; display: inline-block; }  
.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn,  
.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; }  
.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; }  
.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; }  
/* conflicts with listview..  
.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; }  
.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; }  
*/  
 
.min-width-480px .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }  
.min-width-480px .ui-controlgroup-controls { width: 60%; display: inline-block; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer { margin: 15px; position: relative; }  
.ui-dialog .ui-header, .ui-dialog .ui-footer { z-index: 10; width: auto; }  
.ui-dialog .ui-content, .ui-dialog .ui-footer { margin-top: -15px; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; }  
.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; }  
.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; }  
.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }  
.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; }  
.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; }  
/* input, label positioning */  
.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-field-contain { background: none; padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; }  
.ui-field-contain:first-child { border-top-width: 0; }  
@media screen and (max-width: 480px){  
.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }  
}  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-select { display: block; }  
.ui-select select { position: absolute; left: -99999px; }  
.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }  
.ui-select .ui-btn-icon-right .ui-icon { right: 15px; }  
 
/* labels */  
label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }  
 
/*listbox*/  
.ui-selectmenu { position: absolute; padding: 0; z-index: 100 !important; width: 80%; max-width: 350px; padding: 6px; }  
.ui-selectmenu .ui-listview { margin: 0;  
}  
.ui-selectmenu-hidden { top: -999999px; left: -99999px; }  
.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; }  
.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }  
.ui-selectmenu-list .ui-btn-active .ui-icon { display: block; }  
 
 
.min-width-480px label.ui-select { display: inline-block; width: 20%; margin: 0 2% 0 0; }  
.min-width-480px .ui-select { width: 60%; display: inline-block; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; }  
input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 95%; }  
input.ui-input-text { -webkit-appearance: none; }  
textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; }  
.ui-input-search { padding: 0 30px; width: 77%; background-position: 8px 50%; background-repeat: no-repeat; position: relative; }  
.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; }  
.ui-input-search .ui-input-clear { position: absolute; right: 2px; top: 50%; margin-top: -12px; }  
.ui-input-search .ui-input-clear-hidden { display: none; }  
 
/* orientation adjustments - incomplete!*/  
.min-width-480px label.ui-input-text { vertical-align: top; }  
.min-width-480px label.ui-input-text { display: inline-block; width: 20%; margin: 0 2% 0 0; }  
.min-width-480px input.ui-input-text,  
.min-width-480px textarea.ui-input-text,  
.min-width-480px .ui-input-search { width: 60%; display: inline-block; }  
.min-width-480px .ui-input-search { width: 50%; }  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
.ui-listview { margin: 0; counter-reset: listnumbering; }  
.ui-content .ui-listview { margin: -15px; }  
.ui-content .ui-listview-inset { margin: 1em 0; }  
.ui-listview, .ui-li { list-style:none; padding:0; zoom: 1; }  
.ui-li { display: block; margin:0; position: relative; overflow: hidden; text-align: left; border-width: 0; border-top-width: 1px; }  
.ui-li .ui-btn-text { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }  
.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; counter-reset: listnumbering; }  
ol.ui-listview .ui-link-inherit:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; }  
ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */  
.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; }  
.ui-li:last-child { border-bottom-width: 1px; }  
.ui-li .ui-btn-inner { display: block; position: relative; padding: .7em 75px .7em 15px; }  
.ui-li-has-thumb .ui-btn-inner { min-height: 60px; padding-left: 100px; }  
.ui-li-has-icon .ui-btn-inner { min-height: 20px; padding-left: 40px; }  
.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }  
.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }  
.ui-li-thumb, .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; }  
.ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; }  
.ui-li-thumb, .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; }  
 
.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; }  
.min-width-480px .ui-li-aside { width: 45%; }  
.ui-li-has-alt .ui-btn-inner { padding-right: 95px; }  
.ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; }  
.ui-li-divider .ui-li-count { right: 10px; }  
.ui-li-has-alt .ui-li-count { right: 55px; }  
.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; }  
.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; }  
.ui-li-link-alt .ui-btn-inner { padding: 0; position: static; }  
.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; }  
 
.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px }  
.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; }  
 
/* Odd iPad positioning issue. */  
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {  
.ui-li .ui-btn-text { overflow: visible; }  
}  
 
/*  
* jQuery Mobile Framework  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.  
*/  
label.ui-slider { display: block; }  
input.ui-slider-input, .min-width-480px input.ui-slider-input { display: inline-block; width: 50px; }  
select.ui-slider-switch { display: none; }  
div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 66%; }  
a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; }  
a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; }  
.min-width-480px label.ui-slider { display: inline-block; width: 20%; margin: 0 2% 0 0; }  
.min-width-480px div.ui-slider { width: 45%; }  
 
div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; }  
div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; }  
div.ui-slider-handle-snapping { -webkit-transition: left 100ms linear; }  
div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; }  
div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; }  
div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; }  
.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: 1; }  
.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 10; }  
 
div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; }  
span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; }  
span.ui-slider-label-a { left: -100%; margin-right: -1px }  
span.ui-slider-label-b { right: -100%; margin-left: -1px }  
 
 
 
/*!  
* jQuery JavaScript Library v1.4.4  
* http://jquery.com/  
*  
* Copyright 2010, John Resig  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*  
* Includes Sizzle.js  
* http://sizzlejs.com/  
* Copyright 2010, The Dojo Foundation  
* Released under the MIT, BSD, and GPL Licenses.  
*  
* Date: Thu Nov 11 19:04:53 2010 -0500  
*/  
(function( window, undefined ) {  
 
// Use the correct document accordingly with window argument (sandbox)  
var document = window.document;  
var jQuery = (function() {  
 
// Define a local copy of jQuery  
var jQuery = function( selector, context ) {  
// The jQuery object is actually just the init constructor 'enhanced'  
return new jQuery.fn.init( selector, context );  
},  
 
// Map over jQuery in case of overwrite  
_jQuery = window.jQuery,  
 
// Map over the $ in case of overwrite  
_$ = window.$,  
 
// A central reference to the root jQuery(document)  
rootjQuery,  
 
// A simple way to check for HTML strings or ID strings  
// (both of which we optimize for)  
quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,  
 
// Is it a simple selector  
isSimple = /^.[^:#\[\.,]*$/,  
 
// Check if a string has a non-whitespace character in it  
rnotwhite = /\S/,  
rwhite = /\s/,  
 
// Used for trimming whitespace  
trimLeft = /^\s+/,  
trimRight = /\s+$/,  
 
// Check for non-word characters  
rnonword = /\W/,  
 
// Check for digits  
rdigit = /\d/,  
 
// Match a standalone tag  
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,  
 
// JSON RegExp  
rvalidchars = /^[\],:{}\s]*$/,  
rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,  
rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,  
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,  
 
// Useragent RegExp  
rwebkit = /(webkit)[ \/]([\w.]+)/,  
ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,  
rmsie = /(msie) ([\w.]+)/,  
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,  
 
// Keep a UserAgent string for use with jQuery.browser  
userAgent = navigator.userAgent,  
 
// For matching the engine and version of the browser  
browserMatch,  
 
// Has the ready events already been bound?  
readyBound = false,  
 
// The functions to execute on DOM ready  
readyList = [],  
 
// The ready event handler  
DOMContentLoaded,  
 
// Save a reference to some core methods  
toString = Object.prototype.toString,  
hasOwn = Object.prototype.hasOwnProperty,  
push = Array.prototype.push,  
slice = Array.prototype.slice,  
trim = String.prototype.trim,  
indexOf = Array.prototype.indexOf,  
 
// [[Class]] -> type pairs  
class2type = {};  
 
jQuery.fn = jQuery.prototype = {  
init: function( selector, context ) {  
var match, elem, ret, doc;  
 
// Handle $(""), $(null), or $(undefined)  
if ( !selector ) {  
return this;  
}  
 
// Handle $(DOMElement)  
if ( selector.nodeType ) {  
this.context = this[0] = selector;  
this.length = 1;  
return this;  
}  
 
// The body element only exists once, optimize finding it  
if ( selector === "body" && !context && document.body ) {  
this.context = document;  
this[0] = document.body;  
this.selector = "body";  
this.length = 1;  
return this;  
}  
 
// Handle HTML strings  
if ( typeof selector === "string" ) {  
// Are we dealing with HTML string or an ID?  
match = quickExpr.exec( selector );  
 
// Verify a match, and that no context was specified for #id  
if ( match && (match[1] || !context) ) {  
 
// HANDLE: $(html) -> $(array)  
if ( match[1] ) {  
doc = (context ? context.ownerDocument || context : document);  
 
// If a single string is passed in and it's a single tag  
// just do a createElement and skip the rest  
ret = rsingleTag.exec( selector );  
 
if ( ret ) {  
if ( jQuery.isPlainObject( context ) ) {  
selector = [ document.createElement( ret[1] ) ];  
jQuery.fn.attr.call( selector, context, true );  
 
} else {  
selector = [ doc.createElement( ret[1] ) ];  
}  
 
} else {  
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );  
selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;  
}  
 
return jQuery.merge( this, selector );  
 
// HANDLE: $("#id")  
} else {  
elem = document.getElementById( match[2] );  
 
// Check parentNode to catch when Blackberry 4.6 returns  
// nodes that are no longer in the document #6963  
if ( elem && elem.parentNode ) {  
// Handle the case where IE and Opera return items  
// by name instead of ID  
if ( elem.id !== match[2] ) {  
return rootjQuery.find( selector );  
}  
 
// Otherwise, we inject the element directly into the jQuery object  
this.length = 1;  
this[0] = elem;  
}  
 
this.context = document;  
this.selector = selector;  
return this;  
}  
 
// HANDLE: $("TAG")  
} else if ( !context && !rnonword.test( selector ) ) {  
this.selector = selector;  
this.context = document;  
selector = document.getElementsByTagName( selector );  
return jQuery.merge( this, selector );  
 
// HANDLE: $(expr, $(...))  
} else if ( !context || context.jquery ) {  
return (context || rootjQuery).find( selector );  
 
// HANDLE: $(expr, context)  
// (which is just equivalent to: $(context).find(expr)  
} else {  
return jQuery( context ).find( selector );  
}  
 
// HANDLE: $(function)  
// Shortcut for document ready  
} else if ( jQuery.isFunction( selector ) ) {  
return rootjQuery.ready( selector );  
}  
 
if (selector.selector !== undefined) {  
this.selector = selector.selector;  
this.context = selector.context;  
}  
 
return jQuery.makeArray( selector, this );  
},  
 
// Start with an empty selector  
selector: "",  
 
// The current version of jQuery being used  
jquery: "1.4.4",  
 
// The default length of a jQuery object is 0  
length: 0,  
 
// The number of elements contained in the matched element set  
size: function() {  
return this.length;  
},  
 
toArray: function() {  
return slice.call( this, 0 );  
},  
 
// Get the Nth element in the matched element set OR  
// Get the whole matched element set as a clean array  
get: function( num ) {  
return num == null ?  
 
// Return a 'clean' array  
this.toArray() :  
 
// Return just the object  
( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );  
},  
 
// Take an array of elements and push it onto the stack  
// (returning the new matched element set)  
pushStack: function( elems, name, selector ) {  
// Build a new jQuery matched element set  
var ret = jQuery();  
 
if ( jQuery.isArray( elems ) ) {  
push.apply( ret, elems );  
 
} else {  
jQuery.merge( ret, elems );  
}  
 
// Add the old object onto the stack (as a reference)  
ret.prevObject = this;  
 
ret.context = this.context;  
 
if ( name === "find" ) {  
ret.selector = this.selector + (this.selector ? " " : "") + selector;  
} else if ( name ) {  
ret.selector = this.selector + "." + name + "(" + selector + ")";  
}  
 
// Return the newly-formed element set  
return ret;  
},  
 
// Execute a callback for every element in the matched set.  
// (You can seed the arguments with an array of args, but this is  
// only used internally.)  
each: function( callback, args ) {  
return jQuery.each( this, callback, args );  
},  
 
ready: function( fn ) {  
// Attach the listeners  
jQuery.bindReady();  
 
// If the DOM is already ready  
if ( jQuery.isReady ) {  
// Execute the function immediately  
fn.call( document, jQuery );  
 
// Otherwise, remember the function for later  
} else if ( readyList ) {  
// Add the function to the wait list  
readyList.push( fn );  
}  
 
return this;  
},  
 
eq: function( i ) {  
return i === -1 ?  
this.slice( i ) :  
this.slice( i, +i + 1 );  
},  
 
first: function() {  
return this.eq( 0 );  
},  
 
last: function() {  
return this.eq( -1 );  
},  
 
slice: function() {  
return this.pushStack( slice.apply( this, arguments ),  
"slice", slice.call(arguments).join(",") );  
},  
 
map: function( callback ) {  
return this.pushStack( jQuery.map(this, function( elem, i ) {  
return callback.call( elem, i, elem );  
}));  
},  
 
end: function() {  
return this.prevObject || jQuery(null);  
},  
 
// For internal use only.  
// Behaves like an Array's method, not like a jQuery method.  
push: push,  
sort: [].sort,  
splice: [].splice  
};  
 
// Give the init function the jQuery prototype for later instantiation  
jQuery.fn.init.prototype = jQuery.fn;  
 
jQuery.extend = jQuery.fn.extend = function() {  
var options, name, src, copy, copyIsArray, clone,  
target = arguments[0] || {},  
i = 1,  
length = arguments.length,  
deep = false;  
 
// Handle a deep copy situation  
if ( typeof target === "boolean" ) {  
deep = target;  
target = arguments[1] || {};  
// skip the boolean and the target  
i = 2;  
}  
 
// Handle case when target is a string or something (possible in deep copy)  
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {  
target = {};  
}  
 
// extend jQuery itself if only one argument is passed  
if ( length === i ) {  
target = this;  
--i;  
}  
 
for ( ; i < length; i++ ) {  
// Only deal with non-null/undefined values  
if ( (options = arguments[ i ]) != null ) {  
// Extend the base object  
for ( name in options ) {  
src = target[ name ];  
copy = options[ name ];  
 
// Prevent never-ending loop  
if ( target === copy ) {  
continue;  
}  
 
// Recurse if we're merging plain objects or arrays  
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {  
if ( copyIsArray ) {  
copyIsArray = false;  
clone = src && jQuery.isArray(src) ? src : [];  
 
} else {  
clone = src && jQuery.isPlainObject(src) ? src : {};  
}  
 
// Never move original objects, clone them  
target[ name ] = jQuery.extend( deep, clone, copy );  
 
// Don't bring in undefined values  
} else if ( copy !== undefined ) {  
target[ name ] = copy;  
}  
}  
}  
}  
 
// Return the modified object  
return target;  
};  
 
jQuery.extend({  
noConflict: function( deep ) {  
window.$ = _$;  
 
if ( deep ) {  
window.jQuery = _jQuery;  
}  
 
return jQuery;  
},  
 
// Is the DOM ready to be used? Set to true once it occurs.  
isReady: false,  
 
// A counter to track how many items to wait for before  
// the ready event fires. See #6781  
readyWait: 1,  
 
// Handle when the DOM is ready  
ready: function( wait ) {  
// A third-party is pushing the ready event forwards  
if ( wait === true ) {  
jQuery.readyWait--;  
}  
 
// Make sure that the DOM is not already loaded  
if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {  
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).  
if ( !document.body ) {  
return setTimeout( jQuery.ready, 1 );  
}  
 
// Remember that the DOM is ready  
jQuery.isReady = true;  
 
// If a normal DOM Ready event fired, decrement, and wait if need be  
if ( wait !== true && --jQuery.readyWait > 0 ) {  
return;  
}  
 
// If there are functions bound, to execute  
if ( readyList ) {  
// Execute all of them  
var fn,  
i = 0,  
ready = readyList;  
 
// Reset the list of functions  
readyList = null;  
 
while ( (fn = ready[ i++ ]) ) {  
fn.call( document, jQuery );  
}  
 
// Trigger any bound ready events  
if ( jQuery.fn.trigger ) {  
jQuery( document ).trigger( "ready" ).unbind( "ready" );  
}  
}  
}  
},  
 
bindReady: function() {  
if ( readyBound ) {  
return;  
}  
 
readyBound = true;  
 
// Catch cases where $(document).ready() is called after the  
// browser event has already occurred.  
if ( document.readyState === "complete" ) {  
// Handle it asynchronously to allow scripts the opportunity to delay ready  
return setTimeout( jQuery.ready, 1 );  
}  
 
// Mozilla, Opera and webkit nightlies currently support this event  
if ( document.addEventListener ) {  
// Use the handy event callback  
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );  
 
// A fallback to window.onload, that will always work  
window.addEventListener( "load", jQuery.ready, false );  
 
// If IE event model is used  
} else if ( document.attachEvent ) {  
// ensure firing before onload,  
// maybe late but safe also for iframes  
document.attachEvent("onreadystatechange", DOMContentLoaded);  
 
// A fallback to window.onload, that will always work  
window.attachEvent( "onload", jQuery.ready );  
 
// If IE and not a frame  
// continually check to see if the document is ready  
var toplevel = false;  
 
try {  
toplevel = window.frameElement == null;  
} catch(e) {}  
 
if ( document.documentElement.doScroll && toplevel ) {  
doScrollCheck();  
}  
}  
},  
 
// See test/unit/core.js for details concerning isFunction.  
// Since version 1.3, DOM methods and functions like alert  
// aren't supported. They return false on IE (#2968).  
isFunction: function( obj ) {  
return jQuery.type(obj) === "function";  
},  
 
isArray: Array.isArray || function( obj ) {  
return jQuery.type(obj) === "array";  
},  
 
// A crude way of determining if an object is a window  
isWindow: function( obj ) {  
return obj && typeof obj === "object" && "setInterval" in obj;  
},  
 
isNaN: function( obj ) {  
return obj == null || !rdigit.test( obj ) || isNaN( obj );  
},  
 
type: function( obj ) {  
return obj == null ?  
String( obj ) :  
class2type[ toString.call(obj) ] || "object";  
},  
 
isPlainObject: function( obj ) {  
// Must be an Object.  
// Because of IE, we also have to check the presence of the constructor property.  
// Make sure that DOM nodes and window objects don't pass through, as well  
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {  
return false;  
}  
 
// Not own constructor property must be Object  
if ( obj.constructor &&  
!hasOwn.call(obj, "constructor") &&  
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {  
return false;  
}  
 
// Own properties are enumerated firstly, so to speed up,  
// if last one is own, then all properties are own.  
 
var key;  
for ( key in obj ) {}  
 
return key === undefined || hasOwn.call( obj, key );  
},  
 
isEmptyObject: function( obj ) {  
for ( var name in obj ) {  
return false;  
}  
return true;  
},  
 
error: function( msg ) {  
throw msg;  
},  
 
parseJSON: function( data ) {  
if ( typeof data !== "string" || !data ) {  
return null;  
}  
 
// Make sure leading/trailing whitespace is removed (IE can't handle it)  
data = jQuery.trim( data );  
 
// Make sure the incoming data is actual JSON  
// Logic borrowed from http://json.org/json2.js  
if ( rvalidchars.test(data.replace(rvalidescape, "@")  
.replace(rvalidtokens, "]")  
.replace(rvalidbraces, "")) ) {  
 
// Try to use the native JSON parser first  
return window.JSON && window.JSON.parse ?  
window.JSON.parse( data ) :  
(new Function("return " + data))();  
 
} else {  
jQuery.error( "Invalid JSON: " + data );  
}  
},  
 
noop: function() {},  
 
// Evalulates a script in a global context  
globalEval: function( data ) {  
if ( data && rnotwhite.test(data) ) {  
// Inspired by code by Andrea Giammarchi  
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html  
var head = document.getElementsByTagName("head")[0] || document.documentElement,  
script = document.createElement("script");  
 
script.type = "text/javascript";  
 
if ( jQuery.support.scriptEval ) {  
script.appendChild( document.createTextNode( data ) );  
} else {  
script.text = data;  
}  
 
// Use insertBefore instead of appendChild to circumvent an IE6 bug.  
// This arises when a base node is used (#2709).  
head.insertBefore( script, head.firstChild );  
head.removeChild( script );  
}  
},  
 
nodeName: function( elem, name ) {  
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();  
},  
 
// args is for internal usage only  
each: function( object, callback, args ) {  
var name, i = 0,  
length = object.length,  
isObj = length === undefined || jQuery.isFunction(object);  
 
if ( args ) {  
if ( isObj ) {  
for ( name in object ) {  
if ( callback.apply( object[ name ], args ) === false ) {  
break;  
}  
}  
} else {  
for ( ; i < length; ) {  
if ( callback.apply( object[ i++ ], args ) === false ) {  
break;  
}  
}  
}  
 
// A special, fast, case for the most common use of each  
} else {  
if ( isObj ) {  
for ( name in object ) {  
if ( callback.call( object[ name ], name, object[ name ] ) === false ) {  
break;  
}  
}  
} else {  
for ( var value = object[0];  
i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}  
}  
}  
 
return object;  
},  
 
// Use native String.trim function wherever possible  
trim: trim ?  
function( text ) {  
return text == null ?  
"" :  
trim.call( text );  
} :  
 
// Otherwise use our own trimming functionality  
function( text ) {  
return text == null ?  
"" :  
text.toString().replace( trimLeft, "" ).replace( trimRight, "" );  
},  
 
// results is for internal usage only  
makeArray: function( array, results ) {  
var ret = results || [];  
 
if ( array != null ) {  
// The window, strings (and functions) also have 'length'  
// The extra typeof function check is to prevent crashes  
// in Safari 2 (See: #3039)  
// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930  
var type = jQuery.type(array);  
 
if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {  
push.call( ret, array );  
} else {  
jQuery.merge( ret, array );  
}  
}  
 
return ret;  
},  
 
inArray: function( elem, array ) {  
if ( array.indexOf ) {  
return array.indexOf( elem );  
}  
 
for ( var i = 0, length = array.length; i < length; i++ ) {  
if ( array[ i ] === elem ) {  
return i;  
}  
}  
 
return -1;  
},  
 
merge: function( first, second ) {  
var i = first.length,  
j = 0;  
 
if ( typeof second.length === "number" ) {  
for ( var l = second.length; j < l; j++ ) {  
first[ i++ ] = second[ j ];  
}  
 
} else {  
while ( second[j] !== undefined ) {  
first[ i++ ] = second[ j++ ];  
}  
}  
 
first.length = i;  
 
return first;  
},  
 
grep: function( elems, callback, inv ) {  
var ret = [], retVal;  
inv = !!inv;  
 
// Go through the array, only saving the items  
// that pass the validator function  
for ( var i = 0, length = elems.length; i < length; i++ ) {  
retVal = !!callback( elems[ i ], i );  
if ( inv !== retVal ) {  
ret.push( elems[ i ] );  
}  
}  
 
return ret;  
},  
 
// arg is for internal usage only  
map: function( elems, callback, arg ) {  
var ret = [], value;  
 
// Go through the array, translating each of the items to their  
// new value (or values).  
for ( var i = 0, length = elems.length; i < length; i++ ) {  
value = callback( elems[ i ], i, arg );  
 
if ( value != null ) {  
ret[ ret.length ] = value;  
}  
}  
 
return ret.concat.apply( [], ret );  
},  
 
// A global GUID counter for objects  
guid: 1,  
 
proxy: function( fn, proxy, thisObject ) {  
if ( arguments.length === 2 ) {  
if ( typeof proxy === "string" ) {  
thisObject = fn;  
fn = thisObject[ proxy ];  
proxy = undefined;  
 
} else if ( proxy && !jQuery.isFunction( proxy ) ) {  
thisObject = proxy;  
proxy = undefined;  
}  
}  
 
if ( !proxy && fn ) {  
proxy = function() {  
return fn.apply( thisObject || this, arguments );  
};  
}  
 
// Set the guid of unique handler to the same of original handler, so it can be removed  
if ( fn ) {  
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;  
}  
 
// So proxy can be declared as an argument  
return proxy;  
},  
 
// Mutifunctional method to get and set values to a collection  
// The value/s can be optionally by executed if its a function  
access: function( elems, key, value, exec, fn, pass ) {  
var length = elems.length;  
 
// Setting many attributes  
if ( typeof key === "object" ) {  
for ( var k in key ) {  
jQuery.access( elems, k, key[k], exec, fn, value );  
}  
return elems;  
}  
 
// Setting one attribute  
if ( value !== undefined ) {  
// Optionally, function values get executed if exec is true  
exec = !pass && exec && jQuery.isFunction(value);  
 
for ( var i = 0; i < length; i++ ) {  
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );  
}  
 
return elems;  
}  
 
// Getting an attribute  
return length ? fn( elems[0], key ) : undefined;  
},  
 
now: function() {  
return (new Date()).getTime();  
},  
 
// Use of jQuery.browser is frowned upon.  
// More details: http://docs.jquery.com/Utilities/jQuery.browser  
uaMatch: function( ua ) {  
ua = ua.toLowerCase();  
 
var match = rwebkit.exec( ua ) ||  
ropera.exec( ua ) ||  
rmsie.exec( ua ) ||  
ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||  
[];  
 
return { browser: match[1] || "", version: match[2] || "0" };  
},  
 
browser: {}  
});  
 
// Populate the class2type map  
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {  
class2type[ "[object " + name + "]" ] = name.toLowerCase();  
});  
 
browserMatch = jQuery.uaMatch( userAgent );  
if ( browserMatch.browser ) {  
jQuery.browser[ browserMatch.browser ] = true;  
jQuery.browser.version = browserMatch.version;  
}  
 
// Deprecated, use jQuery.browser.webkit instead  
if ( jQuery.browser.webkit ) {  
jQuery.browser.safari = true;  
}  
 
if ( indexOf ) {  
jQuery.inArray = function( elem, array ) {  
return indexOf.call( array, elem );  
};  
}  
 
// Verify that \s matches non-breaking spaces  
// (IE fails on this test)  
if ( !rwhite.test( "\xA0" ) ) {  
trimLeft = /^[\s\xA0]+/;  
trimRight = /[\s\xA0]+$/;  
}  
 
// All jQuery objects should point back to these  
rootjQuery = jQuery(document);  
 
// Cleanup functions for the document ready method  
if ( document.addEventListener ) {  
DOMContentLoaded = function() {  
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );  
jQuery.ready();  
};  
 
} else if ( document.attachEvent ) {  
DOMContentLoaded = function() {  
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).  
if ( document.readyState === "complete" ) {  
document.detachEvent( "onreadystatechange", DOMContentLoaded );  
jQuery.ready();  
}  
};  
}  
 
// The DOM ready check for Internet Explorer  
function doScrollCheck() {  
if ( jQuery.isReady ) {  
return;  
}  
 
try {  
// If IE is used, use the trick by Diego Perini  
// http://javascript.nwbox.com/IEContentLoaded/  
document.documentElement.doScroll("left");  
} catch(e) {  
setTimeout( doScrollCheck, 1 );  
return;  
}  
 
// and execute any waiting functions  
jQuery.ready();  
}  
 
// Expose jQuery to the global object  
return (window.jQuery = window.$ = jQuery);  
 
})();  
 
 
(function() {  
 
jQuery.support = {};  
 
var root = document.documentElement,  
script = document.createElement("script"),  
div = document.createElement("div"),  
id = "script" + jQuery.now();  
 
div.style.display = "none";  
div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";  
 
var all = div.getElementsByTagName("*"),  
a = div.getElementsByTagName("a")[0],  
select = document.createElement("select"),  
opt = select.appendChild( document.createElement("option") );  
 
// Can't get basic test support  
if ( !all || !all.length || !a ) {  
return;  
}  
 
jQuery.support = {  
// IE strips leading whitespace when .innerHTML is used  
leadingWhitespace: div.firstChild.nodeType === 3,  
 
// Make sure that tbody elements aren't automatically inserted  
// IE will insert them into empty tables  
tbody: !div.getElementsByTagName("tbody").length,  
 
// Make sure that link elements get serialized correctly by innerHTML  
// This requires a wrapper element in IE  
htmlSerialize: !!div.getElementsByTagName("link").length,  
 
// Get the style information from getAttribute  
// (IE uses .cssText insted)  
style: /red/.test( a.getAttribute("style") ),  
 
// Make sure that URLs aren't manipulated  
// (IE normalizes it by default)  
hrefNormalized: a.getAttribute("href") === "/a",  
 
// Make sure that element opacity exists  
// (IE uses filter instead)  
// Use a regex to work around a WebKit issue. See #5145  
opacity: /^0.55$/.test( a.style.opacity ),  
 
// Verify style float existence  
// (IE uses styleFloat instead of cssFloat)  
cssFloat: !!a.style.cssFloat,  
 
// Make sure that if no value is specified for a checkbox  
// that it defaults to "on".  
// (WebKit defaults to "" instead)  
checkOn: div.getElementsByTagName("input")[0].value === "on",  
 
// Make sure that a selected-by-default option has a working selected property.  
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)  
optSelected: opt.selected,  
 
// Will be defined later  
deleteExpando: true,  
optDisabled: false,  
checkClone: false,  
scriptEval: false,  
noCloneEvent: true,  
boxModel: null,  
inlineBlockNeedsLayout: false,  
shrinkWrapBlocks: false,  
reliableHiddenOffsets: true  
};  
 
// Make sure that the options inside disabled selects aren't marked as disabled  
// (WebKit marks them as diabled)  
select.disabled = true;  
jQuery.support.optDisabled = !opt.disabled;  
 
script.type = "text/javascript";  
try {  
script.appendChild( document.createTextNode( "window." + id + "=1;" ) );  
} catch(e) {}  
 
root.insertBefore( script, root.firstChild );  
 
// Make sure that the execution of code works by injecting a script  
// tag with appendChild/createTextNode  
// (IE doesn't support this, fails, and uses .text instead)  
if ( window[ id ] ) {  
jQuery.support.scriptEval = true;  
delete window[ id ];  
}  
 
// Test to see if it's possible to delete an expando from an element  
// Fails in Internet Explorer  
try {  
delete script.test;  
 
} catch(e) {  
jQuery.support.deleteExpando = false;  
}  
 
root.removeChild( script );  
 
if ( div.attachEvent && div.fireEvent ) {  
div.attachEvent("onclick", function click() {  
// Cloning a node shouldn't copy over any  
// bound event handlers (IE does this)  
jQuery.support.noCloneEvent = false;  
div.detachEvent("onclick", click);  
});  
div.cloneNode(true).fireEvent("onclick");  
}  
 
div = document.createElement("div");  
div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";  
 
var fragment = document.createDocumentFragment();  
fragment.appendChild( div.firstChild );  
 
// WebKit doesn't clone checked state correctly in fragments  
jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;  
 
// Figure out if the W3C box model works as expected  
// document.body must exist before we can do this  
jQuery(function() {  
var div = document.createElement("div");  
div.style.width = div.style.paddingLeft = "1px";  
 
document.body.appendChild( div );  
jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;  
 
if ( "zoom" in div.style ) {  
// Check if natively block-level elements act like inline-block  
// elements when setting their display to 'inline' and giving  
// them layout  
// (IE < 8 does this)  
div.style.display = "inline";  
div.style.zoom = 1;  
jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;  
 
// Check if elements with layout shrink-wrap their children  
// (IE 6 does this)  
div.style.display = "";  
div.innerHTML = "<div style='width:4px;'></div>";  
jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;  
}  
 
div.innerHTML = "<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";  
var tds = div.getElementsByTagName("td");  
 
// Check if table cells still have offsetWidth/Height when they are set  
// to display:none and there are still other visible table cells in a  
// table row; if so, offsetWidth/Height are not reliable for use when  
// determining if an element has been hidden directly using  
// display:none (it is still safe to use offsets if a parent element is  
// hidden; don safety goggles and see bug #4512 for more information).  
// (only IE 8 fails this test)  
jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;  
 
tds[0].style.display = "";  
tds[1].style.display = "none";  
 
// Check if empty table cells still have offsetWidth/Height  
// (IE < 8 fail this test)  
jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;  
div.innerHTML = "";  
 
document.body.removeChild( div ).style.display = "none";  
div = tds = null;  
});  
 
// Technique from Juriy Zaytsev  
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/  
var eventSupported = function( eventName ) {  
var el = document.createElement("div");  
eventName = "on" + eventName;  
 
var isSupported = (eventName in el);  
if ( !isSupported ) {  
el.setAttribute(eventName, "return;");  
isSupported = typeof el[eventName] === "function";  
}  
el = null;  
 
return isSupported;  
};  
 
jQuery.support.submitBubbles = eventSupported("submit");  
jQuery.support.changeBubbles = eventSupported("change");  
 
// release memory in IE  
root = script = div = all = a = null;  
})();  
 
 
 
var windowData = {},  
rbrace = /^(?:\{.*\}|\[.*\])$/;  
 
jQuery.extend({  
cache: {},  
 
// Please use with caution  
uuid: 0,  
 
// Unique for each copy of jQuery on the page  
expando: "jQuery" + jQuery.now(),  
 
// The following elements throw uncatchable exceptions if you  
// attempt to add expando properties to them.  
noData: {  
"embed": true,  
// Ban all objects except for Flash (which handle expandos)  
"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",  
"applet": true  
},  
 
data: function( elem, name, data ) {  
if ( !jQuery.acceptData( elem ) ) {  
return;  
}  
 
elem = elem == window ?  
windowData :  
elem;  
 
var isNode = elem.nodeType,  
id = isNode ? elem[ jQuery.expando ] : null,  
cache = jQuery.cache, thisCache;  
 
if ( isNode && !id && typeof name === "string" && data === undefined ) {  
return;  
}  
 
// Get the data from the object directly  
if ( !isNode ) {  
cache = elem;  
 
// Compute a unique ID for the element  
} else if ( !id ) {  
elem[ jQuery.expando ] = id = ++jQuery.uuid;  
}  
 
// Avoid generating a new cache unless none exists and we  
// want to manipulate it.  
if ( typeof name === "object" ) {  
if ( isNode ) {  
cache[ id ] = jQuery.extend(cache[ id ], name);  
 
} else {  
jQuery.extend( cache, name );  
}  
 
} else if ( isNode && !cache[ id ] ) {  
cache[ id ] = {};  
}  
 
thisCache = isNode ? cache[ id ] : cache;  
 
// Prevent overriding the named cache with undefined values  
if ( data !== undefined ) {  
thisCache[ name ] = data;  
}  
 
return typeof name === "string" ? thisCache[ name ] : thisCache;  
},  
 
removeData: function( elem, name ) {  
if ( !jQuery.acceptData( elem ) ) {  
return;  
}  
 
elem = elem == window ?  
windowData :  
elem;  
 
var isNode = elem.nodeType,  
id = isNode ? elem[ jQuery.expando ] : elem,  
cache = jQuery.cache,  
thisCache = isNode ? cache[ id ] : id;  
 
// If we want to remove a specific section of the element's data  
if ( name ) {  
if ( thisCache ) {  
// Remove the section of cache data  
delete thisCache[ name ];  
 
// If we've removed all the data, remove the element's cache  
if ( isNode && jQuery.isEmptyObject(thisCache) ) {  
jQuery.removeData( elem );  
}  
}  
 
// Otherwise, we want to remove all of the element's data  
} else {  
if ( isNode && jQuery.support.deleteExpando ) {  
delete elem[ jQuery.expando ];  
 
} else if ( elem.removeAttribute ) {  
elem.removeAttribute( jQuery.expando );  
 
// Completely remove the data cache  
} else if ( isNode ) {  
delete cache[ id ];  
 
// Remove all fields from the object  
} else {  
for ( var n in elem ) {  
delete elem[ n ];  
}  
}  
}  
},  
 
// A method for determining if a DOM node can handle the data expando  
acceptData: function( elem ) {  
if ( elem.nodeName ) {  
var match = jQuery.noData[ elem.nodeName.toLowerCase() ];  
 
if ( match ) {  
return !(match === true || elem.getAttribute("classid") !== match);  
}  
}  
 
return true;  
}  
});  
 
jQuery.fn.extend({  
data: function( key, value ) {  
var data = null;  
 
if ( typeof key === "undefined" ) {  
if ( this.length ) {  
var attr = this[0].attributes, name;  
data = jQuery.data( this[0] );  
 
for ( var i = 0, l = attr.length; i < l; i++ ) {  
name = attr[i].name;  
 
if ( name.indexOf( "data-" ) === 0 ) {  
name = name.substr( 5 );  
dataAttr( this[0], name, data[ name ] );  
}  
}  
}  
 
return data;  
 
} else if ( typeof key === "object" ) {  
return this.each(function() {  
jQuery.data( this, key );  
});  
}  
 
var parts = key.split(".");  
parts[1] = parts[1] ? "." + parts[1] : "";  
 
if ( value === undefined ) {  
data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);  
 
// Try to fetch any internally stored data first  
if ( data === undefined && this.length ) {  
data = jQuery.data( this[0], key );  
data = dataAttr( this[0], key, data );  
}  
 
return data === undefined && parts[1] ?  
this.data( parts[0] ) :  
data;  
 
} else {  
return this.each(function() {  
var $this = jQuery( this ),  
args = [ parts[0], value ];  
 
$this.triggerHandler( "setData" + parts[1] + "!", args );  
jQuery.data( this, key, value );  
$this.triggerHandler( "changeData" + parts[1] + "!", args );  
});  
}  
},  
 
removeData: function( key ) {  
return this.each(function() {  
jQuery.removeData( this, key );  
});  
}  
});  
 
function dataAttr( elem, key, data ) {  
// If nothing was found internally, try to fetch any  
// data from the HTML5 data-* attribute  
if ( data === undefined && elem.nodeType === 1 ) {  
data = elem.getAttribute( "data-" + key );  
 
if ( typeof data === "string" ) {  
try {  
data = data === "true" ? true :  
data === "false" ? false :  
data === "null" ? null :  
!jQuery.isNaN( data ) ? parseFloat( data ) :  
rbrace.test( data ) ? jQuery.parseJSON( data ) :  
data;  
} catch( e ) {}  
 
// Make sure we set the data so it isn't changed later  
jQuery.data( elem, key, data );  
 
} else {  
data = undefined;  
}  
}  
 
return data;  
}  
 
 
 
 
jQuery.extend({  
queue: function( elem, type, data ) {  
if ( !elem ) {  
return;  
}  
 
type = (type || "fx") + "queue";  
var q = jQuery.data( elem, type );  
 
// Speed up dequeue by getting out quickly if this is just a lookup  
if ( !data ) {  
return q || [];  
}  
 
if ( !q || jQuery.isArray(data) ) {  
q = jQuery.data( elem, type, jQuery.makeArray(data) );  
 
} else {  
q.push( data );  
}  
 
return q;  
},  
 
dequeue: function( elem, type ) {  
type = type || "fx";  
 
var queue = jQuery.queue( elem, type ),  
fn = queue.shift();  
 
// If the fx queue is dequeued, always remove the progress sentinel  
if ( fn === "inprogress" ) {  
fn = queue.shift();  
}  
 
if ( fn ) {  
// Add a progress sentinel to prevent the fx queue from being  
// automatically dequeued  
if ( type === "fx" ) {  
queue.unshift("inprogress");  
}  
 
fn.call(elem, function() {  
jQuery.dequeue(elem, type);  
});  
}  
}  
});  
 
jQuery.fn.extend({  
queue: function( type, data ) {  
if ( typeof type !== "string" ) {  
data = type;  
type = "fx";  
}  
 
if ( data === undefined ) {  
return jQuery.queue( this[0], type );  
}  
return this.each(function( i ) {  
var queue = jQuery.queue( this, type, data );  
 
if ( type === "fx" && queue[0] !== "inprogress" ) {  
jQuery.dequeue( this, type );  
}  
});  
},  
dequeue: function( type ) {  
return this.each(function() {  
jQuery.dequeue( this, type );  
});  
},  
 
// Based off of the plugin by Clint Helfers, with permission.  
// http://blindsignals.com/index.php/2009/07/jquery-delay/  
delay: function( time, type ) {  
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;  
type = type || "fx";  
 
return this.queue( type, function() {  
var elem = this;  
setTimeout(function() {  
jQuery.dequeue( elem, type );  
}, time );  
});  
},  
 
clearQueue: function( type ) {  
return this.queue( type || "fx", [] );  
}  
});  
 
 
 
 
var rclass = /[\n\t]/g,  
rspaces = /\s+/,  
rreturn = /\r/g,  
rspecialurl = /^(?:href|src|style)$/,  
rtype = /^(?:button|input)$/i,  
rfocusable = /^(?:button|input|object|select|textarea)$/i,  
rclickable = /^a(?:rea)?$/i,  
rradiocheck = /^(?:radio|checkbox)$/i;  
 
jQuery.props = {  
"for": "htmlFor",  
"class": "className",  
readonly: "readOnly",  
maxlength: "maxLength",  
cellspacing: "cellSpacing",  
rowspan: "rowSpan",  
colspan: "colSpan",  
tabindex: "tabIndex",  
usemap: "useMap",  
frameborder: "frameBorder"  
};  
 
jQuery.fn.extend({  
attr: function( name, value ) {  
return jQuery.access( this, name, value, true, jQuery.attr );  
},  
 
removeAttr: function( name, fn ) {  
return this.each(function(){  
jQuery.attr( this, name, "" );  
if ( this.nodeType === 1 ) {  
this.removeAttribute( name );  
}  
});  
},  
 
addClass: function( value ) {  
if ( jQuery.isFunction(value) ) {  
return this.each(function(i) {  
var self = jQuery(this);  
self.addClass( value.call(this, i, self.attr("class")) );  
});  
}  
 
if ( value && typeof value === "string" ) {  
var classNames = (value || "").split( rspaces );  
 
for ( var i = 0, l = this.length; i < l; i++ ) {  
var elem = this[i];  
 
if ( elem.nodeType === 1 ) {  
if ( !elem.className ) {  
elem.className = value;  
 
} else {  
var className = " " + elem.className + " ",  
setClass = elem.className;  
 
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {  
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {  
setClass += " " + classNames[c];  
}  
}  
elem.className = jQuery.trim( setClass );  
}  
}  
}  
}  
 
return this;  
},  
 
removeClass: function( value ) {  
if ( jQuery.isFunction(value) ) {  
return this.each(function(i) {  
var self = jQuery(this);  
self.removeClass( value.call(this, i, self.attr("class")) );  
});  
}  
 
if ( (value && typeof value === "string") || value === undefined ) {  
var classNames = (value || "").split( rspaces );  
 
for ( var i = 0, l = this.length; i < l; i++ ) {  
var elem = this[i];  
 
if ( elem.nodeType === 1 && elem.className ) {  
if ( value ) {  
var className = (" " + elem.className + " ").replace(rclass, " ");  
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {  
className = className.replace(" " + classNames[c] + " ", " ");  
}  
elem.className = jQuery.trim( className );  
 
} else {  
elem.className = "";  
}  
}  
}  
}  
 
return this;  
},  
 
toggleClass: function( value, stateVal ) {  
var type = typeof value,  
isBool = typeof stateVal === "boolean";  
 
if ( jQuery.isFunction( value ) ) {  
return this.each(function(i) {  
var self = jQuery(this);  
self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );  
});  
}  
 
return this.each(function() {  
if ( type === "string" ) {  
// toggle individual class names  
var className,  
i = 0,  
self = jQuery( this ),  
state = stateVal,  
classNames = value.split( rspaces );  
 
while ( (className = classNames[ i++ ]) ) {  
// check each className given, space seperated list  
state = isBool ? state : !self.hasClass( className );  
self[ state ? "addClass" : "removeClass" ]( className );  
}  
 
} else if ( type === "undefined" || type === "boolean" ) {  
if ( this.className ) {  
// store className if set  
jQuery.data( this, "__className__", this.className );  
}  
 
// toggle whole className  
this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";  
}  
});  
},  
 
hasClass: function( selector ) {  
var className = " " + selector + " ";  
for ( var i = 0, l = this.length; i < l; i++ ) {  
if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {  
return true;  
}  
}  
 
return false;  
},  
 
val: function( value ) {  
if ( !arguments.length ) {  
var elem = this[0];  
 
if ( elem ) {  
if ( jQuery.nodeName( elem, "option" ) ) {  
// attributes.value is undefined in Blackberry 4.7 but  
// uses .value. See #6932  
var val = elem.attributes.value;  
return !val || val.specified ? elem.value : elem.text;  
}  
 
// We need to handle select boxes special  
if ( jQuery.nodeName( elem, "select" ) ) {  
var index = elem.selectedIndex,  
values = [],  
options = elem.options,  
one = elem.type === "select-one";  
 
// Nothing was selected  
if ( index < 0 ) {  
return null;  
}  
 
// Loop through all the selected options  
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {  
var option = options[ i ];  
 
// Don't return options that are disabled or in a disabled optgroup  
if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&  
(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {  
 
// Get the specific value for the option  
value = jQuery(option).val();  
 
// We don't need an array for one selects  
if ( one ) {  
return value;  
}  
 
// Multi-Selects return an array  
values.push( value );  
}  
}  
 
return values;  
}  
 
// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified  
if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {  
return elem.getAttribute("value") === null ? "on" : elem.value;  
}  
 
 
// Everything else, we just grab the value  
return (elem.value || "").replace(rreturn, "");  
 
}  
 
return undefined;  
}  
 
var isFunction = jQuery.isFunction(value);  
 
return this.each(function(i) {  
var self = jQuery(this), val = value;  
 
if ( this.nodeType !== 1 ) {  
return;  
}  
 
if ( isFunction ) {  
val = value.call(this, i, self.val());  
}  
 
// Treat null/undefined as ""; convert numbers to string  
if ( val == null ) {  
val = "";  
} else if ( typeof val === "number" ) {  
val += "";  
} else if ( jQuery.isArray(val) ) {  
val = jQuery.map(val, function (value) {  
return value == null ? "" : value + "";  
});  
}  
 
if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {  
this.checked = jQuery.inArray( self.val(), val ) >= 0;  
 
} else if ( jQuery.nodeName( this, "select" ) ) {  
var values = jQuery.makeArray(val);  
 
jQuery( "option", this ).each(function() {  
this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;  
});  
 
if ( !values.length ) {  
this.selectedIndex = -1;  
}  
 
} else {  
this.value = val;  
}  
});  
}  
});  
 
jQuery.extend({  
attrFn: {  
val: true,  
css: true,  
html: true,  
text: true,  
data: true,  
width: true,  
height: true,  
offset: true  
},  
 
attr: function( elem, name, value, pass ) {  
// don't set attributes on text and comment nodes  
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {  
return undefined;  
}  
 
if ( pass && name in jQuery.attrFn ) {  
return jQuery(elem)[name](value);  
}  
 
var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),  
// Whether we are setting (or getting)  
set = value !== undefined;  
 
// Try to normalize/fix the name  
name = notxml && jQuery.props[ name ] || name;  
 
// These attributes require special treatment  
var special = rspecialurl.test( name );  
 
// Safari mis-reports the default selected property of an option  
// Accessing the parent's selectedIndex property fixes it  
if ( name === "selected" && !jQuery.support.optSelected ) {  
var parent = elem.parentNode;  
if ( parent ) {  
parent.selectedIndex;  
 
// Make sure that it also works with optgroups, see #5701  
if ( parent.parentNode ) {  
parent.parentNode.selectedIndex;  
}  
}  
}  
 
// If applicable, access the attribute via the DOM 0 way  
// 'in' checks fail in Blackberry 4.7 #6931  
if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {  
if ( set ) {  
// We can't allow the type property to be changed (since it causes problems in IE)  
if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {  
jQuery.error( "type property can't be changed" );  
}  
 
if ( value === null ) {  
if ( elem.nodeType === 1 ) {  
elem.removeAttribute( name );  
}  
 
} else {  
elem[ name ] = value;  
}  
}  
 
// browsers index elements by id/name on forms, give priority to attributes.  
if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {  
return elem.getAttributeNode( name ).nodeValue;  
}  
 
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set  
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/  
if ( name === "tabIndex" ) {  
var attributeNode = elem.getAttributeNode( "tabIndex" );  
 
return attributeNode && attributeNode.specified ?  
attributeNode.value :  
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?  
0 :  
undefined;  
}  
 
return elem[ name ];  
}  
 
if ( !jQuery.support.style && notxml && name === "style" ) {  
if ( set ) {  
elem.style.cssText = "" + value;  
}  
 
return elem.style.cssText;  
}  
 
if ( set ) {  
// convert the value to a string (all browsers do this but IE) see #1070  
elem.setAttribute( name, "" + value );  
}  
 
// Ensure that missing attributes return undefined  
// Blackberry 4.7 returns "" from getAttribute #6938  
if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {  
return undefined;  
}  
 
var attr = !jQuery.support.hrefNormalized && notxml && special ?  
// Some attributes require a special call on IE  
elem.getAttribute( name, 2 ) :  
elem.getAttribute( name );  
 
// Non-existent attributes return null, we normalize to undefined  
return attr === null ? undefined : attr;  
}  
});  
 
 
 
 
var rnamespaces = /\.(.*)$/,  
rformElems = /^(?:textarea|input|select)$/i,  
rperiod = /\./g,  
rspace = / /g,  
rescape = /[^\w\s.|`]/g,  
fcleanup = function( nm ) {  
return nm.replace(rescape, "\\$&");  
},  
focusCounts = { focusin: 0, focusout: 0 };  
 
/*  
* A number of helper functions used for managing events.  
* Many of the ideas behind this code originated from  
* Dean Edwards' addEvent library.  
*/  
jQuery.event = {  
 
// Bind an event to an element  
// Original by Dean Edwards  
add: function( elem, types, handler, data ) {  
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {  
return;  
}  
 
// For whatever reason, IE has trouble passing the window object  
// around, causing it to be cloned in the process  
if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {  
elem = window;  
}  
 
if ( handler === false ) {  
handler = returnFalse;  
} else if ( !handler ) {  
// Fixes bug #7229. Fix recommended by jdalton  
return;  
}  
 
var handleObjIn, handleObj;  
 
if ( handler.handler ) {  
handleObjIn = handler;  
handler = handleObjIn.handler;  
}  
 
// Make sure that the function being executed has a unique ID  
if ( !handler.guid ) {  
handler.guid = jQuery.guid++;  
}  
 
// Init the element's event structure  
var elemData = jQuery.data( elem );  
 
// If no elemData is found then we must be trying to bind to one of the  
// banned noData elements  
if ( !elemData ) {  
return;  
}  
 
// Use a key less likely to result in collisions for plain JS objects.  
// Fixes bug #7150.  
var eventKey = elem.nodeType ? "events" : "__events__",  
events = elemData[ eventKey ],  
eventHandle = elemData.handle;  
 
if ( typeof events === "function" ) {  
// On plain objects events is a fn that holds the the data  
// which prevents this data from being JSON serialized  
// the function does not need to be called, it just contains the data  
eventHandle = events.handle;  
events = events.events;  
 
} else if ( !events ) {  
if ( !elem.nodeType ) {  
// On plain objects, create a fn that acts as the holder  
// of the values to avoid JSON serialization of event data  
elemData[ eventKey ] = elemData = function(){};  
}  
 
elemData.events = events = {};  
}  
 
if ( !eventHandle ) {  
elemData.handle = eventHandle = function() {  
// Handle the second event of a trigger and when  
// an event is called after a page has unloaded  
return typeof jQuery !== "undefined" && !jQuery.event.triggered ?  
jQuery.event.handle.apply( eventHandle.elem, arguments ) :  
undefined;  
};  
}  
 
// Add elem as a property of the handle function  
// This is to prevent a memory leak with non-native events in IE.  
eventHandle.elem = elem;  
 
// Handle multiple events separated by a space  
// jQuery(...).bind("mouseover mouseout", fn);  
types = types.split(" ");  
 
var type, i = 0, namespaces;  
 
while ( (type = types[ i++ ]) ) {  
handleObj = handleObjIn ?  
jQuery.extend({}, handleObjIn) :  
{ handler: handler, data: data };  
 
// Namespaced event handlers  
if ( type.indexOf(".") > -1 ) {  
namespaces = type.split(".");  
type = namespaces.shift();  
handleObj.namespace = namespaces.slice(0).sort().join(".");  
 
} else {  
namespaces = [];  
handleObj.namespace = "";  
}  
 
handleObj.type = type;  
if ( !handleObj.guid ) {  
handleObj.guid = handler.guid;  
}  
 
// Get the current list of functions bound to this event  
var handlers = events[ type ],  
special = jQuery.event.special[ type ] || {};  
 
// Init the event handler queue  
if ( !handlers ) {  
handlers = events[ type ] = [];  
 
// Check for a special event handler  
// Only use addEventListener/attachEvent if the special  
// events handler returns false  
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {  
// Bind the global event handler to the element  
if ( elem.addEventListener ) {  
elem.addEventListener( type, eventHandle, false );  
 
} else if ( elem.attachEvent ) {  
elem.attachEvent( "on" + type, eventHandle );  
}  
}  
}  
 
if ( special.add ) {  
special.add.call( elem, handleObj );  
 
if ( !handleObj.handler.guid ) {  
handleObj.handler.guid = handler.guid;  
}  
}  
 
// Add the function to the element's handler list  
handlers.push( handleObj );  
 
// Keep track of which events have been used, for global triggering  
jQuery.event.global[ type ] = true;  
}  
 
// Nullify elem to prevent memory leaks in IE  
elem = null;  
},  
 
global: {},  
 
// Detach an event or set of events from an element  
remove: function( elem, types, handler, pos ) {  
// don't do events on text and comment nodes  
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {  
return;  
}  
 
if ( handler === false ) {  
handler = returnFalse;  
}  
 
var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,  
eventKey = elem.nodeType ? "events" : "__events__",  
elemData = jQuery.data( elem ),  
events = elemData && elemData[ eventKey ];  
 
if ( !elemData || !events ) {  
return;  
}  
 
if ( typeof events === "function" ) {  
elemData = events;  
events = events.events;  
}  
 
// types is actually an event object here  
if ( types && types.type ) {  
handler = types.handler;  
types = types.type;  
}  
 
// Unbind all events for the element  
if ( !types || typeof types === "string" && types.charAt(0) === "." ) {  
types = types || "";  
 
for ( type in events ) {  
jQuery.event.remove( elem, type + types );  
}  
 
return;  
}  
 
// Handle multiple events separated by a space  
// jQuery(...).unbind("mouseover mouseout", fn);  
types = types.split(" ");  
 
while ( (type = types[ i++ ]) ) {  
origType = type;  
handleObj = null;  
all = type.indexOf(".") < 0;  
namespaces = [];  
 
if ( !all ) {  
// Namespaced event handlers  
namespaces = type.split(".");  
type = namespaces.shift();  
 
namespace = new RegExp("(^|\\.)" +  
jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");  
}  
 
eventType = events[ type ];  
 
if ( !eventType ) {  
continue;  
}  
 
if ( !handler ) {  
for ( j = 0; j < eventType.length; j++ ) {  
handleObj = eventType[ j ];  
 
if ( all || namespace.test( handleObj.namespace ) ) {  
jQuery.event.remove( elem, origType, handleObj.handler, j );  
eventType.splice( j--, 1 );  
}  
}  
 
continue;  
}  
 
special = jQuery.event.special[ type ] || {};  
 
for ( j = pos || 0; j < eventType.length; j++ ) {  
handleObj = eventType[ j ];  
 
if ( handler.guid === handleObj.guid ) {  
// remove the given handler for the given type  
if ( all || namespace.test( handleObj.namespace ) ) {  
if ( pos == null ) {  
eventType.splice( j--, 1 );  
}  
 
if ( special.remove ) {  
special.remove.call( elem, handleObj );  
}  
}  
 
if ( pos != null ) {  
break;  
}  
}  
}  
 
// remove generic event handler if no more handlers exist  
if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {  
if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {  
jQuery.removeEvent( elem, type, elemData.handle );  
}  
 
ret = null;  
delete events[ type ];  
}  
}  
 
// Remove the expando if it's no longer used  
if ( jQuery.isEmptyObject( events ) ) {  
var handle = elemData.handle;  
if ( handle ) {  
handle.elem = null;  
}  
 
delete elemData.events;  
delete elemData.handle;  
 
if ( typeof elemData === "function" ) {  
jQuery.removeData( elem, eventKey );  
 
} else if ( jQuery.isEmptyObject( elemData ) ) {  
jQuery.removeData( elem );  
}  
}  
},  
 
// bubbling is internal  
trigger: function( event, data, elem /*, bubbling */ ) {  
// Event object or event type  
var type = event.type || event,  
bubbling = arguments[3];  
 
if ( !bubbling ) {  
event = typeof event === "object" ?  
// jQuery.Event object  
event[ jQuery.expando ] ? event :  
// Object literal  
jQuery.extend( jQuery.Event(type), event ) :  
// Just the event type (string)  
jQuery.Event(type);  
 
if ( type.indexOf("!") >= 0 ) {  
event.type = type = type.slice(0, -1);  
event.exclusive = true;  
}  
 
// Handle a global trigger  
if ( !elem ) {  
// Don't bubble custom events when global (to avoid too much overhead)  
event.stopPropagation();  
 
// Only trigger if we've ever bound an event for it  
if ( jQuery.event.global[ type ] ) {  
jQuery.each( jQuery.cache, function() {  
if ( this.events && this.events[type] ) {  
jQuery.event.trigger( event, data, this.handle.elem );  
}  
});  
}  
}  
 
// Handle triggering a single element  
 
// don't do events on text and comment nodes  
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {  
return undefined;  
}  
 
// Clean up in case it is reused  
event.result = undefined;  
event.target = elem;  
 
// Clone the incoming data, if any  
data = jQuery.makeArray( data );  
data.unshift( event );  
}  
 
event.currentTarget = elem;  
 
// Trigger the event, it is assumed that "handle" is a function  
var handle = elem.nodeType ?  
jQuery.data( elem, "handle" ) :  
(jQuery.data( elem, "__events__" ) || {}).handle;  
 
if ( handle ) {  
handle.apply( elem, data );  
}  
 
var parent = elem.parentNode || elem.ownerDocument;  
 
// Trigger an inline bound script  
try {  
if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {  
if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {  
event.result = false;  
event.preventDefault();  
}  
}  
 
// prevent IE from throwing an error for some elements with some event types, see #3533  
} catch (inlineError) {}  
 
if ( !event.isPropagationStopped() && parent ) {  
jQuery.event.trigger( event, data, parent, true );  
 
} else if ( !event.isDefaultPrevented() ) {  
var old,  
target = event.target,  
targetType = type.replace( rnamespaces, "" ),  
isClick = jQuery.nodeName( target, "a" ) && targetType === "click",  
special = jQuery.event.special[ targetType ] || {};  
 
if ( (!special._default || special._default.call( elem, event ) === false) &&  
!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {  
 
try {  
if ( target[ targetType ] ) {  
// Make sure that we don't accidentally re-trigger the onFOO events  
old = target[ "on" + targetType ];  
 
if ( old ) {  
target[ "on" + targetType ] = null;  
}  
 
jQuery.event.triggered = true;  
target[ targetType ]();  
}  
 
// prevent IE from throwing an error for some elements with some event types, see #3533  
} catch (triggerError) {}  
 
if ( old ) {  
target[ "on" + targetType ] = old;  
}  
 
jQuery.event.triggered = false;  
}  
}  
},  
 
handle: function( event ) {  
var all, handlers, namespaces, namespace_re, events,  
namespace_sort = [],  
args = jQuery.makeArray( arguments );  
 
event = args[0] = jQuery.event.fix( event || window.event );  
event.currentTarget = this;  
 
// Namespaced event handlers  
all = event.type.indexOf(".") < 0 && !event.exclusive;  
 
if ( !all ) {  
namespaces = event.type.split(".");  
event.type = namespaces.shift();  
namespace_sort = namespaces.slice(0).sort();  
namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");  
}  
 
event.namespace = event.namespace || namespace_sort.join(".");  
 
events = jQuery.data(this, this.nodeType ? "events" : "__events__");  
 
if ( typeof events === "function" ) {  
events = events.events;  
}  
 
handlers = (events || {})[ event.type ];  
 
if ( events && handlers ) {  
// Clone the handlers to prevent manipulation  
handlers = handlers.slice(0);  
 
for ( var j = 0, l = handlers.length; j < l; j++ ) {  
var handleObj = handlers[ j ];  
 
// Filter the functions by class  
if ( all || namespace_re.test( handleObj.namespace ) ) {  
// Pass in a reference to the handler function itself  
// So that we can later remove it  
event.handler = handleObj.handler;  
event.data = handleObj.data;  
event.handleObj = handleObj;  
 
var ret = handleObj.handler.apply( this, args );  
 
if ( ret !== undefined ) {  
event.result = ret;  
if ( ret === false ) {  
event.preventDefault();  
event.stopPropagation();  
}  
}  
 
if ( event.isImmediatePropagationStopped() ) {  
break;  
}  
}  
}  
}  
 
return event.result;  
},  
 
props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),  
 
fix: function( event ) {  
if ( event[ jQuery.expando ] ) {  
return event;  
}  
 
// store a copy of the original event object  
// and "clone" to set read-only properties  
var originalEvent = event;  
event = jQuery.Event( originalEvent );  
 
for ( var i = this.props.length, prop; i; ) {  
prop = this.props[ --i ];  
event[ prop ] = originalEvent[ prop ];  
}  
 
// Fix target property, if necessary  
if ( !event.target ) {  
// Fixes #1925 where srcElement might not be defined either  
event.target = event.srcElement || document;  
}  
 
// check if target is a textnode (safari)  
if ( event.target.nodeType === 3 ) {  
event.target = event.target.parentNode;  
}  
 
// Add relatedTarget, if necessary  
if ( !event.relatedTarget && event.fromElement ) {  
event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;  
}  
 
// Calculate pageX/Y if missing and clientX/Y available  
if ( event.pageX == null && event.clientX != null ) {  
var doc = document.documentElement,  
body = document.body;  
 
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);  
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);  
}  
 
// Add which for key events  
if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {  
event.which = event.charCode != null ? event.charCode : event.keyCode;  
}  
 
// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)  
if ( !event.metaKey && event.ctrlKey ) {  
event.metaKey = event.ctrlKey;  
}  
 
// Add which for click: 1 === left; 2 === middle; 3 === right  
// Note: button is not normalized, so don't use it  
if ( !event.which && event.button !== undefined ) {  
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));  
}  
 
return event;  
},  
 
// Deprecated, use jQuery.guid instead  
guid: 1E8,  
 
// Deprecated, use jQuery.proxy instead  
proxy: jQuery.proxy,  
 
special: {  
ready: {  
// Make sure the ready event is setup  
setup: jQuery.bindReady,  
teardown: jQuery.noop  
},  
 
live: {  
add: function( handleObj ) {  
jQuery.event.add( this,  
liveConvert( handleObj.origType, handleObj.selector ),  
jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );  
},  
 
remove: function( handleObj ) {  
jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );  
}  
},  
 
beforeunload: {  
setup: function( data, namespaces, eventHandle ) {  
// We only want to do this special case on windows  
if ( jQuery.isWindow( this ) ) {  
this.onbeforeunload = eventHandle;  
}  
},  
 
teardown: function( namespaces, eventHandle ) {  
if ( this.onbeforeunload === eventHandle ) {  
this.onbeforeunload = null;  
}  
}  
}  
}  
};  
 
jQuery.removeEvent = document.removeEventListener ?  
function( elem, type, handle ) {  
if ( elem.removeEventListener ) {  
elem.removeEventListener( type, handle, false );  
}  
} :  
function( elem, type, handle ) {  
if ( elem.detachEvent ) {  
elem.detachEvent( "on" + type, handle );  
}  
};  
 
jQuery.Event = function( src ) {  
// Allow instantiation without the 'new' keyword  
if ( !this.preventDefault ) {  
return new jQuery.Event( src );  
}  
 
// Event object  
if ( src && src.type ) {  
this.originalEvent = src;  
this.type = src.type;  
// Event type  
} else {  
this.type = src;  
}  
 
// timeStamp is buggy for some events on Firefox(#3843)  
// So we won't rely on the native value  
this.timeStamp = jQuery.now();  
 
// Mark it as fixed  
this[ jQuery.expando ] = true;  
};  
 
function returnFalse() {  
return false;  
}  
function returnTrue() {  
return true;  
}  
 
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding  
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html  
jQuery.Event.prototype = {  
preventDefault: function() {  
this.isDefaultPrevented = returnTrue;  
 
var e = this.originalEvent;  
if ( !e ) {  
return;  
}  
 
// if preventDefault exists run it on the original event  
if ( e.preventDefault ) {  
e.preventDefault();  
 
// otherwise set the returnValue property of the original event to false (IE)  
} else {  
e.returnValue = false;  
}  
},  
stopPropagation: function() {  
this.isPropagationStopped = returnTrue;  
 
var e = this.originalEvent;  
if ( !e ) {  
return;  
}  
// if stopPropagation exists run it on the original event  
if ( e.stopPropagation ) {  
e.stopPropagation();  
}  
// otherwise set the cancelBubble property of the original event to true (IE)  
e.cancelBubble = true;  
},  
stopImmediatePropagation: function() {  
this.isImmediatePropagationStopped = returnTrue;  
this.stopPropagation();  
},  
isDefaultPrevented: returnFalse,  
isPropagationStopped: returnFalse,  
isImmediatePropagationStopped: returnFalse  
};  
 
// Checks if an event happened on an element within another element  
// Used in jQuery.event.special.mouseenter and mouseleave handlers  
var withinElement = function( event ) {  
// Check if mouse(over|out) are still within the same parent element  
var parent = event.relatedTarget;  
 
// Firefox sometimes assigns relatedTarget a XUL element  
// which we cannot access the parentNode property of  
try {  
// Traverse up the tree  
while ( parent && parent !== this ) {  
parent = parent.parentNode;  
}  
 
if ( parent !== this ) {  
// set the correct event type  
event.type = event.data;  
 
// handle event if we actually just moused on to a non sub-element  
jQuery.event.handle.apply( this, arguments );  
}  
 
// assuming we've left the element since we most likely mousedover a xul element  
} catch(e) { }  
},  
 
// In case of event delegation, we only need to rename the event.type,  
// liveHandler will take care of the rest.  
delegate = function( event ) {  
event.type = event.data;  
jQuery.event.handle.apply( this, arguments );  
};  
 
// Create mouseenter and mouseleave events  
jQuery.each({  
mouseenter: "mouseover",  
mouseleave: "mouseout"  
}, function( orig, fix ) {  
jQuery.event.special[ orig ] = {  
setup: function( data ) {  
jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );  
},  
teardown: function( data ) {  
jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );  
}  
};  
});  
 
// submit delegation  
if ( !jQuery.support.submitBubbles ) {  
 
jQuery.event.special.submit = {  
setup: function( data, namespaces ) {  
if ( this.nodeName.toLowerCase() !== "form" ) {  
jQuery.event.add(this, "click.specialSubmit", function( e ) {  
var elem = e.target,  
type = elem.type;  
 
if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {  
e.liveFired = undefined;  
return trigger( "submit", this, arguments );  
}  
});  
 
jQuery.event.add(this, "keypress.specialSubmit", function( e ) {  
var elem = e.target,  
type = elem.type;  
 
if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {  
e.liveFired = undefined;  
return trigger( "submit", this, arguments );  
}  
});  
 
} else {  
return false;  
}  
},  
 
teardown: function( namespaces ) {  
jQuery.event.remove( this, ".specialSubmit" );  
}  
};  
 
}  
 
// change delegation, happens here so we have bind.  
if ( !jQuery.support.changeBubbles ) {  
 
var changeFilters,  
 
getVal = function( elem ) {  
var type = elem.type, val = elem.value;  
 
if ( type === "radio" || type === "checkbox" ) {  
val = elem.checked;  
 
} else if ( type === "select-multiple" ) {  
val = elem.selectedIndex > -1 ?  
jQuery.map( elem.options, function( elem ) {  
return elem.selected;  
}).join("-") :  
"";  
 
} else if ( elem.nodeName.toLowerCase() === "select" ) {  
val = elem.selectedIndex;  
}  
 
return val;  
},  
 
testChange = function testChange( e ) {  
var elem = e.target, data, val;  
 
if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {  
return;  
}  
 
data = jQuery.data( elem, "_change_data" );  
val = getVal(elem);  
 
// the current data will be also retrieved by beforeactivate  
if ( e.type !== "focusout" || elem.type !== "radio" ) {  
jQuery.data( elem, "_change_data", val );  
}  
 
if ( data === undefined || val === data ) {  
return;  
}  
 
if ( data != null || val ) {  
e.type = "change";  
e.liveFired = undefined;  
return jQuery.event.trigger( e, arguments[1], elem );  
}  
};  
 
jQuery.event.special.change = {  
filters: {  
focusout: testChange,  
 
beforedeactivate: testChange,  
 
click: function( e ) {  
var elem = e.target, type = elem.type;  
 
if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {  
return testChange.call( this, e );  
}  
},  
 
// Change has to be called before submit  
// Keydown will be called before keypress, which is used in submit-event delegation  
keydown: function( e ) {  
var elem = e.target, type = elem.type;  
 
if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||  
(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||  
type === "select-multiple" ) {  
return testChange.call( this, e );  
}  
},  
 
// Beforeactivate happens also before the previous element is blurred  
// with this event you can't trigger a change event, but you can store  
// information  
beforeactivate: function( e ) {  
var elem = e.target;  
jQuery.data( elem, "_change_data", getVal(elem) );  
}  
},  
 
setup: function( data, namespaces ) {  
if ( this.type === "file" ) {  
return false;  
}  
 
for ( var type in changeFilters ) {  
jQuery.event.add( this, type + ".specialChange", changeFilters[type] );  
}  
 
return rformElems.test( this.nodeName );  
},  
 
teardown: function( namespaces ) {  
jQuery.event.remove( this, ".specialChange" );  
 
return rformElems.test( this.nodeName );  
}  
};  
 
changeFilters = jQuery.event.special.change.filters;  
 
// Handle when the input is .focus()'d  
changeFilters.focus = changeFilters.beforeactivate;  
}  
 
function trigger( type, elem, args ) {  
args[0].type = type;  
return jQuery.event.handle.apply( elem, args );  
}  
 
// Create "bubbling" focus and blur events  
if ( document.addEventListener ) {  
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {  
jQuery.event.special[ fix ] = {  
setup: function() {  
if ( focusCounts[fix]++ === 0 ) {  
document.addEventListener( orig, handler, true );  
}  
},  
teardown: function() {  
if ( --focusCounts[fix] === 0 ) {  
document.removeEventListener( orig, handler, true );  
}  
}  
};  
 
function handler( e ) {  
e = jQuery.event.fix( e );  
e.type = fix;  
return jQuery.event.trigger( e, null, e.target );  
}  
});  
}  
 
jQuery.each(["bind", "one"], function( i, name ) {  
jQuery.fn[ name ] = function( type, data, fn ) {  
// Handle object literals  
if ( typeof type === "object" ) {  
for ( var key in type ) {  
this[ name ](key, data, type[key], fn);  
}  
return this;  
}  
 
if ( jQuery.isFunction( data ) || data === false ) {  
fn = data;  
data = undefined;  
}  
 
var handler = name === "one" ? jQuery.proxy( fn, function( event ) {  
jQuery( this ).unbind( event, handler );  
return fn.apply( this, arguments );  
}) : fn;  
 
if ( type === "unload" && name !== "one" ) {  
this.one( type, data, fn );  
 
} else {  
for ( var i = 0, l = this.length; i < l; i++ ) {  
jQuery.event.add( this[i], type, handler, data );  
}  
}  
 
return this;  
};  
});  
 
jQuery.fn.extend({  
unbind: function( type, fn ) {  
// Handle object literals  
if ( typeof type === "object" && !type.preventDefault ) {  
for ( var key in type ) {  
this.unbind(key, type[key]);  
}  
 
} else {  
for ( var i = 0, l = this.length; i < l; i++ ) {  
jQuery.event.remove( this[i], type, fn );  
}  
}  
 
return this;  
},  
 
delegate: function( selector, types, data, fn ) {  
return this.live( types, data, fn, selector );  
},  
 
undelegate: function( selector, types, fn ) {  
if ( arguments.length === 0 ) {  
return this.unbind( "live" );  
 
} else {  
return this.die( types, null, fn, selector );  
}  
},  
 
trigger: function( type, data ) {  
return this.each(function() {  
jQuery.event.trigger( type, data, this );  
});  
},  
 
triggerHandler: function( type, data ) {  
if ( this[0] ) {  
var event = jQuery.Event( type );  
event.preventDefault();  
event.stopPropagation();  
jQuery.event.trigger( event, data, this[0] );  
return event.result;  
}  
},  
 
toggle: function( fn ) {  
// Save reference to arguments for access in closure  
var args = arguments,  
i = 1;  
 
// link all the functions, so any of them can unbind this click handler  
while ( i < args.length ) {  
jQuery.proxy( fn, args[ i++ ] );  
}  
 
return this.click( jQuery.proxy( fn, function( event ) {  
// Figure out which function to execute  
var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;  
jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );  
 
// Make sure that clicks stop  
event.preventDefault();  
 
// and execute the function  
return args[ lastToggle ].apply( this, arguments ) || false;  
}));  
},  
 
hover: function( fnOver, fnOut ) {  
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );  
}  
});  
 
var liveMap = {  
focus: "focusin",  
blur: "focusout",  
mouseenter: "mouseover",  
mouseleave: "mouseout"  
};  
 
jQuery.each(["live", "die"], function( i, name ) {  
jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {  
var type, i = 0, match, namespaces, preType,  
selector = origSelector || this.selector,  
context = origSelector ? this : jQuery( this.context );  
 
if ( typeof types === "object" && !types.preventDefault ) {  
for ( var key in types ) {  
context[ name ]( key, data, types[key], selector );  
}  
 
return this;  
}  
 
if ( jQuery.isFunction( data ) ) {  
fn = data;  
data = undefined;  
}  
 
types = (types || "").split(" ");  
 
while ( (type = types[ i++ ]) != null ) {  
match = rnamespaces.exec( type );  
namespaces = "";  
 
if ( match ) {  
namespaces = match[0];  
type = type.replace( rnamespaces, "" );  
}  
 
if ( type === "hover" ) {  
types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );  
continue;  
}  
 
preType = type;  
 
if ( type === "focus" || type === "blur" ) {  
types.push( liveMap[ type ] + namespaces );  
type = type + namespaces;  
 
} else {  
type = (liveMap[ type ] || type) + namespaces;  
}  
 
if ( name === "live" ) {  
// bind live handler  
for ( var j = 0, l = context.length; j < l; j++ ) {  
jQuery.event.add( context[j], "live." + liveConvert( type, selector ),  
{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );  
}  
 
} else {  
// unbind live handler  
context.unbind( "live." + liveConvert( type, selector ), fn );  
}  
}  
 
return this;  
};  
});  
 
function liveHandler( event ) {  
var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,  
elems = [],  
selectors = [],  
events = jQuery.data( this, this.nodeType ? "events" : "__events__" );  
 
if ( typeof events === "function" ) {  
events = events.events;  
}  
 
// Make sure we avoid non-left-click bubbling in Firefox (#3861)  
if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {  
return;  
}  
 
if ( event.namespace ) {  
namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");  
}  
 
event.liveFired = this;  
 
var live = events.live.slice(0);  
 
for ( j = 0; j < live.length; j++ ) {  
handleObj = live[j];  
 
if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {  
selectors.push( handleObj.selector );  
 
} else {  
live.splice( j--, 1 );  
}  
}  
 
match = jQuery( event.target ).closest( selectors, event.currentTarget );  
 
for ( i = 0, l = match.length; i < l; i++ ) {  
close = match[i];  
 
for ( j = 0; j < live.length; j++ ) {  
handleObj = live[j];  
 
if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {  
elem = close.elem;  
related = null;  
 
// Those two events require additional checking  
if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {  
event.type = handleObj.preType;  
related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];  
}  
 
if ( !related || related !== elem ) {  
elems.push({ elem: elem, handleObj: handleObj, level: close.level });  
}  
}  
}  
}  
 
for ( i = 0, l = elems.length; i < l; i++ ) {  
match = elems[i];  
 
if ( maxLevel && match.level > maxLevel ) {  
break;  
}  
 
event.currentTarget = match.elem;  
event.data = match.handleObj.data;  
event.handleObj = match.handleObj;  
 
ret = match.handleObj.origHandler.apply( match.elem, arguments );  
 
if ( ret === false || event.isPropagationStopped() ) {  
maxLevel = match.level;  
 
if ( ret === false ) {  
stop = false;  
}  
if ( event.isImmediatePropagationStopped() ) {  
break;  
}  
}  
}  
 
return stop;  
}  
 
function liveConvert( type, selector ) {  
return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");  
}  
 
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +  
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +  
"change select submit keydown keypress keyup error").split(" "), function( i, name ) {  
 
// Handle event binding  
jQuery.fn[ name ] = function( data, fn ) {  
if ( fn == null ) {  
fn = data;  
data = null;  
}  
 
return arguments.length > 0 ?  
this.bind( name, data, fn ) :  
this.trigger( name );  
};  
 
if ( jQuery.attrFn ) {  
jQuery.attrFn[ name ] = true;  
}  
});  
 
// Prevent memory leaks in IE  
// Window isn't included so as not to unbind existing unload events  
// More info:  
// - http://isaacschlueter.com/2006/10/msie-memory-leaks/  
if ( window.attachEvent && !window.addEventListener ) {  
jQuery(window).bind("unload", function() {  
for ( var id in jQuery.cache ) {  
if ( jQuery.cache[ id ].handle ) {  
// Try/Catch is to handle iframes being unloaded, see #4280  
try {  
jQuery.event.remove( jQuery.cache[ id ].handle.elem );  
} catch(e) {}  
}  
}  
});  
}  
 
 
/*!  
* Sizzle CSS Selector Engine - v1.0  
* Copyright 2009, The Dojo Foundation  
* Released under the MIT, BSD, and GPL Licenses.  
* More information: http://sizzlejs.com/  
*/  
(function(){  
 
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,  
done = 0,  
toString = Object.prototype.toString,  
hasDuplicate = false,  
baseHasDuplicate = true;  
 
// Here we check if the JavaScript engine is using some sort of  
// optimization where it does not always call our comparision  
// function. If that is the case, discard the hasDuplicate value.  
// Thus far that includes Google Chrome.  
[0, 0].sort(function() {  
baseHasDuplicate = false;  
return 0;  
});  
 
var Sizzle = function( selector, context, results, seed ) {  
results = results || [];  
context = context || document;  
 
var origContext = context;  
 
if ( context.nodeType !== 1 && context.nodeType !== 9 ) {  
return [];  
}  
 
if ( !selector || typeof selector !== "string" ) {  
return results;  
}  
 
var m, set, checkSet, extra, ret, cur, pop, i,  
prune = true,  
contextXML = Sizzle.isXML( context ),  
parts = [],  
soFar = selector;  
 
// Reset the position of the chunker regexp (start from head)  
do {  
chunker.exec( "" );  
m = chunker.exec( soFar );  
 
if ( m ) {  
soFar = m[3];  
 
parts.push( m[1] );  
 
if ( m[2] ) {  
extra = m[3];  
break;  
}  
}  
} while ( m );  
 
if ( parts.length > 1 && origPOS.exec( selector ) ) {  
 
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {  
set = posProcess( parts[0] + parts[1], context );  
 
} else {  
set = Expr.relative[ parts[0] ] ?  
[ context ] :  
Sizzle( parts.shift(), context );  
 
while ( parts.length ) {  
selector = parts.shift();  
 
if ( Expr.relative[ selector ] ) {  
selector += parts.shift();  
}  
 
set = posProcess( selector, set );  
}  
}  
 
} else {  
// Take a shortcut and set the context if the root selector is an ID  
// (but not if it'll be faster if the inner selector is an ID)  
if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&  
Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {  
 
ret = Sizzle.find( parts.shift(), context, contextXML );  
context = ret.expr ?  
Sizzle.filter( ret.expr, ret.set )[0] :  
ret.set[0];  
}  
 
if ( context ) {  
ret = seed ?  
{ expr: parts.pop(), set: makeArray(seed) } :  
Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );  
 
set = ret.expr ?  
Sizzle.filter( ret.expr, ret.set ) :  
ret.set;  
 
if ( parts.length > 0 ) {  
checkSet = makeArray( set );  
 
} else {  
prune = false;  
}  
 
while ( parts.length ) {  
cur = parts.pop();  
pop = cur;  
 
if ( !Expr.relative[ cur ] ) {  
cur = "";  
} else {  
pop = parts.pop();  
}  
 
if ( pop == null ) {  
pop = context;  
}  
 
Expr.relative[ cur ]( checkSet, pop, contextXML );  
}  
 
} else {  
checkSet = parts = [];  
}  
}  
 
if ( !checkSet ) {  
checkSet = set;  
}  
 
if ( !checkSet ) {  
Sizzle.error( cur || selector );  
}  
 
if ( toString.call(checkSet) === "[object Array]" ) {  
if ( !prune ) {  
results.push.apply( results, checkSet );  
 
} else if ( context && context.nodeType === 1 ) {  
for ( i = 0; checkSet[i] != null; i++ ) {  
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {  
results.push( set[i] );  
}  
}  
 
} else {  
for ( i = 0; checkSet[i] != null; i++ ) {  
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {  
results.push( set[i] );  
}  
}  
}  
 
} else {  
makeArray( checkSet, results );  
}  
 
if ( extra ) {  
Sizzle( extra, origContext, results, seed );  
Sizzle.uniqueSort( results );  
}  
 
return results;  
};  
 
Sizzle.uniqueSort = function( results ) {  
if ( sortOrder ) {  
hasDuplicate = baseHasDuplicate;  
results.sort( sortOrder );  
 
if ( hasDuplicate ) {  
for ( var i = 1; i < results.length; i++ ) {  
if ( results[i] === results[ i - 1 ] ) {  
results.splice( i--, 1 );  
}  
}  
}  
}  
 
return results;  
};  
 
Sizzle.matches = function( expr, set ) {  
return Sizzle( expr, null, null, set );  
};  
 
Sizzle.matchesSelector = function( node, expr ) {  
return Sizzle( expr, null, null, [node] ).length > 0;  
};  
 
Sizzle.find = function( expr, context, isXML ) {  
var set;  
 
if ( !expr ) {  
return [];  
}  
 
for ( var i = 0, l = Expr.order.length; i < l; i++ ) {  
var match,  
type = Expr.order[i];  
 
if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {  
var left = match[1];  
match.splice( 1, 1 );  
 
if ( left.substr( left.length - 1 ) !== "\\" ) {  
match[1] = (match[1] || "").replace(/\\/g, "");  
set = Expr.find[ type ]( match, context, isXML );  
 
if ( set != null ) {  
expr = expr.replace( Expr.match[ type ], "" );  
break;  
}  
}  
}  
}  
 
if ( !set ) {  
set = context.getElementsByTagName( "*" );  
}  
 
return { set: set, expr: expr };  
};  
 
Sizzle.filter = function( expr, set, inplace, not ) {  
var match, anyFound,  
old = expr,  
result = [],  
curLoop = set,  
isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );  
 
while ( expr && set.length ) {  
for ( var type in Expr.filter ) {  
if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {  
var found, item,  
filter = Expr.filter[ type ],  
left = match[1];  
 
anyFound = false;  
 
match.splice(1,1);  
 
if ( left.substr( left.length - 1 ) === "\\" ) {  
continue;  
}  
 
if ( curLoop === result ) {  
result = [];  
}  
 
if ( Expr.preFilter[ type ] ) {  
match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );  
 
if ( !match ) {  
anyFound = found = true;  
 
} else if ( match === true ) {  
continue;  
}  
}  
 
if ( match ) {  
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {  
if ( item ) {  
found = filter( item, match, i, curLoop );  
var pass = not ^ !!found;  
 
if ( inplace && found != null ) {  
if ( pass ) {  
anyFound = true;  
 
} else {  
curLoop[i] = false;  
}  
 
} else if ( pass ) {  
result.push( item );  
anyFound = true;  
}  
}  
}  
}  
 
if ( found !== undefined ) {  
if ( !inplace ) {  
curLoop = result;  
}  
 
expr = expr.replace( Expr.match[ type ], "" );  
 
if ( !anyFound ) {  
return [];  
}  
 
break;  
}  
}  
}  
 
// Improper expression  
if ( expr === old ) {  
if ( anyFound == null ) {  
Sizzle.error( expr );  
 
} else {  
break;  
}  
}  
 
old = expr;  
}  
 
return curLoop;  
};  
 
Sizzle.error = function( msg ) {  
throw "Syntax error, unrecognized expression: " + msg;  
};  
 
var Expr = Sizzle.selectors = {  
order: [ "ID", "NAME", "TAG" ],  
 
match: {  
ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,  
CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,  
NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,  
ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,  
TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,  
CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,  
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,  
PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/  
},  
 
leftMatch: {},  
 
attrMap: {  
"class": "className",  
"for": "htmlFor"  
},  
 
attrHandle: {  
href: function( elem ) {  
return elem.getAttribute( "href" );  
}  
},  
 
relative: {  
"+": function(checkSet, part){  
var isPartStr = typeof part === "string",  
isTag = isPartStr && !/\W/.test( part ),  
isPartStrNotTag = isPartStr && !isTag;  
 
if ( isTag ) {  
part = part.toLowerCase();  
}  
 
for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {  
if ( (elem = checkSet[i]) ) {  
while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}  
 
checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?  
elem || false :  
elem === part;  
}  
}  
 
if ( isPartStrNotTag ) {  
Sizzle.filter( part, checkSet, true );  
}  
},  
 
">": function( checkSet, part ) {  
var elem,  
isPartStr = typeof part === "string",  
i = 0,  
l = checkSet.length;  
 
if ( isPartStr && !/\W/.test( part ) ) {  
part = part.toLowerCase();  
 
for ( ; i < l; i++ ) {  
elem = checkSet[i];  
 
if ( elem ) {  
var parent = elem.parentNode;  
checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;  
}  
}  
 
} else {  
for ( ; i < l; i++ ) {  
elem = checkSet[i];  
 
if ( elem ) {  
checkSet[i] = isPartStr ?  
elem.parentNode :  
elem.parentNode === part;  
}  
}  
 
if ( isPartStr ) {  
Sizzle.filter( part, checkSet, true );  
}  
}  
},  
 
"": function(checkSet, part, isXML){  
var nodeCheck,  
doneName = done++,  
checkFn = dirCheck;  
 
if ( typeof part === "string" && !/\W/.test(part) ) {  
part = part.toLowerCase();  
nodeCheck = part;  
checkFn = dirNodeCheck;  
}  
 
checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );  
},  
 
"~": function( checkSet, part, isXML ) {  
var nodeCheck,  
doneName = done++,  
checkFn = dirCheck;  
 
if ( typeof part === "string" && !/\W/.test( part ) ) {  
part = part.toLowerCase();  
nodeCheck = part;  
checkFn = dirNodeCheck;  
}  
 
checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );  
}  
},  
 
find: {  
ID: function( match, context, isXML ) {  
if ( typeof context.getElementById !== "undefined" && !isXML ) {  
var m = context.getElementById(match[1]);  
// Check parentNode to catch when Blackberry 4.6 returns  
// nodes that are no longer in the document #6963  
return m && m.parentNode ? [m] : [];  
}  
},  
 
NAME: function( match, context ) {  
if ( typeof context.getElementsByName !== "undefined" ) {  
var ret = [],  
results = context.getElementsByName( match[1] );  
 
for ( var i = 0, l = results.length; i < l; i++ ) {  
if ( results[i].getAttribute("name") === match[1] ) {  
ret.push( results[i] );  
}  
}  
 
return ret.length === 0 ? null : ret;  
}  
},  
 
TAG: function( match, context ) {  
return context.getElementsByTagName( match[1] );  
}  
},  
preFilter: {  
CLASS: function( match, curLoop, inplace, result, not, isXML ) {  
match = " " + match[1].replace(/\\/g, "") + " ";  
 
if ( isXML ) {  
return match;  
}  
 
for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {  
if ( elem ) {  
if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {  
if ( !inplace ) {  
result.push( elem );  
}  
 
} else if ( inplace ) {  
curLoop[i] = false;  
}  
}  
}  
 
return false;  
},  
 
ID: function( match ) {  
return match[1].replace(/\\/g, "");  
},  
 
TAG: function( match, curLoop ) {  
return match[1].toLowerCase();  
},  
 
CHILD: function( match ) {  
if ( match[1] === "nth" ) {  
// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'  
var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(  
match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||  
!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);  
 
// calculate the numbers (first)n+(last) including if they are negative  
match[2] = (test[1] + (test[2] || 1)) - 0;  
match[3] = test[3] - 0;  
}  
 
// TODO: Move to normal caching system  
match[0] = done++;  
 
return match;  
},  
 
ATTR: function( match, curLoop, inplace, result, not, isXML ) {  
var name = match[1].replace(/\\/g, "");  
 
if ( !isXML && Expr.attrMap[name] ) {  
match[1] = Expr.attrMap[name];  
}  
 
if ( match[2] === "~=" ) {  
match[4] = " " + match[4] + " ";  
}  
 
return match;  
},  
 
PSEUDO: function( match, curLoop, inplace, result, not ) {  
if ( match[1] === "not" ) {  
// If we're dealing with a complex expression, or a simple one  
if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {  
match[3] = Sizzle(match[3], null, null, curLoop);  
 
} else {  
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);  
 
if ( !inplace ) {  
result.push.apply( result, ret );  
}  
 
return false;  
}  
 
} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {  
return true;  
}  
 
return match;  
},  
 
POS: function( match ) {  
match.unshift( true );  
 
return match;  
}  
},  
 
filters: {  
enabled: function( elem ) {  
return elem.disabled === false && elem.type !== "hidden";  
},  
 
disabled: function( elem ) {  
return elem.disabled === true;  
},  
 
checked: function( elem ) {  
return elem.checked === true;  
},  
 
selected: function( elem ) {  
// Accessing this property makes selected-by-default  
// options in Safari work properly  
elem.parentNode.selectedIndex;  
 
return elem.selected === true;  
},  
 
parent: function( elem ) {  
return !!elem.firstChild;  
},  
 
empty: function( elem ) {  
return !elem.firstChild;  
},  
 
has: function( elem, i, match ) {  
return !!Sizzle( match[3], elem ).length;  
},  
 
header: function( elem ) {  
return (/h\d/i).test( elem.nodeName );  
},  
 
text: function( elem ) {  
return "text" === elem.type;  
},  
radio: function( elem ) {  
return "radio" === elem.type;  
},  
 
checkbox: function( elem ) {  
return "checkbox" === elem.type;  
},  
 
file: function( elem ) {  
return "file" === elem.type;  
},  
password: function( elem ) {  
return "password" === elem.type;  
},  
 
submit: function( elem ) {  
return "submit" === elem.type;  
},  
 
image: function( elem ) {  
return "image" === elem.type;  
},  
 
reset: function( elem ) {  
return "reset" === elem.type;  
},  
 
button: function( elem ) {  
return "button" === elem.type || elem.nodeName.toLowerCase() === "button";  
},  
 
input: function( elem ) {  
return (/input|select|textarea|button/i).test( elem.nodeName );  
}  
},  
setFilters: {  
first: function( elem, i ) {  
return i === 0;  
},  
 
last: function( elem, i, match, array ) {  
return i === array.length - 1;  
},  
 
even: function( elem, i ) {  
return i % 2 === 0;  
},  
 
odd: function( elem, i ) {  
return i % 2 === 1;  
},  
 
lt: function( elem, i, match ) {  
return i < match[3] - 0;  
},  
 
gt: function( elem, i, match ) {  
return i > match[3] - 0;  
},  
 
nth: function( elem, i, match ) {  
return match[3] - 0 === i;  
},  
 
eq: function( elem, i, match ) {  
return match[3] - 0 === i;  
}  
},  
filter: {  
PSEUDO: function( elem, match, i, array ) {  
var name = match[1],  
filter = Expr.filters[ name ];  
 
if ( filter ) {  
return filter( elem, i, match, array );  
 
} else if ( name === "contains" ) {  
return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;  
 
} else if ( name === "not" ) {  
var not = match[3];  
 
for ( var j = 0, l = not.length; j < l; j++ ) {  
if ( not[j] === elem ) {  
return false;  
}  
}  
 
return true;  
 
} else {  
Sizzle.error( "Syntax error, unrecognized expression: " + name );  
}  
},  
 
CHILD: function( elem, match ) {  
var type = match[1],  
node = elem;  
 
switch ( type ) {  
case "only":  
case "first":  
while ( (node = node.previousSibling) ) {  
if ( node.nodeType === 1 ) {  
return false;  
}  
}  
 
if ( type === "first" ) {  
return true;  
}  
 
node = elem;  
 
case "last":  
while ( (node = node.nextSibling) ) {  
if ( node.nodeType === 1 ) {  
return false;  
}  
}  
 
return true;  
 
case "nth":  
var first = match[2],  
last = match[3];  
 
if ( first === 1 && last === 0 ) {  
return true;  
}  
 
var doneName = match[0],  
parent = elem.parentNode;  
 
if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {  
var count = 0;  
 
for ( node = parent.firstChild; node; node = node.nextSibling ) {  
if ( node.nodeType === 1 ) {  
node.nodeIndex = ++count;  
}  
}  
 
parent.sizcache = doneName;  
}  
 
var diff = elem.nodeIndex - last;  
 
if ( first === 0 ) {  
return diff === 0;  
 
} else {  
return ( diff % first === 0 && diff / first >= 0 );  
}  
}  
},  
 
ID: function( elem, match ) {  
return elem.nodeType === 1 && elem.getAttribute("id") === match;  
},  
 
TAG: function( elem, match ) {  
return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;  
},  
 
CLASS: function( elem, match ) {  
return (" " + (elem.className || elem.getAttribute("class")) + " ")  
.indexOf( match ) > -1;  
},  
 
ATTR: function( elem, match ) {  
var name = match[1],  
result = Expr.attrHandle[ name ] ?  
Expr.attrHandle[ name ]( elem ) :  
elem[ name ] != null ?  
elem[ name ] :  
elem.getAttribute( name ),  
value = result + "",  
type = match[2],  
check = match[4];  
 
return result == null ?  
type === "!=" :  
type === "=" ?  
value === check :  
type === "*=" ?  
value.indexOf(check) >= 0 :  
type === "~=" ?  
(" " + value + " ").indexOf(check) >= 0 :  
!check ?  
value && result !== false :  
type === "!=" ?  
value !== check :  
type === "^=" ?  
value.indexOf(check) === 0 :  
type === "$=" ?  
value.substr(value.length - check.length) === check :  
type === "|=" ?  
value === check || value.substr(0, check.length + 1) === check + "-" :  
false;  
},  
 
POS: function( elem, match, i, array ) {  
var name = match[2],  
filter = Expr.setFilters[ name ];  
 
if ( filter ) {  
return filter( elem, i, match, array );  
}  
}  
}  
};  
 
var origPOS = Expr.match.POS,  
fescape = function(all, num){  
return "\\" + (num - 0 + 1);  
};  
 
for ( var type in Expr.match ) {  
Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );  
Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );  
}  
 
var makeArray = function( array, results ) {  
array = Array.prototype.slice.call( array, 0 );  
 
if ( results ) {  
results.push.apply( results, array );  
return results;  
}  
 
return array;  
};  
 
// Perform a simple check to determine if the browser is capable of  
// converting a NodeList to an array using builtin methods.  
// Also verifies that the returned array holds DOM nodes  
// (which is not the case in the Blackberry browser)  
try {  
Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;  
 
// Provide a fallback method if it does not work  
} catch( e ) {  
makeArray = function( array, results ) {  
var i = 0,  
ret = results || [];  
 
if ( toString.call(array) === "[object Array]" ) {  
Array.prototype.push.apply( ret, array );  
 
} else {  
if ( typeof array.length === "number" ) {  
for ( var l = array.length; i < l; i++ ) {  
ret.push( array[i] );  
}  
 
} else {  
for ( ; array[i]; i++ ) {  
ret.push( array[i] );  
}  
}  
}  
 
return ret;  
};  
}  
 
var sortOrder, siblingCheck;  
 
if ( document.documentElement.compareDocumentPosition ) {  
sortOrder = function( a, b ) {  
if ( a === b ) {  
hasDuplicate = true;  
return 0;  
}  
 
if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {  
return a.compareDocumentPosition ? -1 : 1;  
}  
 
return a.compareDocumentPosition(b) & 4 ? -1 : 1;  
};  
 
} else {  
sortOrder = function( a, b ) {  
var al, bl,  
ap = [],  
bp = [],  
aup = a.parentNode,  
bup = b.parentNode,  
cur = aup;  
 
// The nodes are identical, we can exit early  
if ( a === b ) {  
hasDuplicate = true;  
return 0;  
 
// If the nodes are siblings (or identical) we can do a quick check  
} else if ( aup === bup ) {  
return siblingCheck( a, b );  
 
// If no parents were found then the nodes are disconnected  
} else if ( !aup ) {  
return -1;  
 
} else if ( !bup ) {  
return 1;  
}  
 
// Otherwise they're somewhere else in the tree so we need  
// to build up a full list of the parentNodes for comparison  
while ( cur ) {  
ap.unshift( cur );  
cur = cur.parentNode;  
}  
 
cur = bup;  
 
while ( cur ) {  
bp.unshift( cur );  
cur = cur.parentNode;  
}  
 
al = ap.length;  
bl = bp.length;  
 
// Start walking down the tree looking for a discrepancy  
for ( var i = 0; i < al && i < bl; i++ ) {  
if ( ap[i] !== bp[i] ) {  
return siblingCheck( ap[i], bp[i] );  
}  
}  
 
// We ended someplace up the tree so do a sibling check  
return i === al ?  
siblingCheck( a, bp[i], -1 ) :  
siblingCheck( ap[i], b, 1 );  
};  
 
siblingCheck = function( a, b, ret ) {  
if ( a === b ) {  
return ret;  
}  
 
var cur = a.nextSibling;  
 
while ( cur ) {  
if ( cur === b ) {  
return -1;  
}  
 
cur = cur.nextSibling;  
}  
 
return 1;  
};  
}  
 
// Utility function for retreiving the text value of an array of DOM nodes  
Sizzle.getText = function( elems ) {  
var ret = "", elem;  
 
for ( var i = 0; elems[i]; i++ ) {  
elem = elems[i];  
 
// Get the text from text nodes and CDATA nodes  
if ( elem.nodeType === 3 || elem.nodeType === 4 ) {  
ret += elem.nodeValue;  
 
// Traverse everything else, except comment nodes  
} else if ( elem.nodeType !== 8 ) {  
ret += Sizzle.getText( elem.childNodes );  
}  
}  
 
return ret;  
};  
 
// Check to see if the browser returns elements by name when  
// querying by getElementById (and provide a workaround)  
(function(){  
// We're going to inject a fake input element with a specified name  
var form = document.createElement("div"),  
id = "script" + (new Date()).getTime(),  
root = document.documentElement;  
 
form.innerHTML = "<a name='" + id + "'/>";  
 
// Inject it into the root element, check its status, and remove it quickly  
root.insertBefore( form, root.firstChild );  
 
// The workaround has to do additional checks after a getElementById  
// Which slows things down for other browsers (hence the branching)  
if ( document.getElementById( id ) ) {  
Expr.find.ID = function( match, context, isXML ) {  
if ( typeof context.getElementById !== "undefined" && !isXML ) {  
var m = context.getElementById(match[1]);  
 
return m ?  
m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?  
[m] :  
undefined :  
[];  
}  
};  
 
Expr.filter.ID = function( elem, match ) {  
var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");  
 
return elem.nodeType === 1 && node && node.nodeValue === match;  
};  
}  
 
root.removeChild( form );  
 
// release memory in IE  
root = form = null;  
})();  
 
(function(){  
// Check to see if the browser returns only elements  
// when doing getElementsByTagName("*")  
 
// Create a fake element  
var div = document.createElement("div");  
div.appendChild( document.createComment("") );  
 
// Make sure no comments are found  
if ( div.getElementsByTagName("*").length > 0 ) {  
Expr.find.TAG = function( match, context ) {  
var results = context.getElementsByTagName( match[1] );  
 
// Filter out possible comments  
if ( match[1] === "*" ) {  
var tmp = [];  
 
for ( var i = 0; results[i]; i++ ) {  
if ( results[i].nodeType === 1 ) {  
tmp.push( results[i] );  
}  
}  
 
results = tmp;  
}  
 
return results;  
};  
}  
 
// Check to see if an attribute returns normalized href attributes  
div.innerHTML = "<a href='#'></a>";  
 
if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&  
div.firstChild.getAttribute("href") !== "#" ) {  
 
Expr.attrHandle.href = function( elem ) {  
return elem.getAttribute( "href", 2 );  
};  
}  
 
// release memory in IE  
div = null;  
})();  
 
if ( document.querySelectorAll ) {  
(function(){  
var oldSizzle = Sizzle,  
div = document.createElement("div"),  
id = "__sizzle__";  
 
div.innerHTML = "<p class='TEST'></p>";  
 
// Safari can't handle uppercase or unicode characters when  
// in quirks mode.  
if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {  
return;  
}  
 
Sizzle = function( query, context, extra, seed ) {  
context = context || document;  
 
// Make sure that attribute selectors are quoted  
query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");  
 
// Only use querySelectorAll on non-XML documents  
// (ID selectors don't work in non-HTML documents)  
if ( !seed && !Sizzle.isXML(context) ) {  
if ( context.nodeType === 9 ) {  
try {  
return makeArray( context.querySelectorAll(query), extra );  
} catch(qsaError) {}  
 
// qSA works strangely on Element-rooted queries  
// We can work around this by specifying an extra ID on the root  
// and working up from there (Thanks to Andrew Dupont for the technique)  
// IE 8 doesn't work on object elements  
} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {  
var old = context.getAttribute( "id" ),  
nid = old || id;  
 
if ( !old ) {  
context.setAttribute( "id", nid );  
}  
 
try {  
return makeArray( context.querySelectorAll( "#" + nid + " " + query ), extra );  
 
} catch(pseudoError) {  
} finally {  
if ( !old ) {  
context.removeAttribute( "id" );  
}  
}  
}  
}  
 
return oldSizzle(query, context, extra, seed);  
};  
 
for ( var prop in oldSizzle ) {  
Sizzle[ prop ] = oldSizzle[ prop ];  
}  
 
// release memory in IE  
div = null;  
})();  
}  
 
(function(){  
var html = document.documentElement,  
matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,  
pseudoWorks = false;  
 
try {  
// This should fail with an exception  
// Gecko does not error, returns false instead  
matches.call( document.documentElement, "[test!='']:sizzle" );  
 
} catch( pseudoError ) {  
pseudoWorks = true;  
}  
 
if ( matches ) {  
Sizzle.matchesSelector = function( node, expr ) {  
// Make sure that attribute selectors are quoted  
expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");  
 
if ( !Sizzle.isXML( node ) ) {  
try {  
if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {  
return matches.call( node, expr );  
}  
} catch(e) {}  
}  
 
return Sizzle(expr, null, null, [node]).length > 0;  
};  
}  
})();  
 
(function(){  
var div = document.createElement("div");  
 
div.innerHTML = "<div class='test e'></div><div class='test'></div>";  
 
// Opera can't find a second classname (in 9.6)  
// Also, make sure that getElementsByClassName actually exists  
if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {  
return;  
}  
 
// Safari caches class attributes, doesn't catch changes (in 3.2)  
div.lastChild.className = "e";  
 
if ( div.getElementsByClassName("e").length === 1 ) {  
return;  
}  
 
Expr.order.splice(1, 0, "CLASS");  
Expr.find.CLASS = function( match, context, isXML ) {  
if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {  
return context.getElementsByClassName(match[1]);  
}  
};  
 
// release memory in IE  
div = null;  
})();  
 
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {  
for ( var i = 0, l = checkSet.length; i < l; i++ ) {  
var elem = checkSet[i];  
 
if ( elem ) {  
var match = false;  
 
elem = elem[dir];  
 
while ( elem ) {  
if ( elem.sizcache === doneName ) {  
match = checkSet[elem.sizset];  
break;  
}  
 
if ( elem.nodeType === 1 && !isXML ){  
elem.sizcache = doneName;  
elem.sizset = i;  
}  
 
if ( elem.nodeName.toLowerCase() === cur ) {  
match = elem;  
break;  
}  
 
elem = elem[dir];  
}  
 
checkSet[i] = match;  
}  
}  
}  
 
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {  
for ( var i = 0, l = checkSet.length; i < l; i++ ) {  
var elem = checkSet[i];  
 
if ( elem ) {  
var match = false;  
 
elem = elem[dir];  
 
while ( elem ) {  
if ( elem.sizcache === doneName ) {  
match = checkSet[elem.sizset];  
break;  
}  
 
if ( elem.nodeType === 1 ) {  
if ( !isXML ) {  
elem.sizcache = doneName;  
elem.sizset = i;  
}  
 
if ( typeof cur !== "string" ) {  
if ( elem === cur ) {  
match = true;  
break;  
}  
 
} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {  
match = elem;  
break;  
}  
}  
 
elem = elem[dir];  
}  
 
checkSet[i] = match;  
}  
}  
}  
 
if ( document.documentElement.contains ) {  
Sizzle.contains = function( a, b ) {  
return a !== b && (a.contains ? a.contains(b) : true);  
};  
 
} else if ( document.documentElement.compareDocumentPosition ) {  
Sizzle.contains = function( a, b ) {  
return !!(a.compareDocumentPosition(b) & 16);  
};  
 
} else {  
Sizzle.contains = function() {  
return false;  
};  
}  
 
Sizzle.isXML = function( elem ) {  
// documentElement is verified for cases where it doesn't yet exist  
// (such as loading iframes in IE - #4833)  
var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;  
 
return documentElement ? documentElement.nodeName !== "HTML" : false;  
};  
 
var posProcess = function( selector, context ) {  
var match,  
tmpSet = [],  
later = "",  
root = context.nodeType ? [context] : context;  
 
// Position selectors must be done after the filter  
// And so must :not(positional) so we move all PSEUDOs to the end  
while ( (match = Expr.match.PSEUDO.exec( selector )) ) {  
later += match[0];  
selector = selector.replace( Expr.match.PSEUDO, "" );  
}  
 
selector = Expr.relative[selector] ? selector + "*" : selector;  
 
for ( var i = 0, l = root.length; i < l; i++ ) {  
Sizzle( selector, root[i], tmpSet );  
}  
 
return Sizzle.filter( later, tmpSet );  
};  
 
// EXPOSE  
jQuery.find = Sizzle;  
jQuery.expr = Sizzle.selectors;  
jQuery.expr[":"] = jQuery.expr.filters;  
jQuery.unique = Sizzle.uniqueSort;  
jQuery.text = Sizzle.getText;  
jQuery.isXMLDoc = Sizzle.isXML;  
jQuery.contains = Sizzle.contains;  
 
 
})();  
 
 
var runtil = /Until$/,  
rparentsprev = /^(?:parents|prevUntil|prevAll)/,  
// Note: This RegExp should be improved, or likely pulled from Sizzle  
rmultiselector = /,/,  
isSimple = /^.[^:#\[\.,]*$/,  
slice = Array.prototype.slice,  
POS = jQuery.expr.match.POS;  
 
jQuery.fn.extend({  
find: function( selector ) {  
var ret = this.pushStack( "", "find", selector ),  
length = 0;  
 
for ( var i = 0, l = this.length; i < l; i++ ) {  
length = ret.length;  
jQuery.find( selector, this[i], ret );  
 
if ( i > 0 ) {  
// Make sure that the results are unique  
for ( var n = length; n < ret.length; n++ ) {  
for ( var r = 0; r < length; r++ ) {  
if ( ret[r] === ret[n] ) {  
ret.splice(n--, 1);  
break;  
}  
}  
}  
}  
}  
 
return ret;  
},  
 
has: function( target ) {  
var targets = jQuery( target );  
return this.filter(function() {  
for ( var i = 0, l = targets.length; i < l; i++ ) {  
if ( jQuery.contains( this, targets[i] ) ) {  
return true;  
}  
}  
});  
},  
 
not: function( selector ) {  
return this.pushStack( winnow(this, selector, false), "not", selector);  
},  
 
filter: function( selector ) {  
return this.pushStack( winnow(this, selector, true), "filter", selector );  
},  
 
is: function( selector ) {  
return !!selector && jQuery.filter( selector, this ).length > 0;  
},  
 
closest: function( selectors, context ) {  
var ret = [], i, l, cur = this[0];  
 
if ( jQuery.isArray( selectors ) ) {  
var match, selector,  
matches = {},  
level = 1;  
 
if ( cur && selectors.length ) {  
for ( i = 0, l = selectors.length; i < l; i++ ) {  
selector = selectors[i];  
 
if ( !matches[selector] ) {  
matches[selector] = jQuery.expr.match.POS.test( selector ) ?  
jQuery( selector, context || this.context ) :  
selector;  
}  
}  
 
while ( cur && cur.ownerDocument && cur !== context ) {  
for ( selector in matches ) {  
match = matches[selector];  
 
if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {  
ret.push({ selector: selector, elem: cur, level: level });  
}  
}  
 
cur = cur.parentNode;  
level++;  
}  
}  
 
return ret;  
}  
 
var pos = POS.test( selectors ) ?  
jQuery( selectors, context || this.context ) : null;  
 
for ( i = 0, l = this.length; i < l; i++ ) {  
cur = this[i];  
 
while ( cur ) {  
if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {  
ret.push( cur );  
break;  
 
} else {  
cur = cur.parentNode;  
if ( !cur || !cur.ownerDocument || cur === context ) {  
break;  
}  
}  
}  
}  
 
ret = ret.length > 1 ? jQuery.unique(ret) : ret;  
 
return this.pushStack( ret, "closest", selectors );  
},  
 
// Determine the position of an element within  
// the matched set of elements  
index: function( elem ) {  
if ( !elem || typeof elem === "string" ) {  
return jQuery.inArray( this[0],  
// If it receives a string, the selector is used  
// If it receives nothing, the siblings are used  
elem ? jQuery( elem ) : this.parent().children() );  
}  
// Locate the position of the desired element  
return jQuery.inArray(  
// If it receives a jQuery object, the first element is used  
elem.jquery ? elem[0] : elem, this );  
},  
 
add: function( selector, context ) {  
var set = typeof selector === "string" ?  
jQuery( selector, context || this.context ) :  
jQuery.makeArray( selector ),  
all = jQuery.merge( this.get(), set );  
 
return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?  
all :  
jQuery.unique( all ) );  
},  
 
andSelf: function() {  
return this.add( this.prevObject );  
}  
});  
 
// A painfully simple check to see if an element is disconnected  
// from a document (should be improved, where feasible).  
function isDisconnected( node ) {  
return !node || !node.parentNode || node.parentNode.nodeType === 11;  
}  
 
jQuery.each({  
parent: function( elem ) {  
var parent = elem.parentNode;  
return parent && parent.nodeType !== 11 ? parent : null;  
},  
parents: function( elem ) {  
return jQuery.dir( elem, "parentNode" );  
},  
parentsUntil: function( elem, i, until ) {  
return jQuery.dir( elem, "parentNode", until );  
},  
next: function( elem ) {  
return jQuery.nth( elem, 2, "nextSibling" );  
},  
prev: function( elem ) {  
return jQuery.nth( elem, 2, "previousSibling" );  
},  
nextAll: function( elem ) {  
return jQuery.dir( elem, "nextSibling" );  
},  
prevAll: function( elem ) {  
return jQuery.dir( elem, "previousSibling" );  
},  
nextUntil: function( elem, i, until ) {  
return jQuery.dir( elem, "nextSibling", until );  
},  
prevUntil: function( elem, i, until ) {  
return jQuery.dir( elem, "previousSibling", until );  
},  
siblings: function( elem ) {  
return jQuery.sibling( elem.parentNode.firstChild, elem );  
},  
children: function( elem ) {  
return jQuery.sibling( elem.firstChild );  
},  
contents: function( elem ) {  
return jQuery.nodeName( elem, "iframe" ) ?  
elem.contentDocument || elem.contentWindow.document :  
jQuery.makeArray( elem.childNodes );  
}  
}, function( name, fn ) {  
jQuery.fn[ name ] = function( until, selector ) {  
var ret = jQuery.map( this, fn, until );  
 
if ( !runtil.test( name ) ) {  
selector = until;  
}  
 
if ( selector && typeof selector === "string" ) {  
ret = jQuery.filter( selector, ret );  
}  
 
ret = this.length > 1 ? jQuery.unique( ret ) : ret;  
 
if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {  
ret = ret.reverse();  
}  
 
return this.pushStack( ret, name, slice.call(arguments).join(",") );  
};  
});  
 
jQuery.extend({  
filter: function( expr, elems, not ) {  
if ( not ) {  
expr = ":not(" + expr + ")";  
}  
 
return elems.length === 1 ?  
jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :  
jQuery.find.matches(expr, elems);  
},  
 
dir: function( elem, dir, until ) {  
var matched = [],  
cur = elem[ dir ];  
 
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {  
if ( cur.nodeType === 1 ) {  
matched.push( cur );  
}  
cur = cur[dir];  
}  
return matched;  
},  
 
nth: function( cur, result, dir, elem ) {  
result = result || 1;  
var num = 0;  
 
for ( ; cur; cur = cur[dir] ) {  
if ( cur.nodeType === 1 && ++num === result ) {  
break;  
}  
}  
 
return cur;  
},  
 
sibling: function( n, elem ) {  
var r = [];  
 
for ( ; n; n = n.nextSibling ) {  
if ( n.nodeType === 1 && n !== elem ) {  
r.push( n );  
}  
}  
 
return r;  
}  
});  
 
// Implement the identical functionality for filter and not  
function winnow( elements, qualifier, keep ) {  
if ( jQuery.isFunction( qualifier ) ) {  
return jQuery.grep(elements, function( elem, i ) {  
var retVal = !!qualifier.call( elem, i, elem );  
return retVal === keep;  
});  
 
} else if ( qualifier.nodeType ) {  
return jQuery.grep(elements, function( elem, i ) {  
return (elem === qualifier) === keep;  
});  
 
} else if ( typeof qualifier === "string" ) {  
var filtered = jQuery.grep(elements, function( elem ) {  
return elem.nodeType === 1;  
});  
 
if ( isSimple.test( qualifier ) ) {  
return jQuery.filter(qualifier, filtered, !keep);  
} else {  
qualifier = jQuery.filter( qualifier, filtered );  
}  
}  
 
return jQuery.grep(elements, function( elem, i ) {  
return (jQuery.inArray( elem, qualifier ) >= 0) === keep;  
});  
}  
 
 
 
 
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,  
rleadingWhitespace = /^\s+/,  
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,  
rtagName = /<([\w:]+)/,  
rtbody = /<tbody/i,  
rhtml = /<|&#?\w+;/,  
rnocache = /<(?:script|object|embed|option|style)/i,  
// checked="checked" or checked (html5)  
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  
raction = /\=([^="'>\s]+\/)>/g,  
wrapMap = {  
option: [ 1, "<select multiple='multiple'>", "</select>" ],  
legend: [ 1, "<fieldset>", "</fieldset>" ],  
thead: [ 1, "<table>", "</table>" ],  
tr: [ 2, "<table><tbody>", "</tbody></table>" ],  
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],  
col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],  
area: [ 1, "<map>", "</map>" ],  
_default: [ 0, "", "" ]  
};  
 
wrapMap.optgroup = wrapMap.option;  
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;  
wrapMap.th = wrapMap.td;  
 
// IE can't serialize <link> and <script> tags normally  
if ( !jQuery.support.htmlSerialize ) {  
wrapMap._default = [ 1, "div<div>", "</div>" ];  
}  
 
jQuery.fn.extend({  
text: function( text ) {  
if ( jQuery.isFunction(text) ) {  
return this.each(function(i) {  
var self = jQuery( this );  
 
self.text( text.call(this, i, self.text()) );  
});  
}  
 
if ( typeof text !== "object" && text !== undefined ) {  
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );  
}  
 
return jQuery.text( this );  
},  
 
wrapAll: function( html ) {  
if ( jQuery.isFunction( html ) ) {  
return this.each(function(i) {  
jQuery(this).wrapAll( html.call(this, i) );  
});  
}  
 
if ( this[0] ) {  
// The elements to wrap the target around  
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);  
 
if ( this[0].parentNode ) {  
wrap.insertBefore( this[0] );  
}  
 
wrap.map(function() {  
var elem = this;  
 
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {  
elem = elem.firstChild;  
}  
 
return elem;  
}).append(this);  
}  
 
return this;  
},  
 
wrapInner: function( html ) {  
if ( jQuery.isFunction( html ) ) {  
return this.each(function(i) {  
jQuery(this).wrapInner( html.call(this, i) );  
});  
}  
 
return this.each(function() {  
var self = jQuery( this ),  
contents = self.contents();  
 
if ( contents.length ) {  
contents.wrapAll( html );  
 
} else {  
self.append( html );  
}  
});  
},  
 
wrap: function( html ) {  
return this.each(function() {  
jQuery( this ).wrapAll( html );  
});  
},  
 
unwrap: function() {  
return this.parent().each(function() {  
if ( !jQuery.nodeName( this, "body" ) ) {  
jQuery( this ).replaceWith( this.childNodes );  
}  
}).end();  
},  
 
append: function() {  
return this.domManip(arguments, true, function( elem ) {  
if ( this.nodeType === 1 ) {  
this.appendChild( elem );  
}  
});  
},  
 
prepend: function() {  
return this.domManip(arguments, true, function( elem ) {  
if ( this.nodeType === 1 ) {  
this.insertBefore( elem, this.firstChild );  
}  
});  
},  
 
before: function() {  
if ( this[0] && this[0].parentNode ) {  
return this.domManip(arguments, false, function( elem ) {  
this.parentNode.insertBefore( elem, this );  
});  
} else if ( arguments.length ) {  
var set = jQuery(arguments[0]);  
set.push.apply( set, this.toArray() );  
return this.pushStack( set, "before", arguments );  
}  
},  
 
after: function() {  
if ( this[0] && this[0].parentNode ) {  
return this.domManip(arguments, false, function( elem ) {  
this.parentNode.insertBefore( elem, this.nextSibling );  
});  
} else if ( arguments.length ) {  
var set = this.pushStack( this, "after", arguments );  
set.push.apply( set, jQuery(arguments[0]).toArray() );  
return set;  
}  
},  
 
// keepData is for internal use only--do not document  
remove: function( selector, keepData ) {  
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {  
if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {  
if ( !keepData && elem.nodeType === 1 ) {  
jQuery.cleanData( elem.getElementsByTagName("*") );  
jQuery.cleanData( [ elem ] );  
}  
 
if ( elem.parentNode ) {  
elem.parentNode.removeChild( elem );  
}  
}  
}  
 
return this;  
},  
 
empty: function() {  
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {  
// Remove element nodes and prevent memory leaks  
if ( elem.nodeType === 1 ) {  
jQuery.cleanData( elem.getElementsByTagName("*") );  
}  
 
// Remove any remaining nodes  
while ( elem.firstChild ) {  
elem.removeChild( elem.firstChild );  
}  
}  
 
return this;  
},  
 
clone: function( events ) {  
// Do the clone  
var ret = this.map(function() {  
if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {  
// IE copies events bound via attachEvent when  
// using cloneNode. Calling detachEvent on the  
// clone will also remove the events from the orignal  
// In order to get around this, we use innerHTML.  
// Unfortunately, this means some modifications to  
// attributes in IE that are actually only stored  
// as properties will not be copied (such as the  
// the name attribute on an input).  
var html = this.outerHTML,  
ownerDocument = this.ownerDocument;  
 
if ( !html ) {  
var div = ownerDocument.createElement("div");  
div.appendChild( this.cloneNode(true) );  
html = div.innerHTML;  
}  
 
return jQuery.clean([html.replace(rinlinejQuery, "")  
// Handle the case in IE 8 where action=/test/> self-closes a tag  
.replace(raction, '="$1">')  
.replace(rleadingWhitespace, "")], ownerDocument)[0];  
} else {  
return this.cloneNode(true);  
}  
});  
 
// Copy the events from the original to the clone  
if ( events === true ) {  
cloneCopyEvent( this, ret );  
cloneCopyEvent( this.find("*"), ret.find("*") );  
}  
 
// Return the cloned set  
return ret;  
},  
 
html: function( value ) {  
if ( value === undefined ) {  
return this[0] && this[0].nodeType === 1 ?  
this[0].innerHTML.replace(rinlinejQuery, "") :  
null;  
 
// See if we can take a shortcut and just use innerHTML  
} else if ( typeof value === "string" && !rnocache.test( value ) &&  
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&  
!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {  
 
value = value.replace(rxhtmlTag, "<$1></$2>");  
 
try {  
for ( var i = 0, l = this.length; i < l; i++ ) {  
// Remove element nodes and prevent memory leaks  
if ( this[i].nodeType === 1 ) {  
jQuery.cleanData( this[i].getElementsByTagName("*") );  
this[i].innerHTML = value;  
}  
}  
 
// If using innerHTML throws an exception, use the fallback method  
} catch(e) {  
this.empty().append( value );  
}  
 
} else if ( jQuery.isFunction( value ) ) {  
this.each(function(i){  
var self = jQuery( this );  
 
self.html( value.call(this, i, self.html()) );  
});  
 
} else {  
this.empty().append( value );  
}  
 
return this;  
},  
 
replaceWith: function( value ) {  
if ( this[0] && this[0].parentNode ) {  
// Make sure that the elements are removed from the DOM before they are inserted  
// this can help fix replacing a parent with child elements  
if ( jQuery.isFunction( value ) ) {  
return this.each(function(i) {  
var self = jQuery(this), old = self.html();  
self.replaceWith( value.call( this, i, old ) );  
});  
}  
 
if ( typeof value !== "string" ) {  
value = jQuery( value ).detach();  
}  
 
return this.each(function() {  
var next = this.nextSibling,  
parent = this.parentNode;  
 
jQuery( this ).remove();  
 
if ( next ) {  
jQuery(next).before( value );  
} else {  
jQuery(parent).append( value );  
}  
});  
} else {  
return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );  
}  
},  
 
detach: function( selector ) {  
return this.remove( selector, true );  
},  
 
domManip: function( args, table, callback ) {  
var results, first, fragment, parent,  
value = args[0],  
scripts = [];  
 
// We can't cloneNode fragments that contain checked, in WebKit  
if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {  
return this.each(function() {  
jQuery(this).domManip( args, table, callback, true );  
});  
}  
 
if ( jQuery.isFunction(value) ) {  
return this.each(function(i) {  
var self = jQuery(this);  
args[0] = value.call(this, i, table ? self.html() : undefined);  
self.domManip( args, table, callback );  
});  
}  
 
if ( this[0] ) {  
parent = value && value.parentNode;  
 
// If we're in a fragment, just use that instead of building a new one  
if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {  
results = { fragment: parent };  
 
} else {  
results = jQuery.buildFragment( args, this, scripts );  
}  
 
fragment = results.fragment;  
 
if ( fragment.childNodes.length === 1 ) {  
first = fragment = fragment.firstChild;  
} else {  
first = fragment.firstChild;  
}  
 
if ( first ) {  
table = table && jQuery.nodeName( first, "tr" );  
 
for ( var i = 0, l = this.length; i < l; i++ ) {  
callback.call(  
table ?  
root(this[i], first) :  
this[i],  
i > 0 || results.cacheable || this.length > 1 ?  
fragment.cloneNode(true) :  
fragment  
);  
}  
}  
 
if ( scripts.length ) {  
jQuery.each( scripts, evalScript );  
}  
}  
 
return this;  
}  
});  
 
function root( elem, cur ) {  
return jQuery.nodeName(elem, "table") ?  
(elem.getElementsByTagName("tbody")[0] ||  
elem.appendChild(elem.ownerDocument.createElement("tbody"))) :  
elem;  
}  
 
function cloneCopyEvent(orig, ret) {  
var i = 0;  
 
ret.each(function() {  
if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {  
return;  
}  
 
var oldData = jQuery.data( orig[i++] ),  
curData = jQuery.data( this, oldData ),  
events = oldData && oldData.events;  
 
if ( events ) {  
delete curData.handle;  
curData.events = {};  
 
for ( var type in events ) {  
for ( var handler in events[ type ] ) {  
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );  
}  
}  
}  
});  
}  
 
jQuery.buildFragment = function( args, nodes, scripts ) {  
var fragment, cacheable, cacheresults,  
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);  
 
// Only cache "small" (1/2 KB) strings that are associated with the main document  
// Cloning options loses the selected state, so don't cache them  
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment  
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache  
if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&  
!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {  
 
cacheable = true;  
cacheresults = jQuery.fragments[ args[0] ];  
if ( cacheresults ) {  
if ( cacheresults !== 1 ) {  
fragment = cacheresults;  
}  
}  
}  
 
if ( !fragment ) {  
fragment = doc.createDocumentFragment();  
jQuery.clean( args, doc, fragment, scripts );  
}  
 
if ( cacheable ) {  
jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;  
}  
 
return { fragment: fragment, cacheable: cacheable };  
};  
 
jQuery.fragments = {};  
 
jQuery.each({  
appendTo: "append",  
prependTo: "prepend",  
insertBefore: "before",  
insertAfter: "after",  
replaceAll: "replaceWith"  
}, function( name, original ) {  
jQuery.fn[ name ] = function( selector ) {  
var ret = [],  
insert = jQuery( selector ),  
parent = this.length === 1 && this[0].parentNode;  
 
if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {  
insert[ original ]( this[0] );  
return this;  
 
} else {  
for ( var i = 0, l = insert.length; i < l; i++ ) {  
var elems = (i > 0 ? this.clone(true) : this).get();  
jQuery( insert[i] )[ original ]( elems );  
ret = ret.concat( elems );  
}  
 
return this.pushStack( ret, name, insert.selector );  
}  
};  
});  
 
jQuery.extend({  
clean: function( elems, context, fragment, scripts ) {  
context = context || document;  
 
// !context.createElement fails in IE with an error but returns typeof 'object'  
if ( typeof context.createElement === "undefined" ) {  
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;  
}  
 
var ret = [];  
 
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {  
if ( typeof elem === "number" ) {  
elem += "";  
}  
 
if ( !elem ) {  
continue;  
}  
 
// Convert html string into DOM nodes  
if ( typeof elem === "string" && !rhtml.test( elem ) ) {  
elem = context.createTextNode( elem );  
 
} else if ( typeof elem === "string" ) {  
// Fix "XHTML"-style tags in all browsers  
elem = elem.replace(rxhtmlTag, "<$1></$2>");  
 
// Trim whitespace, otherwise indexOf won't work as expected  
var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),  
wrap = wrapMap[ tag ] || wrapMap._default,  
depth = wrap[0],  
div = context.createElement("div");  
 
// Go to html and back, then peel off extra wrappers  
div.innerHTML = wrap[1] + elem + wrap[2];  
 
// Move to the right depth  
while ( depth-- ) {  
div = div.lastChild;  
}  
 
// Remove IE's autoinserted <tbody> from table fragments  
if ( !jQuery.support.tbody ) {  
 
// String was a <table>, *may* have spurious <tbody>  
var hasBody = rtbody.test(elem),  
tbody = tag === "table" && !hasBody ?  
div.firstChild && div.firstChild.childNodes :  
 
// String was a bare <thead> or <tfoot>  
wrap[1] === "<table>" && !hasBody ?  
div.childNodes :  
[];  
 
for ( var j = tbody.length - 1; j >= 0 ; --j ) {  
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {  
tbody[ j ].parentNode.removeChild( tbody[ j ] );  
}  
}  
 
}  
 
// IE completely kills leading whitespace when innerHTML is used  
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {  
div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );  
}  
 
elem = div.childNodes;  
}  
 
if ( elem.nodeType ) {  
ret.push( elem );  
} else {  
ret = jQuery.merge( ret, elem );  
}  
}  
 
if ( fragment ) {  
for ( i = 0; ret[i]; i++ ) {  
if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {  
scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );  
 
} else {  
if ( ret[i].nodeType === 1 ) {  
ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );  
}  
fragment.appendChild( ret[i] );  
}  
}  
}  
 
return ret;  
},  
 
cleanData: function( elems ) {  
var data, id, cache = jQuery.cache,  
special = jQuery.event.special,  
deleteExpando = jQuery.support.deleteExpando;  
 
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {  
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {  
continue;  
}  
 
id = elem[ jQuery.expando ];  
 
if ( id ) {  
data = cache[ id ];  
 
if ( data && data.events ) {  
for ( var type in data.events ) {  
if ( special[ type ] ) {  
jQuery.event.remove( elem, type );  
 
} else {  
jQuery.removeEvent( elem, type, data.handle );  
}  
}  
}  
 
if ( deleteExpando ) {  
delete elem[ jQuery.expando ];  
 
} else if ( elem.removeAttribute ) {  
elem.removeAttribute( jQuery.expando );  
}  
 
delete cache[ id ];  
}  
}  
}  
});  
 
function evalScript( i, elem ) {  
if ( elem.src ) {  
jQuery.ajax({  
url: elem.src,  
async: false,  
dataType: "script"  
});  
} else {  
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );  
}  
 
if ( elem.parentNode ) {  
elem.parentNode.removeChild( elem );  
}  
}  
 
 
 
 
var ralpha = /alpha\([^)]*\)/i,  
ropacity = /opacity=([^)]*)/,  
rdashAlpha = /-([a-z])/ig,  
rupper = /([A-Z])/g,  
rnumpx = /^-?\d+(?:px)?$/i,  
rnum = /^-?\d/,  
 
cssShow = { position: "absolute", visibility: "hidden", display: "block" },  
cssWidth = [ "Left", "Right" ],  
cssHeight = [ "Top", "Bottom" ],  
curCSS,  
 
getComputedStyle,  
currentStyle,  
 
fcamelCase = function( all, letter ) {  
return letter.toUpperCase();  
};  
 
jQuery.fn.css = function( name, value ) {  
// Setting 'undefined' is a no-op  
if ( arguments.length === 2 && value === undefined ) {  
return this;  
}  
 
return jQuery.access( this, name, value, true, function( elem, name, value ) {  
return value !== undefined ?  
jQuery.style( elem, name, value ) :  
jQuery.css( elem, name );  
});  
};  
 
jQuery.extend({  
// Add in style property hooks for overriding the default  
// behavior of getting and setting a style property  
cssHooks: {  
opacity: {  
get: function( elem, computed ) {  
if ( computed ) {  
// We should always get a number back from opacity  
var ret = curCSS( elem, "opacity", "opacity" );  
return ret === "" ? "1" : ret;  
 
} else {  
return elem.style.opacity;  
}  
}  
}  
},  
 
// Exclude the following css properties to add px  
cssNumber: {  
"zIndex": true,  
"fontWeight": true,  
"opacity": true,  
"zoom": true,  
"lineHeight": true  
},  
 
// Add in properties whose names you wish to fix before  
// setting or getting the value  
cssProps: {  
// normalize float css property  
"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"  
},  
 
// Get and set the style property on a DOM Node  
style: function( elem, name, value, extra ) {  
// Don't set styles on text and comment nodes  
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {  
return;  
}  
 
// Make sure that we're working with the right name  
var ret, origName = jQuery.camelCase( name ),  
style = elem.style, hooks = jQuery.cssHooks[ origName ];  
 
name = jQuery.cssProps[ origName ] || origName;  
 
// Check if we're setting a value  
if ( value !== undefined ) {  
// Make sure that NaN and null values aren't set. See: #7116  
if ( typeof value === "number" && isNaN( value ) || value == null ) {  
return;  
}  
 
// If a number was passed in, add 'px' to the (except for certain CSS properties)  
if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {  
value += "px";  
}  
 
// If a hook was provided, use that value, otherwise just set the specified value  
if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {  
// Wrapped to prevent IE from throwing errors when 'invalid' values are provided  
// Fixes bug #5509  
try {  
style[ name ] = value;  
} catch(e) {}  
}  
 
} else {  
// If a hook was provided get the non-computed value from there  
if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {  
return ret;  
}  
 
// Otherwise just get the value from the style object  
return style[ name ];  
}  
},  
 
css: function( elem, name, extra ) {  
// Make sure that we're working with the right name  
var ret, origName = jQuery.camelCase( name ),  
hooks = jQuery.cssHooks[ origName ];  
 
name = jQuery.cssProps[ origName ] || origName;  
 
// If a hook was provided get the computed value from there  
if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {  
return ret;  
 
// Otherwise, if a way to get the computed value exists, use that  
} else if ( curCSS ) {  
return curCSS( elem, name, origName );  
}  
},  
 
// A method for quickly swapping in/out CSS properties to get correct calculations  
swap: function( elem, options, callback ) {  
var old = {};  
 
// Remember the old values, and insert the new ones  
for ( var name in options ) {  
old[ name ] = elem.style[ name ];  
elem.style[ name ] = options[ name ];  
}  
 
callback.call( elem );  
 
// Revert the old values  
for ( name in options ) {  
elem.style[ name ] = old[ name ];  
}  
},  
 
camelCase: function( string ) {  
return string.replace( rdashAlpha, fcamelCase );  
}  
});  
 
// DEPRECATED, Use jQuery.css() instead  
jQuery.curCSS = jQuery.css;  
 
jQuery.each(["height", "width"], function( i, name ) {  
jQuery.cssHooks[ name ] = {  
get: function( elem, computed, extra ) {  
var val;  
 
if ( computed ) {  
if ( elem.offsetWidth !== 0 ) {  
val = getWH( elem, name, extra );  
 
} else {  
jQuery.swap( elem, cssShow, function() {  
val = getWH( elem, name, extra );  
});  
}  
 
if ( val <= 0 ) {  
val = curCSS( elem, name, name );  
 
if ( val === "0px" && currentStyle ) {  
val = currentStyle( elem, name, name );  
}  
 
if ( val != null ) {  
// Should return "auto" instead of 0, use 0 for  
// temporary backwards-compat  
return val === "" || val === "auto" ? "0px" : val;  
}  
}  
 
if ( val < 0 || val == null ) {  
val = elem.style[ name ];  
 
// Should return "auto" instead of 0, use 0 for  
// temporary backwards-compat  
return val === "" || val === "auto" ? "0px" : val;  
}  
 
return typeof val === "string" ? val : val + "px";  
}  
},  
 
set: function( elem, value ) {  
if ( rnumpx.test( value ) ) {  
// ignore negative width and height values #1599  
value = parseFloat(value);  
 
if ( value >= 0 ) {  
return value + "px";  
}  
 
} else {  
return value;  
}  
}  
};  
});  
 
if ( !jQuery.support.opacity ) {  
jQuery.cssHooks.opacity = {  
get: function( elem, computed ) {  
// IE uses filters for opacity  
return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?  
(parseFloat(RegExp.$1) / 100) + "" :  
computed ? "1" : "";  
},  
 
set: function( elem, value ) {  
var style = elem.style;  
 
// IE has trouble with opacity if it does not have layout  
// Force it by setting the zoom level  
style.zoom = 1;  
 
// Set the alpha filter to set the opacity  
var opacity = jQuery.isNaN(value) ?  
"" :  
"alpha(opacity=" + value * 100 + ")",  
filter = style.filter || "";  
 
style.filter = ralpha.test(filter) ?  
filter.replace(ralpha, opacity) :  
style.filter + ' ' + opacity;  
}  
};  
}  
 
if ( document.defaultView && document.defaultView.getComputedStyle ) {  
getComputedStyle = function( elem, newName, name ) {  
var ret, defaultView, computedStyle;  
 
name = name.replace( rupper, "-$1" ).toLowerCase();  
 
if ( !(defaultView = elem.ownerDocument.defaultView) ) {  
return undefined;  
}  
 
if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {  
ret = computedStyle.getPropertyValue( name );  
if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {  
ret = jQuery.style( elem, name );  
}  
}  
 
return ret;  
};  
}  
 
if ( document.documentElement.currentStyle ) {  
currentStyle = function( elem, name ) {  
var left, rsLeft,  
ret = elem.currentStyle && elem.currentStyle[ name ],  
style = elem.style;  
 
// From the awesome hack by Dean Edwards  
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291  
 
// If we're not dealing with a regular pixel number  
// but a number that has a weird ending, we need to convert it to pixels  
if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {  
// Remember the original values  
left = style.left;  
rsLeft = elem.runtimeStyle.left;  
 
// Put in the new values to get a computed value out  
elem.runtimeStyle.left = elem.currentStyle.left;  
style.left = name === "fontSize" ? "1em" : (ret || 0);  
ret = style.pixelLeft + "px";  
 
// Revert the changed values  
style.left = left;  
elem.runtimeStyle.left = rsLeft;  
}  
 
return ret === "" ? "auto" : ret;  
};  
}  
 
curCSS = getComputedStyle || currentStyle;  
 
function getWH( elem, name, extra ) {  
var which = name === "width" ? cssWidth : cssHeight,  
val = name === "width" ? elem.offsetWidth : elem.offsetHeight;  
 
if ( extra === "border" ) {  
return val;  
}  
 
jQuery.each( which, function() {  
if ( !extra ) {  
val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;  
}  
 
if ( extra === "margin" ) {  
val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;  
 
} else {  
val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;  
}  
});  
 
return val;  
}  
 
if ( jQuery.expr && jQuery.expr.filters ) {  
jQuery.expr.filters.hidden = function( elem ) {  
var width = elem.offsetWidth,  
height = elem.offsetHeight;  
 
return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");  
};  
 
jQuery.expr.filters.visible = function( elem ) {  
return !jQuery.expr.filters.hidden( elem );  
};  
}  
 
 
 
 
var jsc = jQuery.now(),  
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,  
rselectTextarea = /^(?:select|textarea)/i,  
rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,  
rnoContent = /^(?:GET|HEAD)$/,  
rbracket = /\[\]$/,  
jsre = /\=\?(&|$)/,  
rquery = /\?/,  
rts = /([?&])_=[^&]*/,  
rurl = /^(\w+:)?\/\/([^\/?#]+)/,  
r20 = /%20/g,  
rhash = /#.*$/,  
 
// Keep a copy of the old load method  
_load = jQuery.fn.load;  
 
jQuery.fn.extend({  
load: function( url, params, callback ) {  
if ( typeof url !== "string" && _load ) {  
return _load.apply( this, arguments );  
 
// Don't do a request if no elements are being requested  
} else if ( !this.length ) {  
return this;  
}  
 
var off = url.indexOf(" ");  
if ( off >= 0 ) {  
var selector = url.slice(off, url.length);  
url = url.slice(0, off);  
}  
 
// Default to a GET request  
var type = "GET";  
 
// If the second parameter was provided  
if ( params ) {  
// If it's a function  
if ( jQuery.isFunction( params ) ) {  
// We assume that it's the callback  
callback = params;  
params = null;  
 
// Otherwise, build a param string  
} else if ( typeof params === "object" ) {  
params = jQuery.param( params, jQuery.ajaxSettings.traditional );  
type = "POST";  
}  
}  
 
var self = this;  
 
// Request the remote document  
jQuery.ajax({  
url: url,  
type: type,  
dataType: "html",  
data: params,  
complete: function( res, status ) {  
// If successful, inject the HTML into all the matched elements  
if ( status === "success" || status === "notmodified" ) {  
// See if a selector was specified  
self.html( selector ?  
// Create a dummy div to hold the results  
jQuery("<div>")  
// inject the contents of the document in, removing the scripts  
// to avoid any 'Permission Denied' errors in IE  
.append(res.responseText.replace(rscript, ""))  
 
// Locate the specified elements  
.find(selector) :  
 
// If not, just inject the full result  
res.responseText );  
}  
 
if ( callback ) {  
self.each( callback, [res.responseText, status, res] );  
}  
}  
});  
 
return this;  
},  
 
serialize: function() {  
return jQuery.param(this.serializeArray());  
},  
 
serializeArray: function() {  
return this.map(function() {  
return this.elements ? jQuery.makeArray(this.elements) : this;  
})  
.filter(function() {  
return this.name && !this.disabled &&  
(this.checked || rselectTextarea.test(this.nodeName) ||  
rinput.test(this.type));  
})  
.map(function( i, elem ) {  
var val = jQuery(this).val();  
 
return val == null ?  
null :  
jQuery.isArray(val) ?  
jQuery.map( val, function( val, i ) {  
return { name: elem.name, value: val };  
}) :  
{ name: elem.name, value: val };  
}).get();  
}  
});  
 
// Attach a bunch of functions for handling common AJAX events  
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {  
jQuery.fn[o] = function( f ) {  
return this.bind(o, f);  
};  
});  
 
jQuery.extend({  
get: function( url, data, callback, type ) {  
// shift arguments if data argument was omited  
if ( jQuery.isFunction( data ) ) {  
type = type || callback;  
callback = data;  
data = null;  
}  
 
return jQuery.ajax({  
type: "GET",  
url: url,  
data: data,  
success: callback,  
dataType: type  
});  
},  
 
getScript: function( url, callback ) {  
return jQuery.get(url, null, callback, "script");  
},  
 
getJSON: function( url, data, callback ) {  
return jQuery.get(url, data, callback, "json");  
},  
 
post: function( url, data, callback, type ) {  
// shift arguments if data argument was omited  
if ( jQuery.isFunction( data ) ) {  
type = type || callback;  
callback = data;  
data = {};  
}  
 
return jQuery.ajax({  
type: "POST",  
url: url,  
data: data,  
success: callback,  
dataType: type  
});  
},  
 
ajaxSetup: function( settings ) {  
jQuery.extend( jQuery.ajaxSettings, settings );  
},  
 
ajaxSettings: {  
url: location.href,  
global: true,  
type: "GET",  
contentType: "application/x-www-form-urlencoded",  
processData: true,  
async: true,  
/*  
timeout: 0,  
data: null,  
username: null,  
password: null,  
traditional: false,  
*/  
// This function can be overriden by calling jQuery.ajaxSetup  
xhr: function() {  
return new window.XMLHttpRequest();  
},  
accepts: {  
xml: "application/xml, text/xml",  
html: "text/html",  
script: "text/javascript, application/javascript",  
json: "application/json, text/javascript",  
text: "text/plain",  
_default: "*/*"  
}  
},  
 
ajax: function( origSettings ) {  
var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),  
jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type);  
 
s.url = s.url.replace( rhash, "" );  
 
// Use original (not extended) context object if it was provided  
s.context = origSettings && origSettings.context != null ? origSettings.context : s;  
 
// convert data if not already a string  
if ( s.data && s.processData && typeof s.data !== "string" ) {  
s.data = jQuery.param( s.data, s.traditional );  
}  
 
// Handle JSONP Parameter Callbacks  
if ( s.dataType === "jsonp" ) {  
if ( type === "GET" ) {  
if ( !jsre.test( s.url ) ) {  
s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";  
}  
} else if ( !s.data || !jsre.test(s.data) ) {  
s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";  
}  
s.dataType = "json";  
}  
 
// Build temporary JSONP function  
if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {  
jsonp = s.jsonpCallback || ("jsonp" + jsc++);  
 
// Replace the =? sequence both in the query string and the data  
if ( s.data ) {  
s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");  
}  
 
s.url = s.url.replace(jsre, "=" + jsonp + "$1");  
 
// We need to make sure  
// that a JSONP style response is executed properly  
s.dataType = "script";  
 
// Handle JSONP-style loading  
var customJsonp = window[ jsonp ];  
 
window[ jsonp ] = function( tmp ) {  
if ( jQuery.isFunction( customJsonp ) ) {  
customJsonp( tmp );  
 
} else {  
// Garbage collect  
window[ jsonp ] = undefined;  
 
try {  
delete window[ jsonp ];  
} catch( jsonpError ) {}  
}  
 
data = tmp;  
jQuery.handleSuccess( s, xhr, status, data );  
jQuery.handleComplete( s, xhr, status, data );  
 
if ( head ) {  
head.removeChild( script );  
}  
};  
}  
 
if ( s.dataType === "script" && s.cache === null ) {  
s.cache = false;  
}  
 
if ( s.cache === false && noContent ) {  
var ts = jQuery.now();  
 
// try replacing _= if it is there  
var ret = s.url.replace(rts, "$1_=" + ts);  
 
// if nothing was replaced, add timestamp to the end  
s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");  
}  
 
// If data is available, append data to url for GET/HEAD requests  
if ( s.data && noContent ) {  
s.url += (rquery.test(s.url) ? "&" : "?") + s.data;  
}  
 
// Watch for a new set of requests  
if ( s.global && jQuery.active++ === 0 ) {  
jQuery.event.trigger( "ajaxStart" );  
}  
 
// Matches an absolute URL, and saves the domain  
var parts = rurl.exec( s.url ),  
remote = parts && (parts[1] && parts[1].toLowerCase() !== location.protocol || parts[2].toLowerCase() !== location.host);  
 
// If we're requesting a remote document  
// and trying to load JSON or Script with a GET  
if ( s.dataType === "script" && type === "GET" && remote ) {  
var head = document.getElementsByTagName("head")[0] || document.documentElement;  
var script = document.createElement("script");  
if ( s.scriptCharset ) {  
script.charset = s.scriptCharset;  
}  
script.src = s.url;  
 
// Handle Script loading  
if ( !jsonp ) {  
var done = false;  
 
// Attach handlers for all browsers  
script.onload = script.onreadystatechange = function() {  
if ( !done && (!this.readyState ||  
this.readyState === "loaded" || this.readyState === "complete") ) {  
done = true;  
jQuery.handleSuccess( s, xhr, status, data );  
jQuery.handleComplete( s, xhr, status, data );  
 
// Handle memory leak in IE  
script.onload = script.onreadystatechange = null;  
if ( head && script.parentNode ) {  
head.removeChild( script );  
}  
}  
};  
}  
 
// Use insertBefore instead of appendChild to circumvent an IE6 bug.  
// This arises when a base node is used (#2709 and #4378).  
head.insertBefore( script, head.firstChild );  
 
// We handle everything using the script element injection  
return undefined;  
}  
 
var requestDone = false;  
 
// Create the request object  
var xhr = s.xhr();  
 
if ( !xhr ) {  
return;  
}  
 
// Open the socket  
// Passing null username, generates a login popup on Opera (#2865)  
if ( s.username ) {  
xhr.open(type, s.url, s.async, s.username, s.password);  
} else {  
xhr.open(type, s.url, s.async);  
}  
 
// Need an extra try/catch for cross domain requests in Firefox 3  
try {  
// Set content-type if data specified and content-body is valid for this type  
if ( (s.data != null && !noContent) || (origSettings && origSettings.contentType) ) {  
xhr.setRequestHeader("Content-Type", s.contentType);  
}  
 
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.  
if ( s.ifModified ) {  
if ( jQuery.lastModified[s.url] ) {  
xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);  
}  
 
if ( jQuery.etag[s.url] ) {  
xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);  
}  
}  
 
// Set header so the called script knows that it's an XMLHttpRequest  
// Only send the header if it's not a remote XHR  
if ( !remote ) {  
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");  
}  
 
// Set the Accepts header for the server, depending on the dataType  
xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?  
s.accepts[ s.dataType ] + ", */*; q=0.01" :  
s.accepts._default );  
} catch( headerError ) {}  
 
// Allow custom headers/mimetypes and early abort  
if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) {  
// Handle the global AJAX counter  
if ( s.global && jQuery.active-- === 1 ) {  
jQuery.event.trigger( "ajaxStop" );  
}  
 
// close opended socket  
xhr.abort();  
return false;  
}  
 
if ( s.global ) {  
jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] );  
}  
 
// Wait for a response to come back  
var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {  
// The request was aborted  
if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {  
// Opera doesn't call onreadystatechange before this point  
// so we simulate the call  
if ( !requestDone ) {  
jQuery.handleComplete( s, xhr, status, data );  
}  
 
requestDone = true;  
if ( xhr ) {  
xhr.onreadystatechange = jQuery.noop;  
}  
 
// The transfer is complete and the data is available, or the request timed out  
} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {  
requestDone = true;  
xhr.onreadystatechange = jQuery.noop;  
 
status = isTimeout === "timeout" ?  
"timeout" :  
!jQuery.httpSuccess( xhr ) ?  
"error" :  
s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?  
"notmodified" :  
"success";  
 
var errMsg;  
 
if ( status === "success" ) {  
// Watch for, and catch, XML document parse errors  
try {  
// process the data (runs the xml through httpData regardless of callback)  
data = jQuery.httpData( xhr, s.dataType, s );  
} catch( parserError ) {  
status = "parsererror";  
errMsg = parserError;  
}  
}  
 
// Make sure that the request was successful or notmodified  
if ( status === "success" || status === "notmodified" ) {  
// JSONP handles its own success callback  
if ( !jsonp ) {  
jQuery.handleSuccess( s, xhr, status, data );  
}  
} else {  
jQuery.handleError( s, xhr, status, errMsg );  
}  
 
// Fire the complete handlers  
if ( !jsonp ) {  
jQuery.handleComplete( s, xhr, status, data );  
}  
 
if ( isTimeout === "timeout" ) {  
xhr.abort();  
}  
 
// Stop memory leaks  
if ( s.async ) {  
xhr = null;  
}  
}  
};  
 
// Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK)  
// Opera doesn't fire onreadystatechange at all on abort  
try {  
var oldAbort = xhr.abort;  
xhr.abort = function() {  
if ( xhr ) {  
// oldAbort has no call property in IE7 so  
// just do it this way, which works in all  
// browsers  
Function.prototype.call.call( oldAbort, xhr );  
}  
 
onreadystatechange( "abort" );  
};  
} catch( abortError ) {}  
 
// Timeout checker  
if ( s.async && s.timeout > 0 ) {  
setTimeout(function() {  
// Check to see if the request is still happening  
if ( xhr && !requestDone ) {  
onreadystatechange( "timeout" );  
}  
}, s.timeout);  
}  
 
// Send the data  
try {  
xhr.send( noContent || s.data == null ? null : s.data );  
 
} catch( sendError ) {  
jQuery.handleError( s, xhr, null, sendError );  
 
// Fire the complete handlers  
jQuery.handleComplete( s, xhr, status, data );  
}  
 
// firefox 1.5 doesn't fire statechange for sync requests  
if ( !s.async ) {  
onreadystatechange();  
}  
 
// return XMLHttpRequest to allow aborting the request etc.  
return xhr;  
},  
 
// Serialize an array of form elements or a set of  
// key/values into a query string  
param: function( a, traditional ) {  
var s = [],  
add = function( key, value ) {  
// If value is a function, invoke it and return its value  
value = jQuery.isFunction(value) ? value() : value;  
s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);  
};  
 
// Set traditional to true for jQuery <= 1.3.2 behavior.  
if ( traditional === undefined ) {  
traditional = jQuery.ajaxSettings.traditional;  
}  
 
// If an array was passed in, assume that it is an array of form elements.  
if ( jQuery.isArray(a) || a.jquery ) {  
// Serialize the form elements  
jQuery.each( a, function() {  
add( this.name, this.value );  
});  
 
} else {  
// If traditional, encode the "old" way (the way 1.3.2 or older  
// did it), otherwise encode params recursively.  
for ( var prefix in a ) {  
buildParams( prefix, a[prefix], traditional, add );  
}  
}  
 
// Return the resulting serialization  
return s.join("&").replace(r20, "+");  
}  
});  
 
function buildParams( prefix, obj, traditional, add ) {  
if ( jQuery.isArray(obj) && obj.length ) {  
// Serialize array item.  
jQuery.each( obj, function( i, v ) {  
if ( traditional || rbracket.test( prefix ) ) {  
// Treat each array item as a scalar.  
add( prefix, v );  
 
} else {  
// If array item is non-scalar (array or object), encode its  
// numeric index to resolve deserialization ambiguity issues.  
// Note that rack (as of 1.0.0) can't currently deserialize  
// nested arrays properly, and attempting to do so may cause  
// a server error. Possible fixes are to modify rack's  
// deserialization algorithm or to provide an option or flag  
// to force array serialization to be shallow.  
buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );  
}  
});  
 
} else if ( !traditional && obj != null && typeof obj === "object" ) {  
if ( jQuery.isEmptyObject( obj ) ) {  
add( prefix, "" );  
 
// Serialize object item.  
} else {  
jQuery.each( obj, function( k, v ) {  
buildParams( prefix + "[" + k + "]", v, traditional, add );  
});  
}  
 
} else {  
// Serialize scalar item.  
add( prefix, obj );  
}  
}  
 
// This is still on the jQuery object... for now  
// Want to move this to jQuery.ajax some day  
jQuery.extend({  
 
// Counter for holding the number of active queries  
active: 0,  
 
// Last-Modified header cache for next request  
lastModified: {},  
etag: {},  
 
handleError: function( s, xhr, status, e ) {  
// If a local callback was specified, fire it  
if ( s.error ) {  
s.error.call( s.context, xhr, status, e );  
}  
 
// Fire the global callback  
if ( s.global ) {  
jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] );  
}  
},  
 
handleSuccess: function( s, xhr, status, data ) {  
// If a local callback was specified, fire it and pass it the data  
if ( s.success ) {  
s.success.call( s.context, data, status, xhr );  
}  
 
// Fire the global callback  
if ( s.global ) {  
jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] );  
}  
},  
 
handleComplete: function( s, xhr, status ) {  
// Process result  
if ( s.complete ) {  
s.complete.call( s.context, xhr, status );  
}  
 
// The request was completed  
if ( s.global ) {  
jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] );  
}  
 
// Handle the global AJAX counter  
if ( s.global && jQuery.active-- === 1 ) {  
jQuery.event.trigger( "ajaxStop" );  
}  
},  
 
triggerGlobal: function( s, type, args ) {  
(s.context && s.context.url == null ? jQuery(s.context) : jQuery.event).trigger(type, args);  
},  
 
// Determines if an XMLHttpRequest was successful or not  
httpSuccess: function( xhr ) {  
try {  
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450  
return !xhr.status && location.protocol === "file:" ||  
xhr.status >= 200 && xhr.status < 300 ||  
xhr.status === 304 || xhr.status === 1223;  
} catch(e) {}  
 
return false;  
},  
 
// Determines if an XMLHttpRequest returns NotModified  
httpNotModified: function( xhr, url ) {  
var lastModified = xhr.getResponseHeader("Last-Modified"),  
etag = xhr.getResponseHeader("Etag");  
 
if ( lastModified ) {  
jQuery.lastModified[url] = lastModified;  
}  
 
if ( etag ) {  
jQuery.etag[url] = etag;  
}  
 
return xhr.status === 304;  
},  
 
httpData: function( xhr, type, s ) {  
var ct = xhr.getResponseHeader("content-type") || "",  
xml = type === "xml" || !type && ct.indexOf("xml") >= 0,  
data = xml ? xhr.responseXML : xhr.responseText;  
 
if ( xml && data.documentElement.nodeName === "parsererror" ) {  
jQuery.error( "parsererror" );  
}  
 
// Allow a pre-filtering function to sanitize the response  
// s is checked to keep backwards compatibility  
if ( s && s.dataFilter ) {  
data = s.dataFilter( data, type );  
}  
 
// The filter can actually parse the response  
if ( typeof data === "string" ) {  
// Get the JavaScript object, if JSON is used.  
if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {  
data = jQuery.parseJSON( data );  
 
// If the type is "script", eval it in global context  
} else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {  
jQuery.globalEval( data );  
}  
}  
 
return data;  
}  
 
});  
 
/*  
* Create the request object; Microsoft failed to properly  
* implement the XMLHttpRequest in IE7 (can't request local files),  
* so we use the ActiveXObject when it is available  
* Additionally XMLHttpRequest can be disabled in IE7/IE8 so  
* we need a fallback.  
*/  
if ( window.ActiveXObject ) {  
jQuery.ajaxSettings.xhr = function() {  
if ( window.location.protocol !== "file:" ) {  
try {  
return new window.XMLHttpRequest();  
} catch(xhrError) {}  
}  
 
try {  
return new window.ActiveXObject("Microsoft.XMLHTTP");  
} catch(activeError) {}  
};  
}  
 
// Does this browser support XHR requests?  
jQuery.support.ajax = !!jQuery.ajaxSettings.xhr();  
 
 
 
 
var elemdisplay = {},  
rfxtypes = /^(?:toggle|show|hide)$/,  
rfxnum = /^([+\-]=)?([\d+.\-]+)(.*)$/,  
timerId,  
fxAttrs = [  
// height animations  
[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],  
// width animations  
[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],  
// opacity animations  
[ "opacity" ]  
];  
 
jQuery.fn.extend({  
show: function( speed, easing, callback ) {  
var elem, display;  
 
if ( speed || speed === 0 ) {  
return this.animate( genFx("show", 3), speed, easing, callback);  
 
} else {  
for ( var i = 0, j = this.length; i < j; i++ ) {  
elem = this[i];  
display = elem.style.display;  
 
// Reset the inline display of this element to learn if it is  
// being hidden by cascaded rules or not  
if ( !jQuery.data(elem, "olddisplay") && display === "none" ) {  
display = elem.style.display = "";  
}  
 
// Set elements which have been overridden with display: none  
// in a stylesheet to whatever the default browser style is  
// for such an element  
if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {  
jQuery.data(elem, "olddisplay", defaultDisplay(elem.nodeName));  
}  
}  
 
// Set the display of most of the elements in a second loop  
// to avoid the constant reflow  
for ( i = 0; i < j; i++ ) {  
elem = this[i];  
display = elem.style.display;  
 
if ( display === "" || display === "none" ) {  
elem.style.display = jQuery.data(elem, "olddisplay") || "";  
}  
}  
 
return this;  
}  
},  
 
hide: function( speed, easing, callback ) {  
if ( speed || speed === 0 ) {  
return this.animate( genFx("hide", 3), speed, easing, callback);  
 
} else {  
for ( var i = 0, j = this.length; i < j; i++ ) {  
var display = jQuery.css( this[i], "display" );  
 
if ( display !== "none" ) {  
jQuery.data( this[i], "olddisplay", display );  
}  
}  
 
// Set the display of the elements in a second loop  
// to avoid the constant reflow  
for ( i = 0; i < j; i++ ) {  
this[i].style.display = "none";  
}  
 
return this;  
}  
},  
 
// Save the old toggle function  
_toggle: jQuery.fn.toggle,  
 
toggle: function( fn, fn2, callback ) {  
var bool = typeof fn === "boolean";  
 
if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {  
this._toggle.apply( this, arguments );  
 
} else if ( fn == null || bool ) {  
this.each(function() {  
var state = bool ? fn : jQuery(this).is(":hidden");  
jQuery(this)[ state ? "show" : "hide" ]();  
});  
 
} else {  
this.animate(genFx("toggle", 3), fn, fn2, callback);  
}  
 
return this;  
},  
 
fadeTo: function( speed, to, easing, callback ) {  
return this.filter(":hidden").css("opacity", 0).show().end()  
.animate({opacity: to}, speed, easing, callback);  
},  
 
animate: function( prop, speed, easing, callback ) {  
var optall = jQuery.speed(speed, easing, callback);  
 
if ( jQuery.isEmptyObject( prop ) ) {  
return this.each( optall.complete );  
}  
 
return this[ optall.queue === false ? "each" : "queue" ](function() {  
// XXX 'this' does not always have a nodeName when running the  
// test suite  
 
var opt = jQuery.extend({}, optall), p,  
isElement = this.nodeType === 1,  
hidden = isElement && jQuery(this).is(":hidden"),  
self = this;  
 
for ( p in prop ) {  
var name = jQuery.camelCase( p );  
 
if ( p !== name ) {  
prop[ name ] = prop[ p ];  
delete prop[ p ];  
p = name;  
}  
 
if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {  
return opt.complete.call(this);  
}  
 
if ( isElement && ( p === "height" || p === "width" ) ) {  
// Make sure that nothing sneaks out  
// Record all 3 overflow attributes because IE does not  
// change the overflow attribute when overflowX and  
// overflowY are set to the same value  
opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];  
 
// Set display property to inline-block for height/width  
// animations on inline elements that are having width/height  
// animated  
if ( jQuery.css( this, "display" ) === "inline" &&  
jQuery.css( this, "float" ) === "none" ) {  
if ( !jQuery.support.inlineBlockNeedsLayout ) {  
this.style.display = "inline-block";  
 
} else {  
var display = defaultDisplay(this.nodeName);  
 
// inline-level elements accept inline-block;  
// block-level elements need to be inline with layout  
if ( display === "inline" ) {  
this.style.display = "inline-block";  
 
} else {  
this.style.display = "inline";  
this.style.zoom = 1;  
}  
}  
}  
}  
 
if ( jQuery.isArray( prop[p] ) ) {  
// Create (if needed) and add to specialEasing  
(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];  
prop[p] = prop[p][0];  
}  
}  
 
if ( opt.overflow != null ) {  
this.style.overflow = "hidden";  
}  
 
opt.curAnim = jQuery.extend({}, prop);  
 
jQuery.each( prop, function( name, val ) {  
var e = new jQuery.fx( self, opt, name );  
 
if ( rfxtypes.test(val) ) {  
e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );  
 
} else {  
var parts = rfxnum.exec(val),  
start = e.cur() || 0;  
 
if ( parts ) {  
var end = parseFloat( parts[2] ),  
unit = parts[3] || "px";  
 
// We need to compute starting value  
if ( unit !== "px" ) {  
jQuery.style( self, name, (end || 1) + unit);  
start = ((end || 1) / e.cur()) * start;  
jQuery.style( self, name, start + unit);  
}  
 
// If a +=/-= token was provided, we're doing a relative animation  
if ( parts[1] ) {  
end = ((parts[1] === "-=" ? -1 : 1) * end) + start;  
}  
 
e.custom( start, end, unit );  
 
} else {  
e.custom( start, val, "" );  
}  
}  
});  
 
// For JS strict compliance  
return true;  
});  
},  
 
stop: function( clearQueue, gotoEnd ) {  
var timers = jQuery.timers;  
 
if ( clearQueue ) {  
this.queue([]);  
}  
 
this.each(function() {  
// go in reverse order so anything added to the queue during the loop is ignored  
for ( var i = timers.length - 1; i >= 0; i-- ) {  
if ( timers[i].elem === this ) {  
if (gotoEnd) {  
// force the next step to be the last  
timers[i](true);  
}  
 
timers.splice(i, 1);  
}  
}  
});  
 
// start the next in the queue if the last step wasn't forced  
if ( !gotoEnd ) {  
this.dequeue();  
}  
 
return this;  
}  
 
});  
 
function genFx( type, num ) {  
var obj = {};  
 
jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {  
obj[ this ] = type;  
});  
 
return obj;  
}  
 
// Generate shortcuts for custom animations  
jQuery.each({  
slideDown: genFx("show", 1),  
slideUp: genFx("hide", 1),  
slideToggle: genFx("toggle", 1),  
fadeIn: { opacity: "show" },  
fadeOut: { opacity: "hide" },  
fadeToggle: { opacity: "toggle" }  
}, function( name, props ) {  
jQuery.fn[ name ] = function( speed, easing, callback ) {  
return this.animate( props, speed, easing, callback );  
};  
});  
 
jQuery.extend({  
speed: function( speed, easing, fn ) {  
var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {  
complete: fn || !fn && easing ||  
jQuery.isFunction( speed ) && speed,  
duration: speed,  
easing: fn && easing || easing && !jQuery.isFunction(easing) && easing  
};  
 
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :  
opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;  
 
// Queueing  
opt.old = opt.complete;  
opt.complete = function() {  
if ( opt.queue !== false ) {  
jQuery(this).dequeue();  
}  
if ( jQuery.isFunction( opt.old ) ) {  
opt.old.call( this );  
}  
};  
 
return opt;  
},  
 
easing: {  
linear: function( p, n, firstNum, diff ) {  
return firstNum + diff * p;  
},  
swing: function( p, n, firstNum, diff ) {  
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;  
}  
},  
 
timers: [],  
 
fx: function( elem, options, prop ) {  
this.options = options;  
this.elem = elem;  
this.prop = prop;  
 
if ( !options.orig ) {  
options.orig = {};  
}  
}  
 
});  
 
jQuery.fx.prototype = {  
// Simple function for setting a style value  
update: function() {  
if ( this.options.step ) {  
this.options.step.call( this.elem, this.now, this );  
}  
 
(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );  
},  
 
// Get the current size  
cur: function() {  
if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {  
return this.elem[ this.prop ];  
}  
 
var r = parseFloat( jQuery.css( this.elem, this.prop ) );  
return r && r > -10000 ? r : 0;  
},  
 
// Start an animation from one number to another  
custom: function( from, to, unit ) {  
var self = this,  
fx = jQuery.fx;  
 
this.startTime = jQuery.now();  
this.start = from;  
this.end = to;  
this.unit = unit || this.unit || "px";  
this.now = this.start;  
this.pos = this.state = 0;  
 
function t( gotoEnd ) {  
return self.step(gotoEnd);  
}  
 
t.elem = this.elem;  
 
if ( t() && jQuery.timers.push(t) && !timerId ) {  
timerId = setInterval(fx.tick, fx.interval);  
}  
},  
 
// Simple 'show' function  
show: function() {  
// Remember where we started, so that we can go back to it later  
this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );  
this.options.show = true;  
 
// Begin the animation  
// Make sure that we start at a small width/height to avoid any  
// flash of content  
this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());  
 
// Start by showing the element  
jQuery( this.elem ).show();  
},  
 
// Simple 'hide' function  
hide: function() {  
// Remember where we started, so that we can go back to it later  
this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );  
this.options.hide = true;  
 
// Begin the animation  
this.custom(this.cur(), 0);  
},  
 
// Each step of an animation  
step: function( gotoEnd ) {  
var t = jQuery.now(), done = true;  
 
if ( gotoEnd || t >= this.options.duration + this.startTime ) {  
this.now = this.end;  
this.pos = this.state = 1;  
this.update();  
 
this.options.curAnim[ this.prop ] = true;  
 
for ( var i in this.options.curAnim ) {  
if ( this.options.curAnim[i] !== true ) {  
done = false;  
}  
}  
 
if ( done ) {  
// Reset the overflow  
if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {  
var elem = this.elem,  
options = this.options;  
 
jQuery.each( [ "", "X", "Y" ], function (index, value) {  
elem.style[ "overflow" + value ] = options.overflow[index];  
} );  
}  
 
// Hide the element if the "hide" operation was done  
if ( this.options.hide ) {  
jQuery(this.elem).hide();  
}  
 
// Reset the properties, if the item has been hidden or shown  
if ( this.options.hide || this.options.show ) {  
for ( var p in this.options.curAnim ) {  
jQuery.style( this.elem, p, this.options.orig[p] );  
}  
}  
 
// Execute the complete function  
this.options.complete.call( this.elem );  
}  
 
return false;  
 
} else {  
var n = t - this.startTime;  
this.state = n / this.options.duration;  
 
// Perform the easing function, defaults to swing  
var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];  
var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");  
this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);  
this.now = this.start + ((this.end - this.start) * this.pos);  
 
// Perform the next step of the animation  
this.update();  
}  
 
return true;  
}  
};  
 
jQuery.extend( jQuery.fx, {  
tick: function() {  
var timers = jQuery.timers;  
 
for ( var i = 0; i < timers.length; i++ ) {  
if ( !timers[i]() ) {  
timers.splice(i--, 1);  
}  
}  
 
if ( !timers.length ) {  
jQuery.fx.stop();  
}  
},  
 
interval: 13,  
 
stop: function() {  
clearInterval( timerId );  
timerId = null;  
},  
 
speeds: {  
slow: 600,  
fast: 200,  
// Default speed  
_default: 400  
},  
 
step: {  
opacity: function( fx ) {  
jQuery.style( fx.elem, "opacity", fx.now );  
},  
 
_default: function( fx ) {  
if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {  
fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;  
} else {  
fx.elem[ fx.prop ] = fx.now;  
}  
}  
}  
});  
 
if ( jQuery.expr && jQuery.expr.filters ) {  
jQuery.expr.filters.animated = function( elem ) {  
return jQuery.grep(jQuery.timers, function( fn ) {  
return elem === fn.elem;  
}).length;  
};  
}  
 
function defaultDisplay( nodeName ) {  
if ( !elemdisplay[ nodeName ] ) {  
var elem = jQuery("<" + nodeName + ">").appendTo("body"),  
display = elem.css("display");  
 
elem.remove();  
 
if ( display === "none" || display === "" ) {  
display = "block";  
}  
 
elemdisplay[ nodeName ] = display;  
}  
 
return elemdisplay[ nodeName ];  
}  
 
 
 
 
var rtable = /^t(?:able|d|h)$/i,  
rroot = /^(?:body|html)$/i;  
 
if ( "getBoundingClientRect" in document.documentElement ) {  
jQuery.fn.offset = function( options ) {  
var elem = this[0], box;  
 
if ( options ) {  
return this.each(function( i ) {  
jQuery.offset.setOffset( this, options, i );  
});  
}  
 
if ( !elem || !elem.ownerDocument ) {  
return null;  
}  
 
if ( elem === elem.ownerDocument.body ) {  
return jQuery.offset.bodyOffset( elem );  
}  
 
try {  
box = elem.getBoundingClientRect();  
} catch(e) {}  
 
var doc = elem.ownerDocument,  
docElem = doc.documentElement;  
 
// Make sure we're not dealing with a disconnected DOM node  
if ( !box || !jQuery.contains( docElem, elem ) ) {  
return box || { top: 0, left: 0 };  
}  
 
var body = doc.body,  
win = getWindow(doc),  
clientTop = docElem.clientTop || body.clientTop || 0,  
clientLeft = docElem.clientLeft || body.clientLeft || 0,  
scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ),  
scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),  
top = box.top + scrollTop - clientTop,  
left = box.left + scrollLeft - clientLeft;  
 
return { top: top, left: left };  
};  
 
} else {  
jQuery.fn.offset = function( options ) {  
var elem = this[0];  
 
if ( options ) {  
return this.each(function( i ) {  
jQuery.offset.setOffset( this, options, i );  
});  
}  
 
if ( !elem || !elem.ownerDocument ) {  
return null;  
}  
 
if ( elem === elem.ownerDocument.body ) {  
return jQuery.offset.bodyOffset( elem );  
}  
 
jQuery.offset.initialize();  
 
var computedStyle,  
offsetParent = elem.offsetParent,  
prevOffsetParent = elem,  
doc = elem.ownerDocument,  
docElem = doc.documentElement,  
body = doc.body,  
defaultView = doc.defaultView,  
prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,  
top = elem.offsetTop,  
left = elem.offsetLeft;  
 
while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {  
if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {  
break;  
}  
 
computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;  
top -= elem.scrollTop;  
left -= elem.scrollLeft;  
 
if ( elem === offsetParent ) {  
top += elem.offsetTop;  
left += elem.offsetLeft;  
 
if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {  
top += parseFloat( computedStyle.borderTopWidth ) || 0;  
left += parseFloat( computedStyle.borderLeftWidth ) || 0;  
}  
 
prevOffsetParent = offsetParent;  
offsetParent = elem.offsetParent;  
}  
 
if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {  
top += parseFloat( computedStyle.borderTopWidth ) || 0;  
left += parseFloat( computedStyle.borderLeftWidth ) || 0;  
}  
 
prevComputedStyle = computedStyle;  
}  
 
if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {  
top += body.offsetTop;  
left += body.offsetLeft;  
}  
 
if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {  
top += Math.max( docElem.scrollTop, body.scrollTop );  
left += Math.max( docElem.scrollLeft, body.scrollLeft );  
}  
 
return { top: top, left: left };  
};  
}  
 
jQuery.offset = {  
initialize: function() {  
var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,  
html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";  
 
jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );  
 
container.innerHTML = html;  
body.insertBefore( container, body.firstChild );  
innerDiv = container.firstChild;  
checkDiv = innerDiv.firstChild;  
td = innerDiv.nextSibling.firstChild.firstChild;  
 
this.doesNotAddBorder = (checkDiv.offsetTop !== 5);  
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);  
 
checkDiv.style.position = "fixed";  
checkDiv.style.top = "20px";  
 
// safari subtracts parent border width here which is 5px  
this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);  
checkDiv.style.position = checkDiv.style.top = "";  
 
innerDiv.style.overflow = "hidden";  
innerDiv.style.position = "relative";  
 
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);  
 
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);  
 
body.removeChild( container );  
body = container = innerDiv = checkDiv = table = td = null;  
jQuery.offset.initialize = jQuery.noop;  
},  
 
bodyOffset: function( body ) {  
var top = body.offsetTop,  
left = body.offsetLeft;  
 
jQuery.offset.initialize();  
 
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {  
top += parseFloat( jQuery.css(body, "marginTop") ) || 0;  
left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;  
}  
 
return { top: top, left: left };  
},  
 
setOffset: function( elem, options, i ) {  
var position = jQuery.css( elem, "position" );  
 
// set position first, in-case top/left are set even on static elem  
if ( position === "static" ) {  
elem.style.position = "relative";  
}  
 
var curElem = jQuery( elem ),  
curOffset = curElem.offset(),  
curCSSTop = jQuery.css( elem, "top" ),  
curCSSLeft = jQuery.css( elem, "left" ),  
calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),  
props = {}, curPosition = {}, curTop, curLeft;  
 
// need to be able to calculate position if either top or left is auto and position is absolute  
if ( calculatePosition ) {  
curPosition = curElem.position();  
}  
 
curTop = calculatePosition ? curPosition.top : parseInt( curCSSTop, 10 ) || 0;  
curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;  
 
if ( jQuery.isFunction( options ) ) {  
options = options.call( elem, i, curOffset );  
}  
 
if (options.top != null) {  
props.top = (options.top - curOffset.top) + curTop;  
}  
if (options.left != null) {  
props.left = (options.left - curOffset.left) + curLeft;  
}  
 
if ( "using" in options ) {  
options.using.call( elem, props );  
} else {  
curElem.css( props );  
}  
}  
};  
 
 
jQuery.fn.extend({  
position: function() {  
if ( !this[0] ) {  
return null;  
}  
 
var elem = this[0],  
 
// Get *real* offsetParent  
offsetParent = this.offsetParent(),  
 
// Get correct offsets  
offset = this.offset(),  
parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();  
 
// Subtract element margins  
// note: when an element has margin: auto the offsetLeft and marginLeft  
// are the same in Safari causing offset.left to incorrectly be 0  
offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;  
offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;  
 
// Add offsetParent borders  
parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;  
parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;  
 
// Subtract the two offsets  
return {  
top: offset.top - parentOffset.top,  
left: offset.left - parentOffset.left  
};  
},  
 
offsetParent: function() {  
return this.map(function() {  
var offsetParent = this.offsetParent || document.body;  
while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {  
offsetParent = offsetParent.offsetParent;  
}  
return offsetParent;  
});  
}  
});  
 
 
// Create scrollLeft and scrollTop methods  
jQuery.each( ["Left", "Top"], function( i, name ) {  
var method = "scroll" + name;  
 
jQuery.fn[ method ] = function(val) {  
var elem = this[0], win;  
 
if ( !elem ) {  
return null;  
}  
 
if ( val !== undefined ) {  
// Set the scroll offset  
return this.each(function() {  
win = getWindow( this );  
 
if ( win ) {  
win.scrollTo(  
!i ? val : jQuery(win).scrollLeft(),  
i ? val : jQuery(win).scrollTop()  
);  
 
} else {  
this[ method ] = val;  
}  
});  
} else {  
win = getWindow( elem );  
 
// Return the scroll offset  
return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :  
jQuery.support.boxModel && win.document.documentElement[ method ] ||  
win.document.body[ method ] :  
elem[ method ];  
}  
};  
});  
 
function getWindow( elem ) {  
return jQuery.isWindow( elem ) ?  
elem :  
elem.nodeType === 9 ?  
elem.defaultView || elem.parentWindow :  
false;  
}  
 
 
 
 
// Create innerHeight, innerWidth, outerHeight and outerWidth methods  
jQuery.each([ "Height", "Width" ], function( i, name ) {  
 
var type = name.toLowerCase();  
 
// innerHeight and innerWidth  
jQuery.fn["inner" + name] = function() {  
return this[0] ?  
parseFloat( jQuery.css( this[0], type, "padding" ) ) :  
null;  
};  
 
// outerHeight and outerWidth  
jQuery.fn["outer" + name] = function( margin ) {  
return this[0] ?  
parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :  
null;  
};  
 
jQuery.fn[ type ] = function( size ) {  
// Get window width or height  
var elem = this[0];  
if ( !elem ) {  
return size == null ? null : this;  
}  
 
if ( jQuery.isFunction( size ) ) {  
return this.each(function( i ) {  
var self = jQuery( this );  
self[ type ]( size.call( this, i, self[ type ]() ) );  
});  
}  
 
if ( jQuery.isWindow( elem ) ) {  
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode  
return elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||  
elem.document.body[ "client" + name ];  
 
// Get document width or height  
} else if ( elem.nodeType === 9 ) {  
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater  
return Math.max(  
elem.documentElement["client" + name],  
elem.body["scroll" + name], elem.documentElement["scroll" + name],  
elem.body["offset" + name], elem.documentElement["offset" + name]  
);  
 
// Get or set width or height on the element  
} else if ( size === undefined ) {  
var orig = jQuery.css( elem, type ),  
ret = parseFloat( orig );  
 
return jQuery.isNaN( ret ) ? orig : ret;  
 
// Set the width or height on the element (default to pixels if value is unitless)  
} else {  
return this.css( type, typeof size === "string" ? size : size + "px" );  
}  
};  
 
});  
 
 
})(window);  
 
 
/*!  
* jQuery UI Widget @VERSION  
*  
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*  
* http://docs.jquery.com/UI/Widget  
*/  
(function( $, undefined ) {  
 
// jQuery 1.4+  
if ( $.cleanData ) {  
var _cleanData = $.cleanData;  
$.cleanData = function( elems ) {  
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {  
$( elem ).triggerHandler( "remove" );  
}  
_cleanData( elems );  
};  
} else {  
var _remove = $.fn.remove;  
$.fn.remove = function( selector, keepData ) {  
return this.each(function() {  
if ( !keepData ) {  
if ( !selector || $.filter( selector, [ this ] ).length ) {  
$( "*", this ).add( [ this ] ).each(function() {  
$( this ).triggerHandler( "remove" );  
});  
}  
}  
return _remove.call( $(this), selector, keepData );  
});  
};  
}  
 
$.widget = function( name, base, prototype ) {  
var namespace = name.split( "." )[ 0 ],  
fullName;  
name = name.split( "." )[ 1 ];  
fullName = namespace + "-" + name;  
 
if ( !prototype ) {  
prototype = base;  
base = $.Widget;  
}  
 
// create selector for plugin  
$.expr[ ":" ][ fullName ] = function( elem ) {  
return !!$.data( elem, name );  
};  
 
$[ namespace ] = $[ namespace ] || {};  
$[ namespace ][ name ] = function( options, element ) {  
// allow instantiation without initializing for simple inheritance  
if ( arguments.length ) {  
this._createWidget( options, element );  
}  
};  
 
var basePrototype = new base();  
// we need to make the options hash a property directly on the new instance  
// otherwise we'll modify the options hash on the prototype that we're  
// inheriting from  
// $.each( basePrototype, function( key, val ) {  
// if ( $.isPlainObject(val) ) {  
// basePrototype[ key ] = $.extend( {}, val );  
// }  
// });  
basePrototype.options = $.extend( true, {}, basePrototype.options );  
$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {  
namespace: namespace,  
widgetName: name,  
widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,  
widgetBaseClass: fullName  
}, prototype );  
 
$.widget.bridge( name, $[ namespace ][ name ] );  
};  
 
$.widget.bridge = function( name, object ) {  
$.fn[ name ] = function( options ) {  
var isMethodCall = typeof options === "string",  
args = Array.prototype.slice.call( arguments, 1 ),  
returnValue = this;  
 
// allow multiple hashes to be passed on init  
options = !isMethodCall && args.length ?  
$.extend.apply( null, [ true, options ].concat(args) ) :  
options;  
 
// prevent calls to internal methods  
if ( isMethodCall && options.charAt( 0 ) === "_" ) {  
return returnValue;  
}  
 
if ( isMethodCall ) {  
this.each(function() {  
var instance = $.data( this, name );  
if ( !instance ) {  
throw "cannot call methods on " + name + " prior to initialization; " +  
"attempted to call method '" + options + "'";  
}  
if ( !$.isFunction( instance[options] ) ) {  
throw "no such method '" + options + "' for " + name + " widget instance";  
}  
var methodValue = instance[ options ].apply( instance, args );  
if ( methodValue !== instance && methodValue !== undefined ) {  
returnValue = methodValue;  
return false;  
}  
});  
} else {  
this.each(function() {  
var instance = $.data( this, name );  
if ( instance ) {  
instance.option( options || {} )._init();  
} else {  
$.data( this, name, new object( options, this ) );  
}  
});  
}  
 
return returnValue;  
};  
};  
 
$.Widget = function( options, element ) {  
// allow instantiation without initializing for simple inheritance  
if ( arguments.length ) {  
this._createWidget( options, element );  
}  
};  
 
$.Widget.prototype = {  
widgetName: "widget",  
widgetEventPrefix: "",  
options: {  
disabled: false  
},  
_createWidget: function( options, element ) {  
// $.widget.bridge stores the plugin instance, but we do it anyway  
// so that it's stored even before the _create function runs  
$.data( element, this.widgetName, this );  
this.element = $( element );  
this.options = $.extend( true, {},  
this.options,  
this._getCreateOptions(),  
options );  
 
var self = this;  
this.element.bind( "remove." + this.widgetName, function() {  
self.destroy();  
});  
 
this._create();  
this._trigger( "create" );  
this._init();  
},  
_getCreateOptions: function() {  
var options = {};  
if ( $.metadata ) {  
options = $.metadata.get( element )[ this.widgetName ];  
}  
return options;  
},  
_create: function() {},  
_init: function() {},  
 
destroy: function() {  
this.element  
.unbind( "." + this.widgetName )  
.removeData( this.widgetName );  
this.widget()  
.unbind( "." + this.widgetName )  
.removeAttr( "aria-disabled" )  
.removeClass(  
this.widgetBaseClass + "-disabled " +  
"ui-state-disabled" );  
},  
 
widget: function() {  
return this.element;  
},  
 
option: function( key, value ) {  
var options = key;  
 
if ( arguments.length === 0 ) {  
// don't return a reference to the internal hash  
return $.extend( {}, this.options );  
}  
 
if (typeof key === "string" ) {  
if ( value === undefined ) {  
return this.options[ key ];  
}  
options = {};  
options[ key ] = value;  
}  
 
this._setOptions( options );  
 
return this;  
},  
_setOptions: function( options ) {  
var self = this;  
$.each( options, function( key, value ) {  
self._setOption( key, value );  
});  
 
return this;  
},  
_setOption: function( key, value ) {  
this.options[ key ] = value;  
 
if ( key === "disabled" ) {  
this.widget()  
[ value ? "addClass" : "removeClass"](  
this.widgetBaseClass + "-disabled" + " " +  
"ui-state-disabled" )  
.attr( "aria-disabled", value );  
}  
 
return this;  
},  
 
enable: function() {  
return this._setOption( "disabled", false );  
},  
disable: function() {  
return this._setOption( "disabled", true );  
},  
 
_trigger: function( type, event, data ) {  
var callback = this.options[ type ];  
 
event = $.Event( event );  
event.type = ( type === this.widgetEventPrefix ?  
type :  
this.widgetEventPrefix + type ).toLowerCase();  
data = data || {};  
 
// copy original event properties over to the new event  
// this would happen if we could call $.event.fix instead of $.Event  
// but we don't have a way to force an event to be fixed multiple times  
if ( event.originalEvent ) {  
for ( var i = $.event.props.length, prop; i; ) {  
prop = $.event.props[ --i ];  
event[ prop ] = event.originalEvent[ prop ];  
}  
}  
 
this.element.trigger( event, data );  
 
return !( $.isFunction(callback) &&  
callback.call( this.element[0], event, data ) === false ||  
event.isDefaultPrevented() );  
}  
};  
 
})( jQuery );  
 
 
/*  
* jQuery Mobile Framework : widget factory extentions for mobile  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
$.widget( "mobile.widget", {  
_getCreateOptions: function() {  
var elem = this.element,  
options = {};  
$.each( this.options, function( option ) {  
var value = elem.data( option.replace( /[A-Z]/g, function( c ) {  
return "-" + c.toLowerCase();  
} ) );  
if ( value !== undefined ) {  
options[ option ] = value;  
}  
});  
return options;  
}  
});  
 
})( jQuery );  
 
 
/*  
* jQuery Mobile Framework : resolution and CSS media query related helpers and behavior  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
var $window = $(window),  
$html = $( "html" ),  
 
//media-query-like width breakpoints, which are translated to classes on the html element  
resolutionBreakpoints = [320,480,768,1024];  
 
 
/* $.mobile.media method: pass a CSS media type or query and get a bool return  
note: this feature relies on actual media query support for media queries, though types will work most anywhere  
examples:  
$.mobile.media('screen') //>> tests for screen media type  
$.mobile.media('screen and (min-width: 480px)') //>> tests for screen media type with window width > 480px  
$.mobile.media('@media screen and (-webkit-min-device-pixel-ratio: 2)') //>> tests for webkit 2x pixel ratio (iPhone 4)  
*/  
$.mobile.media = (function() {  
// TODO: use window.matchMedia once at least one UA implements it  
var cache = {},  
testDiv = $( "<div id='jquery-mediatest'>" ),  
fakeBody = $( "<body>" ).append( testDiv );  
 
return function( query ) {  
if ( !( query in cache ) ) {  
var styleBlock = $( "<style type='text/css'>" +  
"@media " + query + "{#jquery-mediatest{position:absolute;}}" +  
"</style>" );  
$html.prepend( fakeBody ).prepend( styleBlock );  
cache[ query ] = testDiv.css( "position" ) === "absolute";  
fakeBody.add( styleBlock ).remove();  
}  
return cache[ query ];  
};  
})();  
 
/*  
private function for adding/removing breakpoint classes to HTML element for faux media-query support  
It does not require media query support, instead using JS to detect screen width > cross-browser support  
This function is called on orientationchange, resize, and mobileinit, and is bound via the 'htmlclass' event namespace  
*/  
function detectResolutionBreakpoints(){  
var currWidth = $window.width(),  
minPrefix = "min-width-",  
maxPrefix = "max-width-",  
minBreakpoints = [],  
maxBreakpoints = [],  
unit = "px",  
breakpointClasses;  
 
$html.removeClass( minPrefix + resolutionBreakpoints.join(unit + " " + minPrefix) + unit + " " +  
maxPrefix + resolutionBreakpoints.join( unit + " " + maxPrefix) + unit );  
 
$.each(resolutionBreakpoints,function( i, breakPoint ){  
if( currWidth >= breakPoint ){  
minBreakpoints.push( minPrefix + breakPoint + unit );  
}  
if( currWidth <= breakPoint ){  
maxBreakpoints.push( maxPrefix + breakPoint + unit );  
}  
});  
 
if( minBreakpoints.length ){ breakpointClasses = minBreakpoints.join(" "); }  
if( maxBreakpoints.length ){ breakpointClasses += " " + maxBreakpoints.join(" "); }  
 
$html.addClass( breakpointClasses );  
};  
 
/* $.mobile.addResolutionBreakpoints method:  
pass either a number or an array of numbers and they'll be added to the min/max breakpoint classes  
Examples:  
$.mobile.addResolutionBreakpoints( 500 );  
$.mobile.addResolutionBreakpoints( [500, 1200] );  
*/  
$.mobile.addResolutionBreakpoints = function( newbps ){  
if( $.type( newbps ) === "array" ){  
resolutionBreakpoints = resolutionBreakpoints.concat( newbps );  
}  
else {  
resolutionBreakpoints.push( newbps );  
}  
resolutionBreakpoints.sort(function(a,b){ return a-b; });  
detectResolutionBreakpoints();  
};  
 
/* on mobileinit, add classes to HTML element  
and set handlers to update those on orientationchange and resize*/  
$(document).bind("mobileinit.htmlclass", function(){  
/* bind to orientationchange and resize  
to add classes to HTML element for min/max breakpoints and orientation */  
$window.bind("orientationchange.htmlclass resize.htmlclass", function(event){  
//add orientation class to HTML element on flip/resize.  
if(event.orientation){  
$html.removeClass( "portrait landscape" ).addClass( event.orientation );  
}  
//add classes to HTML element for min/max breakpoints  
detectResolutionBreakpoints();  
});  
 
//trigger event manually  
$window.trigger( "orientationchange.htmlclass" );  
});  
 
})(jQuery);  
 
/*  
* jQuery Mobile Framework : support tests  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
 
 
var fakeBody = $( "<body>" ).prependTo( "html" ),  
fbCSS = fakeBody[0].style,  
vendors = ['webkit','moz','o'],  
webos = window.palmGetResource || window.PalmServiceBridge, //only used to rule out scrollTop  
bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB  
 
//thx Modernizr  
function propExists( prop ){  
var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1),  
props = (prop + ' ' + vendors.join(uc_prop + ' ') + uc_prop).split(' ');  
for(var v in props){  
if( fbCSS[ props[v] ] !== undefined ){  
return true;  
}  
}  
};  
 
//test for dynamic-updating base tag support (allows us to avoid href,src attr rewriting)  
function baseTagTest(){  
var fauxBase = location.protocol + '//' + location.host + location.pathname + "ui-dir/",  
base = $("<base>", {"href": fauxBase}).appendTo("head"),  
link = $( "<a href='testurl'></a>" ).prependTo( fakeBody ),  
rebase = link[0].href;  
base.remove();  
return rebase.indexOf(fauxBase) === 0;  
};  
 
$.extend( $.support, {  
orientation: "orientation" in window,  
touch: "ontouchend" in document,  
cssTransitions: "WebKitTransitionEvent" in window,  
pushState: !!history.pushState,  
mediaquery: $.mobile.media('only all'),  
cssPseudoElement: !!propExists('content'),  
boxShadow: !!propExists('boxShadow') && !bb,  
scrollTop: ("pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[0]) && !webos,  
dynamicBaseTag: baseTagTest()  
});  
 
fakeBody.remove();  
 
//for ruling out shadows via css  
if( !$.support.boxShadow ){ $('html').addClass('ui-mobile-nosupport-boxshadow'); }  
 
})( jQuery );  
 
/*  
* jQuery Mobile Framework : events  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
// add new event shortcuts  
$.each( "touchstart touchmove touchend orientationchange tap taphold swipe swipeleft swiperight scrollstart scrollstop".split( " " ), function( i, name ) {  
$.fn[ name ] = function( fn ) {  
return fn ? this.bind( name, fn ) : this.trigger( name );  
};  
$.attrFn[ name ] = true;  
});  
 
var supportTouch = $.support.touch,  
scrollEvent = "touchmove scroll",  
touchStartEvent = supportTouch ? "touchstart" : "mousedown",  
touchStopEvent = supportTouch ? "touchend" : "mouseup",  
touchMoveEvent = supportTouch ? "touchmove" : "mousemove";  
 
// also handles scrollstop  
$.event.special.scrollstart = {  
enabled: true,  
 
setup: function() {  
var thisObject = this,  
$this = $( thisObject ),  
scrolling,  
timer;  
 
function trigger( event, state ) {  
scrolling = state;  
var originalType = event.type;  
event.type = scrolling ? "scrollstart" : "scrollstop";  
$.event.handle.call( thisObject, event );  
event.type = originalType;  
}  
 
// iPhone triggers scroll after a small delay; use touchmove instead  
$this.bind( scrollEvent, function( event ) {  
if ( !$.event.special.scrollstart.enabled ) {  
return;  
}  
 
if ( !scrolling ) {  
trigger( event, true );  
}  
 
clearTimeout( timer );  
timer = setTimeout(function() {  
trigger( event, false );  
}, 50 );  
});  
}  
};  
 
// also handles taphold  
$.event.special.tap = {  
setup: function() {  
var thisObject = this,  
$this = $( thisObject );  
 
$this  
.bind( touchStartEvent, function( event ) {  
if ( event.which && event.which !== 1 ) {  
return;  
}  
 
var moved = false,  
touching = true,  
origPos = [ event.pageX, event.pageY ],  
originalType,  
timer;  
 
function moveHandler() {  
if ((Math.abs(origPos[0] - event.pageX) > 10) ||  
(Math.abs(origPos[1] - event.pageY) > 10)) {  
moved = true;  
}  
}  
 
timer = setTimeout(function() {  
if ( touching && !moved ) {  
originalType = event.type;  
event.type = "taphold";  
$.event.handle.call( thisObject, event );  
event.type = originalType;  
}  
}, 750 );  
 
$this  
.one( touchMoveEvent, moveHandler)  
.one( touchStopEvent, function( event ) {  
$this.unbind( touchMoveEvent, moveHandler );  
clearTimeout( timer );  
touching = false;  
 
if ( !moved ) {  
originalType = event.type;  
event.type = "tap";  
$.event.handle.call( thisObject, event );  
event.type = originalType;  
}  
});  
});  
}  
};  
 
// also handles swipeleft, swiperight  
$.event.special.swipe = {  
setup: function() {  
var thisObject = this,  
$this = $( thisObject );  
 
$this  
.bind( touchStartEvent, function( event ) {  
var data = event.originalEvent.touches ?  
event.originalEvent.touches[ 0 ] :  
event,  
start = {  
time: (new Date).getTime(),  
coords: [ data.pageX, data.pageY ],  
origin: $( event.target )  
},  
stop;  
 
function moveHandler( event ) {  
if ( !start ) {  
return;  
}  
 
var data = event.originalEvent.touches ?  
event.originalEvent.touches[ 0 ] :  
event;  
stop = {  
time: (new Date).getTime(),  
coords: [ data.pageX, data.pageY ]  
};  
 
// prevent scrolling  
if ( Math.abs( start.coords[0] - stop.coords[0] ) > 10 ) {  
event.preventDefault();  
}  
}  
 
$this  
.bind( touchMoveEvent, moveHandler )  
.one( touchStopEvent, function( event ) {  
$this.unbind( touchMoveEvent, moveHandler );  
if ( start && stop ) {  
if ( stop.time - start.time < 1000 &&  
Math.abs( start.coords[0] - stop.coords[0]) > 30 &&  
Math.abs( start.coords[1] - stop.coords[1]) < 75 ) {  
start.origin  
.trigger( "swipe" )  
.trigger( start.coords[0] > stop.coords[0] ? "swipeleft" : "swiperight" );  
}  
}  
start = stop = undefined;  
});  
});  
}  
};  
 
(function($){  
// "Cowboy" Ben Alman  
 
var win = $(window),  
special_event,  
get_orientation,  
last_orientation;  
 
$.event.special.orientationchange = special_event = {  
setup: function(){  
// If the event is supported natively, return false so that jQuery  
// will bind to the event using DOM methods.  
if ( $.support.orientation ) { return false; }  
 
// Get the current orientation to avoid initial double-triggering.  
last_orientation = get_orientation();  
 
// Because the orientationchange event doesn't exist, simulate the  
// event by testing window dimensions on resize.  
win.bind( "resize", handler );  
},  
teardown: function(){  
// If the event is not supported natively, return false so that  
// jQuery will unbind the event using DOM methods.  
if ( $.support.orientation ) { return false; }  
 
// Because the orientationchange event doesn't exist, unbind the  
// resize event handler.  
win.unbind( "resize", handler );  
},  
add: function( handleObj ) {  
// Save a reference to the bound event handler.  
var old_handler = handleObj.handler;  
 
handleObj.handler = function( event ) {  
// Modify event object, adding the .orientation property.  
event.orientation = get_orientation();  
 
// Call the originally-bound event handler and return its result.  
return old_handler.apply( this, arguments );  
};  
}  
};  
 
// If the event is not supported natively, this handler will be bound to  
// the window resize event to simulate the orientationchange event.  
function handler() {  
// Get the current orientation.  
var orientation = get_orientation();  
 
if ( orientation !== last_orientation ) {  
// The orientation has changed, so trigger the orientationchange event.  
last_orientation = orientation;  
win.trigger( "orientationchange" );  
}  
};  
 
// Get the current page orientation. This method is exposed publicly, should it  
// be needed, as jQuery.event.special.orientationchange.orientation()  
special_event.orientation = get_orientation = function() {  
var elem = document.documentElement;  
return elem && elem.clientWidth / elem.clientHeight < 1.1 ? "portrait" : "landscape";  
};  
 
})(jQuery);  
 
$.each({  
scrollstop: "scrollstart",  
taphold: "tap",  
swipeleft: "swipe",  
swiperight: "swipe"  
}, function( event, sourceEvent ) {  
$.event.special[ event ] = {  
setup: function() {  
$( this ).bind( sourceEvent, $.noop );  
}  
};  
});  
 
})( jQuery );  
 
 
/*!  
* jQuery hashchange event - v1.3 - 7/21/2010  
* http://benalman.com/projects/jquery-hashchange-plugin/  
*  
* Copyright (c) 2010 "Cowboy" Ben Alman  
* Dual licensed under the MIT and GPL licenses.  
* http://benalman.com/about/license/  
*/  
 
// Script: jQuery hashchange event  
//  
// *Version: 1.3, Last updated: 7/21/2010*  
//  
// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/  
// GitHub - http://github.com/cowboy/jquery-hashchange/  
// Source - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js  
// (Minified) - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)  
//  
// About: License  
//  
// Copyright (c) 2010 "Cowboy" Ben Alman,  
// Dual licensed under the MIT and GPL licenses.  
// http://benalman.com/about/license/  
//  
// About: Examples  
//  
// These working examples, complete with fully commented code, illustrate a few  
// ways in which this plugin can be used.  
//  
// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/  
// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/  
//  
// About: Support and Testing  
//  
// Information about what version or versions of jQuery this plugin has been  
// tested with, what browsers it has been tested in, and where the unit tests  
// reside (so you can test it yourself).  
//  
// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2  
// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,  
// Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.  
// Unit Tests - http://benalman.com/code/projects/jquery-hashchange/unit/  
//  
// About: Known issues  
//  
// While this jQuery hashchange event implementation is quite stable and  
// robust, there are a few unfortunate browser bugs surrounding expected  
// hashchange event-based behaviors, independent of any JavaScript  
// window.onhashchange abstraction. See the following examples for more  
// information:  
//  
// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/  
// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/  
// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/  
// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/  
//  
// Also note that should a browser natively support the window.onhashchange  
// event, but not report that it does, the fallback polling loop will be used.  
//  
// About: Release History  
//  
// 1.3 - (7/21/2010) Reorganized IE6/7 Iframe code to make it more  
// "removable" for mobile-only development. Added IE6/7 document.title  
// support. Attempted to make Iframe as hidden as possible by using  
// techniques from http://www.paciellogroup.com/blog/?p=604. Added  
// support for the "shortcut" format $(window).hashchange( fn ) and  
// $(window).hashchange() like jQuery provides for built-in events.  
// Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and  
// lowered its default value to 50. Added <jQuery.fn.hashchange.domain>  
// and <jQuery.fn.hashchange.src> properties plus document-domain.html  
// file to address access denied issues when setting document.domain in  
// IE6/7.  
// 1.2 - (2/11/2010) Fixed a bug where coming back to a page using this plugin  
// from a page on another domain would cause an error in Safari 4. Also,  
// IE6/7 Iframe is now inserted after the body (this actually works),  
// which prevents the page from scrolling when the event is first bound.  
// Event can also now be bound before DOM ready, but it won't be usable  
// before then in IE6/7.  
// 1.1 - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug  
// where browser version is incorrectly reported as 8.0, despite  
// inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.  
// 1.0 - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special  
// window.onhashchange functionality into a separate plugin for users  
// who want just the basic event & back button support, without all the  
// extra awesomeness that BBQ provides. This plugin will be included as  
// part of jQuery BBQ, but also be available separately.  
 
(function($,window,undefined){  
'$:nomunge'; // Used by YUI compressor.  
 
// Reused string.  
var str_hashchange = 'hashchange',  
 
// Method / object references.  
doc = document,  
fake_onhashchange,  
special = $.event.special,  
 
// Does the browser support window.onhashchange? Note that IE8 running in  
// IE7 compatibility mode reports true for 'onhashchange' in window, even  
// though the event isn't supported, so also test document.documentMode.  
doc_mode = doc.documentMode,  
supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );  
 
// Get location.hash (or what you'd expect location.hash to be) sans any  
// leading #. Thanks for making this necessary, Firefox!  
function get_fragment( url ) {  
url = url || location.href;  
return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );  
};  
 
// Method: jQuery.fn.hashchange  
//  
// Bind a handler to the window.onhashchange event or trigger all bound  
// window.onhashchange event handlers. This behavior is consistent with  
// jQuery's built-in event handlers.  
//  
// Usage:  
//  
// > jQuery(window).hashchange( [ handler ] );  
//  
// Arguments:  
//  
// handler - (Function) Optional handler to be bound to the hashchange  
// event. This is a "shortcut" for the more verbose form:  
// jQuery(window).bind( 'hashchange', handler ). If handler is omitted,  
// all bound window.onhashchange event handlers will be triggered. This  
// is a shortcut for the more verbose  
// jQuery(window).trigger( 'hashchange' ). These forms are described in  
// the <hashchange event> section.  
//  
// Returns:  
//  
// (jQuery) The initial jQuery collection of elements.  
 
// Allow the "shortcut" format $(elem).hashchange( fn ) for binding and  
// $(elem).hashchange() for triggering, like jQuery does for built-in events.  
$.fn[ str_hashchange ] = function( fn ) {  
return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );  
};  
 
// Property: jQuery.fn.hashchange.delay  
//  
// The numeric interval (in milliseconds) at which the <hashchange event>  
// polling loop executes. Defaults to 50.  
 
// Property: jQuery.fn.hashchange.domain  
//  
// If you're setting document.domain in your JavaScript, and you want hash  
// history to work in IE6/7, not only must this property be set, but you must  
// also set document.domain BEFORE jQuery is loaded into the page. This  
// property is only applicable if you are supporting IE6/7 (or IE8 operating  
// in "IE7 compatibility" mode).  
//  
// In addition, the <jQuery.fn.hashchange.src> property must be set to the  
// path of the included "document-domain.html" file, which can be renamed or  
// modified if necessary (note that the document.domain specified must be the  
// same in both your main JavaScript as well as in this file).  
//  
// Usage:  
//  
// jQuery.fn.hashchange.domain = document.domain;  
 
// Property: jQuery.fn.hashchange.src  
//  
// If, for some reason, you need to specify an Iframe src file (for example,  
// when setting document.domain as in <jQuery.fn.hashchange.domain>), you can  
// do so using this property. Note that when using this property, history  
// won't be recorded in IE6/7 until the Iframe src file loads. This property  
// is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7  
// compatibility" mode).  
//  
// Usage:  
//  
// jQuery.fn.hashchange.src = 'path/to/file.html';  
 
$.fn[ str_hashchange ].delay = 50;  
/*  
$.fn[ str_hashchange ].domain = null;  
$.fn[ str_hashchange ].src = null;  
*/  
 
// Event: hashchange event  
//  
// Fired when location.hash changes. In browsers that support it, the native  
// HTML5 window.onhashchange event is used, otherwise a polling loop is  
// initialized, running every <jQuery.fn.hashchange.delay> milliseconds to  
// see if the hash has changed. In IE6/7 (and IE8 operating in "IE7  
// compatibility" mode), a hidden Iframe is created to allow the back button  
// and hash-based history to work.  
//  
// Usage as described in <jQuery.fn.hashchange>:  
//  
// > // Bind an event handler.  
// > jQuery(window).hashchange( function(e) {  
// > var hash = location.hash;  
// > ...  
// > });  
// >  
// > // Manually trigger the event handler.  
// > jQuery(window).hashchange();  
//  
// A more verbose usage that allows for event namespacing:  
//  
// > // Bind an event handler.  
// > jQuery(window).bind( 'hashchange', function(e) {  
// > var hash = location.hash;  
// > ...  
// > });  
// >  
// > // Manually trigger the event handler.  
// > jQuery(window).trigger( 'hashchange' );  
//  
// Additional Notes:  
//  
// * The polling loop and Iframe are not created until at least one handler  
// is actually bound to the 'hashchange' event.  
// * If you need the bound handler(s) to execute immediately, in cases where  
// a location.hash exists on page load, via bookmark or page refresh for  
// example, use jQuery(window).hashchange() or the more verbose  
// jQuery(window).trigger( 'hashchange' ).  
// * The event can be bound before DOM ready, but since it won't be usable  
// before then in IE6/7 (due to the necessary Iframe), recommended usage is  
// to bind it inside a DOM ready handler.  
 
// Override existing $.event.special.hashchange methods (allowing this plugin  
// to be defined after jQuery BBQ in BBQ's source code).  
special[ str_hashchange ] = $.extend( special[ str_hashchange ], {  
 
// Called only when the first 'hashchange' event is bound to window.  
setup: function() {  
// If window.onhashchange is supported natively, there's nothing to do..  
if ( supports_onhashchange ) { return false; }  
 
// Otherwise, we need to create our own. And we don't want to call this  
// until the user binds to the event, just in case they never do, since it  
// will create a polling loop and possibly even a hidden Iframe.  
$( fake_onhashchange.start );  
},  
 
// Called only when the last 'hashchange' event is unbound from window.  
teardown: function() {  
// If window.onhashchange is supported natively, there's nothing to do..  
if ( supports_onhashchange ) { return false; }  
 
// Otherwise, we need to stop ours (if possible).  
$( fake_onhashchange.stop );  
}  
 
});  
 
// fake_onhashchange does all the work of triggering the window.onhashchange  
// event for browsers that don't natively support it, including creating a  
// polling loop to watch for hash changes and in IE 6/7 creating a hidden  
// Iframe to enable back and forward.  
fake_onhashchange = (function(){  
var self = {},  
timeout_id,  
 
// Remember the initial hash so it doesn't get triggered immediately.  
last_hash = get_fragment(),  
 
fn_retval = function(val){ return val; },  
history_set = fn_retval,  
history_get = fn_retval;  
 
// Start the polling loop.  
self.start = function() {  
timeout_id || poll();  
};  
 
// Stop the polling loop.  
self.stop = function() {  
timeout_id && clearTimeout( timeout_id );  
timeout_id = undefined;  
};  
 
// This polling loop checks every $.fn.hashchange.delay milliseconds to see  
// if location.hash has changed, and triggers the 'hashchange' event on  
// window when necessary.  
function poll() {  
var hash = get_fragment(),  
history_hash = history_get( last_hash );  
 
if ( hash !== last_hash ) {  
history_set( last_hash = hash, history_hash );  
 
$(window).trigger( str_hashchange );  
 
} else if ( history_hash !== last_hash ) {  
location.href = location.href.replace( /#.*/, '' ) + history_hash;  
}  
 
timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );  
};  
 
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv  
// vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv  
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv  
$.browser.msie && !supports_onhashchange && (function(){  
// Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8  
// when running in "IE7 compatibility" mode.  
 
var iframe,  
iframe_src;  
 
// When the event is bound and polling starts in IE 6/7, create a hidden  
// Iframe for history handling.  
self.start = function(){  
if ( !iframe ) {  
iframe_src = $.fn[ str_hashchange ].src;  
iframe_src = iframe_src && iframe_src + get_fragment();  
 
// Create hidden Iframe. Attempt to make Iframe as hidden as possible  
// by using techniques from http://www.paciellogroup.com/blog/?p=604.  
iframe = $('<iframe tabindex="-1" title="empty"/>').hide()  
 
// When Iframe has completely loaded, initialize the history and  
// start polling.  
.one( 'load', function(){  
iframe_src || history_set( get_fragment() );  
poll();  
})  
 
// Load Iframe src if specified, otherwise nothing.  
.attr( 'src', iframe_src || 'javascript:0' )  
 
// Append Iframe after the end of the body to prevent unnecessary  
// initial page scrolling (yes, this works).  
.insertAfter( 'body' )[0].contentWindow;  
 
// Whenever `document.title` changes, update the Iframe's title to  
// prettify the back/next history menu entries. Since IE sometimes  
// errors with "Unspecified error" the very first time this is set  
// (yes, very useful) wrap this with a try/catch block.  
doc.onpropertychange = function(){  
try {  
if ( event.propertyName === 'title' ) {  
iframe.document.title = doc.title;  
}  
} catch(e) {}  
};  
 
}  
};  
 
// Override the "stop" method since an IE6/7 Iframe was created. Even  
// if there are no longer any bound event handlers, the polling loop  
// is still necessary for back/next to work at all!  
self.stop = fn_retval;  
 
// Get history by looking at the hidden Iframe's location.hash.  
history_get = function() {  
return get_fragment( iframe.location.href );  
};  
 
// Set a new history item by opening and then closing the Iframe  
// document, *then* setting its location.hash. If document.domain has  
// been set, update that as well.  
history_set = function( hash, history_hash ) {  
var iframe_doc = iframe.document,  
domain = $.fn[ str_hashchange ].domain;  
 
if ( hash !== history_hash ) {  
// Update Iframe with any initial `document.title` that might be set.  
iframe_doc.title = doc.title;  
 
// Opening the Iframe's document after it has been closed is what  
// actually adds a history entry.  
iframe_doc.open();  
 
// Set document.domain for the Iframe document as well, if necessary.  
domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );  
 
iframe_doc.close();  
 
// Update the Iframe's hash, for great justice.  
iframe.location.hash = hash;  
}  
};  
 
})();  
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
// ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^  
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
 
return self;  
})();  
 
})(jQuery,this);  
 
 
/*!  
* jQuery Mobile v@VERSION  
* http://jquerymobile.com/  
*  
* Copyright 2010, jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
 
(function( $, window, undefined ) {  
 
//jQuery.mobile configurable options  
$.extend( $.mobile, {  
 
//define the url parameter used for referencing widget-generated sub-pages.  
//Translates to to example.html&ui-page=subpageIdentifier  
//hash segment before &ui-page= is used to make Ajax request  
subPageUrlKey: 'ui-page',  
 
//anchor links with a data-rel, or pages with a data-role, that match these selectors will be untrackable in history  
//(no change in URL, not bookmarkable)  
nonHistorySelectors: 'dialog',  
 
//class assigned to page currently in view, and during transitions  
activePageClass: 'ui-page-active',  
 
//class used for "active" button state, from CSS framework  
activeBtnClass: 'ui-btn-active',  
 
//automatically handle link clicks through Ajax, when possible  
ajaxLinksEnabled: true,  
 
//automatically handle form submissions through Ajax, when possible  
ajaxFormsEnabled: true,  
 
//set default transition - 'none' for no transitions  
defaultTransition: 'slide',  
 
//show loading message during Ajax requests  
//if false, message will not appear, but loading classes will still be toggled on html el  
loadingMessage: "loading",  
 
//configure meta viewport tag's content attr:  
metaViewportContent: "width=device-width, minimum-scale=1, maximum-scale=1",  
 
//support conditions that must be met in order to proceed  
gradeA: function(){  
return $.support.mediaquery;  
}  
});  
 
 
//trigger mobileinit event - useful hook for configuring $.mobile settings before they're used  
$( window.document ).trigger('mobileinit');  
 
 
//support conditions  
//if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,  
//otherwise, proceed with the enhancements  
if ( !$.mobile.gradeA() ) {  
return;  
}  
 
 
//define vars for interal use  
var $window = $(window),  
$html = $('html'),  
$head = $('head'),  
 
//loading div which appears during Ajax requests  
//will not appear if $.mobile.loadingMessage is false  
$loader = $.mobile.loadingMessage ?  
$('<div class="ui-loader ui-body-a ui-corner-all">'+  
'<span class="ui-icon ui-icon-loading spin"></span>'+  
'<h1>'+ $.mobile.loadingMessage +'</h1>'+  
'</div>')  
: undefined;  
 
 
//add mobile, initial load "rendering" classes to docEl  
$html.addClass('ui-mobile ui-mobile-rendering');  
 
 
//define & prepend meta viewport tag, if content is defined  
$.mobile.metaViewportContent ? $("<meta>", { name: "viewport", content: $.mobile.metaViewportContent}).prependTo( $head ) : undefined;  
 
 
//expose some core utilities  
$.extend($.mobile, {  
 
// turn on/off page loading message.  
pageLoading: function ( done ) {  
if ( done ) {  
$html.removeClass( "ui-loading" );  
} else {  
if( $.mobile.loadingMessage ){  
$loader.appendTo($.mobile.pageContainer).css({top: $(window).scrollTop() + 75});  
}  
$html.addClass( "ui-loading" );  
}  
},  
 
//scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value  
silentScroll: function( ypos ) {  
// prevent scrollstart and scrollstop events  
$.event.special.scrollstart.enabled = false;  
setTimeout(function() {  
window.scrollTo( 0, ypos || 0 );  
},20);  
setTimeout(function() {  
$.event.special.scrollstart.enabled = true;  
}, 150 );  
}  
});  
 
 
//dom-ready inits  
$(function(){  
 
//find present pages  
var $pages = $("[data-role='page']");  
 
//set up active page  
$.mobile.startPage = $.mobile.activePage = $pages.first();  
 
//set page container  
$.mobile.pageContainer = $.mobile.startPage.parent().addClass('ui-mobile-viewport');  
 
//cue page loading message  
$.mobile.pageLoading();  
 
//initialize all pages present  
$pages.page();  
 
//trigger a new hashchange, hash or not  
$window.trigger( "hashchange", [ true ] );  
 
//remove rendering class  
$html.removeClass('ui-mobile-rendering');  
});  
 
 
//window load event  
//hide iOS browser chrome on load  
$window.load( $.mobile.silentScroll );  
 
})( jQuery, this );  
 
 
/*  
* jQuery Mobile Framework : core utilities for auto ajax navigation, base tag mgmt,  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
//define vars for interal use  
var $window = $(window),  
$html = $('html'),  
$head = $('head'),  
 
//url path helpers for use in relative url management  
path = {  
 
//get path from current hash, or from a file path  
get: function( newPath ){  
if( newPath == undefined ){  
newPath = location.hash;  
}  
newPath = newPath.replace(/#/,'').split('/');  
newPath.pop();  
return newPath.join('/') + (newPath.length ? '/' : '');  
},  
 
//return the substring of a filepath before the sub-page key, for making a server request  
getFilePath: function( path ){  
var splitkey = '&' + $.mobile.subPageUrlKey;  
return path.indexOf( splitkey ) > -1 ? path.split( splitkey )[0] : path;  
},  
 
set: function( path, disableListening){  
if(disableListening) { hashListener = false; }  
location.hash = path;  
},  
 
//location pathname from intial directory request  
origin: null,  
 
setOrigin: function(){  
path.origin = path.get( location.protocol + '//' + location.host + location.pathname );  
}  
},  
 
//base element management, defined depending on dynamic base tag support  
base = $.support.dynamicBaseTag ? {  
 
//define base element, for use in routing asset urls that are referenced in Ajax-requested markup  
element: $("<base>", { href: path.origin }).prependTo( $head ),  
 
//set the generated BASE element's href attribute to a new page's base path  
set: function( href ){  
base.element.attr('href', path.origin + path.get( href ));  
},  
 
//set the generated BASE element's href attribute to a new page's base path  
reset: function(){  
base.element.attr('href', path.origin );  
}  
 
} : undefined,  
 
 
//will be defined when a link is clicked and given an active class  
$activeClickedLink = null,  
 
//array of pages that are visited during a single page load  
//length will grow as pages are visited, and shrink as "back" link/button is clicked  
//each item has a url (string matches ID), and transition (saved for reuse when "back" link/button is clicked)  
urlStack = [ {  
url: location.hash.replace( /^#/, "" ),  
transition: undefined  
} ],  
 
//define first selector to receive focus when a page is shown  
focusable = "[tabindex],a,button:visible,select:visible,input",  
 
//contains role for next page, if defined on clicked link via data-rel  
nextPageRole = null,  
 
//enable/disable hashchange event listener  
//toggled internally when location.hash is updated to match the url of a successful page load  
hashListener = true;  
 
//set location pathname from intial directory request  
path.setOrigin();  
 
 
/*  
internal utility functions  
--------------------------------------*/  
 
 
//direct focus to the page title, or otherwise first focusable element  
function reFocus( page ){  
var pageTitle = page.find( ".ui-title:eq(0)" );  
if( pageTitle.length ){  
pageTitle.focus();  
}  
else{  
page.find( focusable ).eq(0).focus();  
}  
};  
 
//remove active classes after page transition or error  
function removeActiveLinkClass( forceRemoval ){  
if( !!$activeClickedLink && (!$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval )){  
$activeClickedLink.removeClass( $.mobile.activeBtnClass );  
}  
$activeClickedLink = null;  
};  
 
 
//animation complete callback  
$.fn.animationComplete = function( callback ){  
if($.support.cssTransitions){  
return $(this).one('webkitAnimationEnd', callback);  
}  
else{  
callback();  
}  
};  
 
 
 
/* exposed $.mobile methods */  
 
//update location.hash, with or without triggering hashchange event  
$.mobile.updateHash = path.set;  
 
//url stack, useful when plugins need to be aware of previous pages viewed  
$.mobile.urlStack = urlStack;  
 
// changepage function  
$.mobile.changePage = function( to, transition, back, changeHash){  
 
//from is always the currently viewed page  
var toIsArray = $.type(to) === "array",  
from = toIsArray ? to[0] : $.mobile.activePage,  
to = toIsArray ? to[1] : to,  
url = fileUrl = $.type(to) === "string" ? to.replace( /^#/, "" ) : null,  
data = undefined,  
type = 'get',  
isFormRequest = false,  
duplicateCachedPage = null,  
back = (back !== undefined) ? back : ( urlStack.length > 1 && urlStack[ urlStack.length - 2 ].url === url ),  
transition = (transition !== undefined) ? transition : $.mobile.defaultTransition;  
 
if( $.type(to) === "object" && to.url ){  
url = to.url,  
data = to.data,  
type = to.type,  
isFormRequest = true;  
//make get requests bookmarkable  
if( data && type == 'get' ){  
url += "?" + data;  
data = undefined;  
}  
}  
 
//reset base to pathname for new request  
if(base){ base.reset(); }  
 
// if the new href is the same as the previous one  
if ( back ) {  
var pop = urlStack.pop();  
if( pop ){  
transition = pop.transition;  
}  
} else {  
urlStack.push({ url: url, transition: transition });  
}  
 
//function for transitioning between two existing pages  
function transitionPages() {  
 
//kill the keyboard  
$( window.document.activeElement ).blur();  
 
//get current scroll distance  
var currScroll = $window.scrollTop();  
 
//set as data for returning to that spot  
from.data('lastScroll', currScroll);  
 
//trigger before show/hide events  
from.data("page")._trigger("beforehide", {nextPage: to});  
to.data("page")._trigger("beforeshow", {prevPage: from});  
 
function loadComplete(){  
$.mobile.pageLoading( true );  
//trigger show/hide events, allow preventing focus change through return false  
if( from.data("page")._trigger("hide", null, {nextPage: to}) !== false && to.data("page")._trigger("show", null, {prevPage: from}) !== false ){  
$.mobile.activePage = to;  
}  
reFocus( to );  
if( changeHash !== false && url ){  
path.set(url, true);  
}  
removeActiveLinkClass();  
 
//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden  
if( duplicateCachedPage != null ){  
duplicateCachedPage.remove();  
}  
 
//jump to top or prev scroll, if set  
$.mobile.silentScroll( to.data( 'lastScroll' ) );  
};  
 
if(transition && (transition !== 'none')){  
$.mobile.pageContainer.addClass('ui-mobile-viewport-transitioning');  
// animate in / out  
from.addClass( transition + " out " + ( back ? "reverse" : "" ) );  
to.addClass( $.mobile.activePageClass + " " + transition +  
" in " + ( back ? "reverse" : "" ) );  
 
// callback - remove classes, etc  
to.animationComplete(function() {  
from.add( to ).removeClass("out in reverse " + transition );  
from.removeClass( $.mobile.activePageClass );  
loadComplete();  
$.mobile.pageContainer.removeClass('ui-mobile-viewport-transitioning');  
});  
}  
else{  
from.removeClass( $.mobile.activePageClass );  
to.addClass( $.mobile.activePageClass );  
loadComplete();  
}  
};  
 
//shared page enhancements  
function enhancePage(){  
 
//set next page role, if defined  
if ( nextPageRole ) {  
to.attr( "data-role", nextPageRole );  
nextPageRole = undefined;  
}  
 
//run page plugin  
to.page();  
};  
 
//if url is a string  
if( url ){  
to = $( "[id='" + url + "']" ),  
fileUrl = path.getFilePath(url);  
}  
else{ //find base url of element, if avail  
var toID = to.attr('id'),  
toIDfileurl = path.getFilePath(toID);  
 
if(toID != toIDfileurl){  
fileUrl = toIDfileurl;  
}  
}  
 
// find the "to" page, either locally existing in the dom or by creating it through ajax  
if ( to.length && !isFormRequest ) {  
if( fileUrl && base ){  
base.set( fileUrl );  
}  
enhancePage();  
transitionPages();  
} else {  
 
//if to exists in DOM, save a reference to it in duplicateCachedPage for removal after page change  
if( to.length ){  
duplicateCachedPage = to;  
}  
 
$.mobile.pageLoading();  
 
$.ajax({  
url: fileUrl,  
type: type,  
data: data,  
success: function( html ) {  
 
if(base){ base.set(fileUrl); }  
 
var all = $("<div></div>");  
//workaround to allow scripts to execute when included in page divs  
all.get(0).innerHTML = html;  
to = all.find('[data-role="page"]');  
 
//rewrite src and href attrs to use a base url  
if( !$.support.dynamicBaseTag ){  
var newPath = path.get( fileUrl );  
to.find('[src],link[href]').each(function(){  
var thisAttr = $(this).is('[href]') ? 'href' : 'src',  
thisUrl = $(this).attr(thisAttr);  
 
//if full path exists and is same, chop it - helps IE out  
thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' );  
 
if( !/^(\w+:|#|\/)/.test(thisUrl) ){  
$(this).attr(thisAttr, newPath + thisUrl);  
}  
});  
}  
 
//preserve ID on a retrieved page  
if ( to.attr('id') ) {  
//wrap page and transfer data-attrs if it has an ID  
var copyAttrs = ['data-role', 'data-theme', 'data-fullscreen'], //TODO: more page-level attrs?  
wrapper = to.wrap( "<div>" ).parent();  
 
$.each(copyAttrs,function(i){  
if( to.attr( copyAttrs[ i ] ) ){  
wrapper.attr( copyAttrs[ i ], to.attr( copyAttrs[ i ] ) );  
to.removeAttr( copyAttrs[ i ] );  
}  
});  
to = wrapper;  
}  
 
to  
.attr( "id", fileUrl )  
.appendTo( $.mobile.pageContainer );  
 
enhancePage();  
transitionPages();  
},  
error: function() {  
$.mobile.pageLoading( true );  
removeActiveLinkClass(true);  
$("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>Error Loading Page</h1></div>")  
.css({ "display": "block", "opacity": 0.96, "top": $(window).scrollTop() + 100 })  
.appendTo( $.mobile.pageContainer )  
.delay( 800 )  
.fadeOut( 400, function(){  
$(this).remove();  
});  
}  
});  
}  
 
};  
 
 
 
 
/* Event Bindings - hashchange, submit, and click */  
 
//bind to form submit events, handle with Ajax  
$('form').live('submit', function(event){  
if( !$.mobile.ajaxFormsEnabled ){ return; }  
 
var type = $(this).attr("method"),  
url = $(this).attr( "action" ).replace( location.protocol + "//" + location.host, "");  
 
//external submits use regular HTTP  
if( /^(:?\w+:)/.test( url ) ){  
return;  
}  
 
//if it's a relative href, prefix href with base url  
if( url.indexOf('/') && url.indexOf('#') !== 0 ){  
url = path.get() + url;  
}  
 
$.mobile.changePage({  
url: url,  
type: type,  
data: $(this).serialize()  
},  
undefined,  
undefined,  
true  
);  
event.preventDefault();  
});  
 
 
//click routing - direct to HTTP or Ajax, accordingly  
$( "a" ).live( "click", function(event) {  
if( !$.mobile.ajaxLinksEnabled ){ return; }  
var $this = $(this),  
//get href, remove same-domain protocol and host  
href = $this.attr( "href" ).replace( location.protocol + "//" + location.host, ""),  
//if target attr is specified, it's external, and we mimic _blank... for now  
target = $this.is( "[target]" ),  
//if it still starts with a protocol, it's external, or could be :mailto, etc  
external = target || /^(:?\w+:)/.test( href ) || $this.is( "[rel=external]" ),  
target = $this.is( "[target]" );  
 
if( href === '#' ){  
//for links created purely for interaction - ignore  
return false;  
}  
 
$activeClickedLink = $this.closest( ".ui-btn" ).addClass( $.mobile.activeBtnClass );  
 
if( external || !$.mobile.ajaxLinksEnabled ){  
//remove active link class if external  
removeActiveLinkClass(true);  
 
//deliberately redirect, in case click was triggered  
if( target ){  
window.open(href);  
}  
else{  
location.href = href;  
}  
}  
else {  
//use ajax  
var transition = $this.data( "transition" ),  
back = $this.data( "back" ),  
changeHashOnSuccess = !$this.is( "[data-rel="+ $.mobile.nonHistorySelectors +"]" );  
 
nextPageRole = $this.attr( "data-rel" );  
 
//if it's a relative href, prefix href with base url  
if( href.indexOf('/') && href.indexOf('#') !== 0 ){  
href = path.get() + href;  
}  
 
href.replace(/^#/,'');  
 
$.mobile.changePage(href, transition, back, changeHashOnSuccess);  
}  
event.preventDefault();  
});  
 
 
 
//hashchange event handler  
$window.bind( "hashchange", function(e, triggered) {  
if( !hashListener ){  
hashListener = true;  
return;  
}  
 
if( $(".ui-page-active").is("[data-role=" + $.mobile.nonHistorySelectors + "]") ){  
return;  
}  
 
var to = location.hash,  
transition = triggered ? false : undefined;  
 
//if to is defined, use it  
if ( to ){  
$.mobile.changePage( to, transition);  
}  
//there's no hash, the active page is not the start page, and it's not manually triggered hashchange  
//we probably backed out to the first page visited  
else if( $.mobile.activePage.length && $.mobile.startPage[0] !== $.mobile.activePage[0] && !triggered ) {  
$.mobile.changePage( $.mobile.startPage, transition, true );  
}  
//probably the first page - show it  
else{  
$.mobile.startPage.trigger("pagebeforeshow", {prevPage: $('')});  
$.mobile.startPage.addClass( $.mobile.activePageClass );  
$.mobile.pageLoading( true );  
 
if( $.mobile.startPage.trigger("pageshow", {prevPage: $('')}) !== false ){  
reFocus($.mobile.startPage);  
}  
}  
});  
})( jQuery );  
 
/*  
* jQuery Mobile Framework : "page" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
$.widget( "mobile.page", $.mobile.widget, {  
options: {  
backBtnText: "Back",  
addBackBtn: true,  
degradeInputs: {  
color: false,  
date: false,  
datetime: false,  
"datetime-local": false,  
email: false,  
month: false,  
number: false,  
range: "number",  
search: true,  
tel: false,  
time: false,  
url: false,  
week: false  
}  
},  
 
_create: function() {  
var $elem = this.element,  
o = this.options;  
 
if ( this._trigger( "beforeCreate" ) === false ) {  
return;  
}  
 
//some of the form elements currently rely on the presence of ui-page and ui-content  
// classes so we'll handle page and content roles outside of the main role processing  
// loop below.  
$elem.find( "[data-role='page'], [data-role='content']" ).andSelf().each(function() {  
$(this).addClass( "ui-" + $(this).data( "role" ) );  
});  
 
$elem.find( "[data-role='nojs']" ).addClass( "ui-nojs" );  
 
this._enchanceControls();  
 
// pre-find data els  
var $dataEls = $elem.find( "[data-role]" ).andSelf().each(function() {  
var $this = $( this ),  
role = $this.data( "role" ),  
theme = $this.data( "theme" );  
 
//apply theming and markup modifications to page,header,content,footer  
if ( role === "header" || role === "footer" ) {  
$this.addClass( "ui-bar-" + (theme || $this.parent('[data-role=page]').data( "theme" ) || "a") );  
 
// add ARIA role  
$this.attr( "role", role === "header" ? "banner" : "contentinfo" );  
 
//right,left buttons  
var $headeranchors = $this.children( "a" ),  
leftbtn = $headeranchors.hasClass( "ui-btn-left" ),  
rightbtn = $headeranchors.hasClass( "ui-btn-right" );  
 
if ( !leftbtn ) {  
leftbtn = $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length;  
}  
 
if ( !rightbtn ) {  
rightbtn = $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length;  
}  
 
// auto-add back btn on pages beyond first view  
if ( o.addBackBtn && role === "header" &&  
($.mobile.urlStack.length > 1 || $(".ui-page").length > 1) &&  
!leftbtn && !$this.data( "noBackBtn" ) ) {  
 
$( "<a href='#' class='ui-btn-left' data-icon='arrow-l'>"+ o.backBtnText +"</a>" )  
.click(function() {  
history.back();  
return false;  
})  
.prependTo( $this );  
}  
 
//page title  
$this.children( "h1, h2, h3, h4, h5, h6" )  
.addClass( "ui-title" )  
//regardless of h element number in src, it becomes h1 for the enhanced page  
.attr({ "tabindex": "0", "role": "heading", "aria-level": "1" });  
 
} else if ( role === "content" ) {  
if ( theme ) {  
$this.addClass( "ui-body-" + theme );  
}  
 
// add ARIA role  
$this.attr( "role", "main" );  
 
} else if ( role === "page" ) {  
$this.addClass( "ui-body-" + (theme || "c") );  
}  
 
switch(role) {  
case "header":  
case "footer":  
case "page":  
case "content":  
$this.addClass( "ui-" + role );  
break;  
case "collapsible":  
case "fieldcontain":  
case "navbar":  
case "listview":  
case "dialog":  
$this[ role ]();  
break;  
}  
});  
 
//links in bars, or those with data-role become buttons  
$elem.find( "[data-role='button'], .ui-bar a, .ui-header a, .ui-footer a" )  
.not( ".ui-btn" )  
.buttonMarkup();  
 
$elem  
.find("[data-role='controlgroup']")  
.controlgroup();  
 
//links within content areas  
$elem.find( "a:not(.ui-btn):not(.ui-link-inherit)" )  
.addClass( "ui-link" );  
 
//fix toolbars  
$elem.fixHeaderFooter();  
},  
 
_enchanceControls: function() {  
var o = this.options;  
// degrade inputs to avoid poorly implemented native functionality  
this.element.find( "input" ).each(function() {  
var type = this.getAttribute( "type" ),  
optType = o.degradeInputs[ type ] || "text";  
 
if ( o.degradeInputs[ type ] ) {  
$( this ).replaceWith(  
$( "<div>" ).html( $(this).clone() ).html()  
.replace( /type="([a-zA-Z]+)"/, "type="+ optType +" data-type='$1'" ) );  
}  
});  
 
// enchance form controls  
this.element  
.find( "[type='radio'], [type='checkbox']" )  
.checkboxradio();  
 
this.element  
.find( "button, [type='button'], [type='submit'], [type='reset'], [type='image']" )  
.not( ".ui-nojs" )  
.button();  
 
this.element  
.find( "input, textarea" )  
.not( "[type='radio'], [type='checkbox'], button, [type='button'], [type='submit'], [type='reset'], [type='image']" )  
.textinput();  
 
this.element  
.find( "input, select" )  
.filter( "[data-role='slider'], [data-type='range']" )  
.slider();  
 
this.element  
.find( "select:not([data-role='slider'])" )  
.selectmenu();  
}  
});  
 
})( jQuery );  
 
 
/*  
* jQuery UI Position @VERSION  
*  
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*  
* http://docs.jquery.com/UI/Position  
*/  
(function( $, undefined ) {  
 
$.ui = $.ui || {};  
 
var horizontalPositions = /left|center|right/,  
verticalPositions = /top|center|bottom/,  
center = "center",  
_position = $.fn.position,  
_offset = $.fn.offset;  
 
$.fn.position = function( options ) {  
if ( !options || !options.of ) {  
return _position.apply( this, arguments );  
}  
 
// make a copy, we don't want to modify arguments  
options = $.extend( {}, options );  
 
var target = $( options.of ),  
targetElem = target[0],  
collision = ( options.collision || "flip" ).split( " " ),  
offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],  
targetWidth,  
targetHeight,  
basePosition;  
 
if ( targetElem.nodeType === 9 ) {  
targetWidth = target.width();  
targetHeight = target.height();  
basePosition = { top: 0, left: 0 };  
// TODO: use $.isWindow() in 1.9  
} else if ( targetElem.setTimeout ) {  
targetWidth = target.width();  
targetHeight = target.height();  
basePosition = { top: target.scrollTop(), left: target.scrollLeft() };  
} else if ( targetElem.preventDefault ) {  
// force left top to allow flipping  
options.at = "left top";  
targetWidth = targetHeight = 0;  
basePosition = { top: options.of.pageY, left: options.of.pageX };  
} else {  
targetWidth = target.outerWidth();  
targetHeight = target.outerHeight();  
basePosition = target.offset();  
}  
 
// force my and at to have valid horizontal and veritcal positions  
// if a value is missing or invalid, it will be converted to center  
$.each( [ "my", "at" ], function() {  
var pos = ( options[this] || "" ).split( " " );  
if ( pos.length === 1) {  
pos = horizontalPositions.test( pos[0] ) ?  
pos.concat( [center] ) :  
verticalPositions.test( pos[0] ) ?  
[ center ].concat( pos ) :  
[ center, center ];  
}  
pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;  
pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;  
options[ this ] = pos;  
});  
 
// normalize collision option  
if ( collision.length === 1 ) {  
collision[ 1 ] = collision[ 0 ];  
}  
 
// normalize offset option  
offset[ 0 ] = parseInt( offset[0], 10 ) || 0;  
if ( offset.length === 1 ) {  
offset[ 1 ] = offset[ 0 ];  
}  
offset[ 1 ] = parseInt( offset[1], 10 ) || 0;  
 
if ( options.at[0] === "right" ) {  
basePosition.left += targetWidth;  
} else if (options.at[0] === center ) {  
basePosition.left += targetWidth / 2;  
}  
 
if ( options.at[1] === "bottom" ) {  
basePosition.top += targetHeight;  
} else if ( options.at[1] === center ) {  
basePosition.top += targetHeight / 2;  
}  
 
basePosition.left += offset[ 0 ];  
basePosition.top += offset[ 1 ];  
 
return this.each(function() {  
var elem = $( this ),  
elemWidth = elem.outerWidth(),  
elemHeight = elem.outerHeight(),  
marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,  
marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,  
collisionWidth = elemWidth + marginLeft +  
parseInt( $.curCSS( this, "marginRight", true ) ) || 0,  
collisionHeight = elemHeight + marginTop +  
parseInt( $.curCSS( this, "marginBottom", true ) ) || 0,  
position = $.extend( {}, basePosition ),  
collisionPosition;  
 
if ( options.my[0] === "right" ) {  
position.left -= elemWidth;  
} else if ( options.my[0] === center ) {  
position.left -= elemWidth / 2;  
}  
 
if ( options.my[1] === "bottom" ) {  
position.top -= elemHeight;  
} else if ( options.my[1] === center ) {  
position.top -= elemHeight / 2;  
}  
 
// prevent fractions (see #5280)  
position.left = parseInt( position.left );  
position.top = parseInt( position.top );  
 
collisionPosition = {  
left: position.left - marginLeft,  
top: position.top - marginTop  
};  
 
$.each( [ "left", "top" ], function( i, dir ) {  
if ( $.ui.position[ collision[i] ] ) {  
$.ui.position[ collision[i] ][ dir ]( position, {  
targetWidth: targetWidth,  
targetHeight: targetHeight,  
elemWidth: elemWidth,  
elemHeight: elemHeight,  
collisionPosition: collisionPosition,  
collisionWidth: collisionWidth,  
collisionHeight: collisionHeight,  
offset: offset,  
my: options.my,  
at: options.at  
});  
}  
});  
 
if ( $.fn.bgiframe ) {  
elem.bgiframe();  
}  
elem.offset( $.extend( position, { using: options.using } ) );  
});  
};  
 
$.ui.position = {  
fit: {  
left: function( position, data ) {  
var win = $( window ),  
over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();  
position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );  
},  
top: function( position, data ) {  
var win = $( window ),  
over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();  
position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );  
}  
},  
 
flip: {  
left: function( position, data ) {  
if ( data.at[0] === center ) {  
return;  
}  
var win = $( window ),  
over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),  
myOffset = data.my[ 0 ] === "left" ?  
-data.elemWidth :  
data.my[ 0 ] === "right" ?  
data.elemWidth :  
0,  
atOffset = data.at[ 0 ] === "left" ?  
data.targetWidth :  
-data.targetWidth,  
offset = -2 * data.offset[ 0 ];  
position.left += data.collisionPosition.left < 0 ?  
myOffset + atOffset + offset :  
over > 0 ?  
myOffset + atOffset + offset :  
0;  
},  
top: function( position, data ) {  
if ( data.at[1] === center ) {  
return;  
}  
var win = $( window ),  
over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),  
myOffset = data.my[ 1 ] === "top" ?  
-data.elemHeight :  
data.my[ 1 ] === "bottom" ?  
data.elemHeight :  
0,  
atOffset = data.at[ 1 ] === "top" ?  
data.targetHeight :  
-data.targetHeight,  
offset = -2 * data.offset[ 1 ];  
position.top += data.collisionPosition.top < 0 ?  
myOffset + atOffset + offset :  
over > 0 ?  
myOffset + atOffset + offset :  
0;  
}  
}  
};  
 
// offset setter from jQuery 1.4  
if ( !$.offset.setOffset ) {  
$.offset.setOffset = function( elem, options ) {  
// set position first, in-case top/left are set even on static elem  
if ( /static/.test( $.curCSS( elem, "position" ) ) ) {  
elem.style.position = "relative";  
}  
var curElem = $( elem ),  
curOffset = curElem.offset(),  
curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,  
curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,  
props = {  
top: (options.top - curOffset.top) + curTop,  
left: (options.left - curOffset.left) + curLeft  
};  
 
if ( 'using' in options ) {  
options.using.call( elem, props );  
} else {  
curElem.css( props );  
}  
};  
 
$.fn.offset = function( options ) {  
var elem = this[ 0 ];  
if ( !elem || !elem.ownerDocument ) { return null; }  
if ( options ) {  
return this.each(function() {  
$.offset.setOffset( this, options );  
});  
}  
return _offset.call( this );  
};  
}  
 
}( jQuery ));  
 
/*  
* jQuery Mobile Framework : "fixHeaderFooter" plugin - on-demand positioning for headers,footers  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.fn.fixHeaderFooter = function(options){  
if( !$.support.scrollTop ){ return $(this); }  
return $(this).each(function(){  
if( $(this).data('fullscreen') ){ $(this).addClass('ui-page-fullscreen'); }  
$(this).find('.ui-header[data-position="fixed"]').addClass('ui-header-fixed ui-fixed-inline fade'); //should be slidedown  
$(this).find('.ui-footer[data-position="fixed"]').addClass('ui-footer-fixed ui-fixed-inline fade'); //should be slideup  
});  
};  
 
//single controller for all showing,hiding,toggling  
$.fixedToolbars = (function(){  
if( !$.support.scrollTop ){ return; }  
var currentstate = 'inline',  
delayTimer,  
ignoreTargets = 'a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed',  
toolbarSelector = '.ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last',  
stickyFooter, //for storing quick references to duplicate footers  
supportTouch = $.support.touch,  
touchStartEvent = supportTouch ? "touchstart" : "mousedown",  
touchStopEvent = supportTouch ? "touchend" : "mouseup",  
stateBefore = null,  
scrollTriggered = false;  
 
$(function() {  
$(document)  
.bind(touchStartEvent,function(event){  
if( $(event.target).closest(ignoreTargets).length ){ return; }  
stateBefore = currentstate;  
$.fixedToolbars.hide(true);  
})  
.bind('scrollstart',function(event){  
if( $(event.target).closest(ignoreTargets).length ){ return; } //because it could be a touchmove...  
scrollTriggered = true;  
if(stateBefore == null){ stateBefore = currentstate; }  
$.fixedToolbars.hide(true);  
})  
.bind(touchStopEvent,function(event){  
if( $(event.target).closest(ignoreTargets).length ){ return; }  
if( !scrollTriggered ){  
$.fixedToolbars.toggle(stateBefore);  
stateBefore = null;  
}  
})  
.bind('scrollstop',function(event){  
if( $(event.target).closest(ignoreTargets).length ){ return; }  
scrollTriggered = false;  
$.fixedToolbars.toggle( stateBefore == 'overlay' ? 'inline' : 'overlay' );  
stateBefore = null;  
});  
 
//function to return another footer already in the dom with the same data-id  
function findStickyFooter(el){  
var thisFooter = el.find('[data-role="footer"]');  
return $( '.ui-footer[data-id="'+ thisFooter.data('id') +'"]:not(.ui-footer-duplicate)' ).not(thisFooter);  
}  
 
//before page is shown, check for duplicate footer  
$('.ui-page').live('pagebeforeshow', function(event, ui){  
stickyFooter = findStickyFooter( $(event.target) );  
if( stickyFooter.length ){  
//if the existing footer is the first of its kind, create a placeholder before stealing it  
if( stickyFooter.parents('.ui-page:eq(0)').find('.ui-footer[data-id="'+ stickyFooter.data('id') +'"]').length == 1 ){  
stickyFooter.before( stickyFooter.clone().addClass('ui-footer-duplicate') );  
}  
$(event.target).find('[data-role="footer"]').addClass('ui-footer-duplicate');  
stickyFooter.appendTo($.pageContainer).css('top',0);  
setTop(stickyFooter);  
}  
});  
 
//after page is shown, append footer to new page  
$('.ui-page').live('pageshow', function(event, ui){  
if( stickyFooter && stickyFooter.length ){  
stickyFooter.appendTo(event.target).css('top',0);  
}  
$.fixedToolbars.show(true, this);  
});  
 
});  
 
// element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The  
// coordinates inside of the rect it returns don't have the page scroll position  
// factored out of it like the other platforms do. To get around this,  
// we'll just calculate the top offset the old fashioned way until core has  
// a chance to figure out how to handle this situation.  
//  
// TODO: We'll need to get rid of getOffsetTop() once a fix gets folded into core.  
 
function getOffsetTop(ele)  
{  
var top = 0;  
if (ele)  
{  
var op = ele.offsetParent, body = document.body;  
top = ele.offsetTop;  
while (ele && ele != body)  
{  
top += ele.scrollTop || 0;  
if (ele == op)  
{  
top += op.offsetTop;  
op = ele.offsetParent;  
}  
ele = ele.parentNode;  
}  
}  
return top;  
}  
 
function setTop(el){  
var fromTop = $(window).scrollTop(),  
thisTop = getOffsetTop(el[0]), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead.  
thisCSStop = el.css('top') == 'auto' ? 0 : parseFloat(el.css('top')),  
screenHeight = window.innerHeight,  
thisHeight = el.outerHeight(),  
useRelative = el.parents('.ui-page:not(.ui-page-fullscreen)').length,  
relval;  
if( el.is('.ui-header-fixed') ){  
relval = fromTop - thisTop + thisCSStop;  
if( relval < thisTop){ relval = 0; }  
return el.css('top', ( useRelative ) ? relval : fromTop);  
}  
else{  
//relval = -1 * (thisTop - (fromTop + screenHeight) + thisCSStop + thisHeight);  
//if( relval > thisTop ){ relval = 0; }  
relval = fromTop + screenHeight - thisHeight - (thisTop - thisCSStop);  
return el.css('top', ( useRelative ) ? relval : fromTop + screenHeight - thisHeight );  
}  
}  
 
//exposed methods  
return {  
show: function(immediately, page){  
currentstate = 'overlay';  
var $ap = page ? $(page) : ($.mobile.activePage ? $.mobile.activePage : $(".ui-page-active"));  
return $ap.children( toolbarSelector ).each(function(){  
var el = $(this),  
fromTop = $(window).scrollTop(),  
thisTop = getOffsetTop(el[0]), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead.  
screenHeight = window.innerHeight,  
thisHeight = el.outerHeight(),  
alreadyVisible = (el.is('.ui-header-fixed') && fromTop <= thisTop + thisHeight) || (el.is('.ui-footer-fixed') && thisTop <= fromTop + screenHeight);  
 
//add state class  
el.addClass('ui-fixed-overlay').removeClass('ui-fixed-inline');  
 
if( !alreadyVisible && !immediately ){  
el.addClass('in').animationComplete(function(){  
el.removeClass('in');  
});  
}  
setTop(el);  
});  
},  
hide: function(immediately){  
currentstate = 'inline';  
var $ap = $.mobile.activePage ? $.mobile.activePage : $(".ui-page-active");  
return $ap.children( toolbarSelector ).each(function(){  
var el = $(this);  
 
var thisCSStop = el.css('top'); thisCSStop = thisCSStop == 'auto' ? 0 : parseFloat(thisCSStop);  
 
//add state class  
el.addClass('ui-fixed-inline').removeClass('ui-fixed-overlay');  
 
if (thisCSStop < 0 || (el.is('.ui-header-fixed') && thisCSStop != 0))  
{  
if(immediately){  
el.css('top',0);  
}  
else{  
if( el.css('top') !== 'auto' && parseFloat(el.css('top')) !== 0 ){  
var classes = 'out reverse';  
el.addClass(classes).animationComplete(function(){  
el.removeClass(classes);  
el.css('top',0);  
});  
}  
}  
}  
});  
},  
hideAfterDelay: function(){  
delayTimer = setTimeout(function(){  
$.fixedToolbars.hide();  
}, 3000);  
},  
toggle: function(from){  
if(from){ currentstate = from; }  
return (currentstate == 'overlay') ? $.fixedToolbars.hide() : $.fixedToolbars.show();  
}  
};  
})();  
 
})(jQuery);  
 
/*  
* jQuery Mobile Framework : "checkboxradio" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.checkboxradio", $.mobile.widget, {  
options: {  
theme: null  
},  
_create: function(){  
var input = this.element,  
label = $("label[for='" + input.attr( "id" ) + "']"),  
inputtype = input.attr( "type" ),  
checkedicon = "ui-icon-" + inputtype + "-on",  
uncheckedicon = "ui-icon-" + inputtype + "-off";  
 
if ( inputtype != "checkbox" && inputtype != "radio" ) { return; }  
 
label  
.buttonMarkup({  
theme: this.options.theme,  
icon: this.element.parents( "[data-type='horizontal']" ).length ? undefined : uncheckedicon,  
shadow: false  
});  
 
// wrap the input + label in a div  
input  
.add( label )  
.wrapAll( "<div class='ui-" + inputtype +"'></div>" );  
 
label.bind({  
mouseover: function() {  
if( $(this).parent().is('.ui-disabled') ){ return false; }  
},  
 
mousedown: function() {  
if( $(this).parent().is('.ui-disabled') ){ return false; }  
label.data( "state", input.attr( "checked" ) );  
},  
 
click: function() {  
setTimeout(function() {  
if ( input.attr( "checked" ) === label.data( "state" ) ) {  
input.trigger( "click" );  
}  
}, 1);  
}  
});  
 
input  
.bind({  
 
click: function() {  
$( "input[name='" + input.attr( "name" ) + "'][type='" + inputtype + "']" ).checkboxradio( "refresh" );  
},  
 
focus: function() {  
label.addClass( "ui-focus" );  
},  
 
blur: function() {  
label.removeClass( "ui-focus" );  
}  
});  
 
this.refresh();  
 
},  
 
refresh: function( ){  
var input = this.element,  
label = $("label[for='" + input.attr( "id" ) + "']"),  
inputtype = input.attr( "type" ),  
icon = label.find( ".ui-icon" ),  
checkedicon = "ui-icon-" + inputtype + "-on",  
uncheckedicon = "ui-icon-" + inputtype + "-off";  
 
if ( input[0].checked ) {  
label.addClass( "ui-btn-active" );  
icon.addClass( checkedicon );  
icon.removeClass( uncheckedicon );  
 
} else {  
label.removeClass( "ui-btn-active" );  
icon.removeClass( checkedicon );  
icon.addClass( uncheckedicon );  
}  
 
if( input.is( ":disabled" ) ){  
this.disable();  
}  
else {  
this.enable();  
}  
},  
 
disable: function(){  
this.element.attr("disabled",true).parent().addClass("ui-disabled");  
},  
 
enable: function(){  
this.element.attr("disabled",false).parent().removeClass("ui-disabled");  
}  
});  
})( jQuery );  
 
 
/*  
* jQuery Mobile Framework : "textinput" plugin for text inputs, textareas  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.textinput", $.mobile.widget, {  
options: {  
theme: null  
},  
_create: function(){  
var input = this.element,  
o = this.options,  
theme = o.theme,  
themeclass;  
 
if ( !theme ) {  
var themedParent = this.element.closest("[class*='ui-bar-'],[class*='ui-body-']");  
theme = themedParent.length ?  
/ui-(bar|body)-([a-z])/.exec( themedParent.attr("class") )[2] :  
"c";  
}  
 
themeclass = " ui-body-" + theme;  
 
$('label[for='+input.attr('id')+']').addClass('ui-input-text');  
 
input.addClass('ui-input-text ui-body-'+ o.theme);  
 
var focusedEl = input;  
 
//"search" input widget  
if( input.is('[type="search"],[data-type="search"]') ){  
focusedEl = input.wrap('<div class="ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-search'+ themeclass +'"></div>').parent();  
var clearbtn = $('<a href="#" class="ui-input-clear" title="clear text">clear text</a>')  
.click(function(){  
input.val('').focus();  
input.trigger('change');  
clearbtn.addClass('ui-input-clear-hidden');  
return false;  
})  
.appendTo(focusedEl)  
.buttonMarkup({icon: 'delete', iconpos: 'notext', corners:true, shadow:true});  
 
function toggleClear(){  
if(input.val() == ''){  
clearbtn.addClass('ui-input-clear-hidden');  
}  
else{  
clearbtn.removeClass('ui-input-clear-hidden');  
}  
}  
 
toggleClear();  
input.keyup(toggleClear);  
}  
else{  
input.addClass('ui-corner-all ui-shadow-inset' + themeclass);  
}  
 
input  
.focus(function(){  
focusedEl.addClass('ui-focus');  
})  
.blur(function(){  
focusedEl.removeClass('ui-focus');  
});  
 
//autogrow  
if ( input.is('textarea') ) {  
var extraLineHeight = 15,  
keyupTimeoutBuffer = 100,  
keyup = function() {  
var scrollHeight = input[0].scrollHeight,  
clientHeight = input[0].clientHeight;  
if ( clientHeight < scrollHeight ) {  
input.css({ height: (scrollHeight + extraLineHeight) });  
}  
},  
keyupTimeout;  
input.keyup(function() {  
clearTimeout( keyupTimeout );  
keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );  
});  
}  
},  
 
disable: function(){  
( this.element.attr("disabled",true).is('[type="search"],[data-type="search"]') ? this.element.parent() : this.element ).addClass("ui-disabled");  
},  
 
enable: function(){  
( this.element.attr("disabled", false).is('[type="search"],[data-type="search"]') ? this.element.parent() : this.element ).removeClass("ui-disabled");  
}  
});  
})( jQuery );  
 
 
/*  
* jQuery Mobile Framework : "selectmenu" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.selectmenu", $.mobile.widget, {  
options: {  
theme: null,  
disabled: false,  
icon: 'arrow-d',  
iconpos: 'right',  
inline: null,  
corners: true,  
shadow: true,  
iconshadow: true,  
menuPageTheme: 'b',  
overlayTheme: 'a'  
},  
_create: function(){  
 
var self = this,  
 
o = this.options,  
 
select = this.element  
.attr( "tabindex", "-1" )  
.wrap( "<div class='ui-select'>" ),  
 
selectID = select.attr( "id" ),  
 
label = $( "label[for="+ selectID +"]" ).addClass( "ui-select" ),  
 
buttonId = selectID + "-button",  
 
menuId = selectID + "-menu",  
 
thisPage = select.closest( ".ui-page" ),  
 
button = $( "<a>", {  
"href": "#",  
"role": "button",  
"id": buttonId,  
"aria-haspopup": "true",  
"aria-owns": menuId  
})  
.text( $( select[0].options.item(select[0].selectedIndex) ).text() )  
.insertBefore( select )  
.buttonMarkup({  
theme: o.theme,  
icon: o.icon,  
iconpos: o.iconpos,  
inline: o.inline,  
corners: o.corners,  
shadow: o.shadow,  
iconshadow: o.iconshadow  
}),  
 
theme = /ui-btn-up-([a-z])/.exec( button.attr("class") )[1],  
 
menuPage = $( "<div data-role='dialog' data-theme='"+ o.menuPageTheme +"'>" +  
"<div data-role='header'>" +  
"<div class='ui-title'>" + label.text() + "</div>"+  
"</div>"+  
"<div data-role='content'></div>"+  
"</div>" )  
.appendTo( $.mobile.pageContainer )  
.page(),  
 
menuPageContent = menuPage.find( ".ui-content" ),  
 
screen = $( "<div>", {"class": "ui-selectmenu-screen ui-screen-hidden"})  
.appendTo( thisPage ),  
 
listbox = $( "<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all pop ui-body-" + o.overlayTheme } )  
.insertAfter(screen),  
 
list = $( "<ul>", {  
"class": "ui-selectmenu-list",  
"id": menuId,  
"role": "listbox",  
"aria-labelledby": buttonId,  
"data-theme": theme  
})  
.appendTo( listbox ),  
 
menuType;  
 
//expose to other methods  
$.extend(self, {  
select: select,  
selectID: selectID,  
label: label,  
buttonId:buttonId,  
menuId:menuId,  
thisPage:thisPage,  
button:button,  
menuPage:menuPage,  
menuPageContent:menuPageContent,  
screen:screen,  
listbox:listbox,  
list:list,  
menuType:menuType  
});  
 
 
//create list from select, update state  
self.refresh();  
 
//disable if specified  
if( this.options.disabled ){ this.disable(); }  
 
//events on native select  
select  
.change(function(){  
self.refresh();  
})  
.focus(function(){  
$(this).blur();  
button.focus();  
});  
 
//button events  
button.bind( $.support.touch ? "touchstart" : "click", function(event){  
self.open();  
return false;  
});  
 
//events for list items  
list.delegate("li",'click', function(){  
//update select  
var newIndex = list.find( "li" ).index( this ),  
prevIndex = select[0].selectedIndex;  
 
select[0].selectedIndex = newIndex;  
 
//trigger change event  
if(newIndex !== prevIndex){  
select.trigger( "change" );  
}  
 
self.refresh();  
 
//hide custom select  
self.close();  
return false;  
});  
 
//events on "screen" overlay  
screen.click(function(){  
self.close();  
return false;  
});  
},  
 
_buildList: function(){  
var self = this;  
 
self.list.empty().filter('.ui-listview').listview('destroy');  
 
//populate menu with options from select element  
self.select.find( "option" ).each(function( i ){  
var anchor = $("<a>", {  
"role": "option",  
"href": "#"  
})  
.text( $(this).text() );  
 
$( "<li>", {"data-icon": "checkbox-on"})  
.append( anchor )  
.appendTo( self.list );  
});  
 
//now populated, create listview  
self.list.listview();  
},  
 
refresh: function( forceRebuild ){  
var self = this,  
select = this.element,  
selected = select[0].selectedIndex;  
 
if( forceRebuild || select[0].options.length > self.list.find('li').length ){  
self._buildList();  
}  
 
self.button.find( ".ui-btn-text" ).text( $(select[0].options.item(selected)).text() );  
self.list  
.find('li').removeClass( $.mobile.activeBtnClass ).attr('aria-selected', false)  
.eq(selected).addClass( $.mobile.activeBtnClass ).find('a').attr('aria-selected', true);  
},  
 
open: function(){  
if( this.options.disabled ){ return; }  
 
var self = this,  
menuHeight = self.list.outerHeight(),  
menuWidth = self.list.outerWidth(),  
scrollTop = $(window).scrollTop(),  
btnOffset = self.button.offset().top,  
screenHeight = window.innerHeight,  
screenWidth = window.innerWidth;  
 
//add active class to button  
self.button.addClass( $.mobile.activeBtnClass );  
 
function focusMenuItem(){  
self.list.find( ".ui-btn-active" ).focus();  
}  
 
if( menuHeight > screenHeight - 80 || !$.support.scrollTop ){  
 
//for webos (set lastscroll using button offset)  
if( scrollTop == 0 && btnOffset > screenHeight ){  
self.thisPage.one('pagehide',function(){  
$(this).data('lastScroll', btnOffset);  
});  
}  
 
self.menuPage.one('pageshow',focusMenuItem);  
 
self.menuType = "page";  
self.menuPageContent.append( self.list );  
$.mobile.changePage(self.menuPage, 'pop', false, false);  
}  
else {  
self.menuType = "overlay";  
 
self.screen  
.height( $(document).height() )  
.removeClass('ui-screen-hidden');  
 
self.listbox  
.append( self.list )  
.removeClass( "ui-selectmenu-hidden" )  
.position({  
my: "center center",  
at: "center center",  
of: self.button,  
collision: "fit"  
})  
.addClass("in");  
 
focusMenuItem();  
}  
},  
 
close: function(){  
if( this.options.disabled ){ return; }  
var self = this;  
 
function focusButton(){  
setTimeout(function(){  
self.button.focus();  
//remove active class from button  
self.button.removeClass( $.mobile.activeBtnClass );  
}, 40);  
 
self.listbox.removeAttr('style').append( self.list );  
}  
 
if(self.menuType == "page"){  
$.mobile.changePage([self.menuPage,self.thisPage], 'pop', true, false);  
self.menuPage.one("pagehide",function(){  
focusButton();  
//return false;  
});  
}  
else{  
self.screen.addClass( "ui-screen-hidden" );  
self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass("in");  
focusButton();  
}  
 
},  
 
disable: function(){  
this.element.attr("disabled",true);  
this.button.addClass('ui-disabled').attr("aria-disabled", true);  
return this._setOption( "disabled", true );  
},  
 
enable: function(){  
this.element.attr("disabled",false);  
this.button.removeClass('ui-disabled').attr("aria-disabled", false);  
return this._setOption( "disabled", false );  
}  
});  
})( jQuery );  
 
 
 
/*  
* jQuery Mobile Framework : plugin for making button-like links  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
$.fn.buttonMarkup = function( options ){  
return this.each( function() {  
var el = $( this ),  
o = $.extend( {}, $.fn.buttonMarkup.defaults, el.data(), options),  
 
// Classes Defined  
buttonClass,  
innerClass = "ui-btn-inner",  
iconClass;  
 
if ( attachEvents ) {  
attachEvents();  
}  
 
// if not, try to find closest theme container  
if ( !o.theme ) {  
var themedParent = el.closest("[class*='ui-bar-'],[class*='ui-body-']");  
o.theme = themedParent.length ?  
/ui-(bar|body)-([a-z])/.exec( themedParent.attr("class") )[2] :  
"c";  
}  
 
buttonClass = "ui-btn ui-btn-up-" + o.theme;  
 
if ( o.inline ) {  
buttonClass += " ui-btn-inline";  
}  
 
if ( o.icon ) {  
o.icon = "ui-icon-" + o.icon;  
o.iconpos = o.iconpos || "left";  
 
iconClass = "ui-icon " + o.icon;  
 
if ( o.shadow ) {  
iconClass += " ui-icon-shadow"  
}  
}  
 
if ( o.iconpos ) {  
buttonClass += " ui-btn-icon-" + o.iconpos;  
 
if ( o.iconpos == "notext" && !el.attr("title") ) {  
el.attr( "title", el.text() );  
}  
}  
 
if ( o.corners ) {  
buttonClass += " ui-btn-corner-all";  
innerClass += " ui-btn-corner-all";  
}  
 
if ( o.shadow ) {  
buttonClass += " ui-shadow";  
}  
 
el  
.attr( "data-theme", o.theme )  
.addClass( buttonClass );  
 
var wrap = ("<D class='" + innerClass + "'><D class='ui-btn-text'></D>" +  
( o.icon ? "<span class='" + iconClass + "'></span>" : "" ) +  
"</D>").replace(/D/g, o.wrapperEls);  
 
el.wrapInner( wrap );  
});  
};  
 
$.fn.buttonMarkup.defaults = {  
corners: true,  
shadow: true,  
iconshadow: true,  
wrapperEls: "span"  
};  
 
var attachEvents = function() {  
$(".ui-btn").live({  
mousedown: function() {  
var theme = $(this).attr( "data-theme" );  
$(this).removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );  
},  
mouseup: function() {  
var theme = $(this).attr( "data-theme" );  
$(this).removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );  
},  
"mouseover focus": function() {  
var theme = $(this).attr( "data-theme" );  
$(this).removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );  
},  
"mouseout blur": function() {  
var theme = $(this).attr( "data-theme" );  
$(this).removeClass( "ui-btn-hover-" + theme ).addClass( "ui-btn-up-" + theme );  
}  
});  
 
attachEvents = null;  
};  
 
})(jQuery);  
 
 
/*  
* jQuery Mobile Framework : "button" plugin - links that proxy to native input/buttons  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.button", $.mobile.widget, {  
options: {  
theme: null,  
icon: null,  
iconpos: null,  
inline: null,  
corners: true,  
shadow: true,  
iconshadow: true  
},  
_create: function(){  
var $el = this.element,  
o = this.options,  
type = $el.attr('type');  
$el  
.addClass('ui-btn-hidden')  
.attr('tabindex','-1');  
 
//add ARIA role  
this.button = $( "<a>", {  
"href": "#",  
"role": "button",  
"aria-label": $el.attr( "type" )  
} )  
.text( $el.text() || $el.val() )  
.insertBefore( $el )  
.click(function(){  
if(!o.disabled){  
if( type == "submit" ){  
$(this).closest('form').submit();  
}  
else{  
$el.click();  
}  
}  
 
return false;  
})  
.buttonMarkup({  
theme: o.theme,  
icon: o.icon,  
iconpos: o.iconpos,  
inline: o.inline,  
corners: o.corners,  
shadow: o.shadow,  
iconshadow: o.iconshadow  
});  
},  
 
enable: function(){  
this.element.attr("disabled", false);  
this.button.removeClass("ui-disabled").attr("aria-disabled", false);  
return this._setOption("disabled", false);  
},  
 
disable: function(){  
this.element.attr("disabled", true);  
this.button.addClass("ui-disabled").attr("aria-disabled", true);  
return this._setOption("disabled", true);  
}  
});  
})( jQuery );  
 
/*  
* jQuery Mobile Framework : "slider" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.slider", $.mobile.widget, {  
options: {  
theme: null,  
trackTheme: null,  
disabled: false  
},  
_create: function(){  
var self = this,  
 
control = this.element,  
 
parentTheme = control.parents('[class*=ui-bar-],[class*=ui-body-]').eq(0),  
 
parentTheme = parentTheme.length ? parentTheme.attr('class').match(/ui-(bar|body)-([a-z])/)[2] : 'c',  
 
theme = this.options.theme ? this.options.theme : parentTheme,  
 
trackTheme = this.options.trackTheme ? this.options.trackTheme : parentTheme,  
 
cType = control[0].nodeName.toLowerCase(),  
selectClass = (cType == 'select') ? 'ui-slider-switch' : '',  
controlID = control.attr('id'),  
labelID = controlID + '-label',  
label = $('[for='+ controlID +']').attr('id',labelID),  
val = (cType == 'input') ? parseFloat(control.val()) : control[0].selectedIndex,  
min = (cType == 'input') ? parseFloat(control.attr('min')) : 0,  
max = (cType == 'input') ? parseFloat(control.attr('max')) : control.find('option').length-1,  
slider = $('<div class="ui-slider '+ selectClass +' ui-btn-down-'+ trackTheme+' ui-btn-corner-all" role="application"></div>'),  
handle = $('<a href="#" class="ui-slider-handle"></a>')  
.appendTo(slider)  
.buttonMarkup({corners: true, theme: theme, shadow: true})  
.attr({  
'role': 'slider',  
'aria-valuemin': min,  
'aria-valuemax': max,  
'aria-valuenow': val,  
'aria-valuetext': val,  
'title': val,  
'aria-labelledby': labelID  
});  
 
$.extend(this, {  
slider: slider,  
handle: handle,  
dragging: false,  
beforeStart: null  
});  
 
if(cType == 'select'){  
slider.wrapInner('<div class="ui-slider-inneroffset"></div>');  
var options = control.find('option');  
 
control.find('option').each(function(i){  
var side = (i==0) ?'b':'a',  
corners = (i==0) ? 'right' :'left',  
theme = (i==0) ? ' ui-btn-down-' + trackTheme :' ui-btn-active';  
$('<div class="ui-slider-labelbg ui-slider-labelbg-'+ side + theme +' ui-btn-corner-'+ corners+'"></div>').prependTo(slider);  
$('<span class="ui-slider-label ui-slider-label-'+ side + theme +' ui-btn-corner-'+ corners+'" role="img">'+$(this).text()+'</span>').prependTo(handle);  
});  
 
}  
 
label.addClass('ui-slider');  
 
control  
.addClass((cType == 'input') ? 'ui-slider-input' : 'ui-slider-switch')  
.keyup(function(){  
self.refresh( $(this).val() );  
});  
 
$(document).bind($.support.touch ? "touchmove" : "mousemove", function(event){  
if ( self.dragging ) {  
self.refresh( event );  
return false;  
}  
});  
 
slider  
.bind($.support.touch ? "touchstart" : "mousedown", function(event){  
self.dragging = true;  
if ( cType === "select" ) {  
self.beforeStart = control[0].selectedIndex;  
}  
self.refresh( event );  
return false;  
});  
 
slider  
.add(document)  
.bind($.support.touch ? "touchend" : "mouseup", function(){  
if ( self.dragging ) {  
self.dragging = false;  
if ( cType === "select" ) {  
if ( self.beforeStart === control[0].selectedIndex ) {  
//tap occurred, but value didn't change. flip it!  
self.refresh( self.beforeStart === 0 ? 1 : 0 );  
}  
var curval = (cType === "input") ? parseFloat(control.val()) : control[ 0 ].selectedIndex;  
var snapped = Math.round( curval / (max - min) * 100 );  
handle  
.addClass("ui-slider-handle-snapping")  
.css("left", snapped + "%")  
.animationComplete(function(){  
handle.removeClass("ui-slider-handle-snapping");  
});  
}  
return false;  
}  
});  
 
slider.insertAfter(control);  
handle.bind('click', function(e){ return false; });  
this.refresh();  
},  
 
refresh: function(val){  
if ( this.options.disabled ) { return; }  
 
var control = this.element, percent,  
cType = control[0].nodeName.toLowerCase(),  
min = (cType === "input") ? parseFloat(control.attr("min")) : 0,  
max = (cType === "input") ? parseFloat(control.attr("max")) : control.find("option").length - 1;  
 
if ( typeof val === "object" ) {  
var data = val.originalEvent.touches ? val.originalEvent.touches[ 0 ] : val,  
// a slight tolerance helped get to the ends of the slider  
tol = 8;  
if ( !this.dragging  
|| data.pageX < this.slider.offset().left - tol  
|| data.pageX > this.slider.offset().left + this.slider.width() + tol ) {  
return;  
}  
percent = Math.round( ((data.pageX - this.slider.offset().left) / this.slider.width() ) * 100 );  
} else {  
if ( val == null ) {  
val = (cType === "input") ? parseFloat(control.val()) : control[ 0 ].selectedIndex;  
}  
percent = (parseFloat(val) - min) / (max - min) * 100;  
}  
 
if ( isNaN(percent) ) { return; }  
if ( percent < 0 ) { percent = 0; }  
if ( percent > 100 ) { percent = 100; }  
 
var newval = Math.round( (percent / 100) * (max - min) ) + min;  
if ( newval < min ) { newval = min; }  
if ( newval > max ) { newval = max; }  
 
//flip the stack of the bg colors  
if ( percent > 60 && cType === "select" ) {  
 
}  
this.handle.css("left", percent + "%");  
this.handle.attr({  
"aria-valuenow": (cType === "input") ? newval : control.find("option").eq(newval).attr("value"),  
"aria-valuetext": (cType === "input") ? newval : control.find("option").eq(newval).text(),  
title: newval  
});  
 
// add/remove classes for flip toggle switch  
if ( cType === "select" ) {  
if ( newval === 0 ) {  
this.slider.addClass("ui-slider-switch-a")  
.removeClass("ui-slider-switch-b");  
} else {  
this.slider.addClass("ui-slider-switch-b")  
.removeClass("ui-slider-switch-a");  
}  
}  
 
// update control's value  
if ( cType === "input" ) {  
control.val(newval);  
} else {  
control[ 0 ].selectedIndex = newval;  
}  
control.trigger("change");  
},  
 
enable: function(){  
this.element.attr("disabled", false);  
this.slider.removeClass("ui-disabled").attr("aria-disabled", false);  
return this._setOption("disabled", false);  
},  
 
disable: function(){  
this.element.attr("disabled", true);  
this.slider.addClass("ui-disabled").attr("aria-disabled", true);  
return this._setOption("disabled", true);  
}  
});  
})( jQuery );  
 
 
 
/*  
* jQuery Mobile Framework : "collapsible" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.collapsible", $.mobile.widget, {  
options: {  
expandCueText: ' click to expand contents',  
collapseCueText: ' click to collapse contents',  
collapsed: false,  
heading: '>:header,>legend',  
theme: null,  
iconTheme: 'd'  
},  
_create: function(){  
 
var $el = this.element,  
o = this.options,  
collapsibleContain = $el.addClass('ui-collapsible-contain'),  
collapsibleHeading = $el.find(o.heading).eq(0),  
collapsibleContent = collapsibleContain.wrapInner('<div class="ui-collapsible-content"></div>').find('.ui-collapsible-content'),  
collapsibleParent = $el.closest('[data-role="collapsible-set"]').addClass('ui-collapsible-set');  
 
//replace collapsibleHeading if it's a legend  
if(collapsibleHeading.is('legend')){  
collapsibleHeading = $('<div role="heading">'+ collapsibleHeading.html() +'</div>').insertBefore(collapsibleHeading);  
collapsibleHeading.next().remove();  
}  
 
//drop heading in before content  
collapsibleHeading.insertBefore(collapsibleContent);  
 
//modify markup & attributes  
collapsibleHeading.addClass('ui-collapsible-heading')  
.append('<span class="ui-collapsible-heading-status"></span>')  
.wrapInner('<a href="#" class="ui-collapsible-heading-toggle"></a>')  
.find('a:eq(0)')  
.buttonMarkup({  
shadow: !!!collapsibleParent.length,  
corners:false,  
iconPos: 'left',  
icon: 'plus',  
theme: o.theme  
})  
.find('.ui-icon')  
.removeAttr('class')  
.buttonMarkup({  
shadow: true,  
corners:true,  
iconPos: 'notext',  
icon: 'plus',  
theme: o.iconTheme  
});  
 
if( !collapsibleParent.length ){  
collapsibleHeading  
.find('a:eq(0)')  
.addClass('ui-corner-all')  
.find('.ui-btn-inner')  
.addClass('ui-corner-all');  
}  
else {  
if( collapsibleContain.data('collapsible-last') ){  
collapsibleHeading  
.find('a:eq(0), .ui-btn-inner')  
.addClass('ui-corner-bottom');  
}  
}  
 
 
//events  
collapsibleContain  
.bind('collapse', function(event){  
if( !event.isDefaultPrevented() ){  
event.preventDefault();  
collapsibleHeading  
.addClass('ui-collapsible-heading-collapsed')  
.find('.ui-collapsible-heading-status').text(o.expandCueText);  
 
collapsibleHeading.find('.ui-icon').removeClass('ui-icon-minus').addClass('ui-icon-plus');  
collapsibleContent.addClass('ui-collapsible-content-collapsed').attr('aria-hidden',true);  
 
if( collapsibleContain.data('collapsible-last') ){  
collapsibleHeading  
.find('a:eq(0), .ui-btn-inner')  
.addClass('ui-corner-bottom');  
}  
}  
 
})  
.bind('expand', function(event){  
if( !event.isDefaultPrevented() ){  
event.preventDefault();  
collapsibleHeading  
.removeClass('ui-collapsible-heading-collapsed')  
.find('.ui-collapsible-heading-status').text(o.collapseCueText);  
 
collapsibleHeading.find('.ui-icon').removeClass('ui-icon-plus').addClass('ui-icon-minus');  
collapsibleContent.removeClass('ui-collapsible-content-collapsed').attr('aria-hidden',false);  
 
if( collapsibleContain.data('collapsible-last') ){  
collapsibleHeading  
.find('a:eq(0), .ui-btn-inner')  
.removeClass('ui-corner-bottom');  
}  
 
}  
})  
.trigger(o.collapsed ? 'collapse' : 'expand');  
 
 
//close others in a set  
if( collapsibleParent.length && !collapsibleParent.data("collapsiblebound") ){  
collapsibleParent  
.data("collapsiblebound", true)  
.bind("expand", function( event ){  
$(this).find( ".ui-collapsible-contain" )  
.not( $(event.target).closest( ".ui-collapsible-contain" ) )  
.not( "> .ui-collapsible-contain .ui-collapsible-contain" )  
.trigger( "collapse" );  
})  
var set = collapsibleParent.find('[data-role=collapsible]')  
 
set.first()  
.find('a:eq(0)')  
.addClass('ui-corner-top')  
.find('.ui-btn-inner')  
.addClass('ui-corner-top');  
 
set.last().data('collapsible-last', true)  
}  
 
collapsibleHeading.bind( $.support.touch ? "touchstart" : "click", function(){  
if( collapsibleHeading.is('.ui-collapsible-heading-collapsed') ){  
collapsibleContain.trigger('expand');  
}  
else {  
collapsibleContain.trigger('collapse');  
}  
return false;  
});  
 
}  
});  
})( jQuery );  
 
/*  
* jQuery Mobile Framework: "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.fn.controlgroup = function(options){  
 
return $(this).each(function(){  
var o = $.extend({  
direction: $( this ).data( "type" ) || "vertical",  
shadow: false  
},options);  
var groupheading = $(this).find('>legend'),  
flCorners = o.direction == 'horizontal' ? ['ui-corner-left', 'ui-corner-right'] : ['ui-corner-top', 'ui-corner-bottom'],  
type = $(this).find('input:eq(0)').attr('type');  
 
//replace legend with more stylable replacement div  
if( groupheading.length ){  
$(this).wrapInner('<div class="ui-controlgroup-controls"></div>');  
$('<div role="heading" class="ui-controlgroup-label">'+ groupheading.html() +'</div>').insertBefore( $(this).children(0) );  
groupheading.remove();  
}  
 
$(this).addClass('ui-corner-all ui-controlgroup ui-controlgroup-'+o.direction);  
 
function flipClasses(els){  
els  
.removeClass('ui-btn-corner-all ui-shadow')  
.eq(0).addClass(flCorners[0])  
.end()  
.filter(':last').addClass(flCorners[1]).addClass('ui-controlgroup-last');  
}  
flipClasses($(this).find('.ui-btn'));  
flipClasses($(this).find('.ui-btn-inner'));  
if(o.shadow){  
$(this).addClass('ui-shadow');  
}  
});  
};  
})(jQuery);  
 
/*  
* jQuery Mobile Framework : "fieldcontain" plugin - simple class additions to make form row separators  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.fn.fieldcontain = function(options){  
return $(this).addClass('ui-field-contain ui-body ui-br');  
};  
})(jQuery);  
 
/*  
* jQuery Mobile Framework : "listview" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
$.widget( "mobile.listview", $.mobile.widget, {  
options: {  
theme: "c",  
countTheme: "c",  
headerTheme: "b",  
dividerTheme: "b",  
splitIcon: "arrow-r",  
splitTheme: "b",  
inset: false  
},  
 
_create: function() {  
var $list = this.element,  
o = this.options;  
 
// create listview markup  
$list  
.addClass( "ui-listview" )  
.attr( "role", "listbox" )  
 
if ( o.inset ) {  
$list.addClass( "ui-listview-inset ui-corner-all ui-shadow" );  
}  
 
$list.delegate( ".ui-li", "focusin", function() {  
$( this ).attr( "tabindex", "0" );  
});  
 
this._itemApply( $list, $list );  
 
this.refresh( true );  
 
//keyboard events for menu items  
$list.keydown(function( e ) {  
var target = $( e.target ),  
li = target.closest( "li" );  
 
// switch logic based on which key was pressed  
switch ( e.keyCode ) {  
// up or left arrow keys  
case 38:  
var prev = li.prev();  
 
// if there's a previous option, focus it  
if ( prev.length ) {  
target  
.blur()  
.attr( "tabindex", "-1" );  
 
prev.find( "a" ).first().focus();  
}  
 
return false;  
break;  
 
// down or right arrow keys  
case 40:  
var next = li.next();  
 
// if there's a next option, focus it  
if ( next.length ) {  
target  
.blur()  
.attr( "tabindex", "-1" );  
 
next.find( "a" ).first().focus();  
}  
 
return false;  
break;  
 
case 39:  
var a = li.find( "a.ui-li-link-alt" );  
 
if ( a.length ) {  
target.blur();  
a.first().focus();  
}  
 
return false;  
break;  
 
case 37:  
var a = li.find( "a.ui-link-inherit" );  
 
if ( a.length ) {  
target.blur();  
a.first().focus();  
}  
 
return false;  
break;  
 
// if enter or space is pressed, trigger click  
case 13:  
case 32:  
target.trigger( "click" );  
 
return false;  
break;  
}  
});  
 
// tapping the whole LI triggers click on the first link  
$list.delegate( "li", "click", function(event) {  
if ( !$( event.target ).closest( "a" ).length ) {  
$( this ).find( "a" ).first().trigger( "click" );  
return false;  
}  
});  
},  
 
_itemApply: function( $list, item ) {  
// TODO class has to be defined in markup  
item.find( ".ui-li-count" )  
.addClass( "ui-btn-up-" + ($list.data( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" );  
 
item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" );  
 
item.find( "p, dl" ).addClass( "ui-li-desc" );  
 
item.find( "img" ).addClass( "ui-li-thumb" ).each(function() {  
$( this ).closest( "li" )  
.addClass( $(this).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );  
});  
 
var aside = item.find( ".ui-li-aside" );  
 
if ( aside.length ) {  
aside.each(function(i, el) {  
$(el).prependTo( $(el).parent() ); //shift aside to front for css float  
});  
}  
 
if ( $.support.cssPseudoElement || !$.nodeName( item[0], "ol" ) ) {  
return;  
}  
},  
 
_removeCorners: function(li){  
li  
.add( li.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb") )  
.removeClass( "ui-corner-top ui-corner-bottom ui-corner-br ui-corner-bl ui-corner-tr ui-corner-tl" );  
},  
 
refresh: function( create ) {  
this._createSubPages();  
 
var o = this.options,  
$list = this.element,  
self = this,  
dividertheme = $list.data( "dividertheme" ) || o.dividerTheme,  
li = $list.children( "li" ),  
counter = $.support.cssPseudoElement || !$.nodeName( $list[0], "ol" ) ? 0 : 1;  
 
if ( counter ) {  
$list.find( ".ui-li-dec" ).remove();  
}  
 
li.attr({ "role": "option", "tabindex": "-1" });  
 
li.first().attr( "tabindex", "0" );  
 
li.each(function( pos ) {  
var item = $( this ),  
itemClass = "ui-li";  
 
// If we're creating the element, we update it regardless  
if ( !create && item.hasClass( "ui-li" ) ) {  
return;  
}  
 
var a = item.find( "a" );  
 
if ( a.length ) {  
item  
.buttonMarkup({  
wrapperEls: "div",  
shadow: false,  
corners: false,  
iconpos: "right",  
icon: a.length > 1 ? false : item.data("icon") || "arrow-r",  
theme: o.theme  
});  
 
a.first().addClass( "ui-link-inherit" );  
 
if ( a.length > 1 ) {  
itemClass += " ui-li-has-alt";  
 
var last = a.last(),  
splittheme = $list.data( "splittheme" ) || last.data( "theme" ) || o.splitTheme;  
 
last  
.attr( "title", last.text() )  
.addClass( "ui-li-link-alt" )  
.empty()  
.buttonMarkup({  
shadow: false,  
corners: false,  
theme: o.theme,  
icon: false,  
iconpos: false  
})  
.find( ".ui-btn-inner" )  
.append( $( "<span>" ).buttonMarkup({  
shadow: true,  
corners: true,  
theme: splittheme,  
iconpos: "notext",  
icon: $list.data( "spliticon" ) || last.data( "icon" ) || o.splitIcon  
} ) );  
}  
 
} else if ( item.data( "role" ) === "list-divider" ) {  
itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;  
item.attr( "role", "heading" );  
 
//reset counter when a divider heading is encountered  
if ( counter ) {  
counter = 1;  
}  
 
} else {  
itemClass += " ui-li-static ui-btn-up-" + o.theme;  
}  
 
 
if( o.inset ){  
if ( pos === 0 ) {  
itemClass += " ui-corner-top";  
 
item  
.add( item.find( ".ui-btn-inner" ) )  
.find( ".ui-li-link-alt" )  
.addClass( "ui-corner-tr" )  
.end()  
.find( ".ui-li-thumb" )  
.addClass( "ui-corner-tl" );  
 
self._removeCorners( item.next() );  
 
} else if ( pos === li.length - 1 ) {  
itemClass += " ui-corner-bottom";  
 
item  
.add( item.find( ".ui-btn-inner" ) )  
.find( ".ui-li-link-alt" )  
.addClass( "ui-corner-br" )  
.end()  
.find( ".ui-li-thumb" )  
.addClass( "ui-corner-bl" );  
 
self._removeCorners( item.prev() );  
}  
}  
 
 
if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {  
item  
.find( ".ui-link-inherit" ).first()  
.addClass( "ui-li-jsnumbering" )  
.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );  
}  
 
item.addClass( itemClass );  
 
if ( !create ) {  
self._itemApply( $list, item );  
}  
});  
},  
 
//create a string for ID/subpage url creation  
_idStringEscape: function( str ){  
return str.replace(/[^a-zA-Z0-9]/g, '-');  
},  
 
_createSubPages: function() {  
var parentList = this.element,  
parentPage = parentList.closest( ".ui-page" ),  
parentId = parentPage.attr( "id" ),  
o = this.options,  
self = this,  
persistentFooterID = parentPage.find( "[data-role='footer']" ).data( "id" );  
 
$( parentList.find( "ul, ol" ).toArray().reverse() ).each(function( i ) {  
var list = $( this ),  
parent = list.parent(),  
title = parent.contents()[ 0 ].nodeValue.split("\n")[0],  
id = parentId + "&" + $.mobile.subPageUrlKey + "=" + self._idStringEscape(title + " " + i),  
theme = list.data( "theme" ) || o.theme,  
countTheme = list.data( "counttheme" ) || parentList.data( "counttheme" ) || o.countTheme,  
newPage = list.wrap( "<div data-role='page'><div data-role='content'></div></div>" )  
.parent()  
.before( "<div data-role='header' data-theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )  
.after( persistentFooterID ? $( "<div>", { "data-role": "footer", "data-id": persistentFooterID, "class": "ui-footer-duplicate" } ) : "" )  
.parent()  
.attr({  
id: id,  
"data-theme": theme,  
"data-count-theme": countTheme  
})  
.appendTo( $.mobile.pageContainer );  
 
 
 
newPage.page();  
 
parent.html( "<a href='#" + id + "'>" + title + "</a>" );  
}).listview();  
}  
});  
 
})( jQuery );  
 
 
/*  
* jQuery Mobile Framework : "listview" filter extension  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
 
$.mobile.listview.prototype.options.filter = false;  
 
$( "[data-role='listview']" ).live( "listviewcreate", function() {  
var list = $( this ),  
listview = list.data( "listview" );  
if ( !listview.options.filter ) {  
return;  
}  
 
var wrapper = $( "<form>", { "class": "ui-listview-filter ui-bar-c", "role": "search" } ),  
 
search = $( "<input>", {  
placeholder: "Filter results...",  
"data-type": "search"  
})  
.bind( "keyup change", function() {  
var val = this.value.toLowerCase();;  
list.children().show();  
if ( val ) {  
list.children().filter(function() {  
return $( this ).text().toLowerCase().indexOf( val ) === -1;  
}).hide();  
}  
 
//listview._numberItems();  
})  
.appendTo( wrapper )  
.textinput();  
 
wrapper.insertBefore( list );  
});  
 
})( jQuery );  
 
 
/*  
* jQuery Mobile Framework : "dialog" plugin.  
* 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  
*/  
(function($, undefined ) {  
$.widget( "mobile.dialog", $.mobile.widget, {  
options: {},  
_create: function(){  
var self = this,  
$el = self.element,  
$prevPage = $.mobile.activePage,  
$closeBtn = $('<a href="#" data-icon="delete" data-iconpos="notext">Close</a>');  
 
$el.delegate("a, form", "click submit", function(e){  
if( e.type == "click" && ( $(e.target).closest('[data-back]')[0] || this==$closeBtn[0] ) ){  
self.close();  
return false;  
}  
//otherwise, assume we're headed somewhere new. set activepage to dialog so the transition will work  
$.mobile.activePage = self.element;  
});  
 
this.element  
.bind("pageshow",function(){  
return false;  
})  
//add ARIA role  
.attr("role","dialog")  
.addClass('ui-page ui-dialog ui-body-a')  
.find('[data-role=header]')  
.addClass('ui-corner-top ui-overlay-shadow')  
.prepend( $closeBtn )  
.end()  
.find('.ui-content:not([class*="ui-body-"])')  
.addClass('ui-body-c')  
.end()  
.find('.ui-content,[data-role=footer]')  
.last()  
.addClass('ui-corner-bottom ui-overlay-shadow');  
 
$(window).bind('hashchange',function(){  
if( $el.is('.ui-page-active') ){  
self.close();  
$el.bind('pagehide',function(){  
$.mobile.updateHash( $prevPage.attr('id'), true);  
});  
}  
});  
 
},  
 
close: function(){  
$.mobile.changePage([this.element, $.mobile.activePage], undefined, true, true );  
}  
});  
})( jQuery );  
 
/*  
* jQuery Mobile Framework : "navbar" plugin  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.widget( "mobile.navbar", $.mobile.widget, {  
options: {  
iconpos: 'top',  
grid: null  
},  
_create: function(){  
var $navbar = this.element,  
$navbtns = $navbar.find("a"),  
iconpos = $navbtns.filter('[data-icon]').length ? this.options.iconpos : undefined;  
 
$navbar  
.addClass('ui-navbar')  
.attr("role","navigation")  
.find("ul")  
.grid({grid: this.options.grid });  
 
if( !iconpos ){  
$navbar.addClass("ui-navbar-noicons");  
}  
 
$navbtns  
.buttonMarkup({  
corners: false,  
shadow: false,  
iconpos: iconpos  
});  
 
$navbar.delegate("a", "click",function(event){  
$navbtns.removeClass("ui-btn-active");  
});  
}  
});  
})( jQuery );  
 
/*  
* jQuery Mobile Framework : plugin for creating CSS grids  
* Copyright (c) jQuery Project  
* Dual licensed under the MIT or GPL Version 2 licenses.  
* http://jquery.org/license  
*/  
(function($, undefined ) {  
$.fn.grid = function(options){  
return $(this).each(function(){  
var o = $.extend({  
grid: null  
},options);  
 
 
var $kids = $(this).children(),  
gridCols = {a: 2, b:3, c:4, d:5},  
grid = o.grid,  
iterator;  
 
if( !grid ){  
if( $kids.length <= 5 ){  
for(var letter in gridCols){  
if(gridCols[letter] == $kids.length){ grid = letter; }  
}  
}  
else{  
grid = 'a';  
}  
}  
iterator = gridCols[grid];  
 
$(this).addClass('ui-grid-' + grid);  
 
$kids.filter(':nth-child(' + iterator + 'n+1)').addClass('ui-block-a');  
$kids.filter(':nth-child(' + iterator + 'n+2)').addClass('ui-block-b');  
 
if(iterator > 2){  
$kids.filter(':nth-child(3n+3)').addClass('ui-block-c');  
}  
if(iterator> 3){  
$kids.filter(':nth-child(4n+4)').addClass('ui-block-d');  
}  
if(iterator > 4){  
$kids.filter(':nth-child(5n+5)').addClass('ui-block-e');  
}  
 
});  
};  
})(jQuery);  
 
 
  /*!
  * jQuery UI 1.8.5
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI
  */
  (function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.5",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
  NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
  "position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
  if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind("mousedown.ui-disableSelection selectstart.ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
  "border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this,
  h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
  c(function(){var a=document.createElement("div"),b=document.body;c.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.appendChild(a).offsetHeight===100;b.removeChild(a).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,
  d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
  ;/*
  * jQuery UI Datepicker 1.8.5
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Datepicker
  *
  * Depends:
  * jquery.ui.core.js
  */
  (function(d,G){function L(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
  "ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
  "Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
  minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a,
  b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.5"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=
  f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
  _connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
  b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
  ""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
  c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
  true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor==
  Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);
  d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},
  _enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=
  d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;
  for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&
  this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&
  !a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();
  return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||
  a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,
  a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));
  var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||
  a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);
  d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&
  d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,
  h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");
  this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");
  this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");
  a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),
  k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];
  a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():
  "",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&
  !a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;
  b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=
  this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=
  d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,
  "altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b==
  "object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"?
  3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,H){p=o(p)?H:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length).toLowerCase()==p[w].toLowerCase()){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");
  break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>
  -1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*
  60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)==
  "'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+=
  "'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},
  _setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,
  this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=
  parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1],10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},
  _daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?
  "":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=
  this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,
  "prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+
  n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
  (c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
  y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var N=
  "",D=0;D<i[1];D++){var J=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?
  f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
  A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&q<j||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==J.getTime()&&g==a.selectedMonth&&
  a._keyEvent||M.getTime()==q.getTime()&&M.getTime()==J.getTime()?" "+this._dayOverClass:"")+(K?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(K?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?"&#xa0;":K?'<span class="ui-state-default">'+q.getDate()+
  "</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==J.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
  "");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+
  a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?"&#xa0;":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,
  i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?"&#xa0;":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e=
  a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
  "onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
  c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
  "dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
  function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
  return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.5";window["DP_jQuery_"+y]=d})(jQuery);
  ;
  /*!
  * jQuery JavaScript Library v1.5
  * http://jquery.com/
  *
  * Copyright 2011, John Resig
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * Includes Sizzle.js
  * http://sizzlejs.com/
  * Copyright 2011, The Dojo Foundation
  * Released under the MIT, BSD, and GPL Licenses.
  *
  * Date: Mon Jan 31 08:31:29 2011 -0500
  */
  (function( window, undefined ) {
 
  // Use the correct document accordingly with window argument (sandbox)
  var document = window.document;
  var jQuery = (function() {
 
  // Define a local copy of jQuery
  var jQuery = function( selector, context ) {
  // The jQuery object is actually just the init constructor 'enhanced'
  return new jQuery.fn.init( selector, context, rootjQuery );
  },
 
  // Map over jQuery in case of overwrite
  _jQuery = window.jQuery,
 
  // Map over the $ in case of overwrite
  _$ = window.$,
 
  // A central reference to the root jQuery(document)
  rootjQuery,
 
  // A simple way to check for HTML strings or ID strings
  // (both of which we optimize for)
  quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
 
  // Check if a string has a non-whitespace character in it
  rnotwhite = /\S/,
 
  // Used for trimming whitespace
  trimLeft = /^\s+/,
  trimRight = /\s+$/,
 
  // Check for digits
  rdigit = /\d/,
 
  // Match a standalone tag
  rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
  // JSON RegExp
  rvalidchars = /^[\],:{}\s]*$/,
  rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
  rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
  rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
 
  // Useragent RegExp
  rwebkit = /(webkit)[ \/]([\w.]+)/,
  ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
  rmsie = /(msie) ([\w.]+)/,
  rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
 
  // Keep a UserAgent string for use with jQuery.browser
  userAgent = navigator.userAgent,
 
  // For matching the engine and version of the browser
  browserMatch,
 
  // Has the ready events already been bound?
  readyBound = false,
 
  // The deferred used on DOM ready
  readyList,
 
  // Promise methods
  promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
 
  // The ready event handler
  DOMContentLoaded,
 
  // Save a reference to some core methods
  toString = Object.prototype.toString,
  hasOwn = Object.prototype.hasOwnProperty,
  push = Array.prototype.push,
  slice = Array.prototype.slice,
  trim = String.prototype.trim,
  indexOf = Array.prototype.indexOf,
 
  // [[Class]] -> type pairs
  class2type = {};
 
  jQuery.fn = jQuery.prototype = {
  constructor: jQuery,
  init: function( selector, context, rootjQuery ) {
  var match, elem, ret, doc;
 
  // Handle $(""), $(null), or $(undefined)
  if ( !selector ) {
  return this;
  }
 
  // Handle $(DOMElement)
  if ( selector.nodeType ) {
  this.context = this[0] = selector;
  this.length = 1;
  return this;
  }
 
  // The body element only exists once, optimize finding it
  if ( selector === "body" && !context && document.body ) {
  this.context = document;
  this[0] = document.body;
  this.selector = "body";
  this.length = 1;
  return this;
  }
 
  // Handle HTML strings
  if ( typeof selector === "string" ) {
  // Are we dealing with HTML string or an ID?
  match = quickExpr.exec( selector );
 
  // Verify a match, and that no context was specified for #id
  if ( match && (match[1] || !context) ) {
 
  // HANDLE: $(html) -> $(array)
  if ( match[1] ) {
  context = context instanceof jQuery ? context[0] : context;
  doc = (context ? context.ownerDocument || context : document);
 
  // If a single string is passed in and it's a single tag
  // just do a createElement and skip the rest
  ret = rsingleTag.exec( selector );
 
  if ( ret ) {
  if ( jQuery.isPlainObject( context ) ) {
  selector = [ document.createElement( ret[1] ) ];
  jQuery.fn.attr.call( selector, context, true );
 
  } else {
  selector = [ doc.createElement( ret[1] ) ];
  }
 
  } else {
  ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
  selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
  }
 
  return jQuery.merge( this, selector );
 
  // HANDLE: $("#id")
  } else {
  elem = document.getElementById( match[2] );
 
  // Check parentNode to catch when Blackberry 4.6 returns
  // nodes that are no longer in the document #6963
  if ( elem && elem.parentNode ) {
  // Handle the case where IE and Opera return items
  // by name instead of ID
  if ( elem.id !== match[2] ) {
  return rootjQuery.find( selector );
  }
 
  // Otherwise, we inject the element directly into the jQuery object
  this.length = 1;
  this[0] = elem;
  }
 
  this.context = document;
  this.selector = selector;
  return this;
  }
 
  // HANDLE: $(expr, $(...))
  } else if ( !context || context.jquery ) {
  return (context || rootjQuery).find( selector );
 
  // HANDLE: $(expr, context)
  // (which is just equivalent to: $(context).find(expr)
  } else {
  return this.constructor( context ).find( selector );
  }
 
  // HANDLE: $(function)
  // Shortcut for document ready
  } else if ( jQuery.isFunction( selector ) ) {
  return rootjQuery.ready( selector );
  }
 
  if (selector.selector !== undefined) {
  this.selector = selector.selector;
  this.context = selector.context;
  }
 
  return jQuery.makeArray( selector, this );
  },
 
  // Start with an empty selector
  selector: "",
 
  // The current version of jQuery being used
  jquery: "1.5",
 
  // The default length of a jQuery object is 0
  length: 0,
 
  // The number of elements contained in the matched element set
  size: function() {
  return this.length;
  },
 
  toArray: function() {
  return slice.call( this, 0 );
  },
 
  // Get the Nth element in the matched element set OR
  // Get the whole matched element set as a clean array
  get: function( num ) {
  return num == null ?
 
  // Return a 'clean' array
  this.toArray() :
 
  // Return just the object
  ( num < 0 ? this[ this.length + num ] : this[ num ] );
  },
 
  // Take an array of elements and push it onto the stack
  // (returning the new matched element set)
  pushStack: function( elems, name, selector ) {
  // Build a new jQuery matched element set
  var ret = this.constructor();
 
  if ( jQuery.isArray( elems ) ) {
  push.apply( ret, elems );
 
  } else {
  jQuery.merge( ret, elems );
  }
 
  // Add the old object onto the stack (as a reference)
  ret.prevObject = this;
 
  ret.context = this.context;
 
  if ( name === "find" ) {
  ret.selector = this.selector + (this.selector ? " " : "") + selector;
  } else if ( name ) {
  ret.selector = this.selector + "." + name + "(" + selector + ")";
  }
 
  // Return the newly-formed element set
  return ret;
  },
 
  // Execute a callback for every element in the matched set.
  // (You can seed the arguments with an array of args, but this is
  // only used internally.)
  each: function( callback, args ) {
  return jQuery.each( this, callback, args );
  },
 
  ready: function( fn ) {
  // Attach the listeners
  jQuery.bindReady();
 
  // Add the callback
  readyList.done( fn );
 
  return this;
  },
 
  eq: function( i ) {
  return i === -1 ?
  this.slice( i ) :
  this.slice( i, +i + 1 );
  },
 
  first: function() {
  return this.eq( 0 );
  },
 
  last: function() {
  return this.eq( -1 );
  },
 
  slice: function() {
  return this.pushStack( slice.apply( this, arguments ),
  "slice", slice.call(arguments).join(",") );
  },
 
  map: function( callback ) {
  return this.pushStack( jQuery.map(this, function( elem, i ) {
  return callback.call( elem, i, elem );
  }));
  },
 
  end: function() {
  return this.prevObject || this.constructor(null);
  },
 
  // For internal use only.
  // Behaves like an Array's method, not like a jQuery method.
  push: push,
  sort: [].sort,
  splice: [].splice
  };
 
  // Give the init function the jQuery prototype for later instantiation
  jQuery.fn.init.prototype = jQuery.fn;
 
  jQuery.extend = jQuery.fn.extend = function() {
  var options, name, src, copy, copyIsArray, clone,
  target = arguments[0] || {},
  i = 1,
  length = arguments.length,
  deep = false;
 
  // Handle a deep copy situation
  if ( typeof target === "boolean" ) {
  deep = target;
  target = arguments[1] || {};
  // skip the boolean and the target
  i = 2;
  }
 
  // Handle case when target is a string or something (possible in deep copy)
  if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
  target = {};
  }
 
  // extend jQuery itself if only one argument is passed
  if ( length === i ) {
  target = this;
  --i;
  }
 
  for ( ; i < length; i++ ) {
  // Only deal with non-null/undefined values
  if ( (options = arguments[ i ]) != null ) {
  // Extend the base object
  for ( name in options ) {
  src = target[ name ];
  copy = options[ name ];
 
  // Prevent never-ending loop
  if ( target === copy ) {
  continue;
  }
 
  // Recurse if we're merging plain objects or arrays
  if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
  if ( copyIsArray ) {
  copyIsArray = false;
  clone = src && jQuery.isArray(src) ? src : [];
 
  } else {
  clone = src && jQuery.isPlainObject(src) ? src : {};
  }
 
  // Never move original objects, clone them
  target[ name ] = jQuery.extend( deep, clone, copy );
 
  // Don't bring in undefined values
  } else if ( copy !== undefined ) {
  target[ name ] = copy;
  }
  }
  }
  }
 
  // Return the modified object
  return target;
  };
 
  jQuery.extend({
  noConflict: function( deep ) {
  window.$ = _$;
 
  if ( deep ) {
  window.jQuery = _jQuery;
  }
 
  return jQuery;
  },
 
  // Is the DOM ready to be used? Set to true once it occurs.
  isReady: false,
 
  // A counter to track how many items to wait for before
  // the ready event fires. See #6781
  readyWait: 1,
 
  // Handle when the DOM is ready
  ready: function( wait ) {
  // A third-party is pushing the ready event forwards
  if ( wait === true ) {
  jQuery.readyWait--;
  }
 
  // Make sure that the DOM is not already loaded
  if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
  // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
  if ( !document.body ) {
  return setTimeout( jQuery.ready, 1 );
  }
 
  // Remember that the DOM is ready
  jQuery.isReady = true;
 
  // If a normal DOM Ready event fired, decrement, and wait if need be
  if ( wait !== true && --jQuery.readyWait > 0 ) {
  return;
  }
 
  // If there are functions bound, to execute
  readyList.resolveWith( document, [ jQuery ] );
 
  // Trigger any bound ready events
  if ( jQuery.fn.trigger ) {
  jQuery( document ).trigger( "ready" ).unbind( "ready" );
  }
  }
  },
 
  bindReady: function() {
  if ( readyBound ) {
  return;
  }
 
  readyBound = true;
 
  // Catch cases where $(document).ready() is called after the
  // browser event has already occurred.
  if ( document.readyState === "complete" ) {
  // Handle it asynchronously to allow scripts the opportunity to delay ready
  return setTimeout( jQuery.ready, 1 );
  }
 
  // Mozilla, Opera and webkit nightlies currently support this event
  if ( document.addEventListener ) {
  // Use the handy event callback
  document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
  // A fallback to window.onload, that will always work
  window.addEventListener( "load", jQuery.ready, false );
 
  // If IE event model is used
  } else if ( document.attachEvent ) {
  // ensure firing before onload,
  // maybe late but safe also for iframes
  document.attachEvent("onreadystatechange", DOMContentLoaded);
 
  // A fallback to window.onload, that will always work
  window.attachEvent( "onload", jQuery.ready );
 
  // If IE and not a frame
  // continually check to see if the document is ready
  var toplevel = false;
 
  try {
  toplevel = window.frameElement == null;
  } catch(e) {}
 
  if ( document.documentElement.doScroll && toplevel ) {
  doScrollCheck();
  }
  }
  },
 
  // See test/unit/core.js for details concerning isFunction.
  // Since version 1.3, DOM methods and functions like alert
  // aren't supported. They return false on IE (#2968).
  isFunction: function( obj ) {
  return jQuery.type(obj) === "function";
  },
 
  isArray: Array.isArray || function( obj ) {
  return jQuery.type(obj) === "array";
  },
 
  // A crude way of determining if an object is a window
  isWindow: function( obj ) {
  return obj && typeof obj === "object" && "setInterval" in obj;
  },
 
  isNaN: function( obj ) {
  return obj == null || !rdigit.test( obj ) || isNaN( obj );
  },
 
  type: function( obj ) {
  return obj == null ?
  String( obj ) :
  class2type[ toString.call(obj) ] || "object";
  },
 
  isPlainObject: function( obj ) {
  // Must be an Object.
  // Because of IE, we also have to check the presence of the constructor property.
  // Make sure that DOM nodes and window objects don't pass through, as well
  if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
  return false;
  }
 
  // Not own constructor property must be Object
  if ( obj.constructor &&
  !hasOwn.call(obj, "constructor") &&
  !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
  return false;
  }
 
  // Own properties are enumerated firstly, so to speed up,
  // if last one is own, then all properties are own.
 
  var key;
  for ( key in obj ) {}
 
  return key === undefined || hasOwn.call( obj, key );
  },
 
  isEmptyObject: function( obj ) {
  for ( var name in obj ) {
  return false;
  }
  return true;
  },
 
  error: function( msg ) {
  throw msg;
  },
 
  parseJSON: function( data ) {
  if ( typeof data !== "string" || !data ) {
  return null;
  }
 
  // Make sure leading/trailing whitespace is removed (IE can't handle it)
  data = jQuery.trim( data );
 
  // Make sure the incoming data is actual JSON
  // Logic borrowed from http://json.org/json2.js
  if ( rvalidchars.test(data.replace(rvalidescape, "@")
  .replace(rvalidtokens, "]")
  .replace(rvalidbraces, "")) ) {
 
  // Try to use the native JSON parser first
  return window.JSON && window.JSON.parse ?
  window.JSON.parse( data ) :
  (new Function("return " + data))();
 
  } else {
  jQuery.error( "Invalid JSON: " + data );
  }
  },
 
  // Cross-browser xml parsing
  // (xml & tmp used internally)
  parseXML: function( data , xml , tmp ) {
 
  if ( window.DOMParser ) { // Standard
  tmp = new DOMParser();
  xml = tmp.parseFromString( data , "text/xml" );
  } else { // IE
  xml = new ActiveXObject( "Microsoft.XMLDOM" );
  xml.async = "false";
  xml.loadXML( data );
  }
 
  tmp = xml.documentElement;
 
  if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
  jQuery.error( "Invalid XML: " + data );
  }
 
  return xml;
  },
 
  noop: function() {},
 
  // Evalulates a script in a global context
  globalEval: function( data ) {
  if ( data && rnotwhite.test(data) ) {
  // Inspired by code by Andrea Giammarchi
  // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
  var head = document.getElementsByTagName("head")[0] || document.documentElement,
  script = document.createElement("script");
 
  script.type = "text/javascript";
 
  if ( jQuery.support.scriptEval() ) {
  script.appendChild( document.createTextNode( data ) );
  } else {
  script.text = data;
  }
 
  // Use insertBefore instead of appendChild to circumvent an IE6 bug.
  // This arises when a base node is used (#2709).
  head.insertBefore( script, head.firstChild );
  head.removeChild( script );
  }
  },
 
  nodeName: function( elem, name ) {
  return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
  },
 
  // args is for internal usage only
  each: function( object, callback, args ) {
  var name, i = 0,
  length = object.length,
  isObj = length === undefined || jQuery.isFunction(object);
 
  if ( args ) {
  if ( isObj ) {
  for ( name in object ) {
  if ( callback.apply( object[ name ], args ) === false ) {
  break;
  }
  }
  } else {
  for ( ; i < length; ) {
  if ( callback.apply( object[ i++ ], args ) === false ) {
  break;
  }
  }
  }
 
  // A special, fast, case for the most common use of each
  } else {
  if ( isObj ) {
  for ( name in object ) {
  if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
  break;
  }
  }
  } else {
  for ( var value = object[0];
  i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
  }
  }
 
  return object;
  },
 
  // Use native String.trim function wherever possible
  trim: trim ?
  function( text ) {
  return text == null ?
  "" :
  trim.call( text );
  } :
 
  // Otherwise use our own trimming functionality
  function( text ) {
  return text == null ?
  "" :
  text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
  },
 
  // results is for internal usage only
  makeArray: function( array, results ) {
  var ret = results || [];
 
  if ( array != null ) {
  // The window, strings (and functions) also have 'length'
  // The extra typeof function check is to prevent crashes
  // in Safari 2 (See: #3039)
  // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
  var type = jQuery.type(array);
 
  if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
  push.call( ret, array );
  } else {
  jQuery.merge( ret, array );
  }
  }
 
  return ret;
  },
 
  inArray: function( elem, array ) {
  if ( array.indexOf ) {
  return array.indexOf( elem );
  }
 
  for ( var i = 0, length = array.length; i < length; i++ ) {
  if ( array[ i ] === elem ) {
  return i;
  }
  }
 
  return -1;
  },
 
  merge: function( first, second ) {
  var i = first.length,
  j = 0;
 
  if ( typeof second.length === "number" ) {
  for ( var l = second.length; j < l; j++ ) {
  first[ i++ ] = second[ j ];
  }
 
  } else {
  while ( second[j] !== undefined ) {
  first[ i++ ] = second[ j++ ];
  }
  }
 
  first.length = i;
 
  return first;
  },
 
  grep: function( elems, callback, inv ) {
  var ret = [], retVal;
  inv = !!inv;
 
  // Go through the array, only saving the items
  // that pass the validator function
  for ( var i = 0, length = elems.length; i < length; i++ ) {
  retVal = !!callback( elems[ i ], i );
  if ( inv !== retVal ) {
  ret.push( elems[ i ] );
  }
  }
 
  return ret;
  },
 
  // arg is for internal usage only
  map: function( elems, callback, arg ) {
  var ret = [], value;
 
  // Go through the array, translating each of the items to their
  // new value (or values).
  for ( var i = 0, length = elems.length; i < length; i++ ) {
  value = callback( elems[ i ], i, arg );
 
  if ( value != null ) {
  ret[ ret.length ] = value;
  }
  }
 
  // Flatten any nested arrays
  return ret.concat.apply( [], ret );
  },
 
  // A global GUID counter for objects
  guid: 1,
 
  proxy: function( fn, proxy, thisObject ) {
  if ( arguments.length === 2 ) {
  if ( typeof proxy === "string" ) {
  thisObject = fn;
  fn = thisObject[ proxy ];
  proxy = undefined;
 
  } else if ( proxy && !jQuery.isFunction( proxy ) ) {
  thisObject = proxy;
  proxy = undefined;
  }
  }
 
  if ( !proxy && fn ) {
  proxy = function() {
  return fn.apply( thisObject || this, arguments );
  };
  }
 
  // Set the guid of unique handler to the same of original handler, so it can be removed
  if ( fn ) {
  proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
  }
 
  // So proxy can be declared as an argument
  return proxy;
  },
 
  // Mutifunctional method to get and set values to a collection
  // The value/s can be optionally by executed if its a function
  access: function( elems, key, value, exec, fn, pass ) {
  var length = elems.length;
 
  // Setting many attributes
  if ( typeof key === "object" ) {
  for ( var k in key ) {
  jQuery.access( elems, k, key[k], exec, fn, value );
  }
  return elems;
  }
 
  // Setting one attribute
  if ( value !== undefined ) {
  // Optionally, function values get executed if exec is true
  exec = !pass && exec && jQuery.isFunction(value);
 
  for ( var i = 0; i < length; i++ ) {
  fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
  }
 
  return elems;
  }
 
  // Getting an attribute
  return length ? fn( elems[0], key ) : undefined;
  },
 
  now: function() {
  return (new Date()).getTime();
  },
 
  // Create a simple deferred (one callbacks list)
  _Deferred: function() {
  var // callbacks list
  callbacks = [],
  // stored [ context , args ]
  fired,
  // to avoid firing when already doing so
  firing,
  // flag to know if the deferred has been cancelled
  cancelled,
  // the deferred itself
  deferred = {
 
  // done( f1, f2, ...)
  done: function() {
  if ( !cancelled ) {
  var args = arguments,
  i,
  length,
  elem,
  type,
  _fired;
  if ( fired ) {
  _fired = fired;
  fired = 0;
  }
  for ( i = 0, length = args.length; i < length; i++ ) {
  elem = args[ i ];
  type = jQuery.type( elem );
  if ( type === "array" ) {
  deferred.done.apply( deferred, elem );
  } else if ( type === "function" ) {
  callbacks.push( elem );
  }
  }
  if ( _fired ) {
  deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
  }
  }
  return this;
  },
 
  // resolve with given context and args
  resolveWith: function( context, args ) {
  if ( !cancelled && !fired && !firing ) {
  firing = 1;
  try {
  while( callbacks[ 0 ] ) {
  callbacks.shift().apply( context, args );
  }
  }
  finally {
  fired = [ context, args ];
  firing = 0;
  }
  }
  return this;
  },
 
  // resolve with this as context and given arguments
  resolve: function() {
  deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
  return this;
  },
 
  // Has this deferred been resolved?
  isResolved: function() {
  return !!( firing || fired );
  },
 
  // Cancel
  cancel: function() {
  cancelled = 1;
  callbacks = [];
  return this;
  }
  };
 
  return deferred;
  },
 
  // Full fledged deferred (two callbacks list)
  Deferred: function( func ) {
  var deferred = jQuery._Deferred(),
  failDeferred = jQuery._Deferred(),
  promise;
  // Add errorDeferred methods, then and promise
  jQuery.extend( deferred, {
  then: function( doneCallbacks, failCallbacks ) {
  deferred.done( doneCallbacks ).fail( failCallbacks );
  return this;
  },
  fail: failDeferred.done,
  rejectWith: failDeferred.resolveWith,
  reject: failDeferred.resolve,
  isRejected: failDeferred.isResolved,
  // Get a promise for this deferred
  // If obj is provided, the promise aspect is added to the object
  promise: function( obj , i /* internal */ ) {
  if ( obj == null ) {
  if ( promise ) {
  return promise;
  }
  promise = obj = {};
  }
  i = promiseMethods.length;
  while( i-- ) {
  obj[ promiseMethods[ i ] ] = deferred[ promiseMethods[ i ] ];
  }
  return obj;
  }
  } );
  // Make sure only one callback list will be used
  deferred.then( failDeferred.cancel, deferred.cancel );
  // Unexpose cancel
  delete deferred.cancel;
  // Call given func if any
  if ( func ) {
  func.call( deferred, deferred );
  }
  return deferred;
  },
 
  // Deferred helper
  when: function( object ) {
  var args = arguments,
  length = args.length,
  deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ?
  object :
  jQuery.Deferred(),
  promise = deferred.promise(),
  resolveArray;
 
  if ( length > 1 ) {
  resolveArray = new Array( length );
  jQuery.each( args, function( index, element ) {
  jQuery.when( element ).then( function( value ) {
  resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
  if( ! --length ) {
  deferred.resolveWith( promise, resolveArray );
  }
  }, deferred.reject );
  } );
  } else if ( deferred !== object ) {
  deferred.resolve( object );
  }
  return promise;
  },
 
  // Use of jQuery.browser is frowned upon.
  // More details: http://docs.jquery.com/Utilities/jQuery.browser
  uaMatch: function( ua ) {
  ua = ua.toLowerCase();
 
  var match = rwebkit.exec( ua ) ||
  ropera.exec( ua ) ||
  rmsie.exec( ua ) ||
  ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
  [];
 
  return { browser: match[1] || "", version: match[2] || "0" };
  },
 
  sub: function() {
  function jQuerySubclass( selector, context ) {
  return new jQuerySubclass.fn.init( selector, context );
  }
  jQuery.extend( true, jQuerySubclass, this );
  jQuerySubclass.superclass = this;
  jQuerySubclass.fn = jQuerySubclass.prototype = this();
  jQuerySubclass.fn.constructor = jQuerySubclass;
  jQuerySubclass.subclass = this.subclass;
  jQuerySubclass.fn.init = function init( selector, context ) {
  if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
  context = jQuerySubclass(context);
  }
 
  return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
  };
  jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
  var rootjQuerySubclass = jQuerySubclass(document);
  return jQuerySubclass;
  },
 
  browser: {}
  });
 
  // Create readyList deferred
  readyList = jQuery._Deferred();
 
  // Populate the class2type map
  jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
  });
 
  browserMatch = jQuery.uaMatch( userAgent );
  if ( browserMatch.browser ) {
  jQuery.browser[ browserMatch.browser ] = true;
  jQuery.browser.version = browserMatch.version;
  }
 
  // Deprecated, use jQuery.browser.webkit instead
  if ( jQuery.browser.webkit ) {
  jQuery.browser.safari = true;
  }
 
  if ( indexOf ) {
  jQuery.inArray = function( elem, array ) {
  return indexOf.call( array, elem );
  };
  }
 
  // IE doesn't match non-breaking spaces with \s
  if ( rnotwhite.test( "\xA0" ) ) {
  trimLeft = /^[\s\xA0]+/;
  trimRight = /[\s\xA0]+$/;
  }
 
  // All jQuery objects should point back to these
  rootjQuery = jQuery(document);
 
  // Cleanup functions for the document ready method
  if ( document.addEventListener ) {
  DOMContentLoaded = function() {
  document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  jQuery.ready();
  };
 
  } else if ( document.attachEvent ) {
  DOMContentLoaded = function() {
  // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
  if ( document.readyState === "complete" ) {
  document.detachEvent( "onreadystatechange", DOMContentLoaded );
  jQuery.ready();
  }
  };
  }
 
  // The DOM ready check for Internet Explorer
  function doScrollCheck() {
  if ( jQuery.isReady ) {
  return;
  }
 
  try {
  // If IE is used, use the trick by Diego Perini
  // http://javascript.nwbox.com/IEContentLoaded/
  document.documentElement.doScroll("left");
  } catch(e) {
  setTimeout( doScrollCheck, 1 );
  return;
  }
 
  // and execute any waiting functions
  jQuery.ready();
  }
 
  // Expose jQuery to the global object
  return (window.jQuery = window.$ = jQuery);
 
  })();
 
 
  (function() {
 
  jQuery.support = {};
 
  var div = document.createElement("div");
 
  div.style.display = "none";
  div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
 
  var all = div.getElementsByTagName("*"),
  a = div.getElementsByTagName("a")[0],
  select = document.createElement("select"),
  opt = select.appendChild( document.createElement("option") );
 
  // Can't get basic test support
  if ( !all || !all.length || !a ) {
  return;
  }
 
  jQuery.support = {
  // IE strips leading whitespace when .innerHTML is used
  leadingWhitespace: div.firstChild.nodeType === 3,
 
  // Make sure that tbody elements aren't automatically inserted
  // IE will insert them into empty tables
  tbody: !div.getElementsByTagName("tbody").length,
 
  // Make sure that link elements get serialized correctly by innerHTML
  // This requires a wrapper element in IE
  htmlSerialize: !!div.getElementsByTagName("link").length,
 
  // Get the style information from getAttribute
  // (IE uses .cssText insted)
  style: /red/.test( a.getAttribute("style") ),
 
  // Make sure that URLs aren't manipulated
  // (IE normalizes it by default)
  hrefNormalized: a.getAttribute("href") === "/a",
 
  // Make sure that element opacity exists
  // (IE uses filter instead)
  // Use a regex to work around a WebKit issue. See #5145
  opacity: /^0.55$/.test( a.style.opacity ),
 
  // Verify style float existence
  // (IE uses styleFloat instead of cssFloat)
  cssFloat: !!a.style.cssFloat,
 
  // Make sure that if no value is specified for a checkbox
  // that it defaults to "on".
  // (WebKit defaults to "" instead)
  checkOn: div.getElementsByTagName("input")[0].value === "on",
 
  // Make sure that a selected-by-default option has a working selected property.
  // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
  optSelected: opt.selected,
 
  // Will be defined later
  deleteExpando: true,
  optDisabled: false,
  checkClone: false,
  _scriptEval: null,
  noCloneEvent: true,
  boxModel: null,
  inlineBlockNeedsLayout: false,
  shrinkWrapBlocks: false,
  reliableHiddenOffsets: true
  };
 
  // Make sure that the options inside disabled selects aren't marked as disabled
  // (WebKit marks them as diabled)
  select.disabled = true;
  jQuery.support.optDisabled = !opt.disabled;
 
  jQuery.support.scriptEval = function() {
  if ( jQuery.support._scriptEval === null ) {
  var root = document.documentElement,
  script = document.createElement("script"),
  id = "script" + jQuery.now();
 
  script.type = "text/javascript";
  try {
  script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
  } catch(e) {}
 
  root.insertBefore( script, root.firstChild );
 
  // Make sure that the execution of code works by injecting a script
  // tag with appendChild/createTextNode
  // (IE doesn't support this, fails, and uses .text instead)
  if ( window[ id ] ) {
  jQuery.support._scriptEval = true;
  delete window[ id ];
  } else {
  jQuery.support._scriptEval = false;
  }
 
  root.removeChild( script );
  // release memory in IE
  root = script = id = null;
  }
 
  return jQuery.support._scriptEval;
  };
 
  // Test to see if it's possible to delete an expando from an element
  // Fails in Internet Explorer
  try {
  delete div.test;
 
  } catch(e) {
  jQuery.support.deleteExpando = false;
  }
 
  if ( div.attachEvent && div.fireEvent ) {
  div.attachEvent("onclick", function click() {
  // Cloning a node shouldn't copy over any
  // bound event handlers (IE does this)
  jQuery.support.noCloneEvent = false;
  div.detachEvent("onclick", click);
  });
  div.cloneNode(true).fireEvent("onclick");
  }
 
  div = document.createElement("div");
  div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
 
  var fragment = document.createDocumentFragment();
  fragment.appendChild( div.firstChild );
 
  // WebKit doesn't clone checked state correctly in fragments
  jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
 
  // Figure out if the W3C box model works as expected
  // document.body must exist before we can do this
  jQuery(function() {
  var div = document.createElement("div"),
  body = document.getElementsByTagName("body")[0];
 
  // Frameset documents with no body should not run this code
  if ( !body ) {
  return;
  }
 
  div.style.width = div.style.paddingLeft = "1px";
  body.appendChild( div );
  jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
 
  if ( "zoom" in div.style ) {
  // Check if natively block-level elements act like inline-block
  // elements when setting their display to 'inline' and giving
  // them layout
  // (IE < 8 does this)
  div.style.display = "inline";
  div.style.zoom = 1;
  jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
 
  // Check if elements with layout shrink-wrap their children
  // (IE 6 does this)
  div.style.display = "";
  div.innerHTML = "<div style='width:4px;'></div>";
  jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
  }
 
  div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
  var tds = div.getElementsByTagName("td");
 
  // Check if table cells still have offsetWidth/Height when they are set
  // to display:none and there are still other visible table cells in a
  // table row; if so, offsetWidth/Height are not reliable for use when
  // determining if an element has been hidden directly using
  // display:none (it is still safe to use offsets if a parent element is
  // hidden; don safety goggles and see bug #4512 for more information).
  // (only IE 8 fails this test)
  jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
 
  tds[0].style.display = "";
  tds[1].style.display = "none";
 
  // Check if empty table cells still have offsetWidth/Height
  // (IE < 8 fail this test)
  jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
  div.innerHTML = "";
 
  body.removeChild( div ).style.display = "none";
  div = tds = null;
  });
 
  // Technique from Juriy Zaytsev
  // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
  var eventSupported = function( eventName ) {
  var el = document.createElement("div");
  eventName = "on" + eventName;
 
  // We only care about the case where non-standard event systems
  // are used, namely in IE. Short-circuiting here helps us to
  // avoid an eval call (in setAttribute) which can cause CSP
  // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
  if ( !el.attachEvent ) {
  return true;
  }
 
  var isSupported = (eventName in el);
  if ( !isSupported ) {
  el.setAttribute(eventName, "return;");
  isSupported = typeof el[eventName] === "function";
  }
  el = null;
 
  return isSupported;
  };
 
  jQuery.support.submitBubbles = eventSupported("submit");
  jQuery.support.changeBubbles = eventSupported("change");
 
  // release memory in IE
  div = all = a = null;
  })();
 
 
 
  var rbrace = /^(?:\{.*\}|\[.*\])$/;
 
  jQuery.extend({
  cache: {},
 
  // Please use with caution
  uuid: 0,
 
  // Unique for each copy of jQuery on the page
  // Non-digits removed to match rinlinejQuery
  expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
 
  // The following elements throw uncatchable exceptions if you
  // attempt to add expando properties to them.
  noData: {
  "embed": true,
  // Ban all objects except for Flash (which handle expandos)
  "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
  "applet": true
  },
 
  hasData: function( elem ) {
  elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
 
  return !!elem && !jQuery.isEmptyObject(elem);
  },
 
  data: function( elem, name, data, pvt /* Internal Use Only */ ) {
  if ( !jQuery.acceptData( elem ) ) {
  return;
  }
 
  var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
 
  // We have to handle DOM nodes and JS objects differently because IE6-7
  // can't GC object references properly across the DOM-JS boundary
  isNode = elem.nodeType,
 
  // Only DOM nodes need the global jQuery cache; JS object data is
  // attached directly to the object so GC can occur automatically
  cache = isNode ? jQuery.cache : elem,
 
  // Only defining an ID for JS objects if its cache already exists allows
  // the code to shortcut on the same path as a DOM node with no cache
  id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
 
  // Avoid doing any more work than we need to when trying to get data on an
  // object that has no data at all
  if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
  return;
  }
 
  if ( !id ) {
  // Only DOM nodes need a new unique ID for each element since their data
  // ends up in the global cache
  if ( isNode ) {
  elem[ jQuery.expando ] = id = ++jQuery.uuid;
  } else {
  id = jQuery.expando;
  }
  }
 
  if ( !cache[ id ] ) {
  cache[ id ] = {};
  }
 
  // An object can be passed to jQuery.data instead of a key/value pair; this gets
  // shallow copied over onto the existing cache
  if ( typeof name === "object" ) {
  if ( pvt ) {
  cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
  } else {
  cache[ id ] = jQuery.extend(cache[ id ], name);
  }
  }
 
  thisCache = cache[ id ];
 
  // Internal jQuery data is stored in a separate object inside the object's data
  // cache in order to avoid key collisions between internal data and user-defined
  // data
  if ( pvt ) {
  if ( !thisCache[ internalKey ] ) {
  thisCache[ internalKey ] = {};
  }
 
  thisCache = thisCache[ internalKey ];
  }
 
  if ( data !== undefined ) {
  thisCache[ name ] = data;
  }
 
  // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
  // not attempt to inspect the internal events object using jQuery.data, as this
  // internal data object is undocumented and subject to change.
  if ( name === "events" && !thisCache[name] ) {
  return thisCache[ internalKey ] && thisCache[ internalKey ].events;
  }
 
  return getByName ? thisCache[ name ] : thisCache;
  },
 
  removeData: function( elem, name, pvt /* Internal Use Only */ ) {
  if ( !jQuery.acceptData( elem ) ) {
  return;
  }
 
  var internalKey = jQuery.expando, isNode = elem.nodeType,
 
  // See jQuery.data for more information
  cache = isNode ? jQuery.cache : elem,
 
  // See jQuery.data for more information
  id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
 
  // If there is already no cache entry for this object, there is no
  // purpose in continuing
  if ( !cache[ id ] ) {
  return;
  }
 
  if ( name ) {
  var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
 
  if ( thisCache ) {
  delete thisCache[ name ];
 
  // If there is no data left in the cache, we want to continue
  // and let the cache object itself get destroyed
  if ( !jQuery.isEmptyObject(thisCache) ) {
  return;
  }
  }
  }
 
  // See jQuery.data for more information
  if ( pvt ) {
  delete cache[ id ][ internalKey ];
 
  // Don't destroy the parent cache unless the internal data object
  // had been the only thing left in it
  if ( !jQuery.isEmptyObject(cache[ id ]) ) {
  return;
  }
  }
 
  var internalCache = cache[ id ][ internalKey ];
 
  // Browsers that fail expando deletion also refuse to delete expandos on
  // the window, but it will allow it on all other JS objects; other browsers
  // don't care
  if ( jQuery.support.deleteExpando || cache != window ) {
  delete cache[ id ];
  } else {
  cache[ id ] = null;
  }
 
  // We destroyed the entire user cache at once because it's faster than
  // iterating through each key, but we need to continue to persist internal
  // data if it existed
  if ( internalCache ) {
  cache[ id ] = {};
  cache[ id ][ internalKey ] = internalCache;
 
  // Otherwise, we need to eliminate the expando on the node to avoid
  // false lookups in the cache for entries that no longer exist
  } else if ( isNode ) {
  // IE does not allow us to delete expando properties from nodes,
  // nor does it have a removeAttribute function on Document nodes;
  // we must handle all of these cases
  if ( jQuery.support.deleteExpando ) {
  delete elem[ jQuery.expando ];
  } else if ( elem.removeAttribute ) {
  elem.removeAttribute( jQuery.expando );
  } else {
  elem[ jQuery.expando ] = null;
  }
  }
  },
 
  // For internal use only.
  _data: function( elem, name, data ) {
  return jQuery.data( elem, name, data, true );
  },
 
  // A method for determining if a DOM node can handle the data expando
  acceptData: function( elem ) {
  if ( elem.nodeName ) {
  var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
 
  if ( match ) {
  return !(match === true || elem.getAttribute("classid") !== match);
  }
  }
 
  return true;
  }
  });
 
  jQuery.fn.extend({
  data: function( key, value ) {
  var data = null;
 
  if ( typeof key === "undefined" ) {
  if ( this.length ) {
  data = jQuery.data( this[0] );
 
  if ( this[0].nodeType === 1 ) {
  var attr = this[0].attributes, name;
  for ( var i = 0, l = attr.length; i < l; i++ ) {
  name = attr[i].name;
 
  if ( name.indexOf( "data-" ) === 0 ) {
  name = name.substr( 5 );
  dataAttr( this[0], name, data[ name ] );
  }
  }
  }
  }
 
  return data;
 
  } else if ( typeof key === "object" ) {
  return this.each(function() {
  jQuery.data( this, key );
  });
  }
 
  var parts = key.split(".");
  parts[1] = parts[1] ? "." + parts[1] : "";
 
  if ( value === undefined ) {
  data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
 
  // Try to fetch any internally stored data first
  if ( data === undefined && this.length ) {
  data = jQuery.data( this[0], key );
  data = dataAttr( this[0], key, data );
  }
 
  return data === undefined && parts[1] ?
  this.data( parts[0] ) :
  data;
 
  } else {
  return this.each(function() {
  var $this = jQuery( this ),
  args = [ parts[0], value ];
 
  $this.triggerHandler( "setData" + parts[1] + "!", args );
  jQuery.data( this, key, value );
  $this.triggerHandler( "changeData" + parts[1] + "!", args );
  });
  }
  },
 
  removeData: function( key ) {
  return this.each(function() {
  jQuery.removeData( this, key );
  });
  }
  });
 
  function dataAttr( elem, key, data ) {
  // If nothing was found internally, try to fetch any
  // data from the HTML5 data-* attribute
  if ( data === undefined && elem.nodeType === 1 ) {
  data = elem.getAttribute( "data-" + key );
 
  if ( typeof data === "string" ) {
  try {
  data = data === "true" ? true :
  data === "false" ? false :
  data === "null" ? null :
  !jQuery.isNaN( data ) ? parseFloat( data ) :
  rbrace.test( data ) ? jQuery.parseJSON( data ) :
  data;
  } catch( e ) {}
 
  // Make sure we set the data so it isn't changed later
  jQuery.data( elem, key, data );
 
  } else {
  data = undefined;
  }
  }
 
  return data;
  }
 
 
 
 
  jQuery.extend({
  queue: function( elem, type, data ) {
  if ( !elem ) {
  return;
  }
 
  type = (type || "fx") + "queue";
  var q = jQuery._data( elem, type );
 
  // Speed up dequeue by getting out quickly if this is just a lookup
  if ( !data ) {
  return q || [];
  }
 
  if ( !q || jQuery.isArray(data) ) {
  q = jQuery._data( elem, type, jQuery.makeArray(data) );
 
  } else {
  q.push( data );
  }
 
  return q;
  },
 
  dequeue: function( elem, type ) {
  type = type || "fx";
 
  var queue = jQuery.queue( elem, type ),
  fn = queue.shift();
 
  // If the fx queue is dequeued, always remove the progress sentinel
  if ( fn === "inprogress" ) {
  fn = queue.shift();
  }
 
  if ( fn ) {
  // Add a progress sentinel to prevent the fx queue from being
  // automatically dequeued
  if ( type === "fx" ) {
  queue.unshift("inprogress");
  }
 
  fn.call(elem, function() {
  jQuery.dequeue(elem, type);
  });
  }
 
  if ( !queue.length ) {
  jQuery.removeData( elem, type + "queue", true );
  }
  }
  });
 
  jQuery.fn.extend({
  queue: function( type, data ) {
  if ( typeof type !== "string" ) {
  data = type;
  type = "fx";
  }
 
  if ( data === undefined ) {
  return jQuery.queue( this[0], type );
  }
  return this.each(function( i ) {
  var queue = jQuery.queue( this, type, data );
 
  if ( type === "fx" && queue[0] !== "inprogress" ) {
  jQuery.dequeue( this, type );
  }
  });
  },
  dequeue: function( type ) {
  return this.each(function() {
  jQuery.dequeue( this, type );
  });
  },
 
  // Based off of the plugin by Clint Helfers, with permission.
  // http://blindsignals.com/index.php/2009/07/jquery-delay/
  delay: function( time, type ) {
  time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
  type = type || "fx";
 
  return this.queue( type, function() {
  var elem = this;
  setTimeout(function() {
  jQuery.dequeue( elem, type );
  }, time );
  });
  },
 
  clearQueue: function( type ) {
  return this.queue( type || "fx", [] );
  }
  });
 
 
 
 
  var rclass = /[\n\t\r]/g,
  rspaces = /\s+/,
  rreturn = /\r/g,
  rspecialurl = /^(?:href|src|style)$/,
  rtype = /^(?:button|input)$/i,
  rfocusable = /^(?:button|input|object|select|textarea)$/i,
  rclickable = /^a(?:rea)?$/i,
  rradiocheck = /^(?:radio|checkbox)$/i;
 
  jQuery.props = {
  "for": "htmlFor",
  "class": "className",
  readonly: "readOnly",
  maxlength: "maxLength",
  cellspacing: "cellSpacing",
  rowspan: "rowSpan",
  colspan: "colSpan",
  tabindex: "tabIndex",
  usemap: "useMap",
  frameborder: "frameBorder"
  };
 
  jQuery.fn.extend({
  attr: function( name, value ) {
  return jQuery.access( this, name, value, true, jQuery.attr );
  },
 
  removeAttr: function( name, fn ) {
  return this.each(function(){
  jQuery.attr( this, name, "" );
  if ( this.nodeType === 1 ) {
  this.removeAttribute( name );
  }
  });
  },
 
  addClass: function( value ) {
  if ( jQuery.isFunction(value) ) {
  return this.each(function(i) {
  var self = jQuery(this);
  self.addClass( value.call(this, i, self.attr("class")) );
  });
  }
 
  if ( value && typeof value === "string" ) {
  var classNames = (value || "").split( rspaces );
 
  for ( var i = 0, l = this.length; i < l; i++ ) {
  var elem = this[i];
 
  if ( elem.nodeType === 1 ) {
  if ( !elem.className ) {
  elem.className = value;
 
  } else {
  var className = " " + elem.className + " ",
  setClass = elem.className;
 
  for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
  if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
  setClass += " " + classNames[c];
  }
  }
  elem.className = jQuery.trim( setClass );
  }
  }
  }
  }
 
  return this;
  },
 
  removeClass: function( value ) {
  if ( jQuery.isFunction(value) ) {
  return this.each(function(i) {
  var self = jQuery(this);
  self.removeClass( value.call(this, i, self.attr("class")) );
  });
  }
 
  if ( (value && typeof value === "string") || value === undefined ) {
  var classNames = (value || "").split( rspaces );
 
  for ( var i = 0, l = this.length; i < l; i++ ) {
  var elem = this[i];
 
  if ( elem.nodeType === 1 && elem.className ) {
  if ( value ) {
  var className = (" " + elem.className + " ").replace(rclass, " ");
  for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
  className = className.replace(" " + classNames[c] + " ", " ");
  }
  elem.className = jQuery.trim( className );
 
  } else {
  elem.className = "";
  }
  }
  }
  }
 
  return this;
  },
 
  toggleClass: function( value, stateVal ) {
  var type = typeof value,
  isBool = typeof stateVal === "boolean";
 
  if ( jQuery.isFunction( value ) ) {
  return this.each(function(i) {
  var self = jQuery(this);
  self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
  });
  }
 
  return this.each(function() {
  if ( type === "string" ) {
  // toggle individual class names
  var className,
  i = 0,
  self = jQuery( this ),
  state = stateVal,
  classNames = value.split( rspaces );
 
  while ( (className = classNames[ i++ ]) ) {
  // check each className given, space seperated list
  state = isBool ? state : !self.hasClass( className );
  self[ state ? "addClass" : "removeClass" ]( className );
  }
 
  } else if ( type === "undefined" || type === "boolean" ) {
  if ( this.className ) {
  // store className if set
  jQuery._data( this, "__className__", this.className );
  }
 
  // toggle whole className
  this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
  }
  });
  },
 
  hasClass: function( selector ) {
  var className = " " + selector + " ";
  for ( var i = 0, l = this.length; i < l; i++ ) {
  if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
  return true;
  }
  }
 
  return false;
  },
 
  val: function( value ) {
  if ( !arguments.length ) {
  var elem = this[0];
 
  if ( elem ) {
  if ( jQuery.nodeName( elem, "option" ) ) {
  // attributes.value is undefined in Blackberry 4.7 but
  // uses .value. See #6932
  var val = elem.attributes.value;
  return !val || val.specified ? elem.value : elem.text;
  }
 
  // We need to handle select boxes special
  if ( jQuery.nodeName( elem, "select" ) ) {
  var index = elem.selectedIndex,
  values = [],
  options = elem.options,
  one = elem.type === "select-one";
 
  // Nothing was selected
  if ( index < 0 ) {
  return null;
  }
 
  // Loop through all the selected options
  for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  var option = options[ i ];
 
  // Don't return options that are disabled or in a disabled optgroup
  if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
  (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
 
  // Get the specific value for the option
  value = jQuery(option).val();
 
  // We don't need an array for one selects
  if ( one ) {
  return value;
  }
 
  // Multi-Selects return an array
  values.push( value );
  }
  }
 
  return values;
  }
 
  // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
  if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
  return elem.getAttribute("value") === null ? "on" : elem.value;
  }
 
  // Everything else, we just grab the value
  return (elem.value || "").replace(rreturn, "");
 
  }
 
  return undefined;
  }
 
  var isFunction = jQuery.isFunction(value);
 
  return this.each(function(i) {
  var self = jQuery(this), val = value;
 
  if ( this.nodeType !== 1 ) {
  return;
  }
 
  if ( isFunction ) {
  val = value.call(this, i, self.val());
  }
 
  // Treat null/undefined as ""; convert numbers to string
  if ( val == null ) {
  val = "";
  } else if ( typeof val === "number" ) {
  val += "";
  } else if ( jQuery.isArray(val) ) {
  val = jQuery.map(val, function (value) {
  return value == null ? "" : value + "";
  });
  }
 
  if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
  this.checked = jQuery.inArray( self.val(), val ) >= 0;
 
  } else if ( jQuery.nodeName( this, "select" ) ) {
  var values = jQuery.makeArray(val);
 
  jQuery( "option", this ).each(function() {
  this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
  });
 
  if ( !values.length ) {
  this.selectedIndex = -1;
  }
 
  } else {
  this.value = val;
  }
  });
  }
  });
 
  jQuery.extend({
  attrFn: {
  val: true,
  css: true,
  html: true,
  text: true,
  data: true,
  width: true,
  height: true,
  offset: true
  },
 
  attr: function( elem, name, value, pass ) {
  // don't get/set attributes on text, comment and attribute nodes
  if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
  return undefined;
  }
 
  if ( pass && name in jQuery.attrFn ) {
  return jQuery(elem)[name](value);
  }
 
  var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
  // Whether we are setting (or getting)
  set = value !== undefined;
 
  // Try to normalize/fix the name
  name = notxml && jQuery.props[ name ] || name;
 
  // Only do all the following if this is a node (faster for style)
  if ( elem.nodeType === 1 ) {
  // These attributes require special treatment
  var special = rspecialurl.test( name );
 
  // Safari mis-reports the default selected property of an option
  // Accessing the parent's selectedIndex property fixes it
  if ( name === "selected" && !jQuery.support.optSelected ) {
  var parent = elem.parentNode;
  if ( parent ) {
  parent.selectedIndex;
 
  // Make sure that it also works with optgroups, see #5701
  if ( parent.parentNode ) {
  parent.parentNode.selectedIndex;
  }
  }
  }
 
  // If applicable, access the attribute via the DOM 0 way
  // 'in' checks fail in Blackberry 4.7 #6931
  if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
  if ( set ) {
  // We can't allow the type property to be changed (since it causes problems in IE)
  if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
  jQuery.error( "type property can't be changed" );
  }
 
  if ( value === null ) {
  if ( elem.nodeType === 1 ) {
  elem.removeAttribute( name );
  }
 
  } else {
  elem[ name ] = value;
  }
  }
 
  // browsers index elements by id/name on forms, give priority to attributes.
  if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
  return elem.getAttributeNode( name ).nodeValue;
  }
 
  // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
  // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
  if ( name === "tabIndex" ) {
  var attributeNode = elem.getAttributeNode( "tabIndex" );
 
  return attributeNode && attributeNode.specified ?
  attributeNode.value :
  rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
  0 :
  undefined;
  }
 
  return elem[ name ];
  }
 
  if ( !jQuery.support.style && notxml && name === "style" ) {
  if ( set ) {
  elem.style.cssText = "" + value;
  }
 
  return elem.style.cssText;
  }
 
  if ( set ) {
  // convert the value to a string (all browsers do this but IE) see #1070
  elem.setAttribute( name, "" + value );
  }
 
  // Ensure that missing attributes return undefined
  // Blackberry 4.7 returns "" from getAttribute #6938
  if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
  return undefined;
  }
 
  var attr = !jQuery.support.hrefNormalized && notxml && special ?
  // Some attributes require a special call on IE
  elem.getAttribute( name, 2 ) :
  elem.getAttribute( name );
 
  // Non-existent attributes return null, we normalize to undefined
  return attr === null ? undefined : attr;
  }
  // Handle everything which isn't a DOM element node
  if ( set ) {
  elem[ name ] = value;
  }
  return elem[ name ];
  }
  });
 
 
 
 
  var rnamespaces = /\.(.*)$/,
  rformElems = /^(?:textarea|input|select)$/i,
  rperiod = /\./g,
  rspace = / /g,
  rescape = /[^\w\s.|`]/g,
  fcleanup = function( nm ) {
  return nm.replace(rescape, "\\$&");
  },
  eventKey = "events";
 
  /*
  * A number of helper functions used for managing events.
  * Many of the ideas behind this code originated from
  * Dean Edwards' addEvent library.
  */
  jQuery.event = {
 
  // Bind an event to an element
  // Original by Dean Edwards
  add: function( elem, types, handler, data ) {
  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
  return;
  }
 
  // For whatever reason, IE has trouble passing the window object
  // around, causing it to be cloned in the process
  if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
  elem = window;
  }
 
  if ( handler === false ) {
  handler = returnFalse;
  } else if ( !handler ) {
  // Fixes bug #7229. Fix recommended by jdalton
  return;
  }
 
  var handleObjIn, handleObj;
 
  if ( handler.handler ) {
  handleObjIn = handler;
  handler = handleObjIn.handler;
  }
 
  // Make sure that the function being executed has a unique ID
  if ( !handler.guid ) {
  handler.guid = jQuery.guid++;
  }
 
  // Init the element's event structure
  var elemData = jQuery._data( elem );
 
  // If no elemData is found then we must be trying to bind to one of the
  // banned noData elements
  if ( !elemData ) {
  return;
  }
 
  var events = elemData[ eventKey ],
  eventHandle = elemData.handle;
 
  if ( typeof events === "function" ) {
  // On plain objects events is a fn that holds the the data
  // which prevents this data from being JSON serialized
  // the function does not need to be called, it just contains the data
  eventHandle = events.handle;
  events = events.events;
 
  } else if ( !events ) {
  if ( !elem.nodeType ) {
  // On plain objects, create a fn that acts as the holder
  // of the values to avoid JSON serialization of event data
  elemData[ eventKey ] = elemData = function(){};
  }
 
  elemData.events = events = {};
  }
 
  if ( !eventHandle ) {
  elemData.handle = eventHandle = function() {
  // Handle the second event of a trigger and when
  // an event is called after a page has unloaded
  return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
  jQuery.event.handle.apply( eventHandle.elem, arguments ) :
  undefined;
  };
  }
 
  // Add elem as a property of the handle function
  // This is to prevent a memory leak with non-native events in IE.
  eventHandle.elem = elem;
 
  // Handle multiple events separated by a space
  // jQuery(...).bind("mouseover mouseout", fn);
  types = types.split(" ");
 
  var type, i = 0, namespaces;
 
  while ( (type = types[ i++ ]) ) {
  handleObj = handleObjIn ?
  jQuery.extend({}, handleObjIn) :
  { handler: handler, data: data };
 
  // Namespaced event handlers
  if ( type.indexOf(".") > -1 ) {
  namespaces = type.split(".");
  type = namespaces.shift();
  handleObj.namespace = namespaces.slice(0).sort().join(".");
 
  } else {
  namespaces = [];
  handleObj.namespace = "";
  }
 
  handleObj.type = type;
  if ( !handleObj.guid ) {
  handleObj.guid = handler.guid;
  }
 
  // Get the current list of functions bound to this event
  var handlers = events[ type ],
  special = jQuery.event.special[ type ] || {};
 
  // Init the event handler queue
  if ( !handlers ) {
  handlers = events[ type ] = [];
 
  // Check for a special event handler
  // Only use addEventListener/attachEvent if the special
  // events handler returns false
  if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
  // Bind the global event handler to the element
  if ( elem.addEventListener ) {
  elem.addEventListener( type, eventHandle, false );
 
  } else if ( elem.attachEvent ) {
  elem.attachEvent( "on" + type, eventHandle );
  }
  }
  }
 
  if ( special.add ) {
  special.add.call( elem, handleObj );
 
  if ( !handleObj.handler.guid ) {
  handleObj.handler.guid = handler.guid;
  }
  }
 
  // Add the function to the element's handler list
  handlers.push( handleObj );
 
  // Keep track of which events have been used, for global triggering
  jQuery.event.global[ type ] = true;
  }
 
  // Nullify elem to prevent memory leaks in IE
  elem = null;
  },
 
  global: {},
 
  // Detach an event or set of events from an element
  remove: function( elem, types, handler, pos ) {
  // don't do events on text and comment nodes
  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
  return;
  }
 
  if ( handler === false ) {
  handler = returnFalse;
  }
 
  var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
  elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
  events = elemData && elemData[ eventKey ];
 
  if ( !elemData || !events ) {
  return;
  }
 
  if ( typeof events === "function" ) {
  elemData = events;
  events = events.events;
  }
 
  // types is actually an event object here
  if ( types && types.type ) {
  handler = types.handler;
  types = types.type;
  }
 
  // Unbind all events for the element
  if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
  types = types || "";
 
  for ( type in events ) {
  jQuery.event.remove( elem, type + types );
  }
 
  return;
  }
 
  // Handle multiple events separated by a space
  // jQuery(...).unbind("mouseover mouseout", fn);
  types = types.split(" ");
 
  while ( (type = types[ i++ ]) ) {
  origType = type;
  handleObj = null;
  all = type.indexOf(".") < 0;
  namespaces = [];
 
  if ( !all ) {
  // Namespaced event handlers
  namespaces = type.split(".");
  type = namespaces.shift();
 
  namespace = new RegExp("(^|\\.)" +
  jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
  }
 
  eventType = events[ type ];
 
  if ( !eventType ) {
  continue;
  }
 
  if ( !handler ) {
  for ( j = 0; j < eventType.length; j++ ) {
  handleObj = eventType[ j ];
 
  if ( all || namespace.test( handleObj.namespace ) ) {
  jQuery.event.remove( elem, origType, handleObj.handler, j );
  eventType.splice( j--, 1 );
  }
  }
 
  continue;
  }
 
  special = jQuery.event.special[ type ] || {};
 
  for ( j = pos || 0; j < eventType.length; j++ ) {
  handleObj = eventType[ j ];
 
  if ( handler.guid === handleObj.guid ) {
  // remove the given handler for the given type
  if ( all || namespace.test( handleObj.namespace ) ) {
  if ( pos == null ) {
  eventType.splice( j--, 1 );
  }
 
  if ( special.remove ) {
  special.remove.call( elem, handleObj );
  }
  }
 
  if ( pos != null ) {
  break;
  }
  }
  }
 
  // remove generic event handler if no more handlers exist
  if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
  if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
  jQuery.removeEvent( elem, type, elemData.handle );
  }
 
  ret = null;
  delete events[ type ];
  }
  }
 
  // Remove the expando if it's no longer used
  if ( jQuery.isEmptyObject( events ) ) {
  var handle = elemData.handle;
  if ( handle ) {
  handle.elem = null;
  }
 
  delete elemData.events;
  delete elemData.handle;
 
  if ( typeof elemData === "function" ) {
  jQuery.removeData( elem, eventKey, true );
 
  } else if ( jQuery.isEmptyObject( elemData ) ) {
  jQuery.removeData( elem, undefined, true );
  }
  }
  },
 
  // bubbling is internal
  trigger: function( event, data, elem /*, bubbling */ ) {
  // Event object or event type
  var type = event.type || event,
  bubbling = arguments[3];
 
  if ( !bubbling ) {
  event = typeof event === "object" ?
  // jQuery.Event object
  event[ jQuery.expando ] ? event :
  // Object literal
  jQuery.extend( jQuery.Event(type), event ) :
  // Just the event type (string)
  jQuery.Event(type);
 
  if ( type.indexOf("!") >= 0 ) {
  event.type = type = type.slice(0, -1);
  event.exclusive = true;
  }
 
  // Handle a global trigger
  if ( !elem ) {
  // Don't bubble custom events when global (to avoid too much overhead)
  event.stopPropagation();
 
  // Only trigger if we've ever bound an event for it
  if ( jQuery.event.global[ type ] ) {
  // XXX This code smells terrible. event.js should not be directly
  // inspecting the data cache
  jQuery.each( jQuery.cache, function() {
  // internalKey variable is just used to make it easier to find
  // and potentially change this stuff later; currently it just
  // points to jQuery.expando
  var internalKey = jQuery.expando,
  internalCache = this[ internalKey ];
  if ( internalCache && internalCache.events && internalCache.events[type] ) {
  jQuery.event.trigger( event, data, internalCache.handle.elem );
  }
  });
  }
  }
 
  // Handle triggering a single element
 
  // don't do events on text and comment nodes
  if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
  return undefined;
  }
 
  // Clean up in case it is reused
  event.result = undefined;
  event.target = elem;
 
  // Clone the incoming data, if any
  data = jQuery.makeArray( data );
  data.unshift( event );
  }
 
  event.currentTarget = elem;
 
  // Trigger the event, it is assumed that "handle" is a function
  var handle = elem.nodeType ?
  jQuery._data( elem, "handle" ) :
  (jQuery._data( elem, eventKey ) || {}).handle;
 
  if ( handle ) {
  handle.apply( elem, data );
  }
 
  var parent = elem.parentNode || elem.ownerDocument;
 
  // Trigger an inline bound script
  try {
  if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
  if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
  event.result = false;
  event.preventDefault();
  }
  }
 
  // prevent IE from throwing an error for some elements with some event types, see #3533
  } catch (inlineError) {}
 
  if ( !event.isPropagationStopped() && parent ) {
  jQuery.event.trigger( event, data, parent, true );
 
  } else if ( !event.isDefaultPrevented() ) {
  var old,
  target = event.target,
  targetType = type.replace( rnamespaces, "" ),
  isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
  special = jQuery.event.special[ targetType ] || {};
 
  if ( (!special._default || special._default.call( elem, event ) === false) &&
  !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
 
  try {
  if ( target[ targetType ] ) {
  // Make sure that we don't accidentally re-trigger the onFOO events
  old = target[ "on" + targetType ];
 
  if ( old ) {
  target[ "on" + targetType ] = null;
  }
 
  jQuery.event.triggered = true;
  target[ targetType ]();
  }
 
  // prevent IE from throwing an error for some elements with some event types, see #3533
  } catch (triggerError) {}
 
  if ( old ) {
  target[ "on" + targetType ] = old;
  }
 
  jQuery.event.triggered = false;
  }
  }
  },
 
  handle: function( event ) {
  var all, handlers, namespaces, namespace_re, events,
  namespace_sort = [],
  args = jQuery.makeArray( arguments );
 
  event = args[0] = jQuery.event.fix( event || window.event );
  event.currentTarget = this;
 
  // Namespaced event handlers
  all = event.type.indexOf(".") < 0 && !event.exclusive;
 
  if ( !all ) {
  namespaces = event.type.split(".");
  event.type = namespaces.shift();
  namespace_sort = namespaces.slice(0).sort();
  namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
  }
 
  event.namespace = event.namespace || namespace_sort.join(".");
 
  events = jQuery._data(this, eventKey);
 
  if ( typeof events === "function" ) {
  events = events.events;
  }
 
  handlers = (events || {})[ event.type ];
 
  if ( events && handlers ) {
  // Clone the handlers to prevent manipulation
  handlers = handlers.slice(0);
 
  for ( var j = 0, l = handlers.length; j < l; j++ ) {
  var handleObj = handlers[ j ];
 
  // Filter the functions by class
  if ( all || namespace_re.test( handleObj.namespace ) ) {
  // Pass in a reference to the handler function itself
  // So that we can later remove it
  event.handler = handleObj.handler;
  event.data = handleObj.data;
  event.handleObj = handleObj;
 
  var ret = handleObj.handler.apply( this, args );
 
  if ( ret !== undefined ) {
  event.result = ret;
  if ( ret === false ) {
  event.preventDefault();
  event.stopPropagation();
  }
  }
 
  if ( event.isImmediatePropagationStopped() ) {
  break;
  }
  }
  }
  }
 
  return event.result;
  },
 
  props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
 
  fix: function( event ) {
  if ( event[ jQuery.expando ] ) {
  return event;
  }
 
  // store a copy of the original event object
  // and "clone" to set read-only properties
  var originalEvent = event;
  event = jQuery.Event( originalEvent );
 
  for ( var i = this.props.length, prop; i; ) {
  prop = this.props[ --i ];
  event[ prop ] = originalEvent[ prop ];
  }
 
  // Fix target property, if necessary
  if ( !event.target ) {
  // Fixes #1925 where srcElement might not be defined either
  event.target = event.srcElement || document;
  }
 
  // check if target is a textnode (safari)
  if ( event.target.nodeType === 3 ) {
  event.target = event.target.parentNode;
  }
 
  // Add relatedTarget, if necessary
  if ( !event.relatedTarget && event.fromElement ) {
  event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
  }
 
  // Calculate pageX/Y if missing and clientX/Y available
  if ( event.pageX == null && event.clientX != null ) {
  var doc = document.documentElement,
  body = document.body;
 
  event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
  event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
  }
 
  // Add which for key events
  if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
  event.which = event.charCode != null ? event.charCode : event.keyCode;
  }
 
  // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
  if ( !event.metaKey && event.ctrlKey ) {
  event.metaKey = event.ctrlKey;
  }
 
  // Add which for click: 1 === left; 2 === middle; 3 === right
  // Note: button is not normalized, so don't use it
  if ( !event.which && event.button !== undefined ) {
  event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
  }
 
  return event;
  },
 
  // Deprecated, use jQuery.guid instead
  guid: 1E8,
 
  // Deprecated, use jQuery.proxy instead
  proxy: jQuery.proxy,
 
  special: {
  ready: {
  // Make sure the ready event is setup
  setup: jQuery.bindReady,
  teardown: jQuery.noop
  },
 
  live: {
  add: function( handleObj ) {
  jQuery.event.add( this,
  liveConvert( handleObj.origType, handleObj.selector ),
  jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
  },
 
  remove: function( handleObj ) {
  jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
  }
  },
 
  beforeunload: {
  setup: function( data, namespaces, eventHandle ) {
  // We only want to do this special case on windows
  if ( jQuery.isWindow( this ) ) {
  this.onbeforeunload = eventHandle;
  }
  },
 
  teardown: function( namespaces, eventHandle ) {
  if ( this.onbeforeunload === eventHandle ) {
  this.onbeforeunload = null;
  }
  }
  }
  }
  };
 
  jQuery.removeEvent = document.removeEventListener ?
  function( elem, type, handle ) {
  if ( elem.removeEventListener ) {
  elem.removeEventListener( type, handle, false );
  }
  } :
  function( elem, type, handle ) {
  if ( elem.detachEvent ) {
  elem.detachEvent( "on" + type, handle );
  }
  };
 
  jQuery.Event = function( src ) {
  // Allow instantiation without the 'new' keyword
  if ( !this.preventDefault ) {
  return new jQuery.Event( src );
  }
 
  // Event object
  if ( src && src.type ) {
  this.originalEvent = src;
  this.type = src.type;
 
  // Events bubbling up the document may have been marked as prevented
  // by a handler lower down the tree; reflect the correct value.
  this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
  src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
 
  // Event type
  } else {
  this.type = src;
  }
 
  // timeStamp is buggy for some events on Firefox(#3843)
  // So we won't rely on the native value
  this.timeStamp = jQuery.now();
 
  // Mark it as fixed
  this[ jQuery.expando ] = true;
  };
 
  function returnFalse() {
  return false;
  }
  function returnTrue() {
  return true;
  }
 
  // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
  // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
  jQuery.Event.prototype = {
  preventDefault: function() {
  this.isDefaultPrevented = returnTrue;
 
  var e = this.originalEvent;
  if ( !e ) {
  return;
  }
 
  // if preventDefault exists run it on the original event
  if ( e.preventDefault ) {
  e.preventDefault();
 
  // otherwise set the returnValue property of the original event to false (IE)
  } else {
  e.returnValue = false;
  }
  },
  stopPropagation: function() {
  this.isPropagationStopped = returnTrue;
 
  var e = this.originalEvent;
  if ( !e ) {
  return;
  }
  // if stopPropagation exists run it on the original event
  if ( e.stopPropagation ) {
  e.stopPropagation();
  }
  // otherwise set the cancelBubble property of the original event to true (IE)
  e.cancelBubble = true;
  },
  stopImmediatePropagation: function() {
  this.isImmediatePropagationStopped = returnTrue;
  this.stopPropagation();
  },
  isDefaultPrevented: returnFalse,
  isPropagationStopped: returnFalse,
  isImmediatePropagationStopped: returnFalse
  };
 
  // Checks if an event happened on an element within another element
  // Used in jQuery.event.special.mouseenter and mouseleave handlers
  var withinElement = function( event ) {
  // Check if mouse(over|out) are still within the same parent element
  var parent = event.relatedTarget;
 
  // Firefox sometimes assigns relatedTarget a XUL element
  // which we cannot access the parentNode property of
  try {
  // Traverse up the tree
  while ( parent && parent !== this ) {
  parent = parent.parentNode;
  }
 
  if ( parent !== this ) {
  // set the correct event type
  event.type = event.data;
 
  // handle event if we actually just moused on to a non sub-element
  jQuery.event.handle.apply( this, arguments );
  }
 
  // assuming we've left the element since we most likely mousedover a xul element
  } catch(e) { }
  },
 
  // In case of event delegation, we only need to rename the event.type,
  // liveHandler will take care of the rest.
  delegate = function( event ) {
  event.type = event.data;
  jQuery.event.handle.apply( this, arguments );
  };
 
  // Create mouseenter and mouseleave events
  jQuery.each({
  mouseenter: "mouseover",
  mouseleave: "mouseout"
  }, function( orig, fix ) {
  jQuery.event.special[ orig ] = {
  setup: function( data ) {
  jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
  },
  teardown: function( data ) {
  jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
  }
  };
  });
 
  // submit delegation
  if ( !jQuery.support.submitBubbles ) {
 
  jQuery.event.special.submit = {
  setup: function( data, namespaces ) {
  if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
  jQuery.event.add(this, "click.specialSubmit", function( e ) {
  var elem = e.target,
  type = elem.type;
 
  if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
  e.liveFired = undefined;
  return trigger( "submit", this, arguments );
  }
  });
 
  jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
  var elem = e.target,
  type = elem.type;
 
  if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
  e.liveFired = undefined;
  return trigger( "submit", this, arguments );
  }
  });
 
  } else {
  return false;
  }
  },
 
  teardown: function( namespaces ) {
  jQuery.event.remove( this, ".specialSubmit" );
  }
  };
 
  }
 
  // change delegation, happens here so we have bind.
  if ( !jQuery.support.changeBubbles ) {
 
  var changeFilters,
 
  getVal = function( elem ) {
  var type = elem.type, val = elem.value;
 
  if ( type === "radio" || type === "checkbox" ) {
  val = elem.checked;
 
  } else if ( type === "select-multiple" ) {
  val = elem.selectedIndex > -1 ?
  jQuery.map( elem.options, function( elem ) {
  return elem.selected;
  }).join("-") :
  "";
 
  } else if ( elem.nodeName.toLowerCase() === "select" ) {
  val = elem.selectedIndex;
  }
 
  return val;
  },
 
  testChange = function testChange( e ) {
  var elem = e.target, data, val;
 
  if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
  return;
  }
 
  data = jQuery._data( elem, "_change_data" );
  val = getVal(elem);
 
  // the current data will be also retrieved by beforeactivate
  if ( e.type !== "focusout" || elem.type !== "radio" ) {
  jQuery._data( elem, "_change_data", val );
  }
 
  if ( data === undefined || val === data ) {
  return;
  }
 
  if ( data != null || val ) {
  e.type = "change";
  e.liveFired = undefined;
  return jQuery.event.trigger( e, arguments[1], elem );
  }
  };
 
  jQuery.event.special.change = {
  filters: {
  focusout: testChange,
 
  beforedeactivate: testChange,
 
  click: function( e ) {
  var elem = e.target, type = elem.type;
 
  if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
  return testChange.call( this, e );
  }
  },
 
  // Change has to be called before submit
  // Keydown will be called before keypress, which is used in submit-event delegation
  keydown: function( e ) {
  var elem = e.target, type = elem.type;
 
  if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
  (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
  type === "select-multiple" ) {
  return testChange.call( this, e );
  }
  },
 
  // Beforeactivate happens also before the previous element is blurred
  // with this event you can't trigger a change event, but you can store
  // information
  beforeactivate: function( e ) {
  var elem = e.target;
  jQuery._data( elem, "_change_data", getVal(elem) );
  }
  },
 
  setup: function( data, namespaces ) {
  if ( this.type === "file" ) {
  return false;
  }
 
  for ( var type in changeFilters ) {
  jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
  }
 
  return rformElems.test( this.nodeName );
  },
 
  teardown: function( namespaces ) {
  jQuery.event.remove( this, ".specialChange" );
 
  return rformElems.test( this.nodeName );
  }
  };
 
  changeFilters = jQuery.event.special.change.filters;
 
  // Handle when the input is .focus()'d
  changeFilters.focus = changeFilters.beforeactivate;
  }
 
  function trigger( type, elem, args ) {
  args[0].type = type;
  return jQuery.event.handle.apply( elem, args );
  }
 
  // Create "bubbling" focus and blur events
  if ( document.addEventListener ) {
  jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
  jQuery.event.special[ fix ] = {
  setup: function() {
  this.addEventListener( orig, handler, true );
  },
  teardown: function() {
  this.removeEventListener( orig, handler, true );
  }
  };
 
  function handler( e ) {
  e = jQuery.event.fix( e );
  e.type = fix;
  return jQuery.event.handle.call( this, e );
  }
  });
  }
 
  jQuery.each(["bind", "one"], function( i, name ) {
  jQuery.fn[ name ] = function( type, data, fn ) {
  // Handle object literals
  if ( typeof type === "object" ) {
  for ( var key in type ) {
  this[ name ](key, data, type[key], fn);
  }
  return this;
  }
 
  if ( jQuery.isFunction( data ) || data === false ) {
  fn = data;
  data = undefined;
  }
 
  var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
  jQuery( this ).unbind( event, handler );
  return fn.apply( this, arguments );
  }) : fn;
 
  if ( type === "unload" && name !== "one" ) {
  this.one( type, data, fn );
 
  } else {
  for ( var i = 0, l = this.length; i < l; i++ ) {
  jQuery.event.add( this[i], type, handler, data );
  }
  }
 
  return this;
  };
  });
 
  jQuery.fn.extend({
  unbind: function( type, fn ) {
  // Handle object literals
  if ( typeof type === "object" && !type.preventDefault ) {
  for ( var key in type ) {
  this.unbind(key, type[key]);
  }
 
  } else {
  for ( var i = 0, l = this.length; i < l; i++ ) {
  jQuery.event.remove( this[i], type, fn );
  }
  }
 
  return this;
  },
 
  delegate: function( selector, types, data, fn ) {
  return this.live( types, data, fn, selector );
  },
 
  undelegate: function( selector, types, fn ) {
  if ( arguments.length === 0 ) {
  return this.unbind( "live" );
 
  } else {
  return this.die( types, null, fn, selector );
  }
  },
 
  trigger: function( type, data ) {
  return this.each(function() {
  jQuery.event.trigger( type, data, this );
  });
  },
 
  triggerHandler: function( type, data ) {
  if ( this[0] ) {
  var event = jQuery.Event( type );
  event.preventDefault();
  event.stopPropagation();
  jQuery.event.trigger( event, data, this[0] );
  return event.result;
  }
  },
 
  toggle: function( fn ) {
  // Save reference to arguments for access in closure
  var args = arguments,
  i = 1;
 
  // link all the functions, so any of them can unbind this click handler
  while ( i < args.length ) {
  jQuery.proxy( fn, args[ i++ ] );
  }
 
  return this.click( jQuery.proxy( fn, function( event ) {
  // Figure out which function to execute
  var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
  jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
 
  // Make sure that clicks stop
  event.preventDefault();
 
  // and execute the function
  return args[ lastToggle ].apply( this, arguments ) || false;
  }));
  },
 
  hover: function( fnOver, fnOut ) {
  return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
  }
  });
 
  var liveMap = {
  focus: "focusin",
  blur: "focusout",
  mouseenter: "mouseover",
  mouseleave: "mouseout"
  };
 
  jQuery.each(["live", "die"], function( i, name ) {
  jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
  var type, i = 0, match, namespaces, preType,
  selector = origSelector || this.selector,
  context = origSelector ? this : jQuery( this.context );
 
  if ( typeof types === "object" && !types.preventDefault ) {
  for ( var key in types ) {
  context[ name ]( key, data, types[key], selector );
  }
 
  return this;
  }
 
  if ( jQuery.isFunction( data ) ) {
  fn = data;
  data = undefined;
  }
 
  types = (types || "").split(" ");
 
  while ( (type = types[ i++ ]) != null ) {
  match = rnamespaces.exec( type );
  namespaces = "";
 
  if ( match ) {
  namespaces = match[0];
  type = type.replace( rnamespaces, "" );
  }
 
  if ( type === "hover" ) {
  types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
  continue;
  }
 
  preType = type;
 
  if ( type === "focus" || type === "blur" ) {
  types.push( liveMap[ type ] + namespaces );
  type = type + namespaces;
 
  } else {
  type = (liveMap[ type ] || type) + namespaces;
  }
 
  if ( name === "live" ) {
  // bind live handler
  for ( var j = 0, l = context.length; j < l; j++ ) {
  jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
  { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
  }
 
  } else {
  // unbind live handler
  context.unbind( "live." + liveConvert( type, selector ), fn );
  }
  }
 
  return this;
  };
  });
 
  function liveHandler( event ) {
  var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
  elems = [],
  selectors = [],
  events = jQuery._data( this, eventKey );
 
  if ( typeof events === "function" ) {
  events = events.events;
  }
 
  // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
  if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
  return;
  }
 
  if ( event.namespace ) {
  namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
  }
 
  event.liveFired = this;
 
  var live = events.live.slice(0);
 
  for ( j = 0; j < live.length; j++ ) {
  handleObj = live[j];
 
  if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
  selectors.push( handleObj.selector );
 
  } else {
  live.splice( j--, 1 );
  }
  }
 
  match = jQuery( event.target ).closest( selectors, event.currentTarget );
 
  for ( i = 0, l = match.length; i < l; i++ ) {
  close = match[i];
 
  for ( j = 0; j < live.length; j++ ) {
  handleObj = live[j];
 
  if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
  elem = close.elem;
  related = null;
 
  // Those two events require additional checking
  if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
  event.type = handleObj.preType;
  related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
  }
 
  if ( !related || related !== elem ) {
  elems.push({ elem: elem, handleObj: handleObj, level: close.level });
  }
  }
  }
  }
 
  for ( i = 0, l = elems.length; i < l; i++ ) {
  match = elems[i];
 
  if ( maxLevel && match.level > maxLevel ) {
  break;
  }
 
  event.currentTarget = match.elem;
  event.data = match.handleObj.data;
  event.handleObj = match.handleObj;
 
  ret = match.handleObj.origHandler.apply( match.elem, arguments );
 
  if ( ret === false || event.isPropagationStopped() ) {
  maxLevel = match.level;
 
  if ( ret === false ) {
  stop = false;
  }
  if ( event.isImmediatePropagationStopped() ) {
  break;
  }
  }
  }
 
  return stop;
  }
 
  function liveConvert( type, selector ) {
  return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
  }
 
  jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
  "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
  "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
 
  // Handle event binding
  jQuery.fn[ name ] = function( data, fn ) {
  if ( fn == null ) {
  fn = data;
  data = null;
  }
 
  return arguments.length > 0 ?
  this.bind( name, data, fn ) :
  this.trigger( name );
  };
 
  if ( jQuery.attrFn ) {
  jQuery.attrFn[ name ] = true;
  }
  });
 
 
  /*!
  * Sizzle CSS Selector Engine
  * Copyright 2011, The Dojo Foundation
  * Released under the MIT, BSD, and GPL Licenses.
  * More information: http://sizzlejs.com/
  */
  (function(){
 
  var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
  done = 0,
  toString = Object.prototype.toString,
  hasDuplicate = false,
  baseHasDuplicate = true;
 
  // Here we check if the JavaScript engine is using some sort of
  // optimization where it does not always call our comparision
  // function. If that is the case, discard the hasDuplicate value.
  // Thus far that includes Google Chrome.
  [0, 0].sort(function() {
  baseHasDuplicate = false;
  return 0;
  });
 
  var Sizzle = function( selector, context, results, seed ) {
  results = results || [];
  context = context || document;
 
  var origContext = context;
 
  if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
  return [];
  }
 
  if ( !selector || typeof selector !== "string" ) {
  return results;
  }
 
  var m, set, checkSet, extra, ret, cur, pop, i,
  prune = true,
  contextXML = Sizzle.isXML( context ),
  parts = [],
  soFar = selector;
 
  // Reset the position of the chunker regexp (start from head)
  do {
  chunker.exec( "" );
  m = chunker.exec( soFar );
 
  if ( m ) {
  soFar = m[3];
 
  parts.push( m[1] );
 
  if ( m[2] ) {
  extra = m[3];
  break;
  }
  }
  } while ( m );
 
  if ( parts.length > 1 && origPOS.exec( selector ) ) {
 
  if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
  set = posProcess( parts[0] + parts[1], context );
 
  } else {
  set = Expr.relative[ parts[0] ] ?
  [ context ] :
  Sizzle( parts.shift(), context );
 
  while ( parts.length ) {
  selector = parts.shift();
 
  if ( Expr.relative[ selector ] ) {
  selector += parts.shift();
  }
 
  set = posProcess( selector, set );
  }
  }
 
  } else {
  // Take a shortcut and set the context if the root selector is an ID
  // (but not if it'll be faster if the inner selector is an ID)
  if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
  Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
 
  ret = Sizzle.find( parts.shift(), context, contextXML );
  context = ret.expr ?
  Sizzle.filter( ret.expr, ret.set )[0] :
  ret.set[0];
  }
 
  if ( context ) {
  ret = seed ?
  { expr: parts.pop(), set: makeArray(seed) } :
  Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
 
  set = ret.expr ?
  Sizzle.filter( ret.expr, ret.set ) :
  ret.set;
 
  if ( parts.length > 0 ) {
  checkSet = makeArray( set );
 
  } else {
  prune = false;
  }
 
  while ( parts.length ) {
  cur = parts.pop();
  pop = cur;
 
  if ( !Expr.relative[ cur ] ) {
  cur = "";
  } else {
  pop = parts.pop();
  }
 
  if ( pop == null ) {
  pop = context;
  }
 
  Expr.relative[ cur ]( checkSet, pop, contextXML );
  }
 
  } else {
  checkSet = parts = [];
  }
  }
 
  if ( !checkSet ) {
  checkSet = set;
  }
 
  if ( !checkSet ) {
  Sizzle.error( cur || selector );
  }
 
  if ( toString.call(checkSet) === "[object Array]" ) {
  if ( !prune ) {
  results.push.apply( results, checkSet );
 
  } else if ( context && context.nodeType === 1 ) {
  for ( i = 0; checkSet[i] != null; i++ ) {
  if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
  results.push( set[i] );
  }
  }
 
  } else {
  for ( i = 0; checkSet[i] != null; i++ ) {
  if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
  results.push( set[i] );
  }
  }
  }
 
  } else {
  makeArray( checkSet, results );
  }
 
  if ( extra ) {
  Sizzle( extra, origContext, results, seed );
  Sizzle.uniqueSort( results );
  }
 
  return results;
  };
 
  Sizzle.uniqueSort = function( results ) {
  if ( sortOrder ) {
  hasDuplicate = baseHasDuplicate;
  results.sort( sortOrder );
 
  if ( hasDuplicate ) {
  for ( var i = 1; i < results.length; i++ ) {
  if ( results[i] === results[ i - 1 ] ) {
  results.splice( i--, 1 );
  }
  }
  }
  }
 
  return results;
  };
 
  Sizzle.matches = function( expr, set ) {
  return Sizzle( expr, null, null, set );
  };
 
  Sizzle.matchesSelector = function( node, expr ) {
  return Sizzle( expr, null, null, [node] ).length > 0;
  };
 
  Sizzle.find = function( expr, context, isXML ) {
  var set;
 
  if ( !expr ) {
  return [];
  }
 
  for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
  var match,
  type = Expr.order[i];
 
  if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
  var left = match[1];
  match.splice( 1, 1 );
 
  if ( left.substr( left.length - 1 ) !== "\\" ) {
  match[1] = (match[1] || "").replace(/\\/g, "");
  set = Expr.find[ type ]( match, context, isXML );
 
  if ( set != null ) {
  expr = expr.replace( Expr.match[ type ], "" );
  break;
  }
  }
  }
  }
 
  if ( !set ) {
  set = typeof context.getElementsByTagName !== "undefined" ?
  context.getElementsByTagName( "*" ) :
  [];
  }
 
  return { set: set, expr: expr };
  };
 
  Sizzle.filter = function( expr, set, inplace, not ) {
  var match, anyFound,
  old = expr,
  result = [],
  curLoop = set,
  isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
 
  while ( expr && set.length ) {
  for ( var type in Expr.filter ) {
  if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
  var found, item,
  filter = Expr.filter[ type ],
  left = match[1];
 
  anyFound = false;
 
  match.splice(1,1);
 
  if ( left.substr( left.length - 1 ) === "\\" ) {
  continue;
  }
 
  if ( curLoop === result ) {
  result = [];
  }
 
  if ( Expr.preFilter[ type ] ) {
  match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
 
  if ( !match ) {
  anyFound = found = true;
 
  } else if ( match === true ) {
  continue;
  }
  }
 
  if ( match ) {
  for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
  if ( item ) {
  found = filter( item, match, i, curLoop );
  var pass = not ^ !!found;
 
  if ( inplace && found != null ) {
  if ( pass ) {
  anyFound = true;
 
  } else {
  curLoop[i] = false;
  }
 
  } else if ( pass ) {
  result.push( item );
  anyFound = true;
  }
  }
  }
  }
 
  if ( found !== undefined ) {
  if ( !inplace ) {
  curLoop = result;
  }
 
  expr = expr.replace( Expr.match[ type ], "" );
 
  if ( !anyFound ) {
  return [];
  }
 
  break;
  }
  }
  }
 
  // Improper expression
  if ( expr === old ) {
  if ( anyFound == null ) {
  Sizzle.error( expr );
 
  } else {
  break;
  }
  }
 
  old = expr;
  }
 
  return curLoop;
  };
 
  Sizzle.error = function( msg ) {
  throw "Syntax error, unrecognized expression: " + msg;
  };
 
  var Expr = Sizzle.selectors = {
  order: [ "ID", "NAME", "TAG" ],
 
  match: {
  ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
  CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
  NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
  ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
  TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
  CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
  POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
  PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
  },
 
  leftMatch: {},
 
  attrMap: {
  "class": "className",
  "for": "htmlFor"
  },
 
  attrHandle: {
  href: function( elem ) {
  return elem.getAttribute( "href" );
  }
  },
 
  relative: {
  "+": function(checkSet, part){
  var isPartStr = typeof part === "string",
  isTag = isPartStr && !/\W/.test( part ),
  isPartStrNotTag = isPartStr && !isTag;
 
  if ( isTag ) {
  part = part.toLowerCase();
  }
 
  for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
  if ( (elem = checkSet[i]) ) {
  while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
 
  checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
  elem || false :
  elem === part;
  }
  }
 
  if ( isPartStrNotTag ) {
  Sizzle.filter( part, checkSet, true );
  }
  },
 
  ">": function( checkSet, part ) {
  var elem,
  isPartStr = typeof part === "string",
  i = 0,
  l = checkSet.length;
 
  if ( isPartStr && !/\W/.test( part ) ) {
  part = part.toLowerCase();
 
  for ( ; i < l; i++ ) {
  elem = checkSet[i];
 
  if ( elem ) {
  var parent = elem.parentNode;
  checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
  }
  }
 
  } else {
  for ( ; i < l; i++ ) {
  elem = checkSet[i];
 
  if ( elem ) {
  checkSet[i] = isPartStr ?
  elem.parentNode :
  elem.parentNode === part;
  }
  }
 
  if ( isPartStr ) {
  Sizzle.filter( part, checkSet, true );
  }
  }
  },
 
  "": function(checkSet, part, isXML){
  var nodeCheck,
  doneName = done++,
  checkFn = dirCheck;
 
  if ( typeof part === "string" && !/\W/.test(part) ) {
  part = part.toLowerCase();
  nodeCheck = part;
  checkFn = dirNodeCheck;
  }
 
  checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
  },
 
  "~": function( checkSet, part, isXML ) {
  var nodeCheck,
  doneName = done++,
  checkFn = dirCheck;
 
  if ( typeof part === "string" && !/\W/.test( part ) ) {
  part = part.toLowerCase();
  nodeCheck = part;
  checkFn = dirNodeCheck;
  }
 
  checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
  }
  },
 
  find: {
  ID: function( match, context, isXML ) {
  if ( typeof context.getElementById !== "undefined" && !isXML ) {
  var m = context.getElementById(match[1]);
  // Check parentNode to catch when Blackberry 4.6 returns
  // nodes that are no longer in the document #6963
  return m && m.parentNode ? [m] : [];
  }
  },
 
  NAME: function( match, context ) {
  if ( typeof context.getElementsByName !== "undefined" ) {
  var ret = [],
  results = context.getElementsByName( match[1] );
 
  for ( var i = 0, l = results.length; i < l; i++ ) {
  if ( results[i].getAttribute("name") === match[1] ) {
  ret.push( results[i] );
  }
  }
 
  return ret.length === 0 ? null : ret;
  }
  },
 
  TAG: function( match, context ) {
  if ( typeof context.getElementsByTagName !== "undefined" ) {
  return context.getElementsByTagName( match[1] );
  }
  }
  },
  preFilter: {
  CLASS: function( match, curLoop, inplace, result, not, isXML ) {
  match = " " + match[1].replace(/\\/g, "") + " ";
 
  if ( isXML ) {
  return match;
  }
 
  for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
  if ( elem ) {
  if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
  if ( !inplace ) {
  result.push( elem );
  }
 
  } else if ( inplace ) {
  curLoop[i] = false;
  }
  }
  }
 
  return false;
  },
 
  ID: function( match ) {
  return match[1].replace(/\\/g, "");
  },
 
  TAG: function( match, curLoop ) {
  return match[1].toLowerCase();
  },
 
  CHILD: function( match ) {
  if ( match[1] === "nth" ) {
  if ( !match[2] ) {
  Sizzle.error( match[0] );
  }
 
  match[2] = match[2].replace(/^\+|\s*/g, '');
 
  // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
  var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
  match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
  !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
 
  // calculate the numbers (first)n+(last) including if they are negative
  match[2] = (test[1] + (test[2] || 1)) - 0;
  match[3] = test[3] - 0;
  }
  else if ( match[2] ) {
  Sizzle.error( match[0] );
  }
 
  // TODO: Move to normal caching system
  match[0] = done++;
 
  return match;
  },
 
  ATTR: function( match, curLoop, inplace, result, not, isXML ) {
  var name = match[1] = match[1].replace(/\\/g, "");
 
  if ( !isXML && Expr.attrMap[name] ) {
  match[1] = Expr.attrMap[name];
  }
 
  // Handle if an un-quoted value was used
  match[4] = ( match[4] || match[5] || "" ).replace(/\\/g, "");
 
  if ( match[2] === "~=" ) {
  match[4] = " " + match[4] + " ";
  }
 
  return match;
  },
 
  PSEUDO: function( match, curLoop, inplace, result, not ) {
  if ( match[1] === "not" ) {
  // If we're dealing with a complex expression, or a simple one
  if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
  match[3] = Sizzle(match[3], null, null, curLoop);
 
  } else {
  var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
 
  if ( !inplace ) {
  result.push.apply( result, ret );
  }
 
  return false;
  }
 
  } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
  return true;
  }
 
  return match;
  },
 
  POS: function( match ) {
  match.unshift( true );
 
  return match;
  }
  },
 
  filters: {
  enabled: function( elem ) {
  return elem.disabled === false && elem.type !== "hidden";
  },
 
  disabled: function( elem ) {
  return elem.disabled === true;
  },
 
  checked: function( elem ) {
  return elem.checked === true;
  },
 
  selected: function( elem ) {
  // Accessing this property makes selected-by-default
  // options in Safari work properly
  elem.parentNode.selectedIndex;
 
  return elem.selected === true;
  },
 
  parent: function( elem ) {
  return !!elem.firstChild;
  },
 
  empty: function( elem ) {
  return !elem.firstChild;
  },
 
  has: function( elem, i, match ) {
  return !!Sizzle( match[3], elem ).length;
  },
 
  header: function( elem ) {
  return (/h\d/i).test( elem.nodeName );
  },
 
  text: function( elem ) {
  return "text" === elem.type;
  },
  radio: function( elem ) {
  return "radio" === elem.type;
  },
 
  checkbox: function( elem ) {
  return "checkbox" === elem.type;
  },
 
  file: function( elem ) {
  return "file" === elem.type;
  },
  password: function( elem ) {
  return "password" === elem.type;
  },
 
  submit: function( elem ) {
  return "submit" === elem.type;
  },
 
  image: function( elem ) {
  return "image" === elem.type;
  },
 
  reset: function( elem ) {
  return "reset" === elem.type;
  },
 
  button: function( elem ) {
  return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
  },
 
  input: function( elem ) {
  return (/input|select|textarea|button/i).test( elem.nodeName );
  }
  },
  setFilters: {
  first: function( elem, i ) {
  return i === 0;
  },
 
  last: function( elem, i, match, array ) {
  return i === array.length - 1;
  },
 
  even: function( elem, i ) {
  return i % 2 === 0;
  },
 
  odd: function( elem, i ) {
  return i % 2 === 1;
  },
 
  lt: function( elem, i, match ) {
  return i < match[3] - 0;
  },
 
  gt: function( elem, i, match ) {
  return i > match[3] - 0;
  },
 
  nth: function( elem, i, match ) {
  return match[3] - 0 === i;
  },
 
  eq: function( elem, i, match ) {
  return match[3] - 0 === i;
  }
  },
  filter: {
  PSEUDO: function( elem, match, i, array ) {
  var name = match[1],
  filter = Expr.filters[ name ];
 
  if ( filter ) {
  return filter( elem, i, match, array );
 
  } else if ( name === "contains" ) {
  return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
 
  } else if ( name === "not" ) {
  var not = match[3];
 
  for ( var j = 0, l = not.length; j < l; j++ ) {
  if ( not[j] === elem ) {
  return false;
  }
  }
 
  return true;
 
  } else {
  Sizzle.error( name );
  }
  },
 
  CHILD: function( elem, match ) {
  var type = match[1],
  node = elem;
 
  switch ( type ) {
  case "only":
  case "first":
  while ( (node = node.previousSibling) ) {
  if ( node.nodeType === 1 ) {
  return false;
  }
  }
 
  if ( type === "first" ) {
  return true;
  }
 
  node = elem;
 
  case "last":
  while ( (node = node.nextSibling) ) {
  if ( node.nodeType === 1 ) {
  return false;
  }
  }
 
  return true;
 
  case "nth":
  var first = match[2],
  last = match[3];
 
  if ( first === 1 && last === 0 ) {
  return true;
  }
 
  var doneName = match[0],
  parent = elem.parentNode;
 
  if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
  var count = 0;
 
  for ( node = parent.firstChild; node; node = node.nextSibling ) {
  if ( node.nodeType === 1 ) {
  node.nodeIndex = ++count;
  }
  }
 
  parent.sizcache = doneName;
  }
 
  var diff = elem.nodeIndex - last;
 
  if ( first === 0 ) {
  return diff === 0;
 
  } else {
  return ( diff % first === 0 && diff / first >= 0 );
  }
  }
  },
 
  ID: function( elem, match ) {
  return elem.nodeType === 1 && elem.getAttribute("id") === match;
  },
 
  TAG: function( elem, match ) {
  return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
  },
 
  CLASS: function( elem, match ) {
  return (" " + (elem.className || elem.getAttribute("class")) + " ")
  .indexOf( match ) > -1;
  },
 
  ATTR: function( elem, match ) {
  var name = match[1],
  result = Expr.attrHandle[ name ] ?
  Expr.attrHandle[ name ]( elem ) :
  elem[ name ] != null ?
  elem[ name ] :
  elem.getAttribute( name ),
  value = result + "",
  type = match[2],
  check = match[4];
 
  return result == null ?
  type === "!=" :
  type === "=" ?
  value === check :
  type === "*=" ?
  value.indexOf(check) >= 0 :
  type === "~=" ?
  (" " + value + " ").indexOf(check) >= 0 :
  !check ?
  value && result !== false :
  type === "!=" ?
  value !== check :
  type === "^=" ?
  value.indexOf(check) === 0 :
  type === "$=" ?
  value.substr(value.length - check.length) === check :
  type === "|=" ?
  value === check || value.substr(0, check.length + 1) === check + "-" :
  false;
  },
 
  POS: function( elem, match, i, array ) {
  var name = match[2],
  filter = Expr.setFilters[ name ];
 
  if ( filter ) {
  return filter( elem, i, match, array );
  }
  }
  }
  };
 
  var origPOS = Expr.match.POS,
  fescape = function(all, num){
  return "\\" + (num - 0 + 1);
  };
 
  for ( var type in Expr.match ) {
  Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
  Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
  }
 
  var makeArray = function( array, results ) {
  array = Array.prototype.slice.call( array, 0 );
 
  if ( results ) {
  results.push.apply( results, array );
  return results;
  }
 
  return array;
  };
 
  // Perform a simple check to determine if the browser is capable of
  // converting a NodeList to an array using builtin methods.
  // Also verifies that the returned array holds DOM nodes
  // (which is not the case in the Blackberry browser)
  try {
  Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
 
  // Provide a fallback method if it does not work
  } catch( e ) {
  makeArray = function( array, results ) {
  var i = 0,
  ret = results || [];
 
  if ( toString.call(array) === "[object Array]" ) {
  Array.prototype.push.apply( ret, array );
 
  } else {
  if ( typeof array.length === "number" ) {
  for ( var l = array.length; i < l; i++ ) {
  ret.push( array[i] );
  }
 
  } else {
  for ( ; array[i]; i++ ) {
  ret.push( array[i] );
  }
  }
  }
 
  return ret;
  };
  }
 
  var sortOrder, siblingCheck;
 
  if ( document.documentElement.compareDocumentPosition ) {
  sortOrder = function( a, b ) {
  if ( a === b ) {
  hasDuplicate = true;
  return 0;
  }
 
  if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
  return a.compareDocumentPosition ? -1 : 1;
  }
 
  return a.compareDocumentPosition(b) & 4 ? -1 : 1;
  };
 
  } else {
  sortOrder = function( a, b ) {
  var al, bl,
  ap = [],
  bp = [],
  aup = a.parentNode,
  bup = b.parentNode,
  cur = aup;
 
  // The nodes are identical, we can exit early
  if ( a === b ) {
  hasDuplicate = true;
  return 0;
 
  // If the nodes are siblings (or identical) we can do a quick check
  } else if ( aup === bup ) {
  return siblingCheck( a, b );
 
  // If no parents were found then the nodes are disconnected
  } else if ( !aup ) {
  return -1;
 
  } else if ( !bup ) {
  return 1;
  }
 
  // Otherwise they're somewhere else in the tree so we need
  // to build up a full list of the parentNodes for comparison
  while ( cur ) {
  ap.unshift( cur );
  cur = cur.parentNode;
  }
 
  cur = bup;
 
  while ( cur ) {
  bp.unshift( cur );
  cur = cur.parentNode;
  }
 
  al = ap.length;
  bl = bp.length;
 
  // Start walking down the tree looking for a discrepancy
  for ( var i = 0; i < al && i < bl; i++ ) {
  if ( ap[i] !== bp[i] ) {
  return siblingCheck( ap[i], bp[i] );
  }
  }
 
  // We ended someplace up the tree so do a sibling check
  return i === al ?
  siblingCheck( a, bp[i], -1 ) :
  siblingCheck( ap[i], b, 1 );
  };
 
  siblingCheck = function( a, b, ret ) {
  if ( a === b ) {
  return ret;
  }
 
  var cur = a.nextSibling;
 
  while ( cur ) {
  if ( cur === b ) {
  return -1;
  }
 
  cur = cur.nextSibling;
  }
 
  return 1;
  };
  }
 
  // Utility function for retreiving the text value of an array of DOM nodes
  Sizzle.getText = function( elems ) {
  var ret = "", elem;
 
  for ( var i = 0; elems[i]; i++ ) {
  elem = elems[i];
 
  // Get the text from text nodes and CDATA nodes
  if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
  ret += elem.nodeValue;
 
  // Traverse everything else, except comment nodes
  } else if ( elem.nodeType !== 8 ) {
  ret += Sizzle.getText( elem.childNodes );
  }
  }
 
  return ret;
  };
 
  // Check to see if the browser returns elements by name when
  // querying by getElementById (and provide a workaround)
  (function(){
  // We're going to inject a fake input element with a specified name
  var form = document.createElement("div"),
  id = "script" + (new Date()).getTime(),
  root = document.documentElement;
 
  form.innerHTML = "<a name='" + id + "'/>";
 
  // Inject it into the root element, check its status, and remove it quickly
  root.insertBefore( form, root.firstChild );
 
  // The workaround has to do additional checks after a getElementById
  // Which slows things down for other browsers (hence the branching)
  if ( document.getElementById( id ) ) {
  Expr.find.ID = function( match, context, isXML ) {
  if ( typeof context.getElementById !== "undefined" && !isXML ) {
  var m = context.getElementById(match[1]);
 
  return m ?
  m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
  [m] :
  undefined :
  [];
  }
  };
 
  Expr.filter.ID = function( elem, match ) {
  var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
 
  return elem.nodeType === 1 && node && node.nodeValue === match;
  };
  }
 
  root.removeChild( form );
 
  // release memory in IE
  root = form = null;
  })();
 
  (function(){
  // Check to see if the browser returns only elements
  // when doing getElementsByTagName("*")
 
  // Create a fake element
  var div = document.createElement("div");
  div.appendChild( document.createComment("") );
 
  // Make sure no comments are found
  if ( div.getElementsByTagName("*").length > 0 ) {
  Expr.find.TAG = function( match, context ) {
  var results = context.getElementsByTagName( match[1] );
 
  // Filter out possible comments
  if ( match[1] === "*" ) {
  var tmp = [];
 
  for ( var i = 0; results[i]; i++ ) {
  if ( results[i].nodeType === 1 ) {
  tmp.push( results[i] );
  }
  }
 
  results = tmp;
  }
 
  return results;
  };
  }
 
  // Check to see if an attribute returns normalized href attributes
  div.innerHTML = "<a href='#'></a>";
 
  if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
  div.firstChild.getAttribute("href") !== "#" ) {
 
  Expr.attrHandle.href = function( elem ) {
  return elem.getAttribute( "href", 2 );
  };
  }
 
  // release memory in IE
  div = null;
  })();
 
  if ( document.querySelectorAll ) {
  (function(){
  var oldSizzle = Sizzle,
  div = document.createElement("div"),
  id = "__sizzle__";
 
  div.innerHTML = "<p class='TEST'></p>";
 
  // Safari can't handle uppercase or unicode characters when
  // in quirks mode.
  if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
  return;
  }
 
  Sizzle = function( query, context, extra, seed ) {
  context = context || document;
 
  // Only use querySelectorAll on non-XML documents
  // (ID selectors don't work in non-HTML documents)
  if ( !seed && !Sizzle.isXML(context) ) {
  // See if we find a selector to speed up
  var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
 
  if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
  // Speed-up: Sizzle("TAG")
  if ( match[1] ) {
  return makeArray( context.getElementsByTagName( query ), extra );
 
  // Speed-up: Sizzle(".CLASS")
  } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
  return makeArray( context.getElementsByClassName( match[2] ), extra );
  }
  }
 
  if ( context.nodeType === 9 ) {
  // Speed-up: Sizzle("body")
  // The body element only exists once, optimize finding it
  if ( query === "body" && context.body ) {
  return makeArray( [ context.body ], extra );
 
  // Speed-up: Sizzle("#ID")
  } else if ( match && match[3] ) {
  var elem = context.getElementById( match[3] );
 
  // Check parentNode to catch when Blackberry 4.6 returns
  // nodes that are no longer in the document #6963
  if ( elem && elem.parentNode ) {
  // Handle the case where IE and Opera return items
  // by name instead of ID
  if ( elem.id === match[3] ) {
  return makeArray( [ elem ], extra );
  }
 
  } else {
  return makeArray( [], extra );
  }
  }
 
  try {
  return makeArray( context.querySelectorAll(query), extra );
  } catch(qsaError) {}
 
  // qSA works strangely on Element-rooted queries
  // We can work around this by specifying an extra ID on the root
  // and working up from there (Thanks to Andrew Dupont for the technique)
  // IE 8 doesn't work on object elements
  } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
  var old = context.getAttribute( "id" ),
  nid = old || id,
  hasParent = context.parentNode,
  relativeHierarchySelector = /^\s*[+~]/.test( query );
 
  if ( !old ) {
  context.setAttribute( "id", nid );
  } else {
  nid = nid.replace( /'/g, "\\$&" );
  }
  if ( relativeHierarchySelector && hasParent ) {
  context = context.parentNode;
  }
 
  try {
  if ( !relativeHierarchySelector || hasParent ) {
  return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
  }
 
  } catch(pseudoError) {
  } finally {
  if ( !old ) {
  context.removeAttribute( "id" );
  }
  }
  }
  }
 
  return oldSizzle(query, context, extra, seed);
  };
 
  for ( var prop in oldSizzle ) {
  Sizzle[ prop ] = oldSizzle[ prop ];
  }
 
  // release memory in IE
  div = null;
  })();
  }
 
  (function(){
  var html = document.documentElement,
  matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
  pseudoWorks = false;
 
  try {
  // This should fail with an exception
  // Gecko does not error, returns false instead
  matches.call( document.documentElement, "[test!='']:sizzle" );
 
  } catch( pseudoError ) {
  pseudoWorks = true;
  }
 
  if ( matches ) {
  Sizzle.matchesSelector = function( node, expr ) {
  // Make sure that attribute selectors are quoted
  expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
 
  if ( !Sizzle.isXML( node ) ) {
  try {
  if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
  return matches.call( node, expr );
  }
  } catch(e) {}
  }
 
  return Sizzle(expr, null, null, [node]).length > 0;
  };
  }
  })();
 
  (function(){
  var div = document.createElement("div");
 
  div.innerHTML = "<div class='test e'></div><div class='test'></div>";
 
  // Opera can't find a second classname (in 9.6)
  // Also, make sure that getElementsByClassName actually exists
  if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
  return;
  }
 
  // Safari caches class attributes, doesn't catch changes (in 3.2)
  div.lastChild.className = "e";
 
  if ( div.getElementsByClassName("e").length === 1 ) {
  return;
  }
 
  Expr.order.splice(1, 0, "CLASS");
  Expr.find.CLASS = function( match, context, isXML ) {
  if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
  return context.getElementsByClassName(match[1]);
  }
  };
 
  // release memory in IE
  div = null;
  })();
 
  function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  var elem = checkSet[i];
 
  if ( elem ) {
  var match = false;
 
  elem = elem[dir];
 
  while ( elem ) {
  if ( elem.sizcache === doneName ) {
  match = checkSet[elem.sizset];
  break;
  }
 
  if ( elem.nodeType === 1 && !isXML ){
  elem.sizcache = doneName;
  elem.sizset = i;
  }
 
  if ( elem.nodeName.toLowerCase() === cur ) {
  match = elem;
  break;
  }
 
  elem = elem[dir];
  }
 
  checkSet[i] = match;
  }
  }
  }
 
  function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  var elem = checkSet[i];
 
  if ( elem ) {
  var match = false;
 
  elem = elem[dir];
 
  while ( elem ) {
  if ( elem.sizcache === doneName ) {
  match = checkSet[elem.sizset];
  break;
  }
 
  if ( elem.nodeType === 1 ) {
  if ( !isXML ) {
  elem.sizcache = doneName;
  elem.sizset = i;
  }
 
  if ( typeof cur !== "string" ) {
  if ( elem === cur ) {
  match = true;
  break;
  }
 
  } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
  match = elem;
  break;
  }
  }
 
  elem = elem[dir];
  }
 
  checkSet[i] = match;
  }
  }
  }
 
  if ( document.documentElement.contains ) {
  Sizzle.contains = function( a, b ) {
  return a !== b && (a.contains ? a.contains(b) : true);
  };
 
  } else if ( document.documentElement.compareDocumentPosition ) {
  Sizzle.contains = function( a, b ) {
  return !!(a.compareDocumentPosition(b) & 16);
  };
 
  } else {
  Sizzle.contains = function() {
  return false;
  };
  }
 
  Sizzle.isXML = function( elem ) {
  // documentElement is verified for cases where it doesn't yet exist
  // (such as loading iframes in IE - #4833)
  var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
 
  return documentElement ? documentElement.nodeName !== "HTML" : false;
  };
 
  var posProcess = function( selector, context ) {
  var match,
  tmpSet = [],
  later = "",
  root = context.nodeType ? [context] : context;
 
  // Position selectors must be done after the filter
  // And so must :not(positional) so we move all PSEUDOs to the end
  while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
  later += match[0];
  selector = selector.replace( Expr.match.PSEUDO, "" );
  }
 
  selector = Expr.relative[selector] ? selector + "*" : selector;
 
  for ( var i = 0, l = root.length; i < l; i++ ) {
  Sizzle( selector, root[i], tmpSet );
  }
 
  return Sizzle.filter( later, tmpSet );
  };
 
  // EXPOSE
  jQuery.find = Sizzle;
  jQuery.expr = Sizzle.selectors;
  jQuery.expr[":"] = jQuery.expr.filters;
  jQuery.unique = Sizzle.uniqueSort;
  jQuery.text = Sizzle.getText;
  jQuery.isXMLDoc = Sizzle.isXML;
  jQuery.contains = Sizzle.contains;
 
 
  })();
 
 
  var runtil = /Until$/,
  rparentsprev = /^(?:parents|prevUntil|prevAll)/,
  // Note: This RegExp should be improved, or likely pulled from Sizzle
  rmultiselector = /,/,
  isSimple = /^.[^:#\[\.,]*$/,
  slice = Array.prototype.slice,
  POS = jQuery.expr.match.POS,
  // methods guaranteed to produce a unique set when starting from a unique set
  guaranteedUnique = {
  children: true,
  contents: true,
  next: true,
  prev: true
  };
 
  jQuery.fn.extend({
  find: function( selector ) {
  var ret = this.pushStack( "", "find", selector ),
  length = 0;
 
  for ( var i = 0, l = this.length; i < l; i++ ) {
  length = ret.length;
  jQuery.find( selector, this[i], ret );
 
  if ( i > 0 ) {
  // Make sure that the results are unique
  for ( var n = length; n < ret.length; n++ ) {
  for ( var r = 0; r < length; r++ ) {
  if ( ret[r] === ret[n] ) {
  ret.splice(n--, 1);
  break;
  }
  }
  }
  }
  }
 
  return ret;
  },
 
  has: function( target ) {
  var targets = jQuery( target );
  return this.filter(function() {
  for ( var i = 0, l = targets.length; i < l; i++ ) {
  if ( jQuery.contains( this, targets[i] ) ) {
  return true;
  }
  }
  });
  },
 
  not: function( selector ) {
  return this.pushStack( winnow(this, selector, false), "not", selector);
  },
 
  filter: function( selector ) {
  return this.pushStack( winnow(this, selector, true), "filter", selector );
  },
 
  is: function( selector ) {
  return !!selector && jQuery.filter( selector, this ).length > 0;
  },
 
  closest: function( selectors, context ) {
  var ret = [], i, l, cur = this[0];
 
  if ( jQuery.isArray( selectors ) ) {
  var match, selector,
  matches = {},
  level = 1;
 
  if ( cur && selectors.length ) {
  for ( i = 0, l = selectors.length; i < l; i++ ) {
  selector = selectors[i];
 
  if ( !matches[selector] ) {
  matches[selector] = jQuery.expr.match.POS.test( selector ) ?
  jQuery( selector, context || this.context ) :
  selector;
  }
  }
 
  while ( cur && cur.ownerDocument && cur !== context ) {
  for ( selector in matches ) {
  match = matches[selector];
 
  if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
  ret.push({ selector: selector, elem: cur, level: level });
  }
  }
 
  cur = cur.parentNode;
  level++;
  }
  }
 
  return ret;
  }
 
  var pos = POS.test( selectors ) ?
  jQuery( selectors, context || this.context ) : null;
 
  for ( i = 0, l = this.length; i < l; i++ ) {
  cur = this[i];
 
  while ( cur ) {
  if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
  ret.push( cur );
  break;
 
  } else {
  cur = cur.parentNode;
  if ( !cur || !cur.ownerDocument || cur === context ) {
  break;
  }
  }
  }
  }
 
  ret = ret.length > 1 ? jQuery.unique(ret) : ret;
 
  return this.pushStack( ret, "closest", selectors );
  },
 
  // Determine the position of an element within
  // the matched set of elements
  index: function( elem ) {
  if ( !elem || typeof elem === "string" ) {
  return jQuery.inArray( this[0],
  // If it receives a string, the selector is used
  // If it receives nothing, the siblings are used
  elem ? jQuery( elem ) : this.parent().children() );
  }
  // Locate the position of the desired element
  return jQuery.inArray(
  // If it receives a jQuery object, the first element is used
  elem.jquery ? elem[0] : elem, this );
  },
 
  add: function( selector, context ) {
  var set = typeof selector === "string" ?
  jQuery( selector, context ) :
  jQuery.makeArray( selector ),
  all = jQuery.merge( this.get(), set );
 
  return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
  all :
  jQuery.unique( all ) );
  },
 
  andSelf: function() {
  return this.add( this.prevObject );
  }
  });
 
  // A painfully simple check to see if an element is disconnected
  // from a document (should be improved, where feasible).
  function isDisconnected( node ) {
  return !node || !node.parentNode || node.parentNode.nodeType === 11;
  }
 
  jQuery.each({
  parent: function( elem ) {
  var parent = elem.parentNode;
  return parent && parent.nodeType !== 11 ? parent : null;
  },
  parents: function( elem ) {
  return jQuery.dir( elem, "parentNode" );
  },
  parentsUntil: function( elem, i, until ) {
  return jQuery.dir( elem, "parentNode", until );
  },
  next: function( elem ) {
  return jQuery.nth( elem, 2, "nextSibling" );
  },
  prev: function( elem ) {
  return jQuery.nth( elem, 2, "previousSibling" );
  },
  nextAll: function( elem ) {
  return jQuery.dir( elem, "nextSibling" );
  },
  prevAll: function( elem ) {
  return jQuery.dir( elem, "previousSibling" );
  },
  nextUntil: function( elem, i, until ) {
  return jQuery.dir( elem, "nextSibling", until );
  },
  prevUntil: function( elem, i, until ) {
  return jQuery.dir( elem, "previousSibling", until );
  },
  siblings: function( elem ) {
  return jQuery.sibling( elem.parentNode.firstChild, elem );
  },
  children: function( elem ) {
  return jQuery.sibling( elem.firstChild );
  },
  contents: function( elem ) {
  return jQuery.nodeName( elem, "iframe" ) ?
  elem.contentDocument || elem.contentWindow.document :
  jQuery.makeArray( elem.childNodes );
  }
  }, function( name, fn ) {
  jQuery.fn[ name ] = function( until, selector ) {
  var ret = jQuery.map( this, fn, until ),
  // The variable 'args' was introduced in
  // https://github.com/jquery/jquery/commit/52a0238
  // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
  // http://code.google.com/p/v8/issues/detail?id=1050
  args = slice.call(arguments);
 
  if ( !runtil.test( name ) ) {
  selector = until;
  }
 
  if ( selector && typeof selector === "string" ) {
  ret = jQuery.filter( selector, ret );
  }
 
  ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
  if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
  ret = ret.reverse();
  }
 
  return this.pushStack( ret, name, args.join(",") );
  };
  });
 
  jQuery.extend({
  filter: function( expr, elems, not ) {
  if ( not ) {
  expr = ":not(" + expr + ")";
  }
 
  return elems.length === 1 ?
  jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
  jQuery.find.matches(expr, elems);
  },
 
  dir: function( elem, dir, until ) {
  var matched = [],
  cur = elem[ dir ];
 
  while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
  if ( cur.nodeType === 1 ) {
  matched.push( cur );
  }
  cur = cur[dir];
  }
  return matched;
  },
 
  nth: function( cur, result, dir, elem ) {
  result = result || 1;
  var num = 0;
 
  for ( ; cur; cur = cur[dir] ) {
  if ( cur.nodeType === 1 && ++num === result ) {
  break;
  }
  }
 
  return cur;
  },
 
  sibling: function( n, elem ) {
  var r = [];
 
  for ( ; n; n = n.nextSibling ) {
  if ( n.nodeType === 1 && n !== elem ) {
  r.push( n );
  }
  }
 
  return r;
  }
  });
 
  // Implement the identical functionality for filter and not
  function winnow( elements, qualifier, keep ) {
  if ( jQuery.isFunction( qualifier ) ) {
  return jQuery.grep(elements, function( elem, i ) {
  var retVal = !!qualifier.call( elem, i, elem );
  return retVal === keep;
  });
 
  } else if ( qualifier.nodeType ) {
  return jQuery.grep(elements, function( elem, i ) {
  return (elem === qualifier) === keep;
  });
 
  } else if ( typeof qualifier === "string" ) {
  var filtered = jQuery.grep(elements, function( elem ) {
  return elem.nodeType === 1;
  });
 
  if ( isSimple.test( qualifier ) ) {
  return jQuery.filter(qualifier, filtered, !keep);
  } else {
  qualifier = jQuery.filter( qualifier, filtered );
  }
  }
 
  return jQuery.grep(elements, function( elem, i ) {
  return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
  });
  }
 
 
 
 
  var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
  rleadingWhitespace = /^\s+/,
  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
  rtagName = /<([\w:]+)/,
  rtbody = /<tbody/i,
  rhtml = /<|&#?\w+;/,
  rnocache = /<(?:script|object|embed|option|style)/i,
  // checked="checked" or checked (html5)
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
  wrapMap = {
  option: [ 1, "<select multiple='multiple'>", "</select>" ],
  legend: [ 1, "<fieldset>", "</fieldset>" ],
  thead: [ 1, "<table>", "</table>" ],
  tr: [ 2, "<table><tbody>", "</tbody></table>" ],
  td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
  col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
  area: [ 1, "<map>", "</map>" ],
  _default: [ 0, "", "" ]
  };
 
  wrapMap.optgroup = wrapMap.option;
  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
  wrapMap.th = wrapMap.td;
 
  // IE can't serialize <link> and <script> tags normally
  if ( !jQuery.support.htmlSerialize ) {
  wrapMap._default = [ 1, "div<div>", "</div>" ];
  }
 
  jQuery.fn.extend({
  text: function( text ) {
  if ( jQuery.isFunction(text) ) {
  return this.each(function(i) {
  var self = jQuery( this );
 
  self.text( text.call(this, i, self.text()) );
  });
  }
 
  if ( typeof text !== "object" && text !== undefined ) {
  return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
  }
 
  return jQuery.text( this );
  },
 
  wrapAll: function( html ) {
  if ( jQuery.isFunction( html ) ) {
  return this.each(function(i) {
  jQuery(this).wrapAll( html.call(this, i) );
  });
  }
 
  if ( this[0] ) {
  // The elements to wrap the target around
  var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
 
  if ( this[0].parentNode ) {
  wrap.insertBefore( this[0] );
  }
 
  wrap.map(function() {
  var elem = this;
 
  while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
  elem = elem.firstChild;
  }
 
  return elem;
  }).append(this);
  }
 
  return this;
  },
 
  wrapInner: function( html ) {
  if ( jQuery.isFunction( html ) ) {
  return this.each(function(i) {
  jQuery(this).wrapInner( html.call(this, i) );
  });
  }
 
  return this.each(function() {
  var self = jQuery( this ),
  contents = self.contents();
 
  if ( contents.length ) {
  contents.wrapAll( html );
 
  } else {
  self.append( html );
  }
  });
  },
 
  wrap: function( html ) {
  return this.each(function() {
  jQuery( this ).wrapAll( html );
  });
  },
 
  unwrap: function() {
  return this.parent().each(function() {
  if ( !jQuery.nodeName( this, "body" ) ) {
  jQuery( this ).replaceWith( this.childNodes );
  }
  }).end();
  },
 
  append: function() {
  return this.domManip(arguments, true, function( elem ) {
  if ( this.nodeType === 1 ) {
  this.appendChild( elem );
  }
  });
  },
 
  prepend: function() {
  return this.domManip(arguments, true, function( elem ) {
  if ( this.nodeType === 1 ) {
  this.insertBefore( elem, this.firstChild );
  }
  });
  },
 
  before: function() {
  if ( this[0] && this[0].parentNode ) {
  return this.domManip(arguments, false, function( elem ) {
  this.parentNode.insertBefore( elem, this );
  });
  } else if ( arguments.length ) {
  var set = jQuery(arguments[0]);
  set.push.apply( set, this.toArray() );
  return this.pushStack( set, "before", arguments );
  }
  },
 
  after: function() {
  if ( this[0] && this[0].parentNode ) {
  return this.domManip(arguments, false, function( elem ) {
  this.parentNode.insertBefore( elem, this.nextSibling );
  });
  } else if ( arguments.length ) {
  var set = this.pushStack( this, "after", arguments );
  set.push.apply( set, jQuery(arguments[0]).toArray() );
  return set;
  }
  },
 
  // keepData is for internal use only--do not document
  remove: function( selector, keepData ) {
  for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
  if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
  if ( !keepData && elem.nodeType === 1 ) {
  jQuery.cleanData( elem.getElementsByTagName("*") );
  jQuery.cleanData( [ elem ] );
  }
 
  if ( elem.parentNode ) {
  elem.parentNode.removeChild( elem );
  }
  }
  }
 
  return this;
  },
 
  empty: function() {
  for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
  // Remove element nodes and prevent memory leaks
  if ( elem.nodeType === 1 ) {
  jQuery.cleanData( elem.getElementsByTagName("*") );
  }
 
  // Remove any remaining nodes
  while ( elem.firstChild ) {
  elem.removeChild( elem.firstChild );
  }
  }
 
  return this;
  },
 
  clone: function( dataAndEvents, deepDataAndEvents ) {
  dataAndEvents = dataAndEvents == null ? true : dataAndEvents;
  deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
  return this.map( function () {
  return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
  });
  },
 
  html: function( value ) {
  if ( value === undefined ) {
  return this[0] && this[0].nodeType === 1 ?
  this[0].innerHTML.replace(rinlinejQuery, "") :
  null;
 
  // See if we can take a shortcut and just use innerHTML
  } else if ( typeof value === "string" && !rnocache.test( value ) &&
  (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
  !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
 
  value = value.replace(rxhtmlTag, "<$1></$2>");
 
  try {
  for ( var i = 0, l = this.length; i < l; i++ ) {
  // Remove element nodes and prevent memory leaks
  if ( this[i].nodeType === 1 ) {
  jQuery.cleanData( this[i].getElementsByTagName("*") );
  this[i].innerHTML = value;
  }
  }
 
  // If using innerHTML throws an exception, use the fallback method
  } catch(e) {
  this.empty().append( value );
  }
 
  } else if ( jQuery.isFunction( value ) ) {
  this.each(function(i){
  var self = jQuery( this );
 
  self.html( value.call(this, i, self.html()) );
  });
 
  } else {
  this.empty().append( value );
  }
 
  return this;
  },
 
  replaceWith: function( value ) {
  if ( this[0] && this[0].parentNode ) {
  // Make sure that the elements are removed from the DOM before they are inserted
  // this can help fix replacing a parent with child elements
  if ( jQuery.isFunction( value ) ) {
  return this.each(function(i) {
  var self = jQuery(this), old = self.html();
  self.replaceWith( value.call( this, i, old ) );
  });
  }
 
  if ( typeof value !== "string" ) {
  value = jQuery( value ).detach();
  }
 
  return this.each(function() {
  var next = this.nextSibling,
  parent = this.parentNode;
 
  jQuery( this ).remove();
 
  if ( next ) {
  jQuery(next).before( value );
  } else {
  jQuery(parent).append( value );
  }
  });
  } else {
  return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
  }
  },
 
  detach: function( selector ) {
  return this.remove( selector, true );
  },
 
  domManip: function( args, table, callback ) {
  var results, first, fragment, parent,
  value = args[0],
  scripts = [];
 
  // We can't cloneNode fragments that contain checked, in WebKit
  if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
  return this.each(function() {
  jQuery(this).domManip( args, table, callback, true );
  });
  }
 
  if ( jQuery.isFunction(value) ) {
  return this.each(function(i) {
  var self = jQuery(this);
  args[0] = value.call(this, i, table ? self.html() : undefined);
  self.domManip( args, table, callback );
  });
  }
 
  if ( this[0] ) {
  parent = value && value.parentNode;
 
  // If we're in a fragment, just use that instead of building a new one
  if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
  results = { fragment: parent };
 
  } else {
  results = jQuery.buildFragment( args, this, scripts );
  }
 
  fragment = results.fragment;
 
  if ( fragment.childNodes.length === 1 ) {
  first = fragment = fragment.firstChild;
  } else {
  first = fragment.firstChild;
  }
 
  if ( first ) {
  table = table && jQuery.nodeName( first, "tr" );
 
  for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
  callback.call(
  table ?
  root(this[i], first) :
  this[i],
  // Make sure that we do not leak memory by inadvertently discarding
  // the original fragment (which might have attached data) instead of
  // using it; in addition, use the original fragment object for the last
  // item instead of first because it can end up being emptied incorrectly
  // in certain situations (Bug #8070).
  // Fragments from the fragment cache must always be cloned and never used
  // in place.
  results.cacheable || (l > 1 && i < lastIndex) ?
  jQuery.clone( fragment, true, true ) :
  fragment
  );
  }
  }
 
  if ( scripts.length ) {
  jQuery.each( scripts, evalScript );
  }
  }
 
  return this;
  }
  });
 
  function root( elem, cur ) {
  return jQuery.nodeName(elem, "table") ?
  (elem.getElementsByTagName("tbody")[0] ||
  elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
  elem;
  }
 
  function cloneCopyEvent( src, dest ) {
 
  if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
  return;
  }
 
  var internalKey = jQuery.expando,
  oldData = jQuery.data( src ),
  curData = jQuery.data( dest, oldData );
 
  // Switch to use the internal data object, if it exists, for the next
  // stage of data copying
  if ( (oldData = oldData[ internalKey ]) ) {
  var events = oldData.events;
  curData = curData[ internalKey ] = jQuery.extend({}, oldData);
 
  if ( events ) {
  delete curData.handle;
  curData.events = {};
 
  for ( var type in events ) {
  for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
  jQuery.event.add( dest, type, events[ type ][ i ], events[ type ][ i ].data );
  }
  }
  }
  }
  }
 
  function cloneFixAttributes(src, dest) {
  // We do not need to do anything for non-Elements
  if ( dest.nodeType !== 1 ) {
  return;
  }
 
  var nodeName = dest.nodeName.toLowerCase();
 
  // clearAttributes removes the attributes, which we don't want,
  // but also removes the attachEvent events, which we *do* want
  dest.clearAttributes();
 
  // mergeAttributes, in contrast, only merges back on the
  // original attributes, not the events
  dest.mergeAttributes(src);
 
  // IE6-8 fail to clone children inside object elements that use
  // the proprietary classid attribute value (rather than the type
  // attribute) to identify the type of content to display
  if ( nodeName === "object" ) {
  dest.outerHTML = src.outerHTML;
 
  } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
  // IE6-8 fails to persist the checked state of a cloned checkbox
  // or radio button. Worse, IE6-7 fail to give the cloned element
  // a checked appearance if the defaultChecked value isn't also set
  if ( src.checked ) {
  dest.defaultChecked = dest.checked = src.checked;
  }
 
  // IE6-7 get confused and end up setting the value of a cloned
  // checkbox/radio button to an empty string instead of "on"
  if ( dest.value !== src.value ) {
  dest.value = src.value;
  }
 
  // IE6-8 fails to return the selected option to the default selected
  // state when cloning options
  } else if ( nodeName === "option" ) {
  dest.selected = src.defaultSelected;
 
  // IE6-8 fails to set the defaultValue to the correct value when
  // cloning other types of input fields
  } else if ( nodeName === "input" || nodeName === "textarea" ) {
  dest.defaultValue = src.defaultValue;
  }
 
  // Event data gets referenced instead of copied if the expando
  // gets copied too
  dest.removeAttribute( jQuery.expando );
  }
 
  jQuery.buildFragment = function( args, nodes, scripts ) {
  var fragment, cacheable, cacheresults,
  doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
 
  // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
  // Cloning options loses the selected state, so don't cache them
  // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
  // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
  if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
  args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
 
  cacheable = true;
  cacheresults = jQuery.fragments[ args[0] ];
  if ( cacheresults ) {
  if ( cacheresults !== 1 ) {
  fragment = cacheresults;
  }
  }
  }
 
  if ( !fragment ) {
  fragment = doc.createDocumentFragment();
  jQuery.clean( args, doc, fragment, scripts );
  }
 
  if ( cacheable ) {
  jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
  }
 
  return { fragment: fragment, cacheable: cacheable };
  };
 
  jQuery.fragments = {};
 
  jQuery.each({
  appendTo: "append",
  prependTo: "prepend",
  insertBefore: "before",
  insertAfter: "after",
  replaceAll: "replaceWith"
  }, function( name, original ) {
  jQuery.fn[ name ] = function( selector ) {
  var ret = [],
  insert = jQuery( selector ),
  parent = this.length === 1 && this[0].parentNode;
 
  if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
  insert[ original ]( this[0] );
  return this;
 
  } else {
  for ( var i = 0, l = insert.length; i < l; i++ ) {
  var elems = (i > 0 ? this.clone(true) : this).get();
  jQuery( insert[i] )[ original ]( elems );
  ret = ret.concat( elems );
  }
 
  return this.pushStack( ret, name, insert.selector );
  }
  };
  });
 
  jQuery.extend({
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
  var clone = elem.cloneNode(true),
  srcElements,
  destElements,
  i;
 
  if ( !jQuery.support.noCloneEvent && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
  // IE copies events bound via attachEvent when using cloneNode.
  // Calling detachEvent on the clone will also remove the events
  // from the original. In order to get around this, we use some
  // proprietary methods to clear the events. Thanks to MooTools
  // guys for this hotness.
 
  // Using Sizzle here is crazy slow, so we use getElementsByTagName
  // instead
  srcElements = elem.getElementsByTagName("*");
  destElements = clone.getElementsByTagName("*");
 
  // Weird iteration because IE will replace the length property
  // with an element if you are cloning the body and one of the
  // elements on the page has a name or id of "length"
  for ( i = 0; srcElements[i]; ++i ) {
  cloneFixAttributes( srcElements[i], destElements[i] );
  }
 
  cloneFixAttributes( elem, clone );
  }
 
  // Copy the events from the original to the clone
  if ( dataAndEvents ) {
 
  cloneCopyEvent( elem, clone );
 
  if ( deepDataAndEvents && "getElementsByTagName" in elem ) {
 
  srcElements = elem.getElementsByTagName("*");
  destElements = clone.getElementsByTagName("*");
 
  if ( srcElements.length ) {
  for ( i = 0; srcElements[i]; ++i ) {
  cloneCopyEvent( srcElements[i], destElements[i] );
  }
  }
  }
  }
  // Return the cloned set
  return clone;
  },
  clean: function( elems, context, fragment, scripts ) {
  context = context || document;
 
  // !context.createElement fails in IE with an error but returns typeof 'object'
  if ( typeof context.createElement === "undefined" ) {
  context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
  }
 
  var ret = [];
 
  for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
  if ( typeof elem === "number" ) {
  elem += "";
  }
 
  if ( !elem ) {
  continue;
  }
 
  // Convert html string into DOM nodes
  if ( typeof elem === "string" && !rhtml.test( elem ) ) {
  elem = context.createTextNode( elem );
 
  } else if ( typeof elem === "string" ) {
  // Fix "XHTML"-style tags in all browsers
  elem = elem.replace(rxhtmlTag, "<$1></$2>");
 
  // Trim whitespace, otherwise indexOf won't work as expected
  var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
  wrap = wrapMap[ tag ] || wrapMap._default,
  depth = wrap[0],
  div = context.createElement("div");
 
  // Go to html and back, then peel off extra wrappers
  div.innerHTML = wrap[1] + elem + wrap[2];
 
  // Move to the right depth
  while ( depth-- ) {
  div = div.lastChild;
  }
 
  // Remove IE's autoinserted <tbody> from table fragments
  if ( !jQuery.support.tbody ) {
 
  // String was a <table>, *may* have spurious <tbody>
  var hasBody = rtbody.test(elem),
  tbody = tag === "table" && !hasBody ?
  div.firstChild && div.firstChild.childNodes :
 
  // String was a bare <thead> or <tfoot>
  wrap[1] === "<table>" && !hasBody ?
  div.childNodes :
  [];
 
  for ( var j = tbody.length - 1; j >= 0 ; --j ) {
  if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
  tbody[ j ].parentNode.removeChild( tbody[ j ] );
  }
  }
 
  }
 
  // IE completely kills leading whitespace when innerHTML is used
  if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
  div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
  }
 
  elem = div.childNodes;
  }
 
  if ( elem.nodeType ) {
  ret.push( elem );
  } else {
  ret = jQuery.merge( ret, elem );
  }
  }
 
  if ( fragment ) {
  for ( i = 0; ret[i]; i++ ) {
  if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
  scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
 
  } else {
  if ( ret[i].nodeType === 1 ) {
  ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
  }
  fragment.appendChild( ret[i] );
  }
  }
  }
 
  return ret;
  },
 
  cleanData: function( elems ) {
  var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
  deleteExpando = jQuery.support.deleteExpando;
 
  for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
  if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
  continue;
  }
 
  id = elem[ jQuery.expando ];
 
  if ( id ) {
  data = cache[ id ] && cache[ id ][ internalKey ];
 
  if ( data && data.events ) {
  for ( var type in data.events ) {
  if ( special[ type ] ) {
  jQuery.event.remove( elem, type );
 
  // This is a shortcut to avoid jQuery.event.remove's overhead
  } else {
  jQuery.removeEvent( elem, type, data.handle );
  }
  }
 
  // Null the DOM reference to avoid IE6/7/8 leak (#7054)
  if ( data.handle ) {
  data.handle.elem = null;
  }
  }
 
  if ( deleteExpando ) {
  delete elem[ jQuery.expando ];
 
  } else if ( elem.removeAttribute ) {
  elem.removeAttribute( jQuery.expando );
  }
 
  delete cache[ id ];
  }
  }
  }
  });
 
  function evalScript( i, elem ) {
  if ( elem.src ) {
  jQuery.ajax({
  url: elem.src,
  async: false,
  dataType: "script"
  });
  } else {
  jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  }
 
  if ( elem.parentNode ) {
  elem.parentNode.removeChild( elem );
  }
  }
 
 
 
 
  var ralpha = /alpha\([^)]*\)/i,
  ropacity = /opacity=([^)]*)/,
  rdashAlpha = /-([a-z])/ig,
  rupper = /([A-Z])/g,
  rnumpx = /^-?\d+(?:px)?$/i,
  rnum = /^-?\d/,
 
  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
  cssWidth = [ "Left", "Right" ],
  cssHeight = [ "Top", "Bottom" ],
  curCSS,
 
  getComputedStyle,
  currentStyle,
 
  fcamelCase = function( all, letter ) {
  return letter.toUpperCase();
  };
 
  jQuery.fn.css = function( name, value ) {
  // Setting 'undefined' is a no-op
  if ( arguments.length === 2 && value === undefined ) {
  return this;
  }
 
  return jQuery.access( this, name, value, true, function( elem, name, value ) {
  return value !== undefined ?
  jQuery.style( elem, name, value ) :
  jQuery.css( elem, name );
  });
  };
 
  jQuery.extend({
  // Add in style property hooks for overriding the default
  // behavior of getting and setting a style property
  cssHooks: {
  opacity: {
  get: function( elem, computed ) {
  if ( computed ) {
  // We should always get a number back from opacity
  var ret = curCSS( elem, "opacity", "opacity" );
  return ret === "" ? "1" : ret;
 
  } else {
  return elem.style.opacity;
  }
  }
  }
  },
 
  // Exclude the following css properties to add px
  cssNumber: {
  "zIndex": true,
  "fontWeight": true,
  "opacity": true,
  "zoom": true,
  "lineHeight": true
  },
 
  // Add in properties whose names you wish to fix before
  // setting or getting the value
  cssProps: {
  // normalize float css property
  "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
  },
 
  // Get and set the style property on a DOM Node
  style: function( elem, name, value, extra ) {
  // Don't set styles on text and comment nodes
  if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
  return;
  }
 
  // Make sure that we're working with the right name
  var ret, origName = jQuery.camelCase( name ),
  style = elem.style, hooks = jQuery.cssHooks[ origName ];
 
  name = jQuery.cssProps[ origName ] || origName;
 
  // Check if we're setting a value
  if ( value !== undefined ) {
  // Make sure that NaN and null values aren't set. See: #7116
  if ( typeof value === "number" && isNaN( value ) || value == null ) {
  return;
  }
 
  // If a number was passed in, add 'px' to the (except for certain CSS properties)
  if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
  value += "px";
  }
 
  // If a hook was provided, use that value, otherwise just set the specified value
  if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
  // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
  // Fixes bug #5509
  try {
  style[ name ] = value;
  } catch(e) {}
  }
 
  } else {
  // If a hook was provided get the non-computed value from there
  if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
  return ret;
  }
 
  // Otherwise just get the value from the style object
  return style[ name ];
  }
  },
 
  css: function( elem, name, extra ) {
  // Make sure that we're working with the right name
  var ret, origName = jQuery.camelCase( name ),
  hooks = jQuery.cssHooks[ origName ];
 
  name = jQuery.cssProps[ origName ] || origName;
 
  // If a hook was provided get the computed value from there
  if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
  return ret;
 
  // Otherwise, if a way to get the computed value exists, use that
  } else if ( curCSS ) {
  return curCSS( elem, name, origName );
  }
  },
 
  // A method for quickly swapping in/out CSS properties to get correct calculations
  swap: function( elem, options, callback ) {
  var old = {};
 
  // Remember the old values, and insert the new ones
  for ( var name in options ) {
  old[ name ] = elem.style[ name ];
  elem.style[ name ] = options[ name ];
  }
 
  callback.call( elem );
 
  // Revert the old values
  for ( name in options ) {
  elem.style[ name ] = old[ name ];
  }
  },
 
  camelCase: function( string ) {
  return string.replace( rdashAlpha, fcamelCase );
  }
  });
 
  // DEPRECATED, Use jQuery.css() instead
  jQuery.curCSS = jQuery.css;
 
  jQuery.each(["height", "width"], function( i, name ) {
  jQuery.cssHooks[ name ] = {
  get: function( elem, computed, extra ) {
  var val;
 
  if ( computed ) {
  if ( elem.offsetWidth !== 0 ) {
  val = getWH( elem, name, extra );
 
  } else {
  jQuery.swap( elem, cssShow, function() {
  val = getWH( elem, name, extra );
  });
  }
 
  if ( val <= 0 ) {
  val = curCSS( elem, name, name );
 
  if ( val === "0px" && currentStyle ) {
  val = currentStyle( elem, name, name );
  }
 
  if ( val != null ) {
  // Should return "auto" instead of 0, use 0 for
  // temporary backwards-compat
  return val === "" || val === "auto" ? "0px" : val;
  }
  }
 
  if ( val < 0 || val == null ) {
  val = elem.style[ name ];
 
  // Should return "auto" instead of 0, use 0 for
  // temporary backwards-compat
  return val === "" || val === "auto" ? "0px" : val;
  }
 
  return typeof val === "string" ? val : val + "px";
  }
  },
 
  set: function( elem, value ) {
  if ( rnumpx.test( value ) ) {
  // ignore negative width and height values #1599
  value = parseFloat(value);
 
  if ( value >= 0 ) {
  return value + "px";
  }
 
  } else {
  return value;
  }
  }
  };
  });
 
  if ( !jQuery.support.opacity ) {
  jQuery.cssHooks.opacity = {
  get: function( elem, computed ) {
  // IE uses filters for opacity
  return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
  (parseFloat(RegExp.$1) / 100) + "" :
  computed ? "1" : "";
  },
 
  set: function( elem, value ) {
  var style = elem.style;
 
  // IE has trouble with opacity if it does not have layout
  // Force it by setting the zoom level
  style.zoom = 1;
 
  // Set the alpha filter to set the opacity
  var opacity = jQuery.isNaN(value) ?
  "" :
  "alpha(opacity=" + value * 100 + ")",
  filter = style.filter || "";
 
  style.filter = ralpha.test(filter) ?
  filter.replace(ralpha, opacity) :
  style.filter + ' ' + opacity;
  }
  };
  }
 
  if ( document.defaultView && document.defaultView.getComputedStyle ) {
  getComputedStyle = function( elem, newName, name ) {
  var ret, defaultView, computedStyle;
 
  name = name.replace( rupper, "-$1" ).toLowerCase();
 
  if ( !(defaultView = elem.ownerDocument.defaultView) ) {
  return undefined;
  }
 
  if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
  ret = computedStyle.getPropertyValue( name );
  if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
  ret = jQuery.style( elem, name );
  }
  }
 
  return ret;
  };
  }
 
  if ( document.documentElement.currentStyle ) {
  currentStyle = function( elem, name ) {
  var left,
  ret = elem.currentStyle && elem.currentStyle[ name ],
  rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
  style = elem.style;
 
  // From the awesome hack by Dean Edwards
  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
  // If we're not dealing with a regular pixel number
  // but a number that has a weird ending, we need to convert it to pixels
  if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
  // Remember the original values
  left = style.left;
 
  // Put in the new values to get a computed value out
  if ( rsLeft ) {
  elem.runtimeStyle.left = elem.currentStyle.left;
  }
  style.left = name === "fontSize" ? "1em" : (ret || 0);
  ret = style.pixelLeft + "px";
 
  // Revert the changed values
  style.left = left;
  if ( rsLeft ) {
  elem.runtimeStyle.left = rsLeft;
  }
  }
 
  return ret === "" ? "auto" : ret;
  };
  }
 
  curCSS = getComputedStyle || currentStyle;
 
  function getWH( elem, name, extra ) {
  var which = name === "width" ? cssWidth : cssHeight,
  val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
 
  if ( extra === "border" ) {
  return val;
  }
 
  jQuery.each( which, function() {
  if ( !extra ) {
  val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
  }
 
  if ( extra === "margin" ) {
  val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
 
  } else {
  val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
  }
  });
 
  return val;
  }
 
  if ( jQuery.expr && jQuery.expr.filters ) {
  jQuery.expr.filters.hidden = function( elem ) {
  var width = elem.offsetWidth,
  height = elem.offsetHeight;
 
  return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
  };
 
  jQuery.expr.filters.visible = function( elem ) {
  return !jQuery.expr.filters.hidden( elem );
  };
  }
 
 
 
 
  var r20 = /%20/g,
  rbracket = /\[\]$/,
  rCRLF = /\r?\n/g,
  rhash = /#.*$/,
  rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL
  rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
  rnoContent = /^(?:GET|HEAD)$/,
  rprotocol = /^\/\//,
  rquery = /\?/,
  rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
  rselectTextarea = /^(?:select|textarea)/i,
  rspacesAjax = /\s+/,
  rts = /([?&])_=[^&]*/,
  rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/,
 
  // Keep a copy of the old load method
  _load = jQuery.fn.load,
 
  /* Prefilters
  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  * 2) These are called:
  * - BEFORE asking for a transport
  * - AFTER param serialization (s.data is a string if s.processData is true)
  * 3) key is the dataType
  * 4) the catchall symbol "*" can be used
  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  */
  prefilters = {},
 
  /* Transports bindings
  * 1) key is the dataType
  * 2) the catchall symbol "*" can be used
  * 3) selection will start with transport dataType and THEN go to "*" if needed
  */
  transports = {};
 
  // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
  function addToPrefiltersOrTransports( structure ) {
 
  // dataTypeExpression is optional and defaults to "*"
  return function( dataTypeExpression, func ) {
 
  if ( typeof dataTypeExpression !== "string" ) {
  func = dataTypeExpression;
  dataTypeExpression = "*";
  }
 
  if ( jQuery.isFunction( func ) ) {
  var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
  i = 0,
  length = dataTypes.length,
  dataType,
  list,
  placeBefore;
 
  // For each dataType in the dataTypeExpression
  for(; i < length; i++ ) {
  dataType = dataTypes[ i ];
  // We control if we're asked to add before
  // any existing element
  placeBefore = /^\+/.test( dataType );
  if ( placeBefore ) {
  dataType = dataType.substr( 1 ) || "*";
  }
  list = structure[ dataType ] = structure[ dataType ] || [];
  // then we add to the structure accordingly
  list[ placeBefore ? "unshift" : "push" ]( func );
  }
  }
  };
  }
 
  //Base inspection function for prefilters and transports
  function inspectPrefiltersOrTransports( structure, options, originalOptions, jXHR,
  dataType /* internal */, inspected /* internal */ ) {
 
  dataType = dataType || options.dataTypes[ 0 ];
  inspected = inspected || {};
 
  inspected[ dataType ] = true;
 
  var list = structure[ dataType ],
  i = 0,
  length = list ? list.length : 0,
  executeOnly = ( structure === prefilters ),
  selection;
 
  for(; i < length && ( executeOnly || !selection ); i++ ) {
  selection = list[ i ]( options, originalOptions, jXHR );
  // If we got redirected to another dataType
  // we try there if not done already
  if ( typeof selection === "string" ) {
  if ( inspected[ selection ] ) {
  selection = undefined;
  } else {
  options.dataTypes.unshift( selection );
  selection = inspectPrefiltersOrTransports(
  structure, options, originalOptions, jXHR, selection, inspected );
  }
  }
  }
  // If we're only executing or nothing was selected
  // we try the catchall dataType if not done already
  if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
  selection = inspectPrefiltersOrTransports(
  structure, options, originalOptions, jXHR, "*", inspected );
  }
  // unnecessary when only executing (prefilters)
  // but it'll be ignored by the caller in that case
  return selection;
  }
 
  jQuery.fn.extend({
  load: function( url, params, callback ) {
  if ( typeof url !== "string" && _load ) {
  return _load.apply( this, arguments );
 
  // Don't do a request if no elements are being requested
  } else if ( !this.length ) {
  return this;
  }
 
  var off = url.indexOf( " " );
  if ( off >= 0 ) {
  var selector = url.slice( off, url.length );
  url = url.slice( 0, off );
  }
 
  // Default to a GET request
  var type = "GET";
 
  // If the second parameter was provided
  if ( params ) {
  // If it's a function
  if ( jQuery.isFunction( params ) ) {
  // We assume that it's the callback
  callback = params;
  params = null;
 
  // Otherwise, build a param string
  } else if ( typeof params === "object" ) {
  params = jQuery.param( params, jQuery.ajaxSettings.traditional );
  type = "POST";
  }
  }
 
  var self = this;
 
  // Request the remote document
  jQuery.ajax({
  url: url,
  type: type,
  dataType: "html",
  data: params,
  // Complete callback (responseText is used internally)
  complete: function( jXHR, status, responseText ) {
  // Store the response as specified by the jXHR object
  responseText = jXHR.responseText;
  // If successful, inject the HTML into all the matched elements
  if ( jXHR.isResolved() ) {
  // #4825: Get the actual response in case
  // a dataFilter is present in ajaxSettings
  jXHR.done(function( r ) {
  responseText = r;
  });
  // See if a selector was specified
  self.html( selector ?
  // Create a dummy div to hold the results
  jQuery("<div>")
  // inject the contents of the document in, removing the scripts
  // to avoid any 'Permission Denied' errors in IE
  .append(responseText.replace(rscript, ""))
 
  // Locate the specified elements
  .find(selector) :
 
  // If not, just inject the full result
  responseText );
  }
 
  if ( callback ) {
  self.each( callback, [ responseText, status, jXHR ] );
  }
  }
  });
 
  return this;
  },
 
  serialize: function() {
  return jQuery.param( this.serializeArray() );
  },
 
  serializeArray: function() {
  return this.map(function(){
  return this.elements ? jQuery.makeArray( this.elements ) : this;
  })
  .filter(function(){
  return this.name && !this.disabled &&
  ( this.checked || rselectTextarea.test( this.nodeName ) ||
  rinput.test( this.type ) );
  })
  .map(function( i, elem ){
  var val = jQuery( this ).val();
 
  return val == null ?
  null :
  jQuery.isArray( val ) ?
  jQuery.map( val, function( val, i ){
  return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  }) :
  { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  }).get();
  }
  });
 
  // Attach a bunch of functions for handling common AJAX events
  jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
  jQuery.fn[ o ] = function( f ){
  return this.bind( o, f );
  };
  } );
 
  jQuery.each( [ "get", "post" ], function( i, method ) {
  jQuery[ method ] = function( url, data, callback, type ) {
  // shift arguments if data argument was omitted
  if ( jQuery.isFunction( data ) ) {
  type = type || callback;
  callback = data;
  data = null;
  }
 
  return jQuery.ajax({
  type: method,
  url: url,
  data: data,
  success: callback,
  dataType: type
  });
  };
  } );
 
  jQuery.extend({
 
  getScript: function( url, callback ) {
  return jQuery.get( url, null, callback, "script" );
  },
 
  getJSON: function( url, data, callback ) {
  return jQuery.get( url, data, callback, "json" );
  },
 
  ajaxSetup: function( settings ) {
  jQuery.extend( true, jQuery.ajaxSettings, settings );
  if ( settings.context ) {
  jQuery.ajaxSettings.context = settings.context;
  }
  },
 
  ajaxSettings: {
  url: location.href,
  global: true,
  type: "GET",
  contentType: "application/x-www-form-urlencoded",
  processData: true,
  async: true,
  /*
  timeout: 0,
  data: null,
  dataType: null,
  username: null,
  password: null,
  cache: null,
  traditional: false,
  headers: {},
  crossDomain: null,
  */
 
  accepts: {
  xml: "application/xml, text/xml",
  html: "text/html",
  text: "text/plain",
  json: "application/json, text/javascript",
  "*": "*/*"
  },
 
  contents: {
  xml: /xml/,
  html: /html/,
  json: /json/
  },
 
  responseFields: {
  xml: "responseXML",
  text: "responseText"
  },
 
  // List of data converters
  // 1) key format is "source_type destination_type" (a single space in-between)
  // 2) the catchall symbol "*" can be used for source_type
  converters: {
 
  // Convert anything to text
  "* text": window.String,
 
  // Text to html (true = no transformation)
  "text html": true,
 
  // Evaluate text as a json expression
  "text json": jQuery.parseJSON,
 
  // Parse text as xml
  "text xml": jQuery.parseXML
  }
  },
 
  ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
  ajaxTransport: addToPrefiltersOrTransports( transports ),
 
  // Main method
  ajax: function( url, options ) {
 
  // If options is not an object,
  // we simulate pre-1.5 signature
  if ( typeof options !== "object" ) {
  options = url;
  url = undefined;
  }
 
  // Force options to be an object
  options = options || {};
 
  var // Create the final options object
  s = jQuery.extend( true, {}, jQuery.ajaxSettings, options ),
  // Callbacks contexts
  // We force the original context if it exists
  // or take it from jQuery.ajaxSettings otherwise
  // (plain objects used as context get extended)
  callbackContext =
  ( s.context = ( "context" in options ? options : jQuery.ajaxSettings ).context ) || s,
  globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
  // Deferreds
  deferred = jQuery.Deferred(),
  completeDeferred = jQuery._Deferred(),
  // Status-dependent callbacks
  statusCode = s.statusCode || {},
  // Headers (they are sent all at once)
  requestHeaders = {},
  // Response headers
  responseHeadersString,
  responseHeaders,
  // transport
  transport,
  // timeout handle
  timeoutTimer,
  // Cross-domain detection vars
  loc = document.location,
  protocol = loc.protocol || "http:",
  parts,
  // The jXHR state
  state = 0,
  // Loop variable
  i,
  // Fake xhr
  jXHR = {
 
  readyState: 0,
 
  // Caches the header
  setRequestHeader: function( name, value ) {
  if ( state === 0 ) {
  requestHeaders[ name.toLowerCase() ] = value;
  }
  return this;
  },
 
  // Raw string
  getAllResponseHeaders: function() {
  return state === 2 ? responseHeadersString : null;
  },
 
  // Builds headers hashtable if needed
  getResponseHeader: function( key ) {
  var match;
  if ( state === 2 ) {
  if ( !responseHeaders ) {
  responseHeaders = {};
  while( ( match = rheaders.exec( responseHeadersString ) ) ) {
  responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
  }
  }
  match = responseHeaders[ key.toLowerCase() ];
  }
  return match || null;
  },
 
  // Cancel the request
  abort: function( statusText ) {
  statusText = statusText || "abort";
  if ( transport ) {
  transport.abort( statusText );
  }
  done( 0, statusText );
  return this;
  }
  };
 
  // Callback for when everything is done
  // It is defined here because jslint complains if it is declared
  // at the end of the function (which would be more logical and readable)
  function done( status, statusText, responses, headers) {
 
  // Called once
  if ( state === 2 ) {
  return;
  }
 
  // State is "done" now
  state = 2;
 
  // Clear timeout if it exists
  if ( timeoutTimer ) {
  clearTimeout( timeoutTimer );
  }
 
  // Dereference transport for early garbage collection
  // (no matter how long the jXHR object will be used)
  transport = undefined;
 
  // Cache response headers
  responseHeadersString = headers || "";
 
  // Set readyState
  jXHR.readyState = status ? 4 : 0;
 
  var isSuccess,
  success,
  error,
  response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined,
  lastModified,
  etag;
 
  // If successful, handle type chaining
  if ( status >= 200 && status < 300 || status === 304 ) {
 
  // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  if ( s.ifModified ) {
 
  if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) {
  jQuery.lastModified[ s.url ] = lastModified;
  }
  if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) {
  jQuery.etag[ s.url ] = etag;
  }
  }
 
  // If not modified
  if ( status === 304 ) {
 
  statusText = "notmodified";
  isSuccess = true;
 
  // If we have data
  } else {
 
  try {
  success = ajaxConvert( s, response );
  statusText = "success";
  isSuccess = true;
  } catch(e) {
  // We have a parsererror
  statusText = "parsererror";
  error = e;
  }
  }
  } else {
  // We extract error from statusText
  // then normalize statusText and status for non-aborts
  error = statusText;
  if( status ) {
  statusText = "error";
  if ( status < 0 ) {
  status = 0;
  }
  }
  }
 
  // Set data for the fake xhr object
  jXHR.status = status;
  jXHR.statusText = statusText;
 
  // Success/Error
  if ( isSuccess ) {
  deferred.resolveWith( callbackContext, [ success, statusText, jXHR ] );
  } else {
  deferred.rejectWith( callbackContext, [ jXHR, statusText, error ] );
  }
 
  // Status-dependent callbacks
  jXHR.statusCode( statusCode );
  statusCode = undefined;
 
  if ( s.global ) {
  globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
  [ jXHR, s, isSuccess ? success : error ] );
  }
 
  // Complete
  completeDeferred.resolveWith( callbackContext, [ jXHR, statusText ] );
 
  if ( s.global ) {
  globalEventContext.trigger( "ajaxComplete", [ jXHR, s] );
  // Handle the global AJAX counter
  if ( !( --jQuery.active ) ) {
  jQuery.event.trigger( "ajaxStop" );
  }
  }
  }
 
  // Attach deferreds
  deferred.promise( jXHR );
  jXHR.success = jXHR.done;
  jXHR.error = jXHR.fail;
  jXHR.complete = completeDeferred.done;
 
  // Status-dependent callbacks
  jXHR.statusCode = function( map ) {
  if ( map ) {
  var tmp;
  if ( state < 2 ) {
  for( tmp in map ) {
  statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
  }
  } else {
  tmp = map[ jXHR.status ];
  jXHR.then( tmp, tmp );
  }
  }
  return this;
  };
 
  // Remove hash character (#7531: and string promotion)
  // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
  // We also use the url parameter if available
  s.url = ( "" + ( url || s.url ) ).replace( rhash, "" ).replace( rprotocol, protocol + "//" );
 
  // Extract dataTypes list
  s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
 
  // Determine if a cross-domain request is in order
  if ( !s.crossDomain ) {
  parts = rurl.exec( s.url.toLowerCase() );
  s.crossDomain = !!( parts &&
  ( parts[ 1 ] != protocol || parts[ 2 ] != loc.hostname ||
  ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
  ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) )
  );
  }
 
  // Convert data if not already a string
  if ( s.data && s.processData && typeof s.data !== "string" ) {
  s.data = jQuery.param( s.data, s.traditional );
  }
 
  // Apply prefilters
  inspectPrefiltersOrTransports( prefilters, s, options, jXHR );
 
  // Uppercase the type
  s.type = s.type.toUpperCase();
 
  // Determine if request has content
  s.hasContent = !rnoContent.test( s.type );
 
  // Watch for a new set of requests
  if ( s.global && jQuery.active++ === 0 ) {
  jQuery.event.trigger( "ajaxStart" );
  }
 
  // More options handling for requests with no content
  if ( !s.hasContent ) {
 
  // If data is available, append data to url
  if ( s.data ) {
  s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
  }
 
  // Add anti-cache in url if needed
  if ( s.cache === false ) {
 
  var ts = jQuery.now(),
  // try replacing _= if it is there
  ret = s.url.replace( rts, "$1_=" + ts );
 
  // if nothing was replaced, add timestamp to the end
  s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
  }
  }
 
  // Set the correct header, if data is being sent
  if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
  requestHeaders[ "content-type" ] = s.contentType;
  }
 
  // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  if ( s.ifModified ) {
  if ( jQuery.lastModified[ s.url ] ) {
  requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ];
  }
  if ( jQuery.etag[ s.url ] ) {
  requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ];
  }
  }
 
  // Set the Accepts header for the server, depending on the dataType
  requestHeaders.accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
  s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
  s.accepts[ "*" ];
 
  // Check for headers option
  for ( i in s.headers ) {
  requestHeaders[ i.toLowerCase() ] = s.headers[ i ];
  }
 
  // Allow custom headers/mimetypes and early abort
  if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jXHR, s ) === false || state === 2 ) ) {
  // Abort if not done already
  done( 0, "abort" );
  // Return false
  jXHR = false;
 
  } else {
 
  // Install callbacks on deferreds
  for ( i in { success: 1, error: 1, complete: 1 } ) {
  jXHR[ i ]( s[ i ] );
  }
 
  // Get transport
  transport = inspectPrefiltersOrTransports( transports, s, options, jXHR );
 
  // If no transport, we auto-abort
  if ( !transport ) {
  done( -1, "No Transport" );
  } else {
  // Set state as sending
  state = jXHR.readyState = 1;
  // Send global event
  if ( s.global ) {
  globalEventContext.trigger( "ajaxSend", [ jXHR, s ] );
  }
  // Timeout
  if ( s.async && s.timeout > 0 ) {
  timeoutTimer = setTimeout( function(){
  jXHR.abort( "timeout" );
  }, s.timeout );
  }
 
  try {
  transport.send( requestHeaders, done );
  } catch (e) {
  // Propagate exception as error if not done
  if ( status < 2 ) {
  done( -1, e );
  // Simply rethrow otherwise
  } else {
  jQuery.error( e );
  }
  }
  }
  }
  return jXHR;
  },
 
  // Serialize an array of form elements or a set of
  // key/values into a query string
  param: function( a, traditional ) {
  var s = [],
  add = function( key, value ) {
  // If value is a function, invoke it and return its value
  value = jQuery.isFunction( value ) ? value() : value;
  s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
  };
 
  // Set traditional to true for jQuery <= 1.3.2 behavior.
  if ( traditional === undefined ) {
  traditional = jQuery.ajaxSettings.traditional;
  }
 
  // If an array was passed in, assume that it is an array of form elements.
  if ( jQuery.isArray( a ) || a.jquery ) {
  // Serialize the form elements
  jQuery.each( a, function() {
  add( this.name, this.value );
  } );
 
  } else {
  // If traditional, encode the "old" way (the way 1.3.2 or older
  // did it), otherwise encode params recursively.
  for ( var prefix in a ) {
  buildParams( prefix, a[ prefix ], traditional, add );
  }
  }
 
  // Return the resulting serialization
  return s.join( "&" ).replace( r20, "+" );
  }
  });
 
  function buildParams( prefix, obj, traditional, add ) {
  if ( jQuery.isArray( obj ) && obj.length ) {
  // Serialize array item.
  jQuery.each( obj, function( i, v ) {
  if ( traditional || rbracket.test( prefix ) ) {
  // Treat each array item as a scalar.
  add( prefix, v );
 
  } else {
  // If array item is non-scalar (array or object), encode its
  // numeric index to resolve deserialization ambiguity issues.
  // Note that rack (as of 1.0.0) can't currently deserialize
  // nested arrays properly, and attempting to do so may cause
  // a server error. Possible fixes are to modify rack's
  // deserialization algorithm or to provide an option or flag
  // to force array serialization to be shallow.
  buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
  }
  });
 
  } else if ( !traditional && obj != null && typeof obj === "object" ) {
  // If we see an array here, it is empty and should be treated as an empty
  // object
  if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
  add( prefix, "" );
 
  // Serialize object item.
  } else {
  jQuery.each( obj, function( k, v ) {
  buildParams( prefix + "[" + k + "]", v, traditional, add );
  });
  }
 
  } else {
  // Serialize scalar item.
  add( prefix, obj );
  }
  }
 
  // This is still on the jQuery object... for now
  // Want to move this to jQuery.ajax some day
  jQuery.extend({
 
  // Counter for holding the number of active queries
  active: 0,
 
  // Last-Modified header cache for next request
  lastModified: {},
  etag: {}
 
  });
 
  /* Handles responses to an ajax request:
  * - sets all responseXXX fields accordingly
  * - finds the right dataType (mediates between content-type and expected dataType)
  * - returns the corresponding response
  */
  function ajaxHandleResponses( s, jXHR, responses ) {
 
  var contents = s.contents,
  dataTypes = s.dataTypes,
  responseFields = s.responseFields,
  ct,
  type,
  finalDataType,
  firstDataType;
 
  // Fill responseXXX fields
  for( type in responseFields ) {
  if ( type in responses ) {
  jXHR[ responseFields[type] ] = responses[ type ];
  }
  }
 
  // Remove auto dataType and get content-type in the process
  while( dataTypes[ 0 ] === "*" ) {
  dataTypes.shift();
  if ( ct === undefined ) {
  ct = jXHR.getResponseHeader( "content-type" );
  }
  }
 
  // Check if we're dealing with a known content-type
  if ( ct ) {
  for ( type in contents ) {
  if ( contents[ type ] && contents[ type ].test( ct ) ) {
  dataTypes.unshift( type );
  break;
  }
  }
  }
 
  // Check to see if we have a response for the expected dataType
  if ( dataTypes[ 0 ] in responses ) {
  finalDataType = dataTypes[ 0 ];
  } else {
  // Try convertible dataTypes
  for ( type in responses ) {
  if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
  finalDataType = type;
  break;
  }
  if ( !firstDataType ) {
  firstDataType = type;
  }
  }
  // Or just use first one
  finalDataType = finalDataType || firstDataType;
  }
 
  // If we found a dataType
  // We add the dataType to the list if needed
  // and return the corresponding response
  if ( finalDataType ) {
  if ( finalDataType !== dataTypes[ 0 ] ) {
  dataTypes.unshift( finalDataType );
  }
  return responses[ finalDataType ];
  }
  }
 
  // Chain conversions given the request and the original response
  function ajaxConvert( s, response ) {
 
  // Apply the dataFilter if provided
  if ( s.dataFilter ) {
  response = s.dataFilter( response, s.dataType );
  }
 
  var dataTypes = s.dataTypes,
  converters = s.converters,
  i,
  length = dataTypes.length,
  tmp,
  // Current and previous dataTypes
  current = dataTypes[ 0 ],
  prev,
  // Conversion expression
  conversion,
  // Conversion function
  conv,
  // Conversion functions (transitive conversion)
  conv1,
  conv2;
 
  // For each dataType in the chain
  for( i = 1; i < length; i++ ) {
 
  // Get the dataTypes
  prev = current;
  current = dataTypes[ i ];
 
  // If current is auto dataType, update it to prev
  if( current === "*" ) {
  current = prev;
  // If no auto and dataTypes are actually different
  } else if ( prev !== "*" && prev !== current ) {
 
  // Get the converter
  conversion = prev + " " + current;
  conv = converters[ conversion ] || converters[ "* " + current ];
 
  // If there is no direct converter, search transitively
  if ( !conv ) {
  conv2 = undefined;
  for( conv1 in converters ) {
  tmp = conv1.split( " " );
  if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
  conv2 = converters[ tmp[1] + " " + current ];
  if ( conv2 ) {
  conv1 = converters[ conv1 ];
  if ( conv1 === true ) {
  conv = conv2;
  } else if ( conv2 === true ) {
  conv = conv1;
  }
  break;
  }
  }
  }
  }
  // If we found no converter, dispatch an error
  if ( !( conv || conv2 ) ) {
  jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
  }
  // If found converter is not an equivalence
  if ( conv !== true ) {
  // Convert with 1 or 2 converters accordingly
  response = conv ? conv( response ) : conv2( conv1(response) );
  }
  }
  }
  return response;
  }
 
 
 
 
  var jsc = jQuery.now(),
  jsre = /(\=)\?(&|$)|()\?\?()/i;
 
  // Default jsonp settings
  jQuery.ajaxSetup({
  jsonp: "callback",
  jsonpCallback: function() {
  return jQuery.expando + "_" + ( jsc++ );
  }
  });
 
  // Detect, normalize options and install callbacks for jsonp requests
  jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {
 
  dataIsString = ( typeof s.data === "string" );
 
  if ( s.dataTypes[ 0 ] === "jsonp" ||
  originalSettings.jsonpCallback ||
  originalSettings.jsonp != null ||
  s.jsonp !== false && ( jsre.test( s.url ) ||
  dataIsString && jsre.test( s.data ) ) ) {
 
  var responseContainer,
  jsonpCallback = s.jsonpCallback =
  jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
  previous = window[ jsonpCallback ],
  url = s.url,
  data = s.data,
  replace = "$1" + jsonpCallback + "$2";
 
  if ( s.jsonp !== false ) {
  url = url.replace( jsre, replace );
  if ( s.url === url ) {
  if ( dataIsString ) {
  data = data.replace( jsre, replace );
  }
  if ( s.data === data ) {
  // Add callback manually
  url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
  }
  }
  }
 
  s.url = url;
  s.data = data;
 
  window[ jsonpCallback ] = function( response ) {
  responseContainer = [ response ];
  };
 
  s.complete = [ function() {
 
  // Set callback back to previous value
  window[ jsonpCallback ] = previous;
 
  // Call if it was a function and we have a response
  if ( previous) {
  if ( responseContainer && jQuery.isFunction( previous ) ) {
  window[ jsonpCallback ] ( responseContainer[ 0 ] );
  }
  } else {
  // else, more memory leak avoidance
  try{
  delete window[ jsonpCallback ];
  } catch( e ) {}
  }
 
  }, s.complete ];
 
  // Use data converter to retrieve json after script execution
  s.converters["script json"] = function() {
  if ( ! responseContainer ) {
  jQuery.error( jsonpCallback + " was not called" );
  }
  return responseContainer[ 0 ];
  };
 
  // force json dataType
  s.dataTypes[ 0 ] = "json";
 
  // Delegate to script
  return "script";
  }
  } );
 
 
 
 
  // Install script dataType
  jQuery.ajaxSetup({
  accepts: {
  script: "text/javascript, application/javascript"
  },
  contents: {
  script: /javascript/
  },
  converters: {
  "text script": function( text ) {
  jQuery.globalEval( text );
  return text;
  }
  }
  });
 
  // Handle cache's special case and global
  jQuery.ajaxPrefilter( "script", function( s ) {
  if ( s.cache === undefined ) {
  s.cache = false;
  }
  if ( s.crossDomain ) {
  s.type = "GET";
  s.global = false;
  }
  } );
 
  // Bind script tag hack transport
  jQuery.ajaxTransport( "script", function(s) {
 
  // This transport only deals with cross domain requests
  if ( s.crossDomain ) {
 
  var script,
  head = document.getElementsByTagName( "head" )[ 0 ] || document.documentElement;
 
  return {
 
  send: function( _, callback ) {
 
  script = document.createElement( "script" );
 
  script.async = "async";
 
  if ( s.scriptCharset ) {
  script.charset = s.scriptCharset;
  }
 
  script.src = s.url;
 
  // Attach handlers for all browsers
  script.onload = script.onreadystatechange = function( _, isAbort ) {
 
  if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
  // Handle memory leak in IE
  script.onload = script.onreadystatechange = null;
 
  // Remove the script
  if ( head && script.parentNode ) {
  head.removeChild( script );
  }
 
  // Dereference the script
  script = undefined;
 
  // Callback if not abort
  if ( !isAbort ) {
  callback( 200, "success" );
  }
  }
  };
  // Use insertBefore instead of appendChild to circumvent an IE6 bug.
  // This arises when a base node is used (#2709 and #4378).
  head.insertBefore( script, head.firstChild );
  },
 
  abort: function() {
  if ( script ) {
  script.onload( 0, 1 );
  }
  }
  };
  }
  } );
 
 
 
 
  var // Next active xhr id
  xhrId = jQuery.now(),
 
  // active xhrs
  xhrs = {},
 
  // #5280: see below
  xhrUnloadAbortInstalled,
 
  // XHR used to determine supports properties
  testXHR;
 
  // Create the request object
  // (This is still attached to ajaxSettings for backward compatibility)
  jQuery.ajaxSettings.xhr = window.ActiveXObject ?
  /* Microsoft failed to properly
  * implement the XMLHttpRequest in IE7 (can't request local files),
  * so we use the ActiveXObject when it is available
  * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
  * we need a fallback.
  */
  function() {
  if ( window.location.protocol !== "file:" ) {
  try {
  return new window.XMLHttpRequest();
  } catch( xhrError ) {}
  }
 
  try {
  return new window.ActiveXObject("Microsoft.XMLHTTP");
  } catch( activeError ) {}
  } :
  // For all other browsers, use the standard XMLHttpRequest object
  function() {
  return new window.XMLHttpRequest();
  };
 
  // Test if we can create an xhr object
  try {
  testXHR = jQuery.ajaxSettings.xhr();
  } catch( xhrCreationException ) {}
 
  //Does this browser support XHR requests?
  jQuery.support.ajax = !!testXHR;
 
  // Does this browser support crossDomain XHR requests
  jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
 
  // No need for the temporary xhr anymore
  testXHR = undefined;
 
  // Create transport if the browser can provide an xhr
  if ( jQuery.support.ajax ) {
 
  jQuery.ajaxTransport(function( s ) {
  // Cross domain only allowed if supported through XMLHttpRequest
  if ( !s.crossDomain || jQuery.support.cors ) {
 
  var callback;
 
  return {
  send: function( headers, complete ) {
 
  // #5280: we need to abort on unload or IE will keep connections alive
  if ( !xhrUnloadAbortInstalled ) {
 
  xhrUnloadAbortInstalled = 1;
 
  jQuery(window).bind( "unload", function() {
 
  // Abort all pending requests
  jQuery.each( xhrs, function( _, xhr ) {
  if ( xhr.onreadystatechange ) {
  xhr.onreadystatechange( 1 );
  }
  } );
 
  } );
  }
 
  // Get a new xhr
  var xhr = s.xhr(),
  handle;
 
  // Open the socket
  // Passing null username, generates a login popup on Opera (#2865)
  if ( s.username ) {
  xhr.open( s.type, s.url, s.async, s.username, s.password );
  } else {
  xhr.open( s.type, s.url, s.async );
  }
 
  // Requested-With header
  // Not set for crossDomain requests with no content
  // (see why at http://trac.dojotoolkit.org/ticket/9486)
  // Won't change header if already provided
  if ( !( s.crossDomain && !s.hasContent ) && !headers["x-requested-with"] ) {
  headers[ "x-requested-with" ] = "XMLHttpRequest";
  }
 
  // Need an extra try/catch for cross domain requests in Firefox 3
  try {
  jQuery.each( headers, function( key, value ) {
  xhr.setRequestHeader( key, value );
  } );
  } catch( _ ) {}
 
  // Do send the request
  // This may raise an exception which is actually
  // handled in jQuery.ajax (so no try/catch here)
  xhr.send( ( s.hasContent && s.data ) || null );
 
  // Listener
  callback = function( _, isAbort ) {
 
  // Was never called and is aborted or complete
  if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
 
  // Only called once
  callback = 0;
 
  // Do not keep as active anymore
  if ( handle ) {
  xhr.onreadystatechange = jQuery.noop;
  delete xhrs[ handle ];
  }
 
  // If it's an abort
  if ( isAbort ) {
  // Abort it manually if needed
  if ( xhr.readyState !== 4 ) {
  xhr.abort();
  }
  } else {
  // Get info
  var status = xhr.status,
  statusText,
  responseHeaders = xhr.getAllResponseHeaders(),
  responses = {},
  xml = xhr.responseXML;
 
  // Construct response list
  if ( xml && xml.documentElement /* #4958 */ ) {
  responses.xml = xml;
  }
  responses.text = xhr.responseText;
 
  // Firefox throws an exception when accessing
  // statusText for faulty cross-domain requests
  try {
  statusText = xhr.statusText;
  } catch( e ) {
  // We normalize with Webkit giving an empty statusText
  statusText = "";
  }
 
  // Filter status for non standard behaviours
  status =
  // Opera returns 0 when it should be 304
  // Webkit returns 0 for failing cross-domain no matter the real status
  status === 0 ?
  (
  // Webkit, Firefox: filter out faulty cross-domain requests
  !s.crossDomain || statusText ?
  (
  // Opera: filter out real aborts #6060
  responseHeaders ?
  304 :
  0
  ) :
  // We assume 302 but could be anything cross-domain related
  302
  ) :
  (
  // IE sometimes returns 1223 when it should be 204 (see #1450)
  status == 1223 ?
  204 :
  status
  );
 
  // Call complete
  complete( status, statusText, responses, responseHeaders );
  }
  }
  };
 
  // if we're in sync mode or it's in cache
  // and has been retrieved directly (IE6 & IE7)
  // we need to manually fire the callback
  if ( !s.async || xhr.readyState === 4 ) {
  callback();
  } else {
  // Add to list of active xhrs
  handle = xhrId++;
  xhrs[ handle ] = xhr;
  xhr.onreadystatechange = callback;
  }
  },
 
  abort: function() {
  if ( callback ) {
  callback(0,1);
  }
  }
  };
  }
  });
  }
 
 
 
 
  var elemdisplay = {},
  rfxtypes = /^(?:toggle|show|hide)$/,
  rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
  timerId,
  fxAttrs = [
  // height animations
  [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
  // width animations
  [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
  // opacity animations
  [ "opacity" ]
  ];
 
  jQuery.fn.extend({
  show: function( speed, easing, callback ) {
  var elem, display;
 
  if ( speed || speed === 0 ) {
  return this.animate( genFx("show", 3), speed, easing, callback);
 
  } else {
  for ( var i = 0, j = this.length; i < j; i++ ) {
  elem = this[i];
  display = elem.style.display;
 
  // Reset the inline display of this element to learn if it is
  // being hidden by cascaded rules or not
  if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
  display = elem.style.display = "";
  }
 
  // Set elements which have been overridden with display: none
  // in a stylesheet to whatever the default browser style is
  // for such an element
  if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
  jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
  }
  }
 
  // Set the display of most of the elements in a second loop
  // to avoid the constant reflow
  for ( i = 0; i < j; i++ ) {
  elem = this[i];
  display = elem.style.display;
 
  if ( display === "" || display === "none" ) {
  elem.style.display = jQuery._data(elem, "olddisplay") || "";
  }
  }
 
  return this;
  }
  },
 
  hide: function( speed, easing, callback ) {
  if ( speed || speed === 0 ) {
  return this.animate( genFx("hide", 3), speed, easing, callback);
 
  } else {
  for ( var i = 0, j = this.length; i < j; i++ ) {
  var display = jQuery.css( this[i], "display" );
 
  if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
  jQuery._data( this[i], "olddisplay", display );
  }
  }
 
  // Set the display of the elements in a second loop
  // to avoid the constant reflow
  for ( i = 0; i < j; i++ ) {
  this[i].style.display = "none";
  }
 
  return this;
  }
  },
 
  // Save the old toggle function
  _toggle: jQuery.fn.toggle,
 
  toggle: function( fn, fn2, callback ) {
  var bool = typeof fn === "boolean";
 
  if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
  this._toggle.apply( this, arguments );
 
  } else if ( fn == null || bool ) {
  this.each(function() {
  var state = bool ? fn : jQuery(this).is(":hidden");
  jQuery(this)[ state ? "show" : "hide" ]();
  });
 
  } else {
  this.animate(genFx("toggle", 3), fn, fn2, callback);
  }
 
  return this;
  },
 
  fadeTo: function( speed, to, easing, callback ) {
  return this.filter(":hidden").css("opacity", 0).show().end()
  .animate({opacity: to}, speed, easing, callback);
  },
 
  animate: function( prop, speed, easing, callback ) {
  var optall = jQuery.speed(speed, easing, callback);
 
  if ( jQuery.isEmptyObject( prop ) ) {
  return this.each( optall.complete );
  }
 
  return this[ optall.queue === false ? "each" : "queue" ](function() {
  // XXX 'this' does not always have a nodeName when running the
  // test suite
 
  var opt = jQuery.extend({}, optall), p,
  isElement = this.nodeType === 1,
  hidden = isElement && jQuery(this).is(":hidden"),
  self = this;
 
  for ( p in prop ) {
  var name = jQuery.camelCase( p );
 
  if ( p !== name ) {
  prop[ name ] = prop[ p ];
  delete prop[ p ];
  p = name;
  }
 
  if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
  return opt.complete.call(this);
  }
 
  if ( isElement && ( p === "height" || p === "width" ) ) {
  // Make sure that nothing sneaks out
  // Record all 3 overflow attributes because IE does not
  // change the overflow attribute when overflowX and
  // overflowY are set to the same value
  opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
 
  // Set display property to inline-block for height/width
  // animations on inline elements that are having width/height
  // animated
  if ( jQuery.css( this, "display" ) === "inline" &&
  jQuery.css( this, "float" ) === "none" ) {
  if ( !jQuery.support.inlineBlockNeedsLayout ) {
  this.style.display = "inline-block";
 
  } else {
  var display = defaultDisplay(this.nodeName);
 
  // inline-level elements accept inline-block;
  // block-level elements need to be inline with layout
  if ( display === "inline" ) {
  this.style.display = "inline-block";
 
  } else {
  this.style.display = "inline";
  this.style.zoom = 1;
  }
  }
  }
  }
 
  if ( jQuery.isArray( prop[p] ) ) {
  // Create (if needed) and add to specialEasing
  (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
  prop[p] = prop[p][0];
  }
  }
 
  if ( opt.overflow != null ) {
  this.style.overflow = "hidden";
  }
 
  opt.curAnim = jQuery.extend({}, prop);
 
  jQuery.each( prop, function( name, val ) {
  var e = new jQuery.fx( self, opt, name );
 
  if ( rfxtypes.test(val) ) {
  e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
 
  } else {
  var parts = rfxnum.exec(val),
  start = e.cur() || 0;
 
  if ( parts ) {
  var end = parseFloat( parts[2] ),
  unit = parts[3] || "px";
 
  // We need to compute starting value
  if ( unit !== "px" ) {
  jQuery.style( self, name, (end || 1) + unit);
  start = ((end || 1) / e.cur()) * start;
  jQuery.style( self, name, start + unit);
  }
 
  // If a +=/-= token was provided, we're doing a relative animation
  if ( parts[1] ) {
  end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
  }
 
  e.custom( start, end, unit );
 
  } else {
  e.custom( start, val, "" );
  }
  }
  });
 
  // For JS strict compliance
  return true;
  });
  },
 
  stop: function( clearQueue, gotoEnd ) {
  var timers = jQuery.timers;
 
  if ( clearQueue ) {
  this.queue([]);
  }
 
  this.each(function() {
  // go in reverse order so anything added to the queue during the loop is ignored
  for ( var i = timers.length - 1; i >= 0; i-- ) {
  if ( timers[i].elem === this ) {
  if (gotoEnd) {
  // force the next step to be the last
  timers[i](true);
  }
 
  timers.splice(i, 1);
  }
  }
  });
 
  // start the next in the queue if the last step wasn't forced
  if ( !gotoEnd ) {
  this.dequeue();
  }
 
  return this;
  }
 
  });
 
  function genFx( type, num ) {
  var obj = {};
 
  jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
  obj[ this ] = type;
  });
 
  return obj;
  }
 
  // Generate shortcuts for custom animations
  jQuery.each({
  slideDown: genFx("show", 1),
  slideUp: genFx("hide", 1),
  slideToggle: genFx("toggle", 1),
  fadeIn: { opacity: "show" },
  fadeOut: { opacity: "hide" },
  fadeToggle: { opacity: "toggle" }
  }, function( name, props ) {
  jQuery.fn[ name ] = function( speed, easing, callback ) {
  return this.animate( props, speed, easing, callback );
  };
  });
 
  jQuery.extend({
  speed: function( speed, easing, fn ) {
  var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
  complete: fn || !fn && easing ||
  jQuery.isFunction( speed ) && speed,
  duration: speed,
  easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
  };
 
  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
  opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
 
  // Queueing
  opt.old = opt.complete;
  opt.complete = function() {
  if ( opt.queue !== false ) {
  jQuery(this).dequeue();
  }
  if ( jQuery.isFunction( opt.old ) ) {
  opt.old.call( this );
  }
  };
 
  return opt;
  },
 
  easing: {
  linear: function( p, n, firstNum, diff ) {
  return firstNum + diff * p;
  },
  swing: function( p, n, firstNum, diff ) {
  return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
  }
  },
 
  timers: [],
 
  fx: function( elem, options, prop ) {
  this.options = options;
  this.elem = elem;
  this.prop = prop;
 
  if ( !options.orig ) {
  options.orig = {};
  }
  }
 
  });
 
  jQuery.fx.prototype = {
  // Simple function for setting a style value
  update: function() {
  if ( this.options.step ) {
  this.options.step.call( this.elem, this.now, this );
  }
 
  (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
  },
 
  // Get the current size
  cur: function() {
  if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
  return this.elem[ this.prop ];
  }
 
  var r = parseFloat( jQuery.css( this.elem, this.prop ) );
  return r || 0;
  },
 
  // Start an animation from one number to another
  custom: function( from, to, unit ) {
  var self = this,
  fx = jQuery.fx;
 
  this.startTime = jQuery.now();
  this.start = from;
  this.end = to;
  this.unit = unit || this.unit || "px";
  this.now = this.start;
  this.pos = this.state = 0;
 
  function t( gotoEnd ) {
  return self.step(gotoEnd);
  }
 
  t.elem = this.elem;
 
  if ( t() && jQuery.timers.push(t) && !timerId ) {
  timerId = setInterval(fx.tick, fx.interval);
  }
  },
 
  // Simple 'show' function
  show: function() {
  // Remember where we started, so that we can go back to it later
  this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
  this.options.show = true;
 
  // Begin the animation
  // Make sure that we start at a small width/height to avoid any
  // flash of content
  this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
 
  // Start by showing the element
  jQuery( this.elem ).show();
  },
 
  // Simple 'hide' function
  hide: function() {
  // Remember where we started, so that we can go back to it later
  this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
  this.options.hide = true;
 
  // Begin the animation
  this.custom(this.cur(), 0);
  },
 
  // Each step of an animation
  step: function( gotoEnd ) {
  var t = jQuery.now(), done = true;
 
  if ( gotoEnd || t >= this.options.duration + this.startTime ) {
  this.now = this.end;
  this.pos = this.state = 1;
  this.update();
 
  this.options.curAnim[ this.prop ] = true;
 
  for ( var i in this.options.curAnim ) {
  if ( this.options.curAnim[i] !== true ) {
  done = false;
  }
  }
 
  if ( done ) {
  // Reset the overflow
  if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
  var elem = this.elem,
  options = this.options;
 
  jQuery.each( [ "", "X", "Y" ], function (index, value) {
  elem.style[ "overflow" + value ] = options.overflow[index];
  } );
  }
 
  // Hide the element if the "hide" operation was done
  if ( this.options.hide ) {
  jQuery(this.elem).hide();
  }
 
  // Reset the properties, if the item has been hidden or shown
  if ( this.options.hide || this.options.show ) {
  for ( var p in this.options.curAnim ) {
  jQuery.style( this.elem, p, this.options.orig[p] );
  }
  }
 
  // Execute the complete function
  this.options.complete.call( this.elem );
  }
 
  return false;
 
  } else {
  var n = t - this.startTime;
  this.state = n / this.options.duration;
 
  // Perform the easing function, defaults to swing
  var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
  var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
  this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
  this.now = this.start + ((this.end - this.start) * this.pos);
 
  // Perform the next step of the animation
  this.update();
  }
 
  return true;
  }
  };
 
  jQuery.extend( jQuery.fx, {
  tick: function() {
  var timers = jQuery.timers;
 
  for ( var i = 0; i < timers.length; i++ ) {
  if ( !timers[i]() ) {
  timers.splice(i--, 1);
  }
  }
 
  if ( !timers.length ) {
  jQuery.fx.stop();
  }
  },
 
  interval: 13,
 
  stop: function() {
  clearInterval( timerId );
  timerId = null;
  },
 
  speeds: {
  slow: 600,
  fast: 200,
  // Default speed
  _default: 400
  },
 
  step: {
  opacity: function( fx ) {
  jQuery.style( fx.elem, "opacity", fx.now );
  },
 
  _default: function( fx ) {
  if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
  fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
  } else {
  fx.elem[ fx.prop ] = fx.now;
  }
  }
  }
  });
 
  if ( jQuery.expr && jQuery.expr.filters ) {
  jQuery.expr.filters.animated = function( elem ) {
  return jQuery.grep(jQuery.timers, function( fn ) {
  return elem === fn.elem;
  }).length;
  };
  }
 
  function defaultDisplay( nodeName ) {
  if ( !elemdisplay[ nodeName ] ) {
  var elem = jQuery("<" + nodeName + ">").appendTo("body"),
  display = elem.css("display");
 
  elem.remove();
 
  if ( display === "none" || display === "" ) {
  display = "block";
  }
 
  elemdisplay[ nodeName ] = display;
  }
 
  return elemdisplay[ nodeName ];
  }
 
 
 
 
  var rtable = /^t(?:able|d|h)$/i,
  rroot = /^(?:body|html)$/i;
 
  if ( "getBoundingClientRect" in document.documentElement ) {
  jQuery.fn.offset = function( options ) {
  var elem = this[0], box;
 
  if ( options ) {
  return this.each(function( i ) {
  jQuery.offset.setOffset( this, options, i );
  });
  }
 
  if ( !elem || !elem.ownerDocument ) {
  return null;
  }
 
  if ( elem === elem.ownerDocument.body ) {
  return jQuery.offset.bodyOffset( elem );
  }
 
  try {
  box = elem.getBoundingClientRect();
  } catch(e) {}
 
  var doc = elem.ownerDocument,
  docElem = doc.documentElement;
 
  // Make sure we're not dealing with a disconnected DOM node
  if ( !box || !jQuery.contains( docElem, elem ) ) {
  return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
  }
 
  var body = doc.body,
  win = getWindow(doc),
  clientTop = docElem.clientTop || body.clientTop || 0,
  clientLeft = docElem.clientLeft || body.clientLeft || 0,
  scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ),
  scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
  top = box.top + scrollTop - clientTop,
  left = box.left + scrollLeft - clientLeft;
 
  return { top: top, left: left };
  };
 
  } else {
  jQuery.fn.offset = function( options ) {
  var elem = this[0];
 
  if ( options ) {
  return this.each(function( i ) {
  jQuery.offset.setOffset( this, options, i );
  });
  }
 
  if ( !elem || !elem.ownerDocument ) {
  return null;
  }
 
  if ( elem === elem.ownerDocument.body ) {
  return jQuery.offset.bodyOffset( elem );
  }
 
  jQuery.offset.initialize();
 
  var computedStyle,
  offsetParent = elem.offsetParent,
  prevOffsetParent = elem,
  doc = elem.ownerDocument,
  docElem = doc.documentElement,
  body = doc.body,
  defaultView = doc.defaultView,
  prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
  top = elem.offsetTop,
  left = elem.offsetLeft;
 
  while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
  if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
  break;
  }
 
  computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
  top -= elem.scrollTop;
  left -= elem.scrollLeft;
 
  if ( elem === offsetParent ) {
  top += elem.offsetTop;
  left += elem.offsetLeft;
 
  if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
  top += parseFloat( computedStyle.borderTopWidth ) || 0;
  left += parseFloat( computedStyle.borderLeftWidth ) || 0;
  }
 
  prevOffsetParent = offsetParent;
  offsetParent = elem.offsetParent;
  }
 
  if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
  top += parseFloat( computedStyle.borderTopWidth ) || 0;
  left += parseFloat( computedStyle.borderLeftWidth ) || 0;
  }
 
  prevComputedStyle = computedStyle;
  }
 
  if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
  top += body.offsetTop;
  left += body.offsetLeft;
  }
 
  if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
  top += Math.max( docElem.scrollTop, body.scrollTop );
  left += Math.max( docElem.scrollLeft, body.scrollLeft );
  }
 
  return { top: top, left: left };
  };
  }
 
  jQuery.offset = {
  initialize: function() {
  var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
  html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
 
  jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
 
  container.innerHTML = html;
  body.insertBefore( container, body.firstChild );
  innerDiv = container.firstChild;
  checkDiv = innerDiv.firstChild;
  td = innerDiv.nextSibling.firstChild.firstChild;
 
  this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
  this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
 
  checkDiv.style.position = "fixed";
  checkDiv.style.top = "20px";
 
  // safari subtracts parent border width here which is 5px
  this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
  checkDiv.style.position = checkDiv.style.top = "";
 
  innerDiv.style.overflow = "hidden";
  innerDiv.style.position = "relative";
 
  this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
 
  this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
 
  body.removeChild( container );
  body = container = innerDiv = checkDiv = table = td = null;
  jQuery.offset.initialize = jQuery.noop;
  },
 
  bodyOffset: function( body ) {
  var top = body.offsetTop,
  left = body.offsetLeft;
 
  jQuery.offset.initialize();
 
  if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
  top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
  left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
  }
 
  return { top: top, left: left };
  },
 
  setOffset: function( elem, options, i ) {
  var position = jQuery.css( elem, "position" );
 
  // set position first, in-case top/left are set even on static elem
  if ( position === "static" ) {
  elem.style.position = "relative";
  }
 
  var curElem = jQuery( elem ),
  curOffset = curElem.offset(),
  curCSSTop = jQuery.css( elem, "top" ),
  curCSSLeft = jQuery.css( elem, "left" ),
  calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
  props = {}, curPosition = {}, curTop, curLeft;
 
  // need to be able to calculate position if either top or left is auto and position is absolute
  if ( calculatePosition ) {
  curPosition = curElem.position();
  }
 
  curTop = calculatePosition ? curPosition.top : parseInt( curCSSTop, 10 ) || 0;
  curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
 
  if ( jQuery.isFunction( options ) ) {
  options = options.call( elem, i, curOffset );
  }
 
  if (options.top != null) {
  props.top = (options.top - curOffset.top) + curTop;
  }
  if (options.left != null) {
  props.left = (options.left - curOffset.left) + curLeft;
  }
 
  if ( "using" in options ) {
  options.using.call( elem, props );
  } else {
  curElem.css( props );
  }
  }
  };
 
 
  jQuery.fn.extend({
  position: function() {
  if ( !this[0] ) {
  return null;
  }
 
  var elem = this[0],
 
  // Get *real* offsetParent
  offsetParent = this.offsetParent(),
 
  // Get correct offsets
  offset = this.offset(),
  parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
  // Subtract element margins
  // note: when an element has margin: auto the offsetLeft and marginLeft
  // are the same in Safari causing offset.left to incorrectly be 0
  offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
  offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
 
  // Add offsetParent borders
  parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
  parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
 
  // Subtract the two offsets
  return {
  top: offset.top - parentOffset.top,
  left: offset.left - parentOffset.left
  };
  },
 
  offsetParent: function() {
  return this.map(function() {
  var offsetParent = this.offsetParent || document.body;
  while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
  offsetParent = offsetParent.offsetParent;
  }
  return offsetParent;
  });
  }
  });
 
 
  // Create scrollLeft and scrollTop methods
  jQuery.each( ["Left", "Top"], function( i, name ) {
  var method = "scroll" + name;
 
  jQuery.fn[ method ] = function(val) {
  var elem = this[0], win;
 
  if ( !elem ) {
  return null;
  }
 
  if ( val !== undefined ) {
  // Set the scroll offset
  return this.each(function() {
  win = getWindow( this );
 
  if ( win ) {
  win.scrollTo(
  !i ? val : jQuery(win).scrollLeft(),
  i ? val : jQuery(win).scrollTop()
  );
 
  } else {
  this[ method ] = val;
  }
  });
  } else {
  win = getWindow( elem );
 
  // Return the scroll offset
  return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
  jQuery.support.boxModel && win.document.documentElement[ method ] ||
  win.document.body[ method ] :
  elem[ method ];
  }
  };
  });
 
  function getWindow( elem ) {
  return jQuery.isWindow( elem ) ?
  elem :
  elem.nodeType === 9 ?
  elem.defaultView || elem.parentWindow :
  false;
  }
 
 
 
 
  // Create innerHeight, innerWidth, outerHeight and outerWidth methods
  jQuery.each([ "Height", "Width" ], function( i, name ) {
 
  var type = name.toLowerCase();
 
  // innerHeight and innerWidth
  jQuery.fn["inner" + name] = function() {
  return this[0] ?
  parseFloat( jQuery.css( this[0], type, "padding" ) ) :
  null;
  };
 
  // outerHeight and outerWidth
  jQuery.fn["outer" + name] = function( margin ) {
  return this[0] ?
  parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
  null;
  };
 
  jQuery.fn[ type ] = function( size ) {
  // Get window width or height
  var elem = this[0];
  if ( !elem ) {
  return size == null ? null : this;
  }
 
  if ( jQuery.isFunction( size ) ) {
  return this.each(function( i ) {
  var self = jQuery( this );
  self[ type ]( size.call( this, i, self[ type ]() ) );
  });
  }
 
  if ( jQuery.isWindow( elem ) ) {
  // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
  // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
  var docElemProp = elem.document.documentElement[ "client" + name ];
  return elem.document.compatMode === "CSS1Compat" && docElemProp ||
  elem.document.body[ "client" + name ] || docElemProp;
 
  // Get document width or height
  } else if ( elem.nodeType === 9 ) {
  // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
  return Math.max(
  elem.documentElement["client" + name],
  elem.body["scroll" + name], elem.documentElement["scroll" + name],
  elem.body["offset" + name], elem.documentElement["offset" + name]
  );
 
  // Get or set width or height on the element
  } else if ( size === undefined ) {
  var orig = jQuery.css( elem, type ),
  ret = parseFloat( orig );
 
  return jQuery.isNaN( ret ) ? orig : ret;
 
  // Set the width or height on the element (default to pixels if value is unitless)
  } else {
  return this.css( type, typeof size === "string" ? size : size + "px" );
  }
  };
 
  });
 
 
  })(window);
 
  /*!
  * jQuery Mobile v1.0a3
  * http://jquerymobile.com/
  *
  * Copyright 2010, jQuery Project
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  */
  (function(a,d){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var g=0,e;(e=b[g])!=null;g++)a(e).triggerHandler("remove");c(b)}}else{var f=a.fn.remove;a.fn.remove=function(b,g){return this.each(function(){if(!g)if(!b||a.filter(b,[this]).length)a("*",this).add([this]).each(function(){a(this).triggerHandler("remove")});return f.call(a(this),b,g)})}}a.widget=function(b,g,e){var i=b.split(".")[0],h;b=b.split(".")[1];h=i+"-"+b;if(!e){e=g;g=a.Widget}a.expr[":"][h]=function(k){return!!a.data(k,
  b)};a[i]=a[i]||{};a[i][b]=function(k,j){arguments.length&&this._createWidget(k,j)};g=new g;g.options=a.extend(true,{},g.options);a[i][b].prototype=a.extend(true,g,{namespace:i,widgetName:b,widgetEventPrefix:a[i][b].prototype.widgetEventPrefix||b,widgetBaseClass:h},e);a.widget.bridge(b,a[i][b])};a.widget.bridge=function(b,g){a.fn[b]=function(e){var i=typeof e==="string",h=Array.prototype.slice.call(arguments,1),k=this;e=!i&&h.length?a.extend.apply(null,[true,e].concat(h)):e;if(i&&e.charAt(0)==="_")return k;
  i?this.each(function(){var j=a.data(this,b);if(!j)throw"cannot call methods on "+b+" prior to initialization; attempted to call method '"+e+"'";if(!a.isFunction(j[e]))throw"no such method '"+e+"' for "+b+" widget instance";var o=j[e].apply(j,h);if(o!==j&&o!==d){k=o;return false}}):this.each(function(){var j=a.data(this,b);j?j.option(e||{})._init():a.data(this,b,new g(e,this))});return k}};a.Widget=function(b,g){arguments.length&&this._createWidget(b,g)};a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",
  options:{disabled:false},_createWidget:function(b,g){a.data(g,this.widgetName,this);this.element=a(g);this.options=a.extend(true,{},this.options,this._getCreateOptions(),b);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){var b={};if(a.metadata)b=a.metadata.get(element)[this.widgetName];return b},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);
  this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(b,g){var e=b;if(arguments.length===0)return a.extend({},this.options);if(typeof b==="string"){if(g===d)return this.options[b];e={};e[b]=g}this._setOptions(e);return this},_setOptions:function(b){var g=this;a.each(b,function(e,i){g._setOption(e,i)});return this},_setOption:function(b,g){this.options[b]=g;if(b===
  "disabled")this.widget()[g?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",g);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(b,g,e){var i=this.options[b];g=a.Event(g);g.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase();e=e||{};if(g.originalEvent){b=a.event.props.length;for(var h;b;){h=a.event.props[--b];g[h]=g.originalEvent[h]}}this.element.trigger(g,
  e);return!(a.isFunction(i)&&i.call(this.element[0],g,e)===false||g.isDefaultPrevented())}}})(jQuery);(function(a,d){a.widget("mobile.widget",{_getCreateOptions:function(){var c=this.element,f={};a.each(this.options,function(b){var g=c.data(b.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()}));if(g!==d)f[b]=g});return f}})})(jQuery);
  (function(a){function d(){var g=c.width(),e=[],i=[],h;f.removeClass("min-width-"+b.join("px min-width-")+"px max-width-"+b.join("px max-width-")+"px");a.each(b,function(k,j){g>=j&&e.push("min-width-"+j+"px");g<=j&&i.push("max-width-"+j+"px")});if(e.length)h=e.join(" ");if(i.length)h+=" "+i.join(" ");f.addClass(h)}var c=a(window),f=a("html"),b=[320,480,768,1024];a.mobile.media=function(){var g={},e=a("<div id='jquery-mediatest'>"),i=a("<body>").append(e);return function(h){if(!(h in g)){var k=document.createElement("style"),
  j="@media "+h+" { #jquery-mediatest { position:absolute; } }";k.type="text/css";if(k.styleSheet)k.styleSheet.cssText=j;else k.appendChild(document.createTextNode(j));f.prepend(i).prepend(k);g[h]=e.css("position")==="absolute";i.add(k).remove()}return g[h]}}();a.mobile.addResolutionBreakpoints=function(g){if(a.type(g)==="array")b=b.concat(g);else b.push(g);b.sort(function(e,i){return e-i});d()};a(document).bind("mobileinit.htmlclass",function(){c.bind("orientationchange.htmlclass resize.htmlclass",
  function(g){g.orientation&&f.removeClass("portrait landscape").addClass(g.orientation);d()})});a(function(){c.trigger("orientationchange.htmlclass")})})(jQuery);
  (function(a,d){function c(h){var k=h.charAt(0).toUpperCase()+h.substr(1);h=(h+" "+g.join(k+" ")+k).split(" ");for(var j in h)if(b[j]!==d)return true}var f=a("<body>").prependTo("html"),b=f[0].style,g=["webkit","moz","o"],e=window.palmGetResource||window.PalmServiceBridge,i=window.blackberry;a.extend(a.support,{orientation:"orientation"in window,touch:"ontouchend"in document,cssTransitions:"WebKitTransitionEvent"in window,pushState:!!history.pushState,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!c("content"),
  boxShadow:!!c("boxShadow")&&!i,scrollTop:("pageXOffset"in window||"scrollTop"in document.documentElement||"scrollTop"in f[0])&&!e,dynamicBaseTag:function(){var h=location.protocol+"//"+location.host+location.pathname+"ui-dir/",k=a("head base"),j=null,o="";if(k.length)o=k.attr("href");else k=j=a("<base>",{href:h}).appendTo("head");var p=a("<a href='testurl'></a>").prependTo(f)[0].href;k[0].href=o?o:location.pathname;j&&j.remove();return p.indexOf(h)===0}()});f.remove();a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")})(jQuery);
  (function(a,d){a.each("touchstart touchmove touchend orientationchange tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(e,i){a.fn[i]=function(h){return h?this.bind(i,h):this.trigger(i)};a.attrFn[i]=true});var c=a.support.touch,f=c?"touchstart":"mousedown",b=c?"touchend":"mouseup",g=c?"touchmove":"mousemove";a.event.special.scrollstart={enabled:true,setup:function(){function e(j,o){h=o;var p=j.type;j.type=h?"scrollstart":"scrollstop";a.event.handle.call(i,j);j.type=
  p}var i=this,h,k;a(i).bind("touchmove scroll",function(j){if(a.event.special.scrollstart.enabled){h||e(j,true);clearTimeout(k);k=setTimeout(function(){e(j,false)},50)}})}};a.event.special.tap={setup:function(){var e=this,i=a(e);i.bind("mousedown touchstart",function(h){function k(n){if(n.type=="scroll")j=true;else{n=n.type=="touchmove"?n.originalEvent.touches[0]:n;if(Math.abs(v[0]-n.pageX)>10||Math.abs(v[1]-n.pageY)>10)j=true}}if(h.which&&h.which!==1||i.data("prevEvent")&&i.data("prevEvent")!==h.type)return false;
  i.data("prevEvent",h.type);setTimeout(function(){i.removeData("prevEvent")},800);var j=false,o=true,p=h.target,t=h.originalEvent,v=h.type=="touchstart"?[t.touches[0].pageX,t.touches[0].pageY]:[h.pageX,h.pageY],m,r;r=setTimeout(function(){if(o&&!j){m=h.type;h.type="taphold";a.event.handle.call(e,h);h.type=m}},750);a(window).one("scroll",k);i.bind("mousemove touchmove",k).one("mouseup touchend",function(n){i.unbind("mousemove touchmove",k);a(window).unbind("scroll",k);clearTimeout(r);o=false;if(!j&&
  p==n.target){m=n.type;n.type="tap";a.event.handle.call(e,n);n.type=m}})})}};a.event.special.swipe={setup:function(){var e=a(this);e.bind(f,function(i){function h(p){if(j){var t=p.originalEvent.touches?p.originalEvent.touches[0]:p;o={time:(new Date).getTime(),coords:[t.pageX,t.pageY]};Math.abs(j.coords[0]-o.coords[0])>10&&p.preventDefault()}}var k=i.originalEvent.touches?i.originalEvent.touches[0]:i,j={time:(new Date).getTime(),coords:[k.pageX,k.pageY],origin:a(i.target)},o;e.bind(g,h).one(b,function(){e.unbind(g,
  h);if(j&&o)if(o.time-j.time<1E3&&Math.abs(j.coords[0]-o.coords[0])>30&&Math.abs(j.coords[1]-o.coords[1])<75)j.origin.trigger("swipe").trigger(j.coords[0]>o.coords[0]?"swipeleft":"swiperight");j=o=d})})}};(function(e){function i(){var o=k();if(o!==j){j=o;h.trigger("orientationchange")}}var h=e(window),k,j;e.event.special.orientationchange={setup:function(){if(e.support.orientation)return false;j=k();h.bind("resize",i)},teardown:function(){if(e.support.orientation)return false;h.unbind("resize",i)},
  add:function(o){var p=o.handler;o.handler=function(t){t.orientation=k();return p.apply(this,arguments)}}};k=function(){var o=document.documentElement;return o&&o.clientWidth/o.clientHeight<1.1?"portrait":"landscape"}})(jQuery);a.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(e,i){a.event.special[e]={setup:function(){a(this).bind(i,a.noop)}}})})(jQuery);
  (function(a,d,c){function f(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}var b="hashchange",g=document,e,i=a.event.special,h=g.documentMode,k="on"+b in d&&(h===c||h>7);a.fn[b]=function(j){return j?this.bind(b,j):this.trigger(b)};a.fn[b].delay=50;i[b]=a.extend(i[b],{setup:function(){if(k)return false;a(e.start)},teardown:function(){if(k)return false;a(e.stop)}});e=function(){function j(){var n=f(),u=r(t);if(n!==t){m(t=n,u);a(d).trigger(b)}else if(u!==t)location.href=location.href.replace(/#.*/,
  "")+u;p=setTimeout(j,a.fn[b].delay)}var o={},p,t=f(),v=function(n){return n},m=v,r=v;o.start=function(){p||j()};o.stop=function(){p&&clearTimeout(p);p=c};a.browser.msie&&!k&&function(){var n,u;o.start=function(){if(!n){u=(u=a.fn[b].src)&&u+f();n=a('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){u||m(f());j()}).attr("src",u||"javascript:0").insertAfter("body")[0].contentWindow;g.onpropertychange=function(){try{if(event.propertyName==="title")n.document.title=g.title}catch(l){}}}};
  o.stop=v;r=function(){return f(n.location.href)};m=function(l,s){var q=n.document,w=a.fn[b].domain;if(l!==s){q.title=g.title;q.open();w&&q.write('<script>document.domain="'+w+'"<\/script>');q.close();n.location.hash=l}}}();return o}()})(jQuery,this);
  (function(a){a.widget("mobile.page",a.mobile.widget,{options:{backBtnText:"Back",addBackBtn:true,degradeInputs:{color:false,date:false,datetime:false,"datetime-local":false,email:false,month:false,number:false,range:"number",search:true,tel:false,time:false,url:false,week:false},keepNative:null},_create:function(){var d=this.element,c=this.options;this.keepNative="[data-role='none'], [data-role='nojs']"+(c.keepNative?", "+c.keepNative:"");if(this._trigger("beforeCreate")!==false){d.find("[data-role='page'], [data-role='content']").andSelf().each(function(){a(this).addClass("ui-"+
  a(this).data("role"))});d.find("[data-role='nojs']").addClass("ui-nojs");d.find("[data-role]").andSelf().each(function(){var f=a(this),b=f.data("role"),g=f.data("theme");if(b==="header"||b==="footer"){f.addClass("ui-bar-"+(g||f.parent("[data-role=page]").data("theme")||"a"));f.attr("role",b==="header"?"banner":"contentinfo");g=f.children("a");var e=g.hasClass("ui-btn-left"),i=g.hasClass("ui-btn-right");if(!e)e=g.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length;i||g.eq(1).addClass("ui-btn-right");
  c.addBackBtn&&b==="header"&&a(".ui-page").length>1&&d.data("url")!==a.mobile.path.stripHash(location.hash)&&!e&&f.data("backbtn")!==false&&a("<a href='#' class='ui-btn-left' data-rel='back' data-icon='arrow-l'>"+c.backBtnText+"</a>").prependTo(f);f.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({tabindex:"0",role:"heading","aria-level":"1"})}else if(b==="content"){g&&f.addClass("ui-body-"+g);f.attr("role","main")}else if(b==="page")f.addClass("ui-body-"+(g||"c"));switch(b){case "header":case "footer":case "page":case "content":f.addClass("ui-"+
  b);break;case "collapsible":case "fieldcontain":case "navbar":case "listview":case "dialog":f[b]()}});this._enhanceControls();d.find("[data-role='button'], .ui-bar > a, .ui-header > a, .ui-footer > a").not(".ui-btn").not(this.keepNative).buttonMarkup();d.find("[data-role='controlgroup']").controlgroup();d.find("a:not(.ui-btn):not(.ui-link-inherit)").not(this.keepNative).addClass("ui-link");d.fixHeaderFooter()}},_enhanceControls:function(){var d=this.options;this.element.find("input").not(this.keepNative).each(function(){var b=
  this.getAttribute("type"),g=d.degradeInputs[b]||"text";d.degradeInputs[b]&&a(this).replaceWith(a("<div>").html(a(this).clone()).html().replace(/type="([a-zA-Z]+)"/,"type="+g+" data-type='$1'"))});var c=this.element.find("input, textarea, select, button"),f=c.not(this.keepNative);c=c.filter("input[type=text]");c.length&&typeof c[0].autocorrect!=="undefined"&&c.each(function(){this.setAttribute("autocorrect","off");this.setAttribute("autocomplete","off")});f.filter("[type='radio'], [type='checkbox']").checkboxradio();
  f.filter("button, [type='button'], [type='submit'], [type='reset'], [type='image']").button();f.filter("input, textarea").not("[type='radio'], [type='checkbox'], [type='button'], [type='submit'], [type='reset'], [type='image'], [type='hidden']").textinput();f.filter("input, select").filter("[data-role='slider'], [data-type='range']").slider();f.filter("select:not([data-role='slider'])").selectmenu()}})})(jQuery);
  (function(a,d,c){a.extend(a.mobile,{subPageUrlKey:"ui-page",nonHistorySelectors:"dialog",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",ajaxEnabled:true,hashListeningEnabled:true,ajaxLinksEnabled:true,ajaxFormsEnabled:true,defaultTransition:"slide",loadingMessage:"loading",metaViewportContent:"width=device-width, minimum-scale=1, maximum-scale=1",gradeA:function(){return a.support.mediaquery},autoInitialize:true,keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,
  COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a(d.document).trigger("mobileinit");if(a.mobile.gradeA()){var f=a(d),b=a("html"),g=a("head"),e=a.mobile.loadingMessage?a("<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1>"+
  a.mobile.loadingMessage+"</h1></div>"):c;b.addClass("ui-mobile ui-mobile-rendering");a.mobile.metaViewportContent&&a("<meta>",{name:"viewport",content:a.mobile.metaViewportContent}).prependTo(g);a.extend(a.mobile,{pageLoading:function(i){if(i)b.removeClass("ui-loading");else{if(a.mobile.loadingMessage){i=a("."+a.mobile.activeBtnClass).first();e.appendTo(a.mobile.pageContainer).css({top:a.support.scrollTop&&a(d).scrollTop()+a(d).height()/2||i.length&&i.offset().top||100})}b.addClass("ui-loading")}},
  silentScroll:function(i){i=i||0;a.event.special.scrollstart.enabled=false;setTimeout(function(){d.scrollTo(0,i);a(document).trigger("silentscroll",{x:0,y:i})},20);setTimeout(function(){a.event.special.scrollstart.enabled=true},150)},initializePage:function(){var i=a("[data-role='page']");i.add("[data-role='dialog']").each(function(){a(this).attr("data-url",a(this).attr("id"))});a.mobile.firstPage=i.first();a.mobile.pageContainer=i.first().parent().addClass("ui-mobile-viewport");a.mobile.pageLoading();
  !a.mobile.hashListeningEnabled||!a.mobile.path.stripHash(location.hash)?a.mobile.changePage(a.mobile.firstPage,false,true,false,true):f.trigger("hashchange",[true])}});a.mobile.autoInitialize&&a(a.mobile.initializePage);f.load(a.mobile.silentScroll)}})(jQuery,this);
  (function(a,d){function c(l){if(i&&(!i.closest(".ui-page-active").length||l))i.removeClass(a.mobile.activeBtnClass);i=null}var f=a(window),b=a("html"),g=a("head"),e={get:function(l){if(l==d)l=location.hash;return e.stripHash(l).replace(/[^\/]*\.[^\/*]+$/,"")},getFilePath:function(l){var s="&"+a.mobile.subPageUrlKey;return l&&l.split(s)[0].split(t)[0]},set:function(l){location.hash=l},origin:"",setOrigin:function(){e.origin=e.get(location.protocol+"//"+location.host+location.pathname)},makeAbsolute:function(l){return e.get()+
  l},clean:function(l){return l.replace(location.protocol+"//"+location.host,"")},stripHash:function(l){return l.replace(/^#/,"")},isExternal:function(l){return e.hasProtocol(e.clean(l))},hasProtocol:function(l){return/^(:?\w+:)/.test(l)},isRelative:function(l){return/^[^\/|#]/.test(l)&&!e.hasProtocol(l)},isEmbeddedPage:function(l){return/^#/.test(l)}},i=null,h={stack:[],activeIndex:0,getActive:function(){return h.stack[h.activeIndex]},getPrev:function(){return h.stack[h.activeIndex-1]},getNext:function(){return h.stack[h.activeIndex+
  1]},addNew:function(l,s){h.getNext()&&h.clearForward();h.stack.push({url:l,transition:s});h.activeIndex=h.stack.length-1},clearForward:function(){h.stack=h.stack.slice(0,h.activeIndex+1)},ignoreNextHashChange:true},k="[tabindex],a,button:visible,select:visible,input",j=null,o=[],p=false,t="&ui-state=dialog",v=g.children("base"),m=location.protocol+"//"+location.host,r=e.get(m+location.pathname),n=r;if(v.length){var u=v.attr("href");if(u)n=u.search(/^[^:/]+:\/\/[^/]+\/?/)==-1?u.charAt(0)=="/"?m+u:
  r+u:u;n+=n.charAt(n.length-1)=="/"?" ":"/"}base=a.support.dynamicBaseTag?{element:v.length?v:a("<base>",{href:n}).prependTo(g),set:function(l){base.element.attr("href",n+e.get(l))},reset:function(){base.element.attr("href",n)}}:d;e.setOrigin();a.fn.animationComplete=function(l){if(a.support.cssTransitions)return a(this).one("webkitAnimationEnd",l);else setTimeout(l,0)};a.mobile.updateHash=e.set;a.mobile.path=e;a.mobile.base=base;a.mobile.urlstack=h.stack;a.mobile.urlHistory=h;a.mobile.changePage=
  function(l,s,q,w,z){function F(){function A(){if(w!==false&&x){h.ignoreNextHashChange=false;e.set(x)}!I&&!K&&h.addNew(x,s);c();a.mobile.silentScroll(l.data("lastScroll"));var G=l,P=G.find(".ui-title:eq(0)");P.length?P.focus():G.find(k).eq(0).focus();y&&y.data("page")._trigger("hide",null,{nextPage:l});l.data("page")._trigger("show",null,{prevPage:y||a("")});a.mobile.activePage=l;L!=null&&L.remove();b.removeClass("ui-mobile-rendering");p=false;o.length>0&&a.mobile.changePage.apply(a.mobile,o.pop())}
  function B(G){a.mobile.pageContainer.addClass(G);D.push(G)}a.mobile.silentScroll();var M=f.scrollTop(),J=["flip"],D=[];if(x.indexOf("&"+a.mobile.subPageUrlKey)>-1)l=a("[data-url='"+x+"']");if(y){y.data("lastScroll",M);y.data("page")._trigger("beforehide",{nextPage:l})}l.data("page")._trigger("beforeshow",{prevPage:y||a("")});if(s&&s!=="none"){a.mobile.pageLoading(true);a.inArray(s,J)>=0&&B("ui-mobile-viewport-perspective");B("ui-mobile-viewport-transitioning");if(y)y.addClass(s+" out "+(q?"reverse":
  ""));l.addClass(a.mobile.activePageClass+" "+s+" in "+(q?"reverse":""));l.animationComplete(function(){y.add(l).removeClass("out in reverse "+s);y&&y.removeClass(a.mobile.activePageClass);A();a.mobile.pageContainer.removeClass(D.join(" "));D=[]})}else{a.mobile.pageLoading(true);y&&y.removeClass(a.mobile.activePageClass);l.addClass(a.mobile.activePageClass);A()}}function Q(){if(j||l.data("role")=="dialog"){x=h.getActive().url+t;if(j){l.attr("data-role",j);j=null}}l.page()}var E=a.type(l)==="array",
  H=a.type(l)==="object",y=E?l[0]:a.mobile.activePage;l=E?l[1]:l;var x=fileUrl=a.type(l)==="string"?e.stripHash(l):"",C=d,N="get",R=false,L=null,O=h.getActive(),I=false,K=false;if(!(O&&h.stack.length>1&&O.url===x&&!E&&!H))if(p)o.unshift(arguments);else{p=true;if(z){a.each(h.stack,function(A){if(this.url==x){urlIndex=A;I=A<h.activeIndex;K=!I;h.activeIndex=A}});if(I){q=true;s=s||O.transition}else if(K)s=s||h.getActive().transition}if(H&&l.url){x=l.url;C=l.data;N=l.type;R=true;if(C&&N=="get"){if(a.type(C)==
  "object")C=a.param(C);x+="?"+C;C=d}}base&&base.reset();a(window.document.activeElement).add("input:focus, textarea:focus, select:focus").blur();if(x){l=a("[data-url='"+x+"']");fileUrl=e.getFilePath(x)}else{E=l.attr("data-url");H=e.getFilePath(E);if(E!=H)fileUrl=H}if(s===d)s=a.mobile.defaultTransition;if(l.length&&!R){fileUrl&&base&&base.set(fileUrl);Q();F()}else{if(l.length)L=l;a.mobile.pageLoading();a.ajax({url:fileUrl,type:N,data:C,success:function(A){var B=/ data-url="(.*)"/.test(A)&&RegExp.$1;
  if(B){base&&base.set(B);x=fileUrl=e.getFilePath(B)}else base&&base.set(fileUrl);B=a("<div></div>");B.get(0).innerHTML=A;l=B.find('[data-role="page"], [data-role="dialog"]').first();if(!a.support.dynamicBaseTag){var M=e.get(fileUrl);l.find("[src],link[href]").each(function(){var J=a(this).is("[href]")?"href":"src",D=a(this).attr(J);D.replace(location.protocol+"//"+location.host+location.pathname,"");/^(\w+:|#|\/)/.test(D)||a(this).attr(J,M+D)})}l.attr("data-url",fileUrl).appendTo(a.mobile.pageContainer);
  Q();setTimeout(function(){F()},0)},error:function(){a.mobile.pageLoading(true);c(true);base&&base.set(e.get());a("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>Error Loading Page</h1></div>").css({display:"block",opacity:0.96,top:a(window).scrollTop()+100}).appendTo(a.mobile.pageContainer).delay(800).fadeOut(400,function(){a(this).remove()})}})}}};a("form[data-ajax!='false']").live("submit",function(l){if(a.mobile.ajaxEnabled&&a.mobile.ajaxFormsEnabled){var s=a(this).attr("method"),
  q=e.clean(a(this).attr("action"));if(!e.isExternal(q)){if(e.isRelative(q))q=e.makeAbsolute(q);a.mobile.changePage({url:q,type:s,data:a(this).serialize()},d,d,true);l.preventDefault()}}});a("a").live("click",function(l){var s=a(this),q=s.attr("href")||"#";q=e.clean(q);var w=s.is("[rel='external']"),z=e.isEmbeddedPage(q);w=e.isExternal(q)||w&&!z;z=s.is("[target]");var F=s.is("[data-ajax='false']");if(s.is("[data-rel='back']")){window.history.back();return false}if(q==="#")return false;i=s.closest(".ui-btn").addClass(a.mobile.activeBtnClass);
  if(w||F||z||!a.mobile.ajaxEnabled||!a.mobile.ajaxLinksEnabled){c(true);if(z)window.open(q);else if(F)return;else location.href=q}else{w=s.data("transition");z=(z=s.data("direction"))&&z=="reverse"||s.data("back");j=s.attr("data-rel");if(e.isRelative(q))q=e.makeAbsolute(q);q=e.stripHash(q);a.mobile.changePage(q,w,z)}l.preventDefault()});f.bind("hashchange",function(){var l=e.stripHash(location.hash),s=a.mobile.urlHistory.stack.length===0?false:d;if(!a.mobile.hashListeningEnabled||!h.ignoreNextHashChange||
  h.stack.length>1&&l.indexOf(t)>-1&&!a.mobile.activePage.is(".ui-dialog")){if(!h.ignoreNextHashChange)h.ignoreNextHashChange=true}else l?a.mobile.changePage(l,s,d,false,true):a.mobile.changePage(a.mobile.firstPage,s,true,false,true)})})(jQuery);
  (function(a,d){a.fn.fixHeaderFooter=function(){if(!a.support.scrollTop)return this;return this.each(function(){var c=a(this);c.data("fullscreen")&&c.addClass("ui-page-fullscreen");c.find('.ui-header[data-position="fixed"]').addClass("ui-header-fixed ui-fixed-inline fade");c.find('.ui-footer[data-position="fixed"]').addClass("ui-footer-fixed ui-fixed-inline fade")})};a.fixedToolbars=function(){function c(){if(!e&&g=="overlay"){i||a.fixedToolbars.hide(true);a.fixedToolbars.startShowTimer()}}function f(m){var r=
  0;if(m){var n=m.offsetParent,u=document.body;for(r=m.offsetTop;m&&m!=u;){r+=m.scrollTop||0;if(m==n){r+=n.offsetTop;n=m.offsetParent}m=m.parentNode}}return r}function b(m){var r=a(window).scrollTop(),n=f(m[0]),u=m.css("top")=="auto"?0:parseFloat(m.css("top")),l=window.innerHeight,s=m.outerHeight(),q=m.parents(".ui-page:not(.ui-page-fullscreen)").length;if(m.is(".ui-header-fixed")){u=r-n+u;if(u<n)u=0;return m.css("top",q?u:r)}else{u=r+l-s-(n-u);return m.css("top",q?u:r+l-s)}}if(a.support.scrollTop){var g=
  "inline",e=false,i,h,k=a.support.touch,j=k?"touchstart":"mousedown",o=k?"touchend":"mouseup",p=null,t=false,v=true;a(function(){a(document).bind(j,function(m){if(v)a(m.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length||(p=g)}).bind(o,function(m){if(v)if(!a(m.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length)if(!t){a.fixedToolbars.toggle(p);p=null}}).bind("scrollstart",function(m){if(!a(m.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length){t=
  true;if(p==null)p=g;if(e=(m=p=="overlay")||!!i){a.fixedToolbars.clearShowTimer();m&&a.fixedToolbars.hide(true)}}}).bind("scrollstop",function(m){if(!a(m.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length){t=false;if(e){e=false;a.fixedToolbars.startShowTimer()}p=null}}).bind("silentscroll",c);a(window).bind("resize",c)});a(".ui-page").live("pagebeforeshow",function(m){m=a(m.target).find('[data-role="footer"]:not(.ui-sticky-footer)');var r=m.data("id");
  h=null;if(r){h=a('.ui-footer[data-id="'+r+'"].ui-sticky-footer');if(h.length==0){h=m;m=h.clone();h.addClass("ui-sticky-footer").before(m)}m.addClass("ui-footer-duplicate");h.appendTo(a.pageContainer).css("top",0);b(h)}});a(".ui-page").live("pageshow",function(m){h&&h.length&&h.appendTo(m.target).css("top",0);a.fixedToolbars.show(true,this)});return{show:function(m,r){a.fixedToolbars.clearShowTimer();g="overlay";return(r?a(r):a.mobile.activePage?a.mobile.activePage:a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var n=
  a(this),u=a(window).scrollTop(),l=f(n[0]),s=window.innerHeight,q=n.outerHeight();u=n.is(".ui-header-fixed")&&u<=l+q||n.is(".ui-footer-fixed")&&l<=u+s;n.addClass("ui-fixed-overlay").removeClass("ui-fixed-inline");!u&&!m&&n.animationComplete(function(){n.removeClass("in")}).addClass("in");b(n)})},hide:function(m){g="inline";return(a.mobile.activePage?a.mobile.activePage:a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var r=a(this),
  n=r.css("top");n=n=="auto"?0:parseFloat(n);r.addClass("ui-fixed-inline").removeClass("ui-fixed-overlay");if(n<0||r.is(".ui-header-fixed")&&n!=0)if(m)r.css("top",0);else r.css("top")!=="auto"&&parseFloat(r.css("top"))!==0&&r.animationComplete(function(){r.removeClass("out reverse");r.css("top",0)}).addClass("out reverse")})},startShowTimer:function(){a.fixedToolbars.clearShowTimer();var m=a.makeArray(arguments);i=setTimeout(function(){i=d;a.fixedToolbars.show.apply(null,m)},100)},clearShowTimer:function(){i&&
  clearTimeout(i);i=d},toggle:function(m){if(m)g=m;return g=="overlay"?a.fixedToolbars.hide():a.fixedToolbars.show()},setTouchToggleEnabled:function(m){v=m}}}}()})(jQuery);
  (function(a,d){a.widget("mobile.checkboxradio",a.mobile.widget,{options:{theme:null},_create:function(){var c=this,f=this.element,b=f.closest("form,fieldset,[data-role='page']").find("label[for='"+f.attr("id")+"']"),g=f.attr("type"),e="ui-icon-"+g+"-off";if(!(g!="checkbox"&&g!="radio")){if(!this.options.theme)this.options.theme=this.element.data("theme");b.buttonMarkup({theme:this.options.theme,icon:this.element.parents("[data-type='horizontal']").length?d:e,shadow:false});f.add(b).wrapAll("<div class='ui-"+
  g+"'></div>");b.bind({mouseover:function(){if(a(this).parent().is(".ui-disabled"))return false},touchmove:function(i){i=i.originalEvent.touches[0];if(b.data("movestart")){if(Math.abs(b.data("movestart")[0]-i.pageX)>10||Math.abs(abel.data("movestart")[1]-i.pageY)>10)b.data("moved",true)}else b.data("movestart",[parseFloat(i.pageX),parseFloat(i.pageY)])},"touchend mouseup":function(i){b.removeData("movestart");if(b.data("etype")&&b.data("etype")!==i.type||b.data("moved")){b.removeData("etype").removeData("moved");
  b.data("moved")&&b.removeData("moved");return false}b.data("etype",i.type);c._cacheVals();f.attr("checked",g==="radio"&&true||!f.is(":checked"));c._updateAll();i.preventDefault()},click:false});f.bind({mousedown:function(){this._cacheVals()},click:function(){c._updateAll()},focus:function(){b.addClass("ui-focus")},blur:function(){b.removeClass("ui-focus")}});this.refresh()}},_cacheVals:function(){this._getInputSet().each(function(){a(this).data("cacheVal",a(this).is(":checked"))})},_getInputSet:function(){return this.element.closest("form,fieldset,[data-role='page']").find("input[name='"+
  this.element.attr("name")+"'][type='"+this.element.attr("type")+"']")},_updateAll:function(){this._getInputSet().each(function(){var c=a(this).data("cacheVal");if(c&&c!==a(this).is(":checked")||a(this).is("[type='checkbox']"))a(this).trigger("change")}).checkboxradio("refresh")},refresh:function(){var c=this.element,f=c.closest("form,fieldset,[data-role='page']").find("label[for='"+c.attr("id")+"']"),b=c.attr("type"),g=f.find(".ui-icon"),e="ui-icon-"+b+"-on";b="ui-icon-"+b+"-off";if(c[0].checked){f.addClass("ui-btn-active");
  g.addClass(e);g.removeClass(b)}else{f.removeClass("ui-btn-active");g.removeClass(e);g.addClass(b)}c.is(":disabled")?this.disable():this.enable()},disable:function(){this.element.attr("disabled",true).parent().addClass("ui-disabled")},enable:function(){this.element.attr("disabled",false).parent().removeClass("ui-disabled")}})})(jQuery);
  (function(a){a.widget("mobile.textinput",a.mobile.widget,{options:{theme:null},_create:function(){var d=this.element,c=this.options,f=c.theme;if(!f){f=this.element.closest("[class*='ui-bar-'],[class*='ui-body-']");f=f.length?/ui-(bar|body)-([a-z])/.exec(f.attr("class"))[2]:"c"}f=" ui-body-"+f;a("label[for="+d.attr("id")+"]").addClass("ui-input-text");d.addClass("ui-input-text ui-body-"+c.theme);var b=d;if(d.is('[type="search"],[data-type="search"]')){b=d.wrap('<div class="ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield'+
  f+'"></div>').parent();var g=a('<a href="#" class="ui-input-clear" title="clear text">clear text</a>').tap(function(h){d.val("").focus();d.trigger("change");g.addClass("ui-input-clear-hidden");h.preventDefault()}).appendTo(b).buttonMarkup({icon:"delete",iconpos:"notext",corners:true,shadow:true});c=function(){d.val()==""?g.addClass("ui-input-clear-hidden"):g.removeClass("ui-input-clear-hidden")};c();d.keyup(c)}else d.addClass("ui-corner-all ui-shadow-inset"+f);d.focus(function(){b.addClass("ui-focus")}).blur(function(){b.removeClass("ui-focus")});
  if(d.is("textarea")){var e=function(){var h=d[0].scrollHeight;d[0].clientHeight<h&&d.css({height:h+15})},i;d.keyup(function(){clearTimeout(i);i=setTimeout(e,100)})}},disable:function(){(this.element.attr("disabled",true).is('[type="search"],[data-type="search"]')?this.element.parent():this.element).addClass("ui-disabled")},enable:function(){(this.element.attr("disabled",false).is('[type="search"],[data-type="search"]')?this.element.parent():this.element).removeClass("ui-disabled")}})})(jQuery);
  (function(a){a.widget("mobile.selectmenu",a.mobile.widget,{options:{theme:null,disabled:false,icon:"arrow-d",iconpos:"right",inline:null,corners:true,shadow:true,iconshadow:true,menuPageTheme:"b",overlayTheme:"a",hidePlaceholderMenuItems:true,closeText:"Close",nativeMenu:false},_create:function(){var d=this,c=this.options,f=this.element.wrap("<div class='ui-select'>"),b=f.attr("id"),g=a("label[for="+b+"]").addClass("ui-select"),e=(d.options.nativeMenu?a("<div/>"):a("<a>",{href:"#",role:"button",id:k,
  "aria-haspopup":"true","aria-owns":j})).text(a(f[0].options.item(f[0].selectedIndex)).text()).insertBefore(f).buttonMarkup({theme:c.theme,icon:c.icon,iconpos:c.iconpos,inline:c.inline,corners:c.corners,shadow:c.shadow,iconshadow:c.iconshadow}),i=d.isMultiple=f[0].multiple;c.nativeMenu&&window.opera&&window.opera.version&&f.addClass("ui-select-nativeonly");if(!c.nativeMenu){var h=f.find("option"),k=b+"-button",j=b+"-menu",o=f.closest(".ui-page"),p=/ui-btn-up-([a-z])/.exec(e.attr("class"))[1],t=a("<div data-role='dialog' data-theme='"+
  c.menuPageTheme+"'><div data-role='header'><div class='ui-title'>"+g.text()+"</div></div><div data-role='content'></div></div>").appendTo(a.mobile.pageContainer).page(),v=t.find(".ui-content"),m=t.find(".ui-header a"),r=a("<div>",{"class":"ui-selectmenu-screen ui-screen-hidden"}).appendTo(o),n=a("<div>",{"class":"ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all pop ui-body-"+c.overlayTheme}).insertAfter(r),u=a("<ul>",{"class":"ui-selectmenu-list",id:j,role:"listbox","aria-labelledby":k,
  "data-theme":p}).appendTo(n);p=a("<div>",{"class":"ui-header ui-bar-"+p}).prependTo(n);var l=a("<h1>",{"class":"ui-title"}).appendTo(p),s=a("<a>",{"data-iconpos":"notext","data-icon":"delete",text:c.closeText,href:"#","class":"ui-btn-left"}).appendTo(p).buttonMarkup()}if(i)d.buttonCount=a("<span>").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(e);c.disabled&&this.disable();f.change(function(){d.refresh()});a.extend(d,{select:f,optionElems:h,selectID:b,label:g,buttonId:k,menuId:j,
  thisPage:o,button:e,menuPage:t,menuPageContent:v,screen:r,listbox:n,list:u,menuType:void 0,header:p,headerClose:s,headerTitle:l,placeholder:""});if(c.nativeMenu){f.appendTo(e).bind("touchstart mousedown",function(){e.addClass(a.mobile.activeBtnClass)}).bind("focus mouseover",function(){e.trigger("mouseover")}).bind("touchmove",function(){e.removeClass(a.mobile.activeBtnClass)}).bind("change blur mouseout",function(){e.trigger("mouseout").removeClass(a.mobile.activeBtnClass)});e.attr("tabindex","-1")}else{d.refresh();
  f.attr("tabindex","-1").focus(function(){a(this).blur();e.focus()});e.bind("touchstart",function(q){a(this).data("startTouches",a.extend({},q.originalEvent.touches[0]))}).bind(a.support.touch?"touchend":"mouseup",function(q){a(this).data("moved")?a(this).removeData("moved"):d.open();q.preventDefault()}).bind("touchmove",function(q){q=q.originalEvent.touches[0];var w=a(this).data("startTouches"),z=Math.abs(q.pageY-w.pageY);if(Math.abs(q.pageX-w.pageX)>10||z>10)a(this).data("moved",true)});u.delegate("li:not(.ui-disabled, .ui-li-divider)",
  "click",function(q){if(a(q.target).is("a")){var w=u.find("li:not(.ui-li-divider)").index(this);w=d.optionElems.eq(w)[0];w.selected=i?!w.selected:true;i&&a(this).find(".ui-icon").toggleClass("ui-icon-checkbox-on",w.selected).toggleClass("ui-icon-checkbox-off",!w.selected);f.trigger("change");i||d.close();q.preventDefault()}});r.add(s).add(m).bind("click",function(q){d.close();q.preventDefault();a.contains(m[0],q.target)&&q.stopImmediatePropagation()})}},_buildList:function(){var d=this,c=this.options,
  f=this.placeholder,b=[],g=[],e=d.isMultiple?"checkbox-off":"false";d.list.empty().filter(".ui-listview").listview("destroy");d.select.find("option").each(function(){var i=a(this),h=i.parent(),k=i.text(),j="<a href='#'>"+k+"</a>",o=[],p=[];if(h.is("optgroup")){h=h.attr("label");if(a.inArray(h,b)===-1){g.push("<li data-role='list-divider'>"+h+"</li>");b.push(h)}}if(!this.getAttribute("value")||k.length==0||i.data("placeholder")){c.hidePlaceholderMenuItems&&o.push("ui-selectmenu-placeholder");f=d.placeholder=
  k}if(this.disabled){o.push("ui-disabled");p.push("aria-disabled='true'")}g.push("<li data-icon='"+e+"' class='"+o.join(" ")+"' "+p.join(" ")+">"+j+"</li>")});d.list.html(g.join(" "));this.isMultiple||this.headerClose.hide();!this.isMultiple&&!f.length?this.header.hide():this.headerTitle.text(this.placeholder);d.list.listview()},refresh:function(d){var c=this,f=this.element,b=this.isMultiple,g=this.optionElems=f.find("option"),e=g.filter(":selected"),i=e.map(function(){return g.index(this)}).get();
  if(!c.options.nativeMenu&&(d||f[0].options.length>c.list.find("li").length))c._buildList();c.button.find(".ui-btn-text").text(function(){if(!b)return e.text();return e.length?e.map(function(){return a(this).text()}).get().join(", "):c.placeholder});if(b)c.buttonCount[e.length>1?"show":"hide"]().text(e.length);c.options.nativeMenu||c.list.find("li:not(.ui-li-divider)").removeClass(a.mobile.activeBtnClass).attr("aria-selected",false).each(function(h){if(a.inArray(h,i)>-1){h=a(this).addClass(a.mobile.activeBtnClass);
  h.find("a").attr("aria-selected",true);b&&h.find(".ui-icon").removeClass("ui-icon-checkbox-off").addClass("ui-icon-checkbox-on")}})},open:function(){function d(){c.list.find(".ui-btn-active").focus()}if(!(this.options.disabled||this.options.nativeMenu)){var c=this,f=c.list.outerHeight(),b=c.list.outerWidth(),g=a(window).scrollTop(),e=c.button.offset().top,i=window.innerHeight,h=c.list.parents(".ui-dialog").length;c.button.addClass(a.mobile.activeBtnClass);if(h||f>i-80||!a.support.scrollTop){g==0&&
  e>i&&c.thisPage.one("pagehide",function(){a(this).data("lastScroll",e)});c.menuPage.one("pageshow",function(){a(window).one("silentscroll",function(){d()})});c.menuType="page";c.menuPageContent.append(c.list);a.mobile.changePage(c.menuPage,"pop",false,true)}else{c.menuType="overlay";c.screen.height(a(document).height()).removeClass("ui-screen-hidden");h=e-g;var k=g+i-e,j=f/2;f=h>f/2&&k>f/2?e+c.button.outerHeight()/2-j:h>k?g+i-f-30:g+30;b=c.button.offset().left+c.button.outerWidth()/2-b/2;c.listbox.append(c.list).removeClass("ui-selectmenu-hidden").css({top:f,
  left:b}).addClass("in");d()}setTimeout(function(){c.isOpen=true},400)}},close:function(){function d(){setTimeout(function(){c.button.focus();c.button.removeClass(a.mobile.activeBtnClass)},40);c.listbox.removeAttr("style").append(c.list)}if(!(this.options.disabled||!this.isOpen||this.options.nativeMenu)){var c=this;if(c.menuType=="page"){a.mobile.changePage([c.menuPage,c.thisPage],"pop",true,false);c.menuPage.one("pagehide",d)}else{c.screen.addClass("ui-screen-hidden");c.listbox.addClass("ui-selectmenu-hidden").removeAttr("style").removeClass("in");
  d()}this.isOpen=false}},disable:function(){this.element.attr("disabled",true);this.button.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)},enable:function(){this.element.attr("disabled",false);this.button.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)}})})(jQuery);
  (function(a){a.fn.buttonMarkup=function(c){return this.each(function(){var f=a(this),b=a.extend({},a.fn.buttonMarkup.defaults,f.data(),c),g,e="ui-btn-inner",i;d&&d();if(!b.theme){g=f.closest("[class*='ui-bar-'],[class*='ui-body-']");b.theme=g.length?/ui-(bar|body)-([a-z])/.exec(g.attr("class"))[2]:"c"}g="ui-btn ui-btn-up-"+b.theme;if(b.inline)g+=" ui-btn-inline";if(b.icon){b.icon="ui-icon-"+b.icon;b.iconpos=b.iconpos||"left";i="ui-icon "+b.icon;if(b.shadow)i+=" ui-icon-shadow"}if(b.iconpos){g+=" ui-btn-icon-"+
  b.iconpos;b.iconpos=="notext"&&!f.attr("title")&&f.attr("title",f.text())}if(b.corners){g+=" ui-btn-corner-all";e+=" ui-btn-corner-all"}if(b.shadow)g+=" ui-shadow";f.attr("data-theme",b.theme).addClass(g);b=("<D class='"+e+"'><D class='ui-btn-text'></D>"+(b.icon?"<span class='"+i+"'></span>":"")+"</D>").replace(/D/g,b.wrapperEls);f.wrapInner(b)})};a.fn.buttonMarkup.defaults={corners:true,shadow:true,iconshadow:true,wrapperEls:"span"};var d=function(){a(".ui-btn:not(.ui-disabled)").live({"touchstart mousedown":function(){var c=
  a(this).attr("data-theme");a(this).removeClass("ui-btn-up-"+c).addClass("ui-btn-down-"+c)},"touchmove touchend mouseup":function(){var c=a(this).attr("data-theme");a(this).removeClass("ui-btn-down-"+c).addClass("ui-btn-up-"+c)},"mouseover focus":function(){var c=a(this).attr("data-theme");a(this).removeClass("ui-btn-up-"+c).addClass("ui-btn-hover-"+c)},"mouseout blur":function(){var c=a(this).attr("data-theme");a(this).removeClass("ui-btn-hover-"+c).addClass("ui-btn-up-"+c)}});d=null}})(jQuery);
  (function(a){a.widget("mobile.button",a.mobile.widget,{options:{theme:null,icon:null,iconpos:null,inline:null,corners:true,shadow:true,iconshadow:true},_create:function(){var d=this.element,c=this.options;this.button=a("<div></div>").text(d.text()||d.val()).buttonMarkup({theme:c.theme,icon:c.icon,iconpos:c.iconpos,inline:c.inline,corners:c.corners,shadow:c.shadow,iconshadow:c.iconshadow}).insertBefore(d).append(d.addClass("ui-btn-hidden"));d.attr("type")!=="reset"&&d.click(function(){var f=a("<input>",
  {type:"hidden",name:d.attr("name"),value:d.attr("value")}).insertBefore(d);a(document).submit(function(){f.remove()})})},enable:function(){this.element.attr("disabled",false);this.button.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)},disable:function(){this.element.attr("disabled",true);this.button.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)}})})(jQuery);
  (function(a){a.widget("mobile.slider",a.mobile.widget,{options:{theme:null,trackTheme:null,disabled:false},_create:function(){var d=this,c=this.element,f=c.parents("[class*=ui-bar-],[class*=ui-body-]").eq(0);f=f.length?f.attr("class").match(/ui-(bar|body)-([a-z])/)[2]:"c";var b=this.options.theme?this.options.theme:f,g=this.options.trackTheme?this.options.trackTheme:f,e=c[0].nodeName.toLowerCase();f=e=="select"?"ui-slider-switch":"";var i=c.attr("id"),h=i+"-label";i=a("[for="+i+"]").attr("id",h);
  var k=function(){return e=="input"?parseFloat(c.val()):c[0].selectedIndex},j=e=="input"?parseFloat(c.attr("min")):0,o=e=="input"?parseFloat(c.attr("max")):c.find("option").length-1,p=window.parseFloat(c.attr("step")||1),t=a('<div class="ui-slider '+f+" ui-btn-down-"+g+' ui-btn-corner-all" role="application"></div>'),v=a('<a href="#" class="ui-slider-handle"></a>').appendTo(t).buttonMarkup({corners:true,theme:b,shadow:true}).attr({role:"slider","aria-valuemin":j,"aria-valuemax":o,"aria-valuenow":k(),
  "aria-valuetext":k(),title:k(),"aria-labelledby":h});a.extend(this,{slider:t,handle:v,dragging:false,beforeStart:null});if(e=="select"){t.wrapInner('<div class="ui-slider-inneroffset"></div>');c.find("option");c.find("option").each(function(m){var r=m==0?"b":"a",n=m==0?"right":"left";m=m==0?" ui-btn-down-"+g:" ui-btn-active";a('<div class="ui-slider-labelbg ui-slider-labelbg-'+r+m+" ui-btn-corner-"+n+'"></div>').prependTo(t);a('<span class="ui-slider-label ui-slider-label-'+r+m+" ui-btn-corner-"+
  n+'" role="img">'+a(this).text()+"</span>").prependTo(v)})}i.addClass("ui-slider");c.addClass(e=="input"?"ui-slider-input":"ui-slider-switch").change(function(){d.refresh(k(),true)}).keyup(function(){d.refresh(k(),true,true)}).blur(function(){d.refresh(k(),true)});a(document).bind("touchmove mousemove",function(m){if(d.dragging){d.refresh(m);return false}});t.bind("touchstart mousedown",function(m){d.dragging=true;if(e==="select")d.beforeStart=c[0].selectedIndex;d.refresh(m);return false});t.add(document).bind("touchend mouseup",
  function(){if(d.dragging){d.dragging=false;if(e==="select"){if(d.beforeStart===c[0].selectedIndex)d.refresh(d.beforeStart===0?1:0);var m=k();m=Math.round(m/(o-j)*100);v.addClass("ui-slider-handle-snapping").css("left",m+"%").animationComplete(function(){v.removeClass("ui-slider-handle-snapping")})}return false}});t.insertAfter(c);this.handle.bind("touchstart mousedown",function(){a(this).focus()});this.handle.bind("keydown",function(m){var r=k();if(!d.options.disabled){switch(m.keyCode){case a.mobile.keyCode.HOME:case a.mobile.keyCode.END:case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:m.preventDefault();
  if(!d._keySliding){d._keySliding=true;a(this).addClass("ui-state-active")}}switch(m.keyCode){case a.mobile.keyCode.HOME:d.refresh(j);break;case a.mobile.keyCode.END:d.refresh(o);break;case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:d.refresh(r+p);break;case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:d.refresh(r-p)}}}).keyup(function(){if(d._keySliding){d._keySliding=false;a(this).removeClass("ui-state-active")}});this.refresh()},
  refresh:function(d,c,f){if(!this.options.disabled){var b=this.element,g=b[0].nodeName.toLowerCase(),e=g==="input"?parseFloat(b.attr("min")):0,i=g==="input"?parseFloat(b.attr("max")):b.find("option").length-1;if(typeof d==="object"){d=d.originalEvent.touches?d.originalEvent.touches[0]:d;if(!this.dragging||d.pageX<this.slider.offset().left-8||d.pageX>this.slider.offset().left+this.slider.width()+8)return;d=Math.round((d.pageX-this.slider.offset().left)/this.slider.width()*100)}else{if(d==null)d=g===
  "input"?parseFloat(b.val()):b[0].selectedIndex;d=(parseFloat(d)-e)/(i-e)*100}if(!isNaN(d)){if(d<0)d=0;if(d>100)d=100;var h=Math.round(d/100*(i-e))+e;if(h<e)h=e;if(h>i)h=i;this.handle.css("left",d+"%");this.handle.attr({"aria-valuenow":g==="input"?h:b.find("option").eq(h).attr("value"),"aria-valuetext":g==="input"?h:b.find("option").eq(h).text(),title:h});if(g==="select")h===0?this.slider.addClass("ui-slider-switch-a").removeClass("ui-slider-switch-b"):this.slider.addClass("ui-slider-switch-b").removeClass("ui-slider-switch-a");
  if(!f){if(g==="input")b.val(h);else b[0].selectedIndex=h;c||b.trigger("change")}}}},enable:function(){this.element.attr("disabled",false);this.slider.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)},disable:function(){this.element.attr("disabled",true);this.slider.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)}})})(jQuery);
  (function(a){a.widget("mobile.collapsible",a.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:false,heading:">:header,>legend",theme:null,iconTheme:"d"},_create:function(){var d=this.element,c=this.options,f=d.addClass("ui-collapsible-contain"),b=d.find(c.heading).eq(0),g=f.wrapInner('<div class="ui-collapsible-content"></div>').find(".ui-collapsible-content");d=d.closest('[data-role="collapsible-set"]').addClass("ui-collapsible-set");
  if(b.is("legend")){b=a('<div role="heading">'+b.html()+"</div>").insertBefore(b);b.next().remove()}b.insertBefore(g);b.addClass("ui-collapsible-heading").append('<span class="ui-collapsible-heading-status"></span>').wrapInner('<a href="#" class="ui-collapsible-heading-toggle"></a>').find("a:eq(0)").buttonMarkup({shadow:!!!d.length,corners:false,iconPos:"left",icon:"plus",theme:c.theme}).find(".ui-icon").removeAttr("class").buttonMarkup({shadow:true,corners:true,iconPos:"notext",icon:"plus",theme:c.iconTheme});
  if(d.length)f.data("collapsible-last")&&b.find("a:eq(0), .ui-btn-inner").addClass("ui-corner-bottom");else b.find("a:eq(0)").addClass("ui-corner-all").find(".ui-btn-inner").addClass("ui-corner-all");f.bind("collapse",function(e){if(!e.isDefaultPrevented()){e.preventDefault();b.addClass("ui-collapsible-heading-collapsed").find(".ui-collapsible-heading-status").text(c.expandCueText);b.find(".ui-icon").removeClass("ui-icon-minus").addClass("ui-icon-plus");g.addClass("ui-collapsible-content-collapsed").attr("aria-hidden",
  true);f.data("collapsible-last")&&b.find("a:eq(0), .ui-btn-inner").addClass("ui-corner-bottom")}}).bind("expand",function(e){if(!e.isDefaultPrevented()){e.preventDefault();b.removeClass("ui-collapsible-heading-collapsed").find(".ui-collapsible-heading-status").text(c.collapseCueText);b.find(".ui-icon").removeClass("ui-icon-plus").addClass("ui-icon-minus");g.removeClass("ui-collapsible-content-collapsed").attr("aria-hidden",false);f.data("collapsible-last")&&b.find("a:eq(0), .ui-btn-inner").removeClass("ui-corner-bottom")}}).trigger(c.collapsed?
  "collapse":"expand");if(d.length&&!d.data("collapsiblebound")){d.data("collapsiblebound",true).bind("expand",function(e){a(this).find(".ui-collapsible-contain").not(a(e.target).closest(".ui-collapsible-contain")).not("> .ui-collapsible-contain .ui-collapsible-contain").trigger("collapse")});d=d.find("[data-role=collapsible]");d.first().find("a:eq(0)").addClass("ui-corner-top").find(".ui-btn-inner").addClass("ui-corner-top");d.last().data("collapsible-last",true)}b.bind(a.support.touch?"touchstart":
  "click",function(){b.is(".ui-collapsible-heading-collapsed")?f.trigger("expand"):f.trigger("collapse");return false})}})})(jQuery);
  (function(a){a.fn.controlgroup=function(d){return this.each(function(){function c(e){e.removeClass("ui-btn-corner-all ui-shadow").eq(0).addClass(g[0]).end().filter(":last").addClass(g[1]).addClass("ui-controlgroup-last")}var f=a.extend({direction:a(this).data("type")||"vertical",shadow:false},d),b=a(this).find(">legend"),g=f.direction=="horizontal"?["ui-corner-left","ui-corner-right"]:["ui-corner-top","ui-corner-bottom"];a(this).find("input:eq(0)").attr("type");if(b.length){a(this).wrapInner('<div class="ui-controlgroup-controls"></div>');
  a('<div role="heading" class="ui-controlgroup-label">'+b.html()+"</div>").insertBefore(a(this).children(0));b.remove()}a(this).addClass("ui-corner-all ui-controlgroup ui-controlgroup-"+f.direction);c(a(this).find(".ui-btn"));c(a(this).find(".ui-btn-inner"));f.shadow&&a(this).addClass("ui-shadow")})}})(jQuery);(function(a){a.fn.fieldcontain=function(){return this.addClass("ui-field-contain ui-body ui-br")}})(jQuery);
  (function(a){a.widget("mobile.listview",a.mobile.widget,{options:{theme:"c",countTheme:"c",headerTheme:"b",dividerTheme:"b",splitIcon:"arrow-r",splitTheme:"b",inset:false},_create:function(){var d=this.element,c=this.options;d.addClass("ui-listview").attr("role","listbox");c.inset&&d.addClass("ui-listview-inset ui-corner-all ui-shadow");d.delegate(".ui-li","focusin",function(){a(this).attr("tabindex","0")});this._itemApply(d,d);this.refresh(true);d.keydown(function(f){var b=a(f.target),g=b.closest("li");
  switch(f.keyCode){case 38:f=g.prev();if(f.length){b.blur().attr("tabindex","-1");f.find("a").first().focus()}return false;case 40:f=g.next();if(f.length){b.blur().attr("tabindex","-1");f.find("a").first().focus()}return false;case 39:f=g.find("a.ui-li-link-alt");if(f.length){b.blur();f.first().focus()}return false;case 37:f=g.find("a.ui-link-inherit");if(f.length){b.blur();f.first().focus()}return false;case 13:case 32:b.trigger("click");return false}});d.delegate("li","click",function(f){if(!a(f.target).closest("a").length){a(this).find("a").first().trigger("click");
  return false}})},_itemApply:function(d,c){c.find(".ui-li-count").addClass("ui-btn-up-"+(d.data("counttheme")||this.options.countTheme)+" ui-btn-corner-all");c.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading");c.find("p, dl").addClass("ui-li-desc");c.find("li").find("img:eq(0)").addClass("ui-li-thumb").each(function(){a(this).closest("li").addClass(a(this).is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb")});var f=c.find(".ui-li-aside");f.length&&f.each(function(b,g){a(g).prependTo(a(g).parent())});
  a.support.cssPseudoElement||a.nodeName(c[0],"ol")},_removeCorners:function(d){d.add(d.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb")).removeClass("ui-corner-top ui-corner-bottom ui-corner-br ui-corner-bl ui-corner-tr ui-corner-tl")},refresh:function(d){this._createSubPages();var c=this.options,f=this.element,b=this,g=f.data("dividertheme")||c.dividerTheme,e=f.children("li"),i=a.support.cssPseudoElement||!a.nodeName(f[0],"ol")?0:1;i&&f.find(".ui-li-dec").remove();e.attr({role:"option",tabindex:"-1"});
  e.first().attr("tabindex","0");e.each(function(h){var k=a(this),j="ui-li";if(!(!d&&k.hasClass("ui-li"))){var o=k.data("theme")||c.theme,p=k.find("a");if(p.length){var t=k.data("icon");k.buttonMarkup({wrapperEls:"div",shadow:false,corners:false,iconpos:"right",icon:p.length>1||t===false?false:t||"arrow-r",theme:o});p.first().addClass("ui-link-inherit");if(p.length>1){j+=" ui-li-has-alt";p=p.last();t=f.data("splittheme")||p.data("theme")||c.splitTheme;p.appendTo(k).attr("title",p.text()).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:false,
  corners:false,theme:o,icon:false,iconpos:false}).find(".ui-btn-inner").append(a("<span>").buttonMarkup({shadow:true,corners:true,theme:t,iconpos:"notext",icon:f.data("spliticon")||p.data("icon")||c.splitIcon}))}}else if(k.data("role")==="list-divider"){j+=" ui-li-divider ui-btn ui-bar-"+g;k.attr("role","heading");if(i)i=1}else j+=" ui-li-static ui-btn-up-"+o;if(c.inset){if(h===0){j+=" ui-corner-top";k.add(k.find(".ui-btn-inner")).find(".ui-li-link-alt").addClass("ui-corner-tr").end().find(".ui-li-thumb").addClass("ui-corner-tl");
  k.next().next().length&&b._removeCorners(k.next())}if(h===e.length-1){j+=" ui-corner-bottom";k.add(k.find(".ui-btn-inner")).find(".ui-li-link-alt").addClass("ui-corner-br").end().find(".ui-li-thumb").addClass("ui-corner-bl");k.prev().prev().length&&b._removeCorners(k.prev())}}i&&j.indexOf("ui-li-divider")<0&&k.find(".ui-link-inherit").first().addClass("ui-li-jsnumbering").prepend("<span class='ui-li-dec'>"+i++ +". </span>");k.addClass(j);d||b._itemApply(f,k)}})},_idStringEscape:function(d){return d.replace(/[^a-zA-Z0-9]/g,
  "-")},_createSubPages:function(){var d=this.element,c=d.closest(".ui-page"),f=c.data("url"),b=this.options,g=this,e=c.find("[data-role='footer']").data("id");a(d.find("ul, ol").toArray().reverse()).each(function(i){var h=a(this),k=h.parent(),j=a.trim(k.contents()[0].nodeValue)||k.find("a:first").text();i=f+"&"+a.mobile.subPageUrlKey+"="+g._idStringEscape(j+" "+i);var o=h.data("theme")||b.theme,p=h.data("counttheme")||d.data("counttheme")||b.countTheme;h.wrap("<div data-role='page'><div data-role='content'></div></div>").parent().before("<div data-role='header' data-theme='"+
  b.headerTheme+"'><div class='ui-title'>"+j+"</div></div>").after(e?a("<div>",{"data-role":"footer","data-id":e,"class":"ui-footer-duplicate"}):"").parent().attr({"data-url":i,"data-theme":o,"data-count-theme":p}).appendTo(a.mobile.pageContainer).page();h=k.find("a:first");h.length||(h=a("<a></a>").html(j).prependTo(k.empty()));h.attr("href","#"+i)}).listview()}})})(jQuery);
  (function(a){a.mobile.listview.prototype.options.filter=false;a("[data-role='listview']").live("listviewcreate",function(){var d=a(this);if(d.data("listview").options.filter){var c=a("<form>",{"class":"ui-listview-filter ui-bar-c",role:"search"});a("<input>",{placeholder:"Filter results...","data-type":"search"}).bind("keyup change",function(){var f=this.value.toLowerCase();d.children().show();f&&d.children().filter(function(){return a(this).text().toLowerCase().indexOf(f)===-1}).hide()}).appendTo(c).textinput();
  c.insertBefore(d)}})})(jQuery);
  (function(a){a.widget("mobile.dialog",a.mobile.widget,{options:{},_create:function(){this.element.attr("role","dialog").addClass("ui-page ui-dialog ui-body-a").find("[data-role=header]").addClass("ui-corner-top ui-overlay-shadow").prepend('<a href="#" data-icon="delete" data-rel="back" data-iconpos="notext">Close</a>').end().find('.ui-content:not([class*="ui-body-"])').addClass("ui-body-c").end().find(".ui-content,[data-role=footer]").last().addClass("ui-corner-bottom ui-overlay-shadow");this.element.bind("click submit",
  function(d){d=d.type=="click"?a(d.target).closest("a"):a(d.target).closest("form");d.length&&!d.data("transition")&&d.attr("data-transition",a.mobile.urlHistory.getActive().transition).attr("data-direction","reverse")})},close:function(){window.history.back()}})})(jQuery);
  (function(a,d){a.widget("mobile.navbar",a.mobile.widget,{options:{iconpos:"top",grid:null},_create:function(){var c=this.element,f=c.find("a"),b=f.filter("[data-icon]").length?this.options.iconpos:d;c.addClass("ui-navbar").attr("role","navigation").find("ul").grid({grid:this.options.grid});b||c.addClass("ui-navbar-noicons");f.buttonMarkup({corners:false,shadow:false,iconpos:b});c.delegate("a","click",function(){f.removeClass("ui-btn-active");a(this).addClass("ui-btn-active")})}})})(jQuery);
  (function(a){a.fn.grid=function(d){return this.each(function(){var c=a.extend({grid:null},d),f=a(this).children(),b={a:2,b:3,c:4,d:5};c=c.grid;if(!c)if(f.length<=5)for(var g in b){if(b[g]==f.length)c=g}else c="a";b=b[c];a(this).addClass("ui-grid-"+c);f.filter(":nth-child("+b+"n+1)").addClass("ui-block-a");f.filter(":nth-child("+b+"n+2)").addClass("ui-block-b");b>2&&f.filter(":nth-child(3n+3)").addClass("ui-block-c");b>3&&f.filter(":nth-child(4n+4)").addClass("ui-block-d");b>4&&f.filter(":nth-child(5n+5)").addClass("ui-block-e")})}})(jQuery);
 
  /*
  * jQuery UI Effects @VERSION
  *
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Effects/
  */
  ;jQuery.effects || (function($, undefined) {
 
  $.effects = {};
 
 
 
  /******************************************************************************/
  /****************************** COLOR ANIMATIONS ******************************/
  /******************************************************************************/
 
  // override the animation for color styles
  $.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
  'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
  function(i, attr) {
  $.fx.step[attr] = function(fx) {
  if (!fx.colorInit) {
  fx.start = getColor(fx.elem, attr);
  fx.end = getRGB(fx.end);
  fx.colorInit = true;
  }
 
  fx.elem.style[attr] = 'rgb(' +
  Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
  Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
  Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
  };
  });
 
  // Color Conversion functions from highlightFade
  // By Blair Mitchelmore
  // http://jquery.offput.ca/highlightFade/
 
  // Parse strings looking for color tuples [255,255,255]
  function getRGB(color) {
  var result;
 
  // Check if we're already dealing with an array of colors
  if ( color && color.constructor == Array && color.length == 3 )
  return color;
 
  // Look for rgb(num,num,num)
  if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
  return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
 
  // Look for rgb(num%,num%,num%)
  if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
  return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
 
  // Look for #a0b1c2
  if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
  return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
 
  // Look for #fff
  if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
  return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
 
  // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
  if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
  return colors['transparent'];
 
  // Otherwise, we're most likely dealing with a named color
  return colors[$.trim(color).toLowerCase()];
  }
 
  function getColor(elem, attr) {
  var color;
 
  do {
  color = $.curCSS(elem, attr);
 
  // Keep going until we find an element that has color, or we hit the body
  if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
  break;
 
  attr = "backgroundColor";
  } while ( elem = elem.parentNode );
 
  return getRGB(color);
  };
 
  // Some named colors to work with
  // From Interface by Stefan Petre
  // http://interface.eyecon.ro/
 
  var colors = {
  aqua:[0,255,255],
  azure:[240,255,255],
  beige:[245,245,220],
  black:[0,0,0],
  blue:[0,0,255],
  brown:[165,42,42],
  cyan:[0,255,255],
  darkblue:[0,0,139],
  darkcyan:[0,139,139],
  darkgrey:[169,169,169],
  darkgreen:[0,100,0],
  darkkhaki:[189,183,107],
  darkmagenta:[139,0,139],
  darkolivegreen:[85,107,47],
  darkorange:[255,140,0],
  darkorchid:[153,50,204],
  darkred:[139,0,0],
  darksalmon:[233,150,122],
  darkviolet:[148,0,211],
  fuchsia:[255,0,255],
  gold:[255,215,0],
  green:[0,128,0],
  indigo:[75,0,130],
  khaki:[240,230,140],
  lightblue:[173,216,230],
  lightcyan:[224,255,255],
  lightgreen:[144,238,144],
  lightgrey:[211,211,211],
  lightpink:[255,182,193],
  lightyellow:[255,255,224],
  lime:[0,255,0],
  magenta:[255,0,255],
  maroon:[128,0,0],
  navy:[0,0,128],
  olive:[128,128,0],
  orange:[255,165,0],
  pink:[255,192,203],
  purple:[128,0,128],
  violet:[128,0,128],
  red:[255,0,0],
  silver:[192,192,192],
  white:[255,255,255],
  yellow:[255,255,0],
  transparent: [255,255,255]
  };
 
 
 
  /******************************************************************************/
  /****************************** CLASS ANIMATIONS ******************************/
  /******************************************************************************/
 
  var classAnimationActions = ['add', 'remove', 'toggle'],
  shorthandStyles = {
  border: 1,
  borderBottom: 1,
  borderColor: 1,
  borderLeft: 1,
  borderRight: 1,
  borderTop: 1,
  borderWidth: 1,
  margin: 1,
  padding: 1
  };
 
  function getElementStyles() {
  var style = document.defaultView
  ? document.defaultView.getComputedStyle(this, null)
  : this.currentStyle,
  newStyle = {},
  key,
  camelCase;
 
  // webkit enumerates style porperties
  if (style && style.length && style[0] && style[style[0]]) {
  var len = style.length;
  while (len--) {
  key = style[len];
  if (typeof style[key] == 'string') {
  camelCase = key.replace(/\-(\w)/g, function(all, letter){
  return letter.toUpperCase();
  });
  newStyle[camelCase] = style[key];
  }
  }
  } else {
  for (key in style) {
  if (typeof style[key] === 'string') {
  newStyle[key] = style[key];
  }
  }
  }
 
  return newStyle;
  }
 
  function filterStyles(styles) {
  var name, value;
  for (name in styles) {
  value = styles[name];
  if (
  // ignore null and undefined values
  value == null ||
  // ignore functions (when does this occur?)
  $.isFunction(value) ||
  // shorthand styles that need to be expanded
  name in shorthandStyles ||
  // ignore scrollbars (break in IE)
  (/scrollbar/).test(name) ||
 
  // only colors or values that can be converted to numbers
  (!(/color/i).test(name) && isNaN(parseFloat(value)))
  ) {
  delete styles[name];
  }
  }
 
  return styles;
  }
 
  function styleDifference(oldStyle, newStyle) {
  var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
  name;
 
  for (name in newStyle) {
  if (oldStyle[name] != newStyle[name]) {
  diff[name] = newStyle[name];
  }
  }
 
  return diff;
  }
 
  $.effects.animateClass = function(value, duration, easing, callback) {
  if ($.isFunction(easing)) {
  callback = easing;
  easing = null;
  }
 
  return this.queue('fx', function() {
  var that = $(this),
  originalStyleAttr = that.attr('style') || ' ',
  originalStyle = filterStyles(getElementStyles.call(this)),
  newStyle,
  className = that.attr('className');
 
  $.each(classAnimationActions, function(i, action) {
  if (value[action]) {
  that[action + 'Class'](value[action]);
  }
  });
  newStyle = filterStyles(getElementStyles.call(this));
  that.attr('className', className);
 
  that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
  $.each(classAnimationActions, function(i, action) {
  if (value[action]) { that[action + 'Class'](value[action]); }
  });
  // work around bug in IE by clearing the cssText before setting it
  if (typeof that.attr('style') == 'object') {
  that.attr('style').cssText = '';
  that.attr('style').cssText = originalStyleAttr;
  } else {
  that.attr('style', originalStyleAttr);
  }
  if (callback) { callback.apply(this, arguments); }
  });
 
  // $.animate adds a function to the end of the queue
  // but we want it at the front
  var queue = $.queue(this),
  anim = queue.splice(queue.length - 1, 1)[0];
  queue.splice(1, 0, anim);
  $.dequeue(this);
  });
  };
 
  $.fn.extend({
  _addClass: $.fn.addClass,
  addClass: function(classNames, speed, easing, callback) {
  return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
  },
 
  _removeClass: $.fn.removeClass,
  removeClass: function(classNames,speed,easing,callback) {
  return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
  },
 
  _toggleClass: $.fn.toggleClass,
  toggleClass: function(classNames, force, speed, easing, callback) {
  if ( typeof force == "boolean" || force === undefined ) {
  if ( !speed ) {
  // without speed parameter;
  return this._toggleClass(classNames, force);
  } else {
  return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
  }
  } else {
  // without switch parameter;
  return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
  }
  },
 
  switchClass: function(remove,add,speed,easing,callback) {
  return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
  }
  });
 
 
 
  /******************************************************************************/
  /*********************************** EFFECTS **********************************/
  /******************************************************************************/
 
  $.extend($.effects, {
  version: "@VERSION",
 
  // Saves a set of properties in a data storage
  save: function(element, set) {
  for(var i=0; i < set.length; i++) {
  if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
  }
  },
 
  // Restores a set of previously saved properties from a data storage
  restore: function(element, set) {
  for(var i=0; i < set.length; i++) {
  if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
  }
  },
 
  setMode: function(el, mode) {
  if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
  return mode;
  },
 
  getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
  // this should be a little more flexible in the future to handle a string & hash
  var y, x;
  switch (origin[0]) {
  case 'top': y = 0; break;
  case 'middle': y = 0.5; break;
  case 'bottom': y = 1; break;
  default: y = origin[0] / original.height;
  };
  switch (origin[1]) {
  case 'left': x = 0; break;
  case 'center': x = 0.5; break;
  case 'right': x = 1; break;
  default: x = origin[1] / original.width;
  };
  return {x: x, y: y};
  },
 
  // Wraps the element around a wrapper that copies position properties
  createWrapper: function(element) {
 
  // if the element is already wrapped, return it
  if (element.parent().is('.ui-effects-wrapper')) {
  return element.parent();
  }
 
  // wrap the element
  var props = {
  width: element.outerWidth(true),
  height: element.outerHeight(true),
  'float': element.css('float')
  },
  wrapper = $('<div></div>')
  .addClass('ui-effects-wrapper')
  .css({
  fontSize: '100%',
  background: 'transparent',
  border: 'none',
  margin: 0,
  padding: 0
  });
 
  element.wrap(wrapper);
  wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
 
  // transfer positioning properties to the wrapper
  if (element.css('position') == 'static') {
  wrapper.css({ position: 'relative' });
  element.css({ position: 'relative' });
  } else {
  $.extend(props, {
  position: element.css('position'),
  zIndex: element.css('z-index')
  });
  $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
  props[pos] = element.css(pos);
  if (isNaN(parseInt(props[pos], 10))) {
  props[pos] = 'auto';
  }
  });
  element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
  }
 
  return wrapper.css(props).show();
  },
 
  removeWrapper: function(element) {
  if (element.parent().is('.ui-effects-wrapper'))
  return element.parent().replaceWith(element);
  return element;
  },
 
  setTransition: function(element, list, factor, value) {
  value = value || {};
  $.each(list, function(i, x){
  unit = element.cssUnit(x);
  if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
  });
  return value;
  }
  });
 
 
  function _normalizeArguments(effect, options, speed, callback) {
  // shift params for method overloading
  if (typeof effect == 'object') {
  callback = options;
  speed = null;
  options = effect;
  effect = options.effect;
  }
  if ($.isFunction(options)) {
  callback = options;
  speed = null;
  options = {};
  }
  if (typeof options == 'number' || $.fx.speeds[options]) {
  callback = speed;
  speed = options;
  options = {};
  }
  if ($.isFunction(speed)) {
  callback = speed;
  speed = null;
  }
 
  options = options || {};
 
  speed = speed || options.duration;
  speed = $.fx.off ? 0 : typeof speed == 'number'
  ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
 
  callback = callback || options.complete;
 
  return [effect, options, speed, callback];
  }
 
  function standardSpeed( speed ) {
  // valid standard speeds
  if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
  return true;
  }
 
  // invalid strings - treat as "normal" speed
  if ( typeof speed === "string" && !$.effects[ speed ] ) {
  return true;
  }
 
  return false;
  }
 
  $.fn.extend({
  effect: function(effect, options, speed, callback) {
  var args = _normalizeArguments.apply(this, arguments),
  // TODO: make effects take actual parameters instead of a hash
  args2 = {
  options: args[1],
  duration: args[2],
  callback: args[3]
  },
  mode = args2.options.mode,
  effectMethod = $.effects[effect];
 
  if ( $.fx.off || !effectMethod ) {
  // delegate to the original method (e.g., .show()) if possible
  if ( mode ) {
  return this[ mode ]( args2.duration, args2.callback );
  } else {
  return this.each(function() {
  if ( args2.callback ) {
  args2.callback.call( this );
  }
  });
  }
  }
 
  return effectMethod.call(this, args2);
  },
 
  _show: $.fn.show,
  show: function(speed) {
  if ( standardSpeed( speed ) ) {
  return this._show.apply(this, arguments);
  } else {
  var args = _normalizeArguments.apply(this, arguments);
  args[1].mode = 'show';
  return this.effect.apply(this, args);
  }
  },
 
  _hide: $.fn.hide,
  hide: function(speed) {
  if ( standardSpeed( speed ) ) {
  return this._hide.apply(this, arguments);
  } else {
  var args = _normalizeArguments.apply(this, arguments);
  args[1].mode = 'hide';
  return this.effect.apply(this, args);
  }
  },
 
  // jQuery core overloads toggle and creates _toggle
  __toggle: $.fn.toggle,
  toggle: function(speed) {
  if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
  return this.__toggle.apply(this, arguments);
  } else {
  var args = _normalizeArguments.apply(this, arguments);
  args[1].mode = 'toggle';
  return this.effect.apply(this, args);
  }
  },
 
  // helper functions
  cssUnit: function(key) {
  var style = this.css(key), val = [];
  $.each( ['em','px','%','pt'], function(i, unit){
  if(style.indexOf(unit) > 0)
  val = [parseFloat(style), unit];
  });
  return val;
  }
  });
 
 
 
  /******************************************************************************/
  /*********************************** EASING ***********************************/
  /******************************************************************************/
 
  /*
  * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
  *
  * Uses the built in easing capabilities added In jQuery 1.1
  * to offer multiple easing options
  *
  * TERMS OF USE - jQuery Easing
  *
  * Open source under the BSD License.
  *
  * Copyright 2008 George McGinley Smith
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *
  * Redistributions of source code must retain the above copyright notice, this list of
  * conditions and the following disclaimer.
  * 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.
  *
  * Neither the name of the author nor the names of contributors may be used to endorse
  * or promote products derived from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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
  * COPYRIGHT OWNER OR CONTRIBUTORS 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.
  *
  */
 
  // t: current time, b: begInnIng value, c: change In value, d: duration
  $.easing.jswing = $.easing.swing;
 
  $.extend($.easing,
  {
  def: 'easeOutQuad',
  swing: function (x, t, b, c, d) {
  //alert($.easing.default);
  return $.easing[$.easing.def](x, t, b, c, d);
  },
  easeInQuad: function (x, t, b, c, d) {
  return c*(t/=d)*t + b;
  },
  easeOutQuad: function (x, t, b, c, d) {
  return -c *(t/=d)*(t-2) + b;
  },
  easeInOutQuad: function (x, t, b, c, d) {
  if ((t/=d/2) < 1) return c/2*t*t + b;
  return -c/2 * ((--t)*(t-2) - 1) + b;
  },
  easeInCubic: function (x, t, b, c, d) {
  return c*(t/=d)*t*t + b;
  },
  easeOutCubic: function (x, t, b, c, d) {
  return c*((t=t/d-1)*t*t + 1) + b;
  },
  easeInOutCubic: function (x, t, b, c, d) {
  if ((t/=d/2) < 1) return c/2*t*t*t + b;
  return c/2*((t-=2)*t*t + 2) + b;
  },
  easeInQuart: function (x, t, b, c, d) {
  return c*(t/=d)*t*t*t + b;
  },
  easeOutQuart: function (x, t, b, c, d) {
  return -c * ((t=t/d-1)*t*t*t - 1) + b;
  },
  easeInOutQuart: function (x, t, b, c, d) {
  if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
  return -c/2 * ((t-=2)*t*t*t - 2) + b;
  },
  easeInQuint: function (x, t, b, c, d) {
  return c*(t/=d)*t*t*t*t + b;
  },
  easeOutQuint: function (x, t, b, c, d) {
  return c*((t=t/d-1)*t*t*t*t + 1) + b;
  },
  easeInOutQuint: function (x, t, b, c, d) {
  if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
  return c/2*((t-=2)*t*t*t*t + 2) + b;
  },
  easeInSine: function (x, t, b, c, d) {
  return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
  },
  easeOutSine: function (x, t, b, c, d) {
  return c * Math.sin(t/d * (Math.PI/2)) + b;
  },
  easeInOutSine: function (x, t, b, c, d) {
  return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
  },
  easeInExpo: function (x, t, b, c, d) {
  return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
  },
  easeOutExpo: function (x, t, b, c, d) {
  return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
  },
  easeInOutExpo: function (x, t, b, c, d) {
  if (t==0) return b;
  if (t==d) return b+c;
  if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
  return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
  },
  easeInCirc: function (x, t, b, c, d) {
  return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
  },
  easeOutCirc: function (x, t, b, c, d) {
  return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
  },
  easeInOutCirc: function (x, t, b, c, d) {
  if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
  return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
  },
  easeInElastic: function (x, t, b, c, d) {
  var s=1.70158;var p=0;var a=c;
  if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
  if (a < Math.abs(c)) { a=c; var s=p/4; }
  else var s = p/(2*Math.PI) * Math.asin (c/a);
  return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
  },
  easeOutElastic: function (x, t, b, c, d) {
  var s=1.70158;var p=0;var a=c;
  if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
  if (a < Math.abs(c)) { a=c; var s=p/4; }
  else var s = p/(2*Math.PI) * Math.asin (c/a);
  return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
  },
  easeInOutElastic: function (x, t, b, c, d) {
  var s=1.70158;var p=0;var a=c;
  if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
  if (a < Math.abs(c)) { a=c; var s=p/4; }
  else var s = p/(2*Math.PI) * Math.asin (c/a);
  if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
  return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
  },
  easeInBack: function (x, t, b, c, d, s) {
  if (s == undefined) s = 1.70158;
  return c*(t/=d)*t*((s+1)*t - s) + b;
  },
  easeOutBack: function (x, t, b, c, d, s) {
  if (s == undefined) s = 1.70158;
  return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
  },
  easeInOutBack: function (x, t, b, c, d, s) {
  if (s == undefined) s = 1.70158;
  if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
  return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
  },
  easeInBounce: function (x, t, b, c, d) {
  return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
  },
  easeOutBounce: function (x, t, b, c, d) {
  if ((t/=d) < (1/2.75)) {
  return c*(7.5625*t*t) + b;
  } else if (t < (2/2.75)) {
  return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
  } else if (t < (2.5/2.75)) {
  return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
  } else {
  return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
  }
  },
  easeInOutBounce: function (x, t, b, c, d) {
  if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
  return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
  }
  });
 
  /*
  *
  * TERMS OF USE - EASING EQUATIONS
  *
  * Open source under the BSD License.
  *
  * Copyright 2001 Robert Penner
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *
  * Redistributions of source code must retain the above copyright notice, this list of
  * conditions and the following disclaimer.
  * 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.
  *
  * Neither the name of the author nor the names of contributors may be used to endorse
  * or promote products derived from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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
  * COPYRIGHT OWNER OR CONTRIBUTORS 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.
  *
  */
 
  })(jQuery);
 
  /*
  * jQuery UI Autocomplete @VERSION
  *
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Autocomplete
  *
  * Depends:
  * jquery.ui.core.js
  * jquery.ui.widget.js
  * jquery.ui.position.js
  * jquery.ui.menu.js
  */
  (function( $, undefined ) {
 
  // used to prevent race conditions with remote data sources
  var requestIndex = 0;
 
  $.widget( "ui.autocomplete", {
  defaultElement: "<input>",
  options: {
  appendTo: "body",
  delay: 300,
  minLength: 1,
  position: {
  my: "left top",
  at: "left bottom",
  collision: "none"
  },
  source: null
  },
 
  pending: 0,
 
  _create: function() {
  var self = this,
  doc = this.element[ 0 ].ownerDocument,
  suppressKeyPress;
 
  this.element
  .addClass( "ui-autocomplete-input" )
  .attr( "autocomplete", "off" )
  // TODO verify these actually work as intended
  .attr({
  role: "textbox",
  "aria-autocomplete": "list",
  "aria-haspopup": "true"
  })
  .bind( "keydown.autocomplete", function( event ) {
  if ( self.options.disabled || self.element.attr( "readonly" ) ) {
  return;
  }
 
  suppressKeyPress = false;
  var keyCode = $.ui.keyCode;
  switch( event.keyCode ) {
  case keyCode.PAGE_UP:
  self._move( "previousPage", event );
  break;
  case keyCode.PAGE_DOWN:
  self._move( "nextPage", event );
  break;
  case keyCode.UP:
  self._move( "previous", event );
  // prevent moving cursor to beginning of text field in some browsers
  event.preventDefault();
  break;
  case keyCode.DOWN:
  self._move( "next", event );
  // prevent moving cursor to end of text field in some browsers
  event.preventDefault();
  break;
  case keyCode.ENTER:
  case keyCode.NUMPAD_ENTER:
  // when menu is open and has focus
  if ( self.menu.active ) {
  // #6055 - Opera still allows the keypress to occur
  // which causes forms to submit
  suppressKeyPress = true;
  event.preventDefault();
  }
  //passthrough - ENTER and TAB both select the current element
  case keyCode.TAB:
  if ( !self.menu.active ) {
  return;
  }
  self.menu.select( event );
  break;
  case keyCode.ESCAPE:
  self.element.val( self.term );
  self.close( event );
  break;
  default:
  // keypress is triggered before the input value is changed
  clearTimeout( self.searching );
  self.searching = setTimeout(function() {
  // only search if the value has changed
  if ( self.term != self.element.val() ) {
  self.selectedItem = null;
  self.search( null, event );
  }
  }, self.options.delay );
  break;
  }
  })
  .bind( "keypress.autocomplete", function( event ) {
  if ( suppressKeyPress ) {
  suppressKeyPress = false;
  event.preventDefault();
  }
  })
  .bind( "focus.autocomplete", function() {
  if ( self.options.disabled ) {
  return;
  }
 
  self.selectedItem = null;
  self.previous = self.element.val();
  })
  .bind( "blur.autocomplete", function( event ) {
  if ( self.options.disabled ) {
  return;
  }
 
  clearTimeout( self.searching );
  // clicks on the menu (or a button to trigger a search) will cause a blur event
  self.closing = setTimeout(function() {
  self.close( event );
  self._change( event );
  }, 150 );
  });
  this._initSource();
  this.response = function() {
  return self._response.apply( self, arguments );
  };
  this.menu = $( "<ul></ul>" )
  .addClass( "ui-autocomplete" )
  .appendTo( $( this.options.appendTo || "body", doc )[0] )
  // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
  .mousedown(function( event ) {
  // clicking on the scrollbar causes focus to shift to the body
  // but we can't detect a mouseup or a click immediately afterward
  // so we have to track the next mousedown and close the menu if
  // the user clicks somewhere outside of the autocomplete
  var menuElement = self.menu.element[ 0 ];
  if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
  setTimeout(function() {
  $( document ).one( 'mousedown', function( event ) {
  if ( event.target !== self.element[ 0 ] &&
  event.target !== menuElement &&
  !$.contains( menuElement, event.target ) ) {
  self.close();
  }
  });
  }, 1 );
  }
 
  // use another timeout to make sure the blur-event-handler on the input was already triggered
  setTimeout(function() {
  clearTimeout( self.closing );
  }, 13);
  })
  .menu({
  // custom key handling for now
  input: $(),
  focus: function( event, ui ) {
  var item = ui.item.data( "item.autocomplete" );
  if ( false !== self._trigger( "focus", event, { item: item } ) ) {
  // use value to match what will end up in the input, if it was a key event
  if ( /^key/.test(event.originalEvent.type) ) {
  self.element.val( item.value );
  }
  }
  },
  select: function( event, ui ) {
  var item = ui.item.data( "item.autocomplete" ),
  previous = self.previous;
 
  // only trigger when focus was lost (click on menu)
  if ( self.element[0] !== doc.activeElement ) {
  self.element.focus();
  self.previous = previous;
  // #6109 - IE triggers two focus events and the second
  // is asynchronous, so we need to reset the previous
  // term synchronously and asynchronously :-(
  setTimeout(function() {
  self.previous = previous;
  self.selectedItem = item;
  }, 1);
  }
 
  if ( false !== self._trigger( "select", event, { item: item } ) ) {
  self.element.val( item.value );
  }
  // reset the term after the select event
  // this allows custom select handling to work properly
  self.term = self.element.val();
 
  self.close( event );
  self.selectedItem = item;
  },
  blur: function( event, ui ) {
  // don't set the value of the text field if it's already correct
  // this prevents moving the cursor unnecessarily
  if ( self.menu.element.is(":visible") &&
  ( self.element.val() !== self.term ) ) {
  self.element.val( self.term );
  }
  }
  })
  .zIndex( this.element.zIndex() + 1 )
  .hide()
  .data( "menu" );
  if ( $.fn.bgiframe ) {
  this.menu.element.bgiframe();
  }
  },
 
  _destroy: function() {
  this.element
  .removeClass( "ui-autocomplete-input" )
  .removeAttr( "autocomplete" )
  .removeAttr( "role" )
  .removeAttr( "aria-autocomplete" )
  .removeAttr( "aria-haspopup" );
  this.menu.element.remove();
  },
 
  _setOption: function( key, value ) {
  this._super( "_setOption", key, value );
  if ( key === "source" ) {
  this._initSource();
  }
  if ( key === "appendTo" ) {
  this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
  }
  if ( key === "disabled" && value && this.xhr ) {
  this.xhr.abort();
  }
  },
 
  _initSource: function() {
  var self = this,
  array,
  url;
  if ( $.isArray(this.options.source) ) {
  array = this.options.source;
  this.source = function( request, response ) {
  response( $.ui.autocomplete.filter(array, request.term) );
  };
  } else if ( typeof this.options.source === "string" ) {
  url = this.options.source;
  this.source = function( request, response ) {
  if ( self.xhr ) {
  self.xhr.abort();
  }
  self.xhr = $.ajax({
  url: url,
  data: request,
  dataType: "json",
  autocompleteRequest: ++requestIndex,
  success: function( data, status ) {
  if ( this.autocompleteRequest === requestIndex ) {
  response( data );
  }
  },
  error: function() {
  if ( this.autocompleteRequest === requestIndex ) {
  response( [] );
  }
  }
  });
  };
  } else {
  this.source = this.options.source;
  }
  },
 
  search: function( value, event ) {
  value = value != null ? value : this.element.val();
 
  // always save the actual value, not the one passed as an argument
  this.term = this.element.val();
 
  if ( value.length < this.options.minLength ) {
  return this.close( event );
  }
 
  clearTimeout( this.closing );
  if ( this._trigger( "search", event ) === false ) {
  return;
  }
 
  return this._search( value );
  },
 
  _search: function( value ) {
  this.pending++;
  this.element.addClass( "ui-autocomplete-loading" );
 
  this.source( { term: value }, this.response );
  },
 
  _response: function( content ) {
  if ( !this.options.disabled && content && content.length ) {
  content = this._normalize( content );
  this._suggest( content );
  this._trigger( "open" );
  } else {
  this.close();
  }
  this.pending--;
  if ( !this.pending ) {
  this.element.removeClass( "ui-autocomplete-loading" );
  }
  },
 
  close: function( event ) {
  clearTimeout( this.closing );
  if ( this.menu.element.is(":visible") ) {
  this.menu.element.hide();
  this.menu.deactivate();
  this._trigger( "close", event );
  }
  },
 
  _change: function( event ) {
  if ( this.previous !== this.element.val() ) {
  this._trigger( "change", event, { item: this.selectedItem } );
  }
  },
 
  _normalize: function( items ) {
  // assume all items have the right format when the first item is complete
  if ( items.length && items[0].label && items[0].value ) {
  return items;
  }
  return $.map( items, function(item) {
  if ( typeof item === "string" ) {
  return {
  label: item,
  value: item
  };
  }
  return $.extend({
  label: item.label || item.value,
  value: item.value || item.label
  }, item );
  });
  },
 
  _suggest: function( items ) {
  var ul = this.menu.element
  .empty()
  .zIndex( this.element.zIndex() + 1 );
  this._renderMenu( ul, items );
  // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
  this.menu.deactivate();
  this.menu.refresh();
 
  // size and position menu
  ul.show();
  this._resizeMenu();
  ul.position( $.extend({
  of: this.element
  }, this.options.position ));
  },
 
  _resizeMenu: function() {
  var ul = this.menu.element;
  ul.outerWidth( Math.max(
  ul.width( "" ).outerWidth(),
  this.element.outerWidth()
  ) );
  },
 
  _renderMenu: function( ul, items ) {
  var self = this;
  $.each( items, function( index, item ) {
  self._renderItem( ul, item );
  });
  },
 
  _renderItem: function( ul, item) {
  return $( "<li></li>" )
  .data( "item.autocomplete", item )
  .append( $( "<a></a>" ).text( item.label ) )
  .appendTo( ul );
  },
 
  _move: function( direction, event ) {
  if ( !this.menu.element.is(":visible") ) {
  this.search( null, event );
  return;
  }
  if ( this.menu.first() && /^previous/.test(direction) ||
  this.menu.last() && /^next/.test(direction) ) {
  this.element.val( this.term );
  this.menu.deactivate();
  return;
  }
  this.menu[ direction ]( event );
  },
 
  widget: function() {
  return this.menu.element;
  }
  });
 
  $.extend( $.ui.autocomplete, {
  version: "@VERSION",
  escapeRegex: function( value ) {
  return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  },
  filter: function(array, term) {
  var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
  return $.grep( array, function(value) {
  return matcher.test( value.label || value.value || value );
  });
  }
  });
 
  }( jQuery ));
 
  /*
  * jQuery Mobile Framework : temporary extension to port jQuery UI's datepicker for mobile
  * Copyright (c) jQuery Project
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  */
  (function($, undefined ) {
 
  //cache previous datepicker ui method
  var prevDp = $.fn.datepicker;
 
  //rewrite datepicker
  $.fn.datepicker = function( options ){
 
  var dp = this;
 
  //call cached datepicker plugin
  prevDp.call( this, options );
 
  //extend with some dom manipulation to update the markup for jQM
  //call immediately
  function updateDatepicker(){
  $( ".ui-datepicker-header", dp ).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all");
  $( ".ui-datepicker-prev, .ui-datepicker-next", dp ).attr("href", "#");
  $( ".ui-datepicker-prev", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-l", shadow: true, corners: true});
  $( ".ui-datepicker-next", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-r", shadow: true, corners: true});
  $( ".ui-datepicker-calendar th", dp ).addClass("ui-bar-c");
  $( ".ui-datepicker-calendar td", dp ).addClass("ui-body-c");
  $( ".ui-datepicker-calendar a", dp ).buttonMarkup({corners: false, shadow: false});
  $( ".ui-datepicker-calendar a.ui-state-active", dp ).addClass("ui-btn-active"); // selected date
  $( ".ui-datepicker-calendar a.ui-state-highlight", dp ).addClass("ui-btn-up-e"); // today"s date
  $( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){
  var el = $(this);
  // remove extra button markup - necessary for date value to be interpreted correctly
  el.html( el.find( ".ui-btn-text" ).text() );
  });
  };
 
  //update now
  updateDatepicker();
 
  // and on click
  $( dp ).click( updateDatepicker );
 
  //return jqm obj
  return this;
  };
 
  //bind to pagecreate to automatically enhance date inputs
  $( ".ui-page" ).live( "pagecreate", function(){
  $( "input[type='date'], input[data-type='date']" ).each(function(){
  $(this).after( $( "<div />" ).datepicker({ altField: "#" + $(this).attr( "id" ), showOtherMonths: true }) );
  });
  });
  })( jQuery );
  /*
  * jQuery UI Position @VERSION
  *
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Position
  */
  (function( $, undefined ) {
 
  $.ui = $.ui || {};
 
  var horizontalPositions = /left|center|right/,
  verticalPositions = /top|center|bottom/,
  center = "center",
  _position = $.fn.position,
  _offset = $.fn.offset;
 
  $.fn.position = function( options ) {
  if ( !options || !options.of ) {
  return _position.apply( this, arguments );
  }
 
  // make a copy, we don't want to modify arguments
  options = $.extend( {}, options );
 
  var target = $( options.of ),
  targetElem = target[0],
  collision = ( options.collision || "flip" ).split( " " ),
  offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
  targetWidth,
  targetHeight,
  basePosition;
 
  if ( targetElem.nodeType === 9 ) {
  targetWidth = target.width();
  targetHeight = target.height();
  basePosition = { top: 0, left: 0 };
  } else if ( $.isWindow( targetElem ) ) {
  targetWidth = target.width();
  targetHeight = target.height();
  basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
  } else if ( targetElem.preventDefault ) {
  // force left top to allow flipping
  options.at = "left top";
  targetWidth = targetHeight = 0;
  basePosition = { top: options.of.pageY, left: options.of.pageX };
  } else {
  targetWidth = target.outerWidth();
  targetHeight = target.outerHeight();
  basePosition = target.offset();
  }
 
  // force my and at to have valid horizontal and veritcal positions
  // if a value is missing or invalid, it will be converted to center
  $.each( [ "my", "at" ], function() {
  var pos = ( options[this] || "" ).split( " " );
  if ( pos.length === 1) {
  pos = horizontalPositions.test( pos[0] ) ?
  pos.concat( [center] ) :
  verticalPositions.test( pos[0] ) ?
  [ center ].concat( pos ) :
  [ center, center ];
  }
  pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
  pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
  options[ this ] = pos;
  });
 
  // normalize collision option
  if ( collision.length === 1 ) {
  collision[ 1 ] = collision[ 0 ];
  }
 
  // normalize offset option
  offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
  if ( offset.length === 1 ) {
  offset[ 1 ] = offset[ 0 ];
  }
  offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
 
  if ( options.at[0] === "right" ) {
  basePosition.left += targetWidth;
  } else if ( options.at[0] === center ) {
  basePosition.left += targetWidth / 2;
  }
 
  if ( options.at[1] === "bottom" ) {
  basePosition.top += targetHeight;
  } else if ( options.at[1] === center ) {
  basePosition.top += targetHeight / 2;
  }
 
  basePosition.left += offset[ 0 ];
  basePosition.top += offset[ 1 ];
 
  return this.each(function() {
  var elem = $( this ),
  elemWidth = elem.outerWidth(),
  elemHeight = elem.outerHeight(),
  marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
  marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
  collisionWidth = elemWidth + marginLeft +
  ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
  collisionHeight = elemHeight + marginTop +
  ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
  position = $.extend( {}, basePosition ),
  collisionPosition;
 
  if ( options.my[0] === "right" ) {
  position.left -= elemWidth;
  } else if ( options.my[0] === center ) {
  position.left -= elemWidth / 2;
  }
 
  if ( options.my[1] === "bottom" ) {
  position.top -= elemHeight;
  } else if ( options.my[1] === center ) {
  position.top -= elemHeight / 2;
  }
 
  // prevent fractions (see #5280)
  position.left = Math.round( position.left );
  position.top = Math.round( position.top );
 
  collisionPosition = {
  left: position.left - marginLeft,
  top: position.top - marginTop
  };
 
  $.each( [ "left", "top" ], function( i, dir ) {
  if ( $.ui.position[ collision[i] ] ) {
  $.ui.position[ collision[i] ][ dir ]( position, {
  targetWidth: targetWidth,
  targetHeight: targetHeight,
  elemWidth: elemWidth,
  elemHeight: elemHeight,
  collisionPosition: collisionPosition,
  collisionWidth: collisionWidth,
  collisionHeight: collisionHeight,
  offset: offset,
  my: options.my,
  at: options.at
  });
  }
  });
 
  if ( $.fn.bgiframe ) {
  elem.bgiframe();
  }
  elem.offset( $.extend( position, { using: options.using } ) );
  });
  };
 
  $.ui.position = {
  fit: {
  left: function( position, data ) {
  var win = $( window ),
  over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
  position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
  },
  top: function( position, data ) {
  var win = $( window ),
  over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
  position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
  }
  },
 
  flip: {
  left: function( position, data ) {
  if ( data.at[0] === center ) {
  return;
  }
  var win = $( window ),
  over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
  myOffset = data.my[ 0 ] === "left" ?
  -data.elemWidth :
  data.my[ 0 ] === "right" ?
  data.elemWidth :
  0,
  atOffset = data.at[ 0 ] === "left" ?
  data.targetWidth :
  -data.targetWidth,
  offset = -2 * data.offset[ 0 ];
  position.left += data.collisionPosition.left < 0 ?
  myOffset + atOffset + offset :
  over > 0 ?
  myOffset + atOffset + offset :
  0;
  },
  top: function( position, data ) {
  if ( data.at[1] === center ) {
  return;
  }
  var win = $( window ),
  over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
  myOffset = data.my[ 1 ] === "top" ?
  -data.elemHeight :
  data.my[ 1 ] === "bottom" ?
  data.elemHeight :
  0,
  atOffset = data.at[ 1 ] === "top" ?
  data.targetHeight :
  -data.targetHeight,
  offset = -2 * data.offset[ 1 ];
  position.top += data.collisionPosition.top < 0 ?
  myOffset + atOffset + offset :
  over > 0 ?
  myOffset + atOffset + offset :
  0;
  }
  }
  };
 
  // offset setter from jQuery 1.4
  if ( !$.offset.setOffset ) {
  $.offset.setOffset = function( elem, options ) {
  // set position first, in-case top/left are set even on static elem
  if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
  elem.style.position = "relative";
  }
  var curElem = $( elem ),
  curOffset = curElem.offset(),
  curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
  curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
  props = {
  top: (options.top - curOffset.top) + curTop,
  left: (options.left - curOffset.left) + curLeft
  };
 
  if ( 'using' in options ) {
  options.using.call( elem, props );
  } else {
  curElem.css( props );
  }
  };
 
  $.fn.offset = function( options ) {
  var elem = this[ 0 ];
  if ( !elem || !elem.ownerDocument ) { return null; }
  if ( options ) {
  return this.each(function() {
  $.offset.setOffset( this, options );
  });
  }
  return _offset.call( this );
  };
  }
 
  }( jQuery ));
 
  /*!
  * jQuery UI Widget @VERSION
  *
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Widget
  */
  (function( $, undefined ) {
 
  var slice = Array.prototype.slice;
 
  var _cleanData = $.cleanData;
  $.cleanData = function( elems ) {
  for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
  $( elem ).triggerHandler( "remove" );
  }
  _cleanData( elems );
  };
 
  $.widget = function( name, base, prototype ) {
  var namespace = name.split( "." )[ 0 ],
  fullName;
  name = name.split( "." )[ 1 ];
  fullName = namespace + "-" + name;
 
  if ( !prototype ) {
  prototype = base;
  base = $.Widget;
  }
 
  // create selector for plugin
  $.expr[ ":" ][ fullName ] = function( elem ) {
  return !!$.data( elem, name );
  };
 
  $[ namespace ] = $[ namespace ] || {};
  $[ namespace ][ name ] = $[ namespace ][ name ] || function( options, element ) {
  // allow instantiation without "new" keyword
  if ( !this._createWidget ) {
  return new $[ namespace ][ name ]( options, element );
  }
 
  // allow instantiation without initializing for simple inheritance
  // must use "new" keyword (the code above always passes args)
  if ( arguments.length ) {
  this._createWidget( options, element );
  }
  };
 
  var basePrototype = new base();
  // we need to make the options hash a property directly on the new instance
  // otherwise we'll modify the options hash on the prototype that we're
  // inheriting from
  basePrototype.options = $.extend( true, {}, basePrototype.options );
  $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
  namespace: namespace,
  widgetName: name,
  widgetEventPrefix: name,
  widgetBaseClass: fullName,
  base: base.prototype
  }, prototype );
 
  $.widget.bridge( name, $[ namespace ][ name ] );
  };
 
  $.widget.bridge = function( name, object ) {
  $.fn[ name ] = function( options ) {
  var isMethodCall = typeof options === "string",
  args = slice.call( arguments, 1 ),
  returnValue = this;
 
  // allow multiple hashes to be passed on init
  options = !isMethodCall && args.length ?
  $.extend.apply( null, [ true, options ].concat(args) ) :
  options;
 
  // prevent calls to internal methods
  if ( isMethodCall && options.charAt( 0 ) === "_" ) {
  return returnValue;
  }
 
  if ( isMethodCall ) {
  this.each(function() {
  var instance = $.data( this, name );
  if ( !instance ) {
  return $.error( "cannot call methods on " + name + " prior to initialization; " +
  "attempted to call method '" + options + "'" );
  }
  if ( !$.isFunction( instance[options] ) ) {
  return $.error( "no such method '" + options + "' for " + name + " widget instance" );
  }
  var methodValue = instance[ options ].apply( instance, args );
  if ( methodValue !== instance && methodValue !== undefined ) {
  returnValue = methodValue;
  return false;
  }
  });
  } else {
  this.each(function() {
  var instance = $.data( this, name );
  if ( instance ) {
  instance.option( options || {} )._init();
  } else {
  object( options, this );
  }
  });
  }
 
  return returnValue;
  };
  };
 
  $.Widget = function( options, element ) {
  // allow instantiation without "new" keyword
  if ( !this._createWidget ) {
  return new $[ namespace ][ name ]( options, element );
  }
 
  // allow instantiation without initializing for simple inheritance
  // must use "new" keyword (the code above always passes args)
  if ( arguments.length ) {
  this._createWidget( options, element );
  }
  };
 
  $.Widget.prototype = {
  widgetName: "widget",
  widgetEventPrefix: "",
  defaultElement: "<div>",
  options: {
  disabled: false
  },
  _createWidget: function( options, element ) {
  element = $( element || this.defaultElement || this )[ 0 ];
  this.element = $( element );
  this.options = $.extend( true, {},
  this.options,
  this._getCreateOptions(),
  options );
 
  this.bindings = $();
  this.hoverable = $();
  this.focusable = $();
 
  if ( element !== this ) {
  $.data( element, this.widgetName, this );
  this._bind({ remove: "destroy" });
  }
 
  this._create();
  this._trigger( "create" );
  this._init();
  },
  _getCreateOptions: function() {
  return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
  },
  _create: $.noop,
  _init: $.noop,
 
  _super: function( method ) {
  return this.base[ method ].apply( this, slice.call( arguments, 1 ) );
  },
  _superApply: function( method, args ) {
  return this.base[ method ].apply( this, args );
  },
 
  destroy: function() {
  this._destroy();
  // we can probably remove the unbind calls in 2.0
  // all event bindings should go through this._bind()
  this.element
  .unbind( "." + this.widgetName )
  .removeData( this.widgetName );
  this.widget()
  .unbind( "." + this.widgetName )
  .removeAttr( "aria-disabled" )
  .removeClass(
  this.widgetBaseClass + "-disabled " +
  "ui-state-disabled" );
 
  // clean up events and states
  this.bindings.unbind( "." + this.widgetName );
  this.hoverable.removeClass( "ui-state-hover" );
  this.focusable.removeClass( "ui-state-focus" );
  },
  _destroy: $.noop,
 
  widget: function() {
  return this.element;
  },
 
  option: function( key, value ) {
  var options = key;
 
  if ( arguments.length === 0 ) {
  // don't return a reference to the internal hash
  return $.extend( {}, this.options );
  }
 
  if (typeof key === "string" ) {
  if ( value === undefined ) {
  return this.options[ key ];
  }
  options = {};
  options[ key ] = value;
  }
 
  this._setOptions( options );
 
  return this;
  },
  _setOptions: function( options ) {
  var self = this;
  $.each( options, function( key, value ) {
  self._setOption( key, value );
  });
 
  return this;
  },
  _setOption: function( key, value ) {
  this.options[ key ] = value;
 
  if ( key === "disabled" ) {
  this.widget()
  .toggleClass( this.widgetBaseClass + "-disabled ui-state-disabled", !!value )
  .attr( "aria-disabled", value );
  this.hoverable.removeClass( "ui-state-hover" );
  this.focusable.removeClass( "ui-state-focus" );
  }
 
  return this;
  },
 
  enable: function() {
  return this._setOption( "disabled", false );
  },
  disable: function() {
  return this._setOption( "disabled", true );
  },
 
  _bind: function( element, handlers ) {
  // no element argument, shuffle and use this.element
  if ( !handlers ) {
  handlers = element;
  element = this.element;
  } else {
  this.bindings = this.bindings.add( element );
  }
  var instance = this;
  $.each( handlers, function( event, handler ) {
  element.bind( event + "." + instance.widgetName, function() {
  // allow widgets to customize the disabled handling
  // - disabled as an array instead of boolean
  // - disabled class as method for disabling individual parts
  if ( instance.options.disabled === true ||
  $( this ).hasClass( "ui-state-disabled" ) ) {
  return;
  }
  return ( typeof handler === "string" ? instance[ handler ] : handler )
  .apply( instance, arguments );
  });
  });
  },
 
  _hoverable: function( element ) {
  this.hoverable = this.hoverable.add( element );
  this._bind( element, {
  mouseenter: function( event ) {
  $( event.currentTarget ).addClass( "ui-state-hover" );
  },
  mouseleave: function( event ) {
  $( event.currentTarget ).removeClass( "ui-state-hover" );
  }
  });
  },
 
  _focusable: function( element ) {
  this.focusable = this.focusable.add( element );
  this._bind( element, {
  focusin: function( event ) {
  $( event.currentTarget ).addClass( "ui-state-focus" );
  },
  focusout: function( event ) {
  $( event.currentTarget ).removeClass( "ui-state-focus" );
  }
  });
  },
 
  _trigger: function( type, event, data ) {
  var callback = this.options[ type ],
  args;
 
  event = $.Event( event );
  event.type = ( type === this.widgetEventPrefix ?
  type :
  this.widgetEventPrefix + type ).toLowerCase();
  data = data || {};
 
  // copy original event properties over to the new event
  // this would happen if we could call $.event.fix instead of $.Event
  // but we don't have a way to force an event to be fixed multiple times
  if ( event.originalEvent ) {
  for ( var i = $.event.props.length, prop; i; ) {
  prop = $.event.props[ --i ];
  event[ prop ] = event.originalEvent[ prop ];
  }
  }
 
  this.element.trigger( event, data );
 
  args = $.isArray( data ) ?
  [ event ].concat( data ) :
  [ event, data ];
 
  return !( $.isFunction( callback ) &&
  callback.apply( this.element[0], args ) === false ||
  event.isDefaultPrevented() );
  }
  };
 
  })( jQuery );
 
<?php <?php
include('common.inc.php'); include('common.inc.php');
$url = $APIurl."/json/stop?stop_id=".$_REQUEST['stopid']; $url = $APIurl."/json/stop?stop_id=".$_REQUEST['stopid'];
$stop = json_decode(getPage($url)); $stop = json_decode(getPage($url));
   
include_header("Trips passing ".$stop[1]); include_header("Trips passing ".$stop[1]);
echo '<div data-role="content" class="ui-content" role="main"><p>'.staticmap(Array(0 => Array($stop[2],$stop[3]))).'</p>'; echo '<div data-role="content" class="ui-content" role="main"><p>'.staticmap(Array(0 => Array($stop[2],$stop[3]))).'</p>';
// change date/time/service_period // change date/time/service_period
echo ' <ul data-role="listview" data-inset="true">'; echo ' <ul data-role="listview" data-inset="true">';
$url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds()."&service_period=".service_period(); $url = $APIurl."/json/stoptrips?stop=".$_REQUEST['stopid']."&time=".midnight_seconds()."&service_period=".service_period();
$trips = json_decode(getPage($url)); $trips = json_decode(getPage($url));
debug(print_r($trips,true)); debug(print_r($trips,true));
foreach ($trips as $row) foreach ($trips as $row)
{ {
echo '<li>'; echo '<li>';
echo '<h3><a href="trip.php?stopid='.$_REQUEST['stopid'].'&tripid='.$row[1][0].'">'.$row[1][1].'</a></h3>'; echo '<h3><a href="trip.php?stopid='.$_REQUEST['stopid'].'&tripid='.$row[1][0].'">'.bracketsMeanNewLine($row[1][1]).'</a></h3>';
echo '<p class="ui-li-aside"><strong>'.midnight_seconds_to_time($row[0]).'</strong></p>'; echo '<p class="ui-li-aside"><strong>'.midnight_seconds_to_time($row[0]).'</strong></p>';
echo '</li>'; echo '</li>';
} }
if (sizeof($trips) == 0) echo "<li> <center>No trips in the near future.</center> </li>"; if (sizeof($trips) == 0) echo "<li> <center>No trips in the near future.</center> </li>";
echo '</ul></div>'; echo '</ul></div>';
include_footer(); include_footer();
?> ?>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
include_header("Stops"); include_header("Stops");
echo' echo'
<div data-role="navbar"> <div data-role="navbar">
<ul> <ul>
<li><a href="stopList.php">Timing Points</a></li> <li><a href="stopList.php">Timing Points</a></li>
<li><a href="stopList.php?allstops=yes">All Stops</a></li> <li><a href="stopList.php?allstops=yes">All Stops</a></li>
</ul> </ul>
</div> </div>
'; ';
echo '<div class="noscriptnav"> Go to letter: '; echo '<div class="noscriptnav"> Go to letter: ';
foreach(range('A','Z') as $letter) foreach(range('A','Z') as $letter)
{ {
echo "<a href=\"#$letter\">$letter</a>&nbsp;"; echo "<a href=\"#$letter\">$letter</a>&nbsp;";
} }
echo "</div> echo "</div>
<script> <script>
$('.noscriptnav').hide(); $('.noscriptnav').hide();
</script>"; </script>";
echo ' <ul data-role="listview" data-filter="true" data-inset="true" >'; echo ' <ul data-role="listview" data-filter="true" data-inset="true" >';
$url = $APIurl."/json/timingpoints"; $url = $APIurl."/json/timingpoints";
if ($_REQUEST['allstops']) $url = $APIurl."/json/stops"; if ($_REQUEST['allstops']) $url = $APIurl."/json/stops";
if ($_REQUEST['lat'] && $_REQUEST['lon']) $url = $APIurl."/json/neareststops?lat={$_REQUEST['lat']}&lon={$_REQUEST['lon']}&limit=15"; if ($_REQUEST['lat'] && $_REQUEST['lon']) $url = $APIurl."/json/neareststops?lat={$_REQUEST['lat']}&lon={$_REQUEST['lon']}&limit=15";
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
debug(print_r($contents,true)); debug(print_r($contents,true));
foreach ($contents as $key => $row) { foreach ($contents as $key => $row) {
$stopName[$key] = $row[1]; $stopName[$key] = $row[1];
} }
   
// Sort the stops by name // Sort the stops by name
array_multisort($stopName, SORT_ASC, $contents); array_multisort($stopName, SORT_ASC, $contents);
   
$firstletter = ""; $firstletter = "";
foreach ($contents as $row) foreach ($contents as $row)
{ {
if (substr($row[1],0,1) != $firstletter){ if (substr($row[1],0,1) != $firstletter){
echo "<a name=$firstletter></a>"; echo "<a name=$firstletter></a>";
$firstletter = substr($row[1],0,1); $firstletter = substr($row[1],0,1);
} }
echo '<li><a href="stop.php?stopid='.$row[0].'">'.$row[1].'</a></li>'; echo '<li><a href="stop.php?stopid='.$row[0].'">'.bracketsMeanNewLine($row[1]).'</a></li>';
} }
echo '</ul>'; echo '</ul>';
   
include_footer(); include_footer();
?> ?>
   
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
$tripid = $_REQUEST['tripid']; $tripid = $_REQUEST['tripid'];
if ($_REQUEST['routeid']) { if ($_REQUEST['routeid']) {
$url = $APIurl."/json/routetrips?route_id=".$_REQUEST['routeid']; $url = $APIurl."/json/routetrips?route_id=".$_REQUEST['routeid'];
$trips = json_decode(getPage($url)); $trips = json_decode(getPage($url));
debug(print_r($trips,true)); debug(print_r($trips,true));
foreach ($trips as $trip) foreach ($trips as $trip)
{ {
if ($trip[0] < midnight_seconds()) { if ($trip[0] < midnight_seconds()) {
$tripid = $trip[1]; $tripid = $trip[1];
break; break;
} }
} }
if (!($tripid > 0)) $tripid = $trips[0][1]; if (!($tripid > 0)) $tripid = $trips[0][1];
} }
$url = $APIurl."/json/triprows?trip=".$tripid; $url = $APIurl."/json/triprows?trip=".$tripid;
$trips = array_flatten(json_decode(getPage($url))); $trips = array_flatten(json_decode(getPage($url)));
debug(print_r($trips,true)); debug(print_r($trips,true));
include_header("Stops on ". $trips[1]->route_short_name . ' '. $trips[1]->route_long_name); include_header("Stops on ". $trips[1]->route_short_name . ' '. $trips[1]->route_long_name);
echo ' <ul data-role="listview" data-inset="true">'; echo ' <ul data-role="listview" data-inset="true">';
   
   
$url = $APIurl."/json/tripstoptimes?trip=".$tripid; $url = $APIurl."/json/tripstoptimes?trip=".$tripid;
   
$json = json_decode(getPage($url)); $json = json_decode(getPage($url));
debug(print_r($json,true)); debug(print_r($json,true));
$stops = $json[0]; $stops = $json[0];
$times = $json[1]; $times = $json[1];
foreach ($stops as $key => $row) foreach ($stops as $key => $row)
{ {
echo '<li>'; echo '<li>';
echo '<h3><a href="stop.php?stopid='.$row[0].'">'.$row[1].'</a></h3>'; echo '<h3><a href="stop.php?stopid='.$row[0].'">'.bracketsMeanNewLine($row[1]).'</a></h3>';
echo '<p class="ui-li-aside">'.midnight_seconds_to_time($times[$key]).'</p>'; echo '<p class="ui-li-aside">'.midnight_seconds_to_time($times[$key]).'</p>';
echo '</li>'; echo '</li>';
} }
echo '</ul>'; echo '</ul>';
include_footer(); include_footer();
?> ?>
   
<?php <?php
include('common.inc.php'); include('common.inc.php');
include_header("Trip Planner", true, true); include_header("Trip Planner", true, true);
function tripPlanForm($errorMessage = "") function tripPlanForm($errorMessage = "")
{ {
$from = (isset($_REQUEST['from']) ? $_REQUEST['from'] : "Brigalow"); $from = (isset($_REQUEST['from']) ? $_REQUEST['from'] : "Brigalow");
$to = (isset($_REQUEST['to']) ? $_REQUEST['to'] : "Barry"); $to = (isset($_REQUEST['to']) ? $_REQUEST['to'] : "Barry");
$date = (isset($_REQUEST['date']) ? $_REQUEST['date'] : date("m/d/Y")); $date = (isset($_REQUEST['date']) ? $_REQUEST['date'] : date("m/d/Y"));
$time = (isset($_REQUEST['time']) ? $_REQUEST['time'] : date("h:ia")); $time = (isset($_REQUEST['time']) ? $_REQUEST['time'] : date("h:ia"));
echo "<font color=red>$errorMessage</font>"; echo "<font color=red>$errorMessage</font>";
echo '<form action="tripPlanner.php" method="post"> echo '<form action="tripPlanner.php" method="post">
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="from">I would like to go from</label> <label for="from">I would like to go from</label>
<input type="text" name="from" id="from" value="' . $from . '" /> <input type="text" name="from" id="from" value="' . $from . '" />
<a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a> <a href="#" style="display:none" name="fromHere" id="fromHere"/>Here?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="to"> to </label> <label for="to"> to </label>
<input type="text" name="to" id="to" value="' . $to . '" /> <input type="text" name="to" id="to" value="' . $to . '" />
<a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a> <a href="#" style="display:none" name="toHere" id="toHere"/>Here?</a>
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="date"> on </label> <label for="date"> on </label>
<input type="date" name="date" id="date" value="' . $date . '" /> <input type="date" name="date" id="date" value="' . $date . '" />
</div> </div>
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<label for="time"> at </label> <label for="time"> at </label>
<input type="time" name="time" id="time" value="' . $time . '" /> <input type="time" name="time" id="time" value="' . $time . '" />
</div> </div>
<input type="submit" value="Go!"></form>'; <input type="submit" value="Go!"></form>';
echo "<script> echo "<script>
$('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;}); $('#toHere').click(function(event) { $('#to').val(getCookie('geolocate')); return false;});
$('#toHere').show(); $('#toHere').show();
$('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;}); $('#fromHere').click(function(event) { $('#from').val(getCookie('geolocate')); return false;});
$('#fromHere').show(); $('#fromHere').show();
   
</script>"; </script>";
} }
function processItinerary($itineraryNumber, $itinerary) function processItinerary($itineraryNumber, $itinerary)
{ {
echo '<div data-role="collapsible" ' . ($itineraryNumber > 0 ? 'data-collapsed="true"' : "") . '> <h3> Option #' . ($itineraryNumber + 1) . ": " . floor($itinerary->duration / 60000) . " minutes ({$itinerary->startTime} to {$itinerary->endTime})</h3><p>"; echo '<div data-role="collapsible" ' . ($itineraryNumber > 0 ? 'data-collapsed="true"' : "") . '> <h3> Option #' . ($itineraryNumber + 1) . ": " . floor($itinerary->duration / 60000) . " minutes ({$itinerary->startTime} to {$itinerary->endTime})</h3><p>";
echo "Walking time: " . floor($itinerary->walkTime / 60000) . " minutes (" . floor($itinerary->walkDistance) . " meters)<br>\n"; echo "Walking time: " . floor($itinerary->walkTime / 60000) . " minutes (" . floor($itinerary->walkDistance) . " meters)<br>\n";
echo "Transit time: " . floor($itinerary->transitTime / 60000) . " minutes<br>\n"; echo "Transit time: " . floor($itinerary->transitTime / 60000) . " minutes<br>\n";
echo "Waiting time: " . floor($itinerary->waitingTime / 60000) . " minutes<br>\n"; echo "Waiting time: " . floor($itinerary->waitingTime / 60000) . " minutes<br>\n";
   
if (is_array($itinerary->legs->leg)) { if (is_array($itinerary->legs->leg)) {
$legMarkers = array(); $legMarkers = array();
foreach ($itinerary->legs->leg as $legNumber => $leg) { foreach ($itinerary->legs->leg as $legNumber => $leg) {
$legMarkers[] = array($leg->from->lat, $leg->from->lon); $legMarkers[] = array($leg->from->lat, $leg->from->lon);
} }
echo '' . staticmap($legMarkers) . "<br>\n"; echo '' . staticmap($legMarkers) . "<br>\n";
echo '<ul>'; echo '<ul>';
foreach ($itinerary->legs->leg as $legNumber => $leg) { foreach ($itinerary->legs->leg as $legNumber => $leg) {
echo '<li>'; echo '<li>';
processLeg($legNumber, $leg); processLeg($legNumber, $leg);
echo "</li>"; echo "</li>";
} }
echo "</ul>"; echo "</ul>";
} else { } else {
echo '' . staticmap(array(array($itinerary->legs->leg->from->lat, $itinerary->legs->leg->from->lon))) . "<br>\n"; echo '' . staticmap(array(array($itinerary->legs->leg->from->lat, $itinerary->legs->leg->from->lon))) . "<br>\n";
processLeg(0, $itinerary->legs->leg); processLeg(0, $itinerary->legs->leg);
} }
echo "</p></div>"; echo "</p></div>";
} }
function processLeg($legNumber, $leg) { function processLeg($legNumber, $leg) {
$legArray = object2array($leg); $legArray = object2array($leg);
echo '<h3>Leg #' . ($legNumber + 1) . " ( {$legArray['@mode']} from: {$leg->from->name} to {$leg->to->name}, " . floor($leg->duration / 60000) . " minutes) </h3>\n"; echo '<h3>Leg #' . ($legNumber + 1) . " ( {$legArray['@mode']} from: {$leg->from->name} to {$leg->to->name}, " . floor($leg->duration / 60000) . " minutes) </h3>\n";
if ($legArray["@mode"] === "BUS") { if ($legArray["@mode"] === "BUS") {
echo "Take bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']) . "<br>"; echo "Take bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']) . "<br>";
} else { } else {
$walkStepMarkers = array(); $walkStepMarkers = array();
foreach ($leg->steps->walkSteps as $stepNumber => $step) { foreach ($leg->steps->walkSteps as $stepNumber => $step) {
$walkStepMarkers[] = array($step->lat, $step->lon); $walkStepMarkers[] = array($step->lat, $step->lon);
} }
echo "" . staticmap($walkStepMarkers, "icong") . "<br>\n"; echo "" . staticmap($walkStepMarkers, "icong") . "<br>\n";
foreach ($leg->steps->walkSteps as $stepNumber => $step) { foreach ($leg->steps->walkSteps as $stepNumber => $step) {
echo "Walking step " . ($stepNumber + 1) . " $step->absoluteDirection / $step->relativeDirection on $step->streetName for " . floor($step->distance) . " meters<br>\n"; echo "Walking step " . ($stepNumber + 1) . " $step->absoluteDirection / $step->relativeDirection on $step->streetName for " . floor($step->distance) . " meters<br>\n";
} }
} }
} }
if ($_REQUEST['time']) { if ($_REQUEST['time']) {
$toPlace = (startsWith($_REQUEST['to'], "-") ? $_REQUEST['to'] : geocode(urlencode($_REQUEST['to']), false)); $toPlace = (startsWith($_REQUEST['to'], "-") ? $_REQUEST['to'] : geocode(urlencode($_REQUEST['to']), false));
$fromPlace = (startsWith($_REQUEST['from'], "-") ? $_REQUEST['from'] : geocode(urlencode($_REQUEST['from']), false)); $fromPlace = (startsWith($_REQUEST['from'], "-") ? $_REQUEST['from'] : geocode(urlencode($_REQUEST['from']), false));
if ($toPlace == "" || $fromPlace == "") { if ($toPlace == "" || $fromPlace == "") {
$errorMessage = ""; $errorMessage = "";
if ($toPlace === "") if ($toPlace === "")
$errorMessage .= urlencode($_REQUEST['to']) . " not found.<br>\n"; $errorMessage .= urlencode($_REQUEST['to']) . " not found.<br>\n";
if ($fromPlace === "") if ($fromPlace === "")
$errorMessage .= urlencode($_REQUEST['from']) . " not found.<br>\n"; $errorMessage .= urlencode($_REQUEST['from']) . " not found.<br>\n";
tripPlanForm($errorMessage); tripPlanForm($errorMessage);
} else { } else {
$url = "http://localhost:8080/opentripplanner-api-webapp/ws/plan?_dc=1290254798856&arriveBy=false&date=" . urlencode($_REQUEST['date']) . "&time=" . urlencode($_REQUEST['time']) . "&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=840&wheelchair=false&toPlace=$toPlace&fromPlace=$fromPlace&intermediatePlaces="; $url = "http://10.1.0.243:5080/opentripplanner-api-webapp/ws/plan?_dc=1290254798856&arriveBy=false&date=" . urlencode($_REQUEST['date']) . "&time=" . urlencode($_REQUEST['time']) . "&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=840&wheelchair=false&toPlace=$toPlace&fromPlace=$fromPlace&intermediatePlaces=";
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json")); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json"));
  curl_setopt($ch,CURLOPT_TIMEOUT,5);
$page = curl_exec($ch); $page = curl_exec($ch);
curl_close($ch);  
  if(curl_errno($ch)) { tripPlanForm("Trip planner temporarily unavailable: ".curl_errno($ch)." ".curl_error($ch));}
  else {
$tripplan = json_decode($page); $tripplan = json_decode($page);
debug(print_r($triplan,true)); debug(print_r($triplan,true));
echo "<h1> From: {$tripplan->plan->from->name} To: {$tripplan->plan->to->name} </h1>"; echo "<h1> From: {$tripplan->plan->from->name} To: {$tripplan->plan->to->name} </h1>";
echo "<h1> At: {$tripplan->plan->date} </h1>"; echo "<h1> At: {$tripplan->plan->date} </h1>";
if (is_array($tripplan->plan->itineraries->itinerary)) { if (is_array($tripplan->plan->itineraries->itinerary)) {
echo '<div data-role="collapsible-set">'; echo '<div data-role="collapsible-set">';
foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) { foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) {
processItinerary($itineraryNumber, $itinerary); processItinerary($itineraryNumber, $itinerary);
} }
echo "</div>"; echo "</div>";
} else { } else {
processItinerary(0, $tripplan->plan->itineraries->itinerary); processItinerary(0, $tripplan->plan->itineraries->itinerary);
} }
  }
  curl_close($ch);
} }
} else { } else {
tripPlanForm(); tripPlanForm();
} }
include_footer(); include_footer();
?> ?>
   
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<script src="openlayers/OpenLayers.js"></script> <script src="openlayers/OpenLayers.js"></script>
<SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT> <SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT>
<script type="text/javascript"> <script type="text/javascript">
   
function init() function init()
{ {
var extent = new OpenLayers.Bounds(148.98, -35.48, 149.25, -35.15); var extent = new OpenLayers.Bounds(148.98, -35.48, 149.25, -35.15);
// set up the map options // set up the map options
var options = var options =
{ {
maxExtent: extent, maxExtent: extent,
numZoomLevels: 20, numZoomLevels: 20,
}; };
// create the ol map object // create the ol map object
var map = new OpenLayers.Map('map', options); var map = new OpenLayers.Map('map', options);
var osmtiles = new OpenLayers.Layer.OSM("local", "http://localhost/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 // use http://open.atlas.free.fr/GMapsTransparenciesImgOver.php and http://code.google.com/p/googletilecutter/ to make tiles
var graphic = new OpenLayers.Layer.Image( var graphic = new OpenLayers.Layer.Image(
'Weekday Bus Map', 'Weekday Bus Map',
'weekday_bus_map.png', 'weekday_bus_map.png',
new OpenLayers.Bounds(149.0, -35.47, 149.16, -35.16), new OpenLayers.Bounds(149.0, -35.47, 149.16, -35.16),
new OpenLayers.Size(1191, 2268), new OpenLayers.Size(1191, 2268),
{baseLayer: false} {baseLayer: false}
); );
   
var nearmap = new OpenLayers.Layer.OSM.NearMap("NearMap"); var nearmap = new OpenLayers.Layer.OSM.NearMap("NearMap");
   
var routes = new OpenLayers.Layer.GML("Routes", "displayroutes.kml.php", { var routes = new OpenLayers.Layer.GML("Routes", "displayroutes.kml.php", {
format: OpenLayers.Format.KML, format: OpenLayers.Format.KML,
formatOptions: { formatOptions: {
extractStyles: true, extractStyles: true,
extractAttributes: true, extractAttributes: true,
maxDepth: 2 maxDepth: 2
} }
}); });
var stopicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",new OpenLayers.Size(32,32)); var stopicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png",new OpenLayers.Size(32,32));
var stops = new OpenLayers.Layer.GeoRSS("Stops", "displaystops.georss.php", { icon: stopicon }); var stops = new OpenLayers.Layer.GeoRSS("Stops", "displaystops.georss.php", { icon: stopicon });
var timeicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png",new OpenLayers.Size(32,32)); var timeicon = new OpenLayers.Icon("http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png",new OpenLayers.Size(32,32));
var timepoints = new OpenLayers.Layer.GeoRSS("Timing Points", "displaytimepoints.georss.php", { icon: timeicon }); var timepoints = new OpenLayers.Layer.GeoRSS("Timing Points", "displaytimepoints.georss.php", { icon: timeicon });
   
map.addLayers([osmtiles,stops,routes,timepoints,nearmap]); map.addLayers([osmtiles,stops,routes,timepoints,nearmap]);
   
var lonLat = new OpenLayers.LonLat(149.11, -35.28).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); var lonLat = new OpenLayers.LonLat(149.11, -35.28).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(lonLat, 13); map.setCenter(lonLat, 13);
map.addControl( new OpenLayers.Control.LayerSwitcher({'ascending':false})); map.addControl( new OpenLayers.Control.LayerSwitcher({'ascending':false}));
map.addControl(new OpenLayers.Control.MousePosition( map.addControl(new OpenLayers.Control.MousePosition(
{ {
displayProjection: new OpenLayers.Projection("EPSG:4326"), displayProjection: new OpenLayers.Projection("EPSG:4326"),
suffix: "__________________________________" suffix: "__________________________________"
})); }));
map.addControl(new OpenLayers.Control.MousePosition( map.addControl(new OpenLayers.Control.MousePosition(
{ {
displayProjection: new OpenLayers.Projection("EPSG:900913") displayProjection: new OpenLayers.Projection("EPSG:900913")
})); }));
   
} }
</script> </script>
   
</head> </head>
<body onload="init()"> <body onload="init()">
<div id="map" width="100%" height="100%" class="smallmap"></div> <div id="map" width="100%" height="100%" class="smallmap"></div>
</body> </body>
</html> </html>
   
   
<?php <?php
header('Content-Type: application/xml'); header('Content-Type: application/xml');
echo '<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">'; echo '<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">';
echo '<title> Points</title>'; echo '<title> Points</title>';
$conn = pg_connect("dbname=bus user=postgres password=snmc"); $conn = pg_connect("dbname=bus user=postgres password=snmc");
if (!$conn) { if (!$conn) {
echo "An error occured.\n"; echo "An error occured.\n";
exit; exit;
} }
$result_timepoints = pg_query($conn, "Select * FROM timing_point where lat is not null and lng is not null "); $result_timepoints = pg_query($conn, "Select * FROM timing_point where lat is not null and lng is not null ");
if (!$result_timepoints) { if (!$result_timepoints) {
echo "An timepoints retirieve error occured.\n"; echo "An timepoints retirieve error occured.\n";
exit; exit;
} }
while ($timepoint = pg_fetch_assoc($result_timepoints)) { while ($timepoint = pg_fetch_assoc($result_timepoints)) {
echo "<entry>"; echo "<entry>";
echo "<summary>".htmlspecialchars ($timepoint['name'])."</summary>"; echo "<summary>".htmlspecialchars ($timepoint['name'])."</summary>";
echo "<title>".htmlspecialchars($timepoint['name'])."</title>"; echo "<title>".htmlspecialchars($timepoint['name'])."</title>";
echo "<georss:point> ".($timepoint['lat']/10000000)." ".($timepoint['lng']/10000000)."</georss:point>"; echo "<georss:point> ".($timepoint['lat']/10000001)." ".($timepoint['lng']/10000000)."</georss:point>";
echo "</entry>\n"; echo "</entry>\n";
} }
echo "\n</feed>\n"; echo "\n</feed>\n";
?> ?>
   
file:b/icong.png (new)
 Binary files /dev/null and b/icong.png differ
require 'rubygems' require 'rubygems'
require 'nokogiri' require 'nokogiri'
require 'open-uri' require 'open-uri'
require 'pp' require 'pp'
require 'yaml' require 'yaml'
class Array class Array
def to_yaml_style def to_yaml_style
:inline :inline
end end
end end
   
   
def makeTimetable(table, period, short_name) def makeTimetable(table, period, short_name)
timetable = {"between_stops" => [], "short_name" => short_name} timetable = {"between_stops" => [], "short_name" => short_name}
time_points = table.xpath('tr[1]//th').map do |tp| time_points = table.xpath('tr[1]//th').map do |tp|
if tp.content != "\302\240" && tp.content != "" && tp.content != "<br/>" if tp.content != "\302\240" && tp.content != "" && tp.content != "<br/>"
timing_point = tp.content.squeeze(" ").gsub("Shops"," ").gsub("Bus Station"," Bus Station ").gsub("Interchange"," Bus Station ").gsub(" Platform"," (Platform") timing_point = tp.content.squeeze(" ").gsub("Shops"," ").gsub("Bus Station"," Bus Station ").gsub("Interchange"," Bus Station ").gsub(" Platform"," (Platform")
timing_point = timing_point.gsub("Machonochie","Maconochie").gsub("Hume"," ").gsub("Market Place","Marketplace").gsub("Terminus Fyshwick","Terminus") timing_point = timing_point.gsub("Machonochie","Maconochie").gsub("Hume"," ").gsub("Market Place","Marketplace").gsub("Terminus Fyshwick","Terminus")
timing_point = timing_point.gsub(" - "," - ").gsub("\n"," ").gsub("\r"," ").gsub("\t"," ").gsub("\\"," / ").gsub("/"," / ").gsub(","," ").gsub("\302\240","").squeeze(" ").strip timing_point = timing_point.gsub(" - "," - ").gsub("\n"," ").gsub("\r"," ").gsub("\t"," ").gsub("\\"," / ").gsub("/"," / ").gsub(","," ").gsub("\302\240","").squeeze(" ").strip
  if (short_name == "923" or short_name == "924" or short_name == "938") and timing_point == "Pearce"
  timing_point = "Canberra Hospital"
  end
if (tp.content.match('Platform')) if (tp.content.match('Platform'))
timing_point.concat(")") timing_point.concat(")")
end; end
if tp.to_s.match(/[0-9][0-9][0-9]/) or tp.to_s.include? "Wheelchair" if tp.to_s.match(/[0-9][0-9][0-9]/) or tp.to_s.include? "Wheelchair"
timing_point = nil timing_point = nil
end end
timing_point timing_point
end end
end end
time_points.delete(nil) time_points.delete(nil)
timetable["time_points"] = time_points.to_a timetable["time_points"] = time_points.to_a
timetable["long_name"] = "To " + time_points.last timetable["long_name"] = "To " + time_points.last
periodtimes = [] periodtimes = []
table.css('tr').each do |row| table.css('tr').each do |row|
times = row.css('td').map do |cell| times = row.css('td').map do |cell|
time = cell.content.squeeze(" ").strip time = cell.content.squeeze(" ").strip
time = time.gsub(/ *A\S?M/,"a").gsub(/ ?P\S?M/,"p").gsub(/ *a\S?m/,"a").gsub(/ ?p\S?m/,"p") time = time.gsub(/ *A\S?M/,"a").gsub(/ ?P\S?M/,"p").gsub(/ *a\S?m/,"a").gsub(/ ?p\S?m/,"p")
time = time.gsub("12:08 AM","1208x").gsub(":","").gsub("1.","1").gsub("2.","2").gsub("3.","3").gsub("4.","4") time = time.gsub("12:08 AM","1208x").gsub(":","").gsub("1.","1").gsub("2.","2").gsub("3.","3").gsub("4.","4")
time = time.gsub("5.","5").gsub("6.","6").gsub("7.","7").gsub("8.","8").gsub("9.","9").gsub("10.","10") time = time.gsub("5.","5").gsub("6.","6").gsub("7.","7").gsub("8.","8").gsub("9.","9").gsub("10.","10")
time = time.gsub("11.","11").gsub("12.","12").gsub(/\.+/,"-").gsub("\302\240","") time = time.gsub("11.","11").gsub("12.","12").gsub(/\.+/,"-").gsub("\302\240","")
if time == "" or time.include? "chool" or time.include? "On Race Days" or time.include? "Bus" if time == "" or time.include? "chool" or time.include? "On Race Days" or time.include? "Bus"
time = nil # This hacky way is faster than using position()>1 xpath on <TD>s! time = nil # This hacky way is faster than using position()>1 xpath on <TD>s!
end end
time time
end end
times.delete(nil) times.delete(nil)
if not times.empty? if not times.empty?
if not (route = times.shift) if not (route = times.shift)
raise("TODO: account for shifting route numbers eg. intertown/redex 62/162") raise("TODO: account for shifting route numbers eg. intertown/redex 62/162")
end end
periodtimes << times.to_a periodtimes << times.to_a
end end
end end
if periodtimes.size < 1 if periodtimes.size < 1
raise "No times for route " + short_name + " in period " + period raise "No times for route " + short_name + " in period " + period
end end
timetable[period] = periodtimes.to_a timetable[period] = periodtimes.to_a
# pp timetable # pp timetable
filename = timetable["short_name"] + "-" + timetable["long_name"]+ "." + period + ".yml" filename = timetable["short_name"] + "-" + timetable["long_name"]+ "." + period + ".yml"
filename = filename.downcase.gsub(" ","-").gsub("/","-").gsub("(","").gsub(")","") filename = filename.downcase.gsub(" ","-").gsub("/","-").gsub("(","").gsub(")","")
puts "Saving " + filename puts "Saving " + filename
File.open("#{File.dirname(__FILE__)}/output/"+filename, "w") do |f| File.open("#{File.dirname(__FILE__)}/output/"+filename, "w") do |f|
f.write timetable.to_yaml f.write timetable.to_yaml
end end
timetable timetable
end end
   
Dir.glob("source-html/*oute*.htm*") { |file| Dir.glob("source-html/*oute*.htm*") { |file|
puts "Opened " + file puts "Opened " + file
doc = Nokogiri::HTML(open(file)) doc = Nokogiri::HTML(open(file))
# Search for nodes by css # Search for nodes by css
timetables = [] timetables = []
short_name = ""; short_name = "";
doc.xpath('//title').each do |title| doc.xpath('//title').each do |title|
short_name = title.content.gsub("Route_","").gsub("Route ","").gsub("route ","").gsub(", ","/").gsub("ACTION Buses Timetable for ","").squeeze(" ").strip short_name = title.content.gsub("Route_","").gsub("Route ","").gsub("route ","").gsub(", ","/").gsub("ACTION Buses Timetable for ","").squeeze(" ").strip
end end
if short_name == "" if short_name == ""
raise "Route number(s) not found in <title> tag" raise "Route number(s) not found in <title> tag"
end end
   
doc.xpath('//table[preceding::text()="Weekdays"]').each do |table| doc.xpath('//table[preceding::text()="Weekdays"]').each do |table|
timetables << makeTimetable(table, "stop_times", short_name) timetables << makeTimetable(table, "stop_times", short_name)
end end
doc.xpath('//table[preceding::text()="This timetable is effective from Monday 15th November 2010."]').each do |table| doc.xpath('//table[preceding::text()="This timetable is effective from Monday 15th November 2010."]').each do |table|
if short_name[0].chr != "9" or short_name.size == 1 if short_name[0].chr != "9" or short_name.size == 1
timetables << makeTimetable(table, "stop_times", short_name) timetables << makeTimetable(table, "stop_times", short_name)
end end
end end
#all tables are weekdays on some really malformatted timetables #all tables are weekdays on some really malformatted timetables
if short_name == "170" if short_name == "170"
doc.xpath('//table').each do |table| doc.xpath('//table').each do |table|
timetables << makeTimetable(table, "stop_times", short_name) timetables << makeTimetable(table, "stop_times", short_name)
end end
end end
#weekends #weekends
doc.xpath('//table[preceding::text()="Saturdays" and following::a]').each do |table| doc.xpath('//table[preceding::text()="Saturdays" and following::a]').each do |table|
timetables << makeTimetable(table, "stop_times_saturday", short_name) timetables << makeTimetable(table, "stop_times_saturday", short_name)
end end
doc.xpath('//table[preceding::text()="Sundays"]').each do |table| doc.xpath('//table[preceding::text()="Sundays"]').each do |table|
timetables << makeTimetable(table, "stop_times_sunday", short_name) timetables << makeTimetable(table, "stop_times_sunday", short_name)
end end
#930/934 special cases #930/934 special cases
doc.xpath('//table[preceding::text()="Saturday" and following::h2]').each do |table| doc.xpath('//table[preceding::text()="Saturday" and following::h2]').each do |table|
timetables << makeTimetable(table, "stop_times_saturday", short_name) timetables << makeTimetable(table, "stop_times_saturday", short_name)
end end
doc.xpath('//table[preceding::text()="Sunday"]').each do |table| doc.xpath('//table[preceding::text()="Sunday"]').each do |table|
timetables << makeTimetable(table, "stop_times_sunday", short_name) timetables << makeTimetable(table, "stop_times_sunday", short_name)
end end
#route 81 = Weekdays - School Holidays Only #route 81 = Weekdays - School Holidays Only
doc.xpath('//table[preceding::text()="Weekdays - School Holidays Only "]').each do |table| doc.xpath('//table[preceding::text()="Weekdays - School Holidays Only "]').each do |table|
timetable = makeTimetable(table, "stop_times", short_name) timetable = makeTimetable(table, "stop_times", short_name)
#TODO set active date range to only be holidays #TODO set active date range to only be holidays
timetables << timetable; timetables << timetable;
end end
   
if timetables.size > 2 if timetables.size > 2
puts "WARNING: " + file + " more than 2 timetables (weekend split?):" + timetables.size.to_s puts "WARNING: " + file + " more than 2 timetables (weekend split?):" + timetables.size.to_s
end end
if timetables.size < 2 if timetables.size < 2
puts "WARNING: " + file + " less than 2 timetables (weekday loop service?):" + timetables.size.to_s puts "WARNING: " + file + " less than 2 timetables (weekday loop service?):" + timetables.size.to_s
elsif not (timetables[0]["time_points"] - timetables[1]["time_points"].reverse).empty? elsif not (timetables[0]["time_points"] - timetables[1]["time_points"].reverse).empty?
puts "WARNING: first pair of timetable timing points are not complementary for "+ file puts "WARNING: first pair of timetable timing points are not complementary for "+ file
pp(timetables[0]["time_points"] - timetables[1]["time_points"].reverse) pp(timetables[0]["time_points"] - timetables[1]["time_points"].reverse)
end end
if timetables.size < 1 if timetables.size < 1
raise "No timetables extracted from " + file raise "No timetables extracted from " + file
end end
} }
   
require 'rubygems' require 'rubygems'
require 'pp' require 'pp'
require 'yaml' require 'yaml'
class Array class Array
def to_yaml_style def to_yaml_style
:inline :inline
end end
end end
Dir.chdir("output") Dir.chdir("output")
   
def getTimePoints() def getTimePoints()
$time_points = [] $time_points = []
$time_points_sources = Hash.new([]) $time_points_sources = Hash.new([])
Dir.glob("*.yml") { |file| Dir.glob("*.yml") { |file|
timetable = YAML::load_file(file) timetable = YAML::load_file(file)
$time_points = $time_points | timetable["time_points"] $time_points = $time_points | timetable["time_points"]
timetable["time_points"].each do |timepoint| timetable["time_points"].each do |timepoint|
$time_points_sources[timepoint] = $time_points_sources[timepoint] | [ file ] $time_points_sources[timepoint] = $time_points_sources[timepoint] | [ file ]
end end
} }
end end
def correctTimePoints() def correctTimePoints()
time_point_corrections = {"North Lynehamham" => "North Lyneham", time_point_corrections = {"North Lynehamham" => "North Lyneham",
"Woden Bus Station Platform 10)" => "Woden Bus Station (Platform 10)", "Woden Bus Station Platform 10)" => "Woden Bus Station (Platform 10)",
"Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes", "Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes",
"Flemmington Road / Sandford St"=>"Flemington Road / Sandford St", "Flemmington Road / Sandford St"=>"Flemington Road / Sandford St",
"City Interchange"=>"City Bus Station", "City Interchange"=>"City Bus Station",
"City Interchange (Platform 9)"=>"City Bus Station (Platform 9)", "City Interchange (Platform 9)"=>"City Bus Station (Platform 9)",
"City Bus Station Platfrom 9"=>"City Bus Station (Platform 9)", "City Bus Station Platfrom 9"=>"City Bus Station (Platform 9)",
"Belconnen Community Bus StationPlatform 2)"=>"Belconnen Community Bus Station (Platform 2)", "Belconnen Community Bus StationPlatform 2)"=>"Belconnen Community Bus Station (Platform 2)",
"Bridbabella Gardens Nursing Home"=>"Brindabella Gardens Nursing Home", "Bridbabella Gardens Nursing Home"=>"Brindabella Gardens Nursing Home",
"Bridbabella GardensNursing Home"=> "Brindabella Gardens Nursing Home", "Bridbabella GardensNursing Home"=> "Brindabella Gardens Nursing Home",
"BrindabellaBusiness Park"=> "Brindabella Business Park", "BrindabellaBusiness Park"=> "Brindabella Business Park",
"NarrabundahTerminus"=>"Narrabundah Terminus", "NarrabundahTerminus"=>"Narrabundah Terminus",
  "Narrabundah"=>"Narrabundah Terminus",
"Railway StationKingston"=>"Railway Station Kingston", "Railway StationKingston"=>"Railway Station Kingston",
"Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes", "Saint AndrewsVillage Hughes"=>"Saint Andrews Village Hughes",
"DicksonAntill Street"=>"Dickson",  
"Cohen St Bus Station (Platform 3)" => "Cohen Street Bus Station (Platform 3)", "Cohen St Bus Station (Platform 3)" => "Cohen Street Bus Station (Platform 3)",
"Cohen St Bus Station (Platform 6)" => "Cohen Street Bus Station (Platform 6)", "Cohen St Bus Station (Platform 6)" => "Cohen Street Bus Station (Platform 6)",
"Newcastle Streetafter Isa Street" => "Newcastle Street after Isa Street", "Newcastle Streetafter Isa Street" => "Newcastle Street after Isa Street",
"Newcastle St after Isa St" => "Newcastle Street after Isa Street", "Newcastle St after Isa St" => "Newcastle Street after Isa Street",
"Newcastle Street after Isa St" => "Newcastle Street after Isa Street", "Newcastle Street after Isa St" => "Newcastle Street after Isa Street",
"Northbourne Ave / Antill St" => "Northbourne Avenue / Antill St", "Northbourne Ave / Antill St" => "Northbourne Avenue / Antill St",
"Macarthur / Northbourne" => "Macarthur / Northbourne Ave", "Macarthur / Northbourne" => "Macarthur / Northbourne Ave",
"Macarthur Ave / Northbourne" => "Macarthur / Northbourne Ave", "Macarthur Ave / Northbourne" => "Macarthur / Northbourne Ave",
"Kings Ave / National Cct"=> "Kings Ave / National Circuit", "Kings Ave / National Cct"=> "Kings Ave / National Circuit",
"Kosciuszco Ave / Everard Street"=>"Kosciuszko / Everard", "Kosciuszco Ave / Everard Street"=>"Kosciuszko / Everard",
"Lithgow St Terminus" => "Lithgow St Terminus Fyshwick", "Lithgow St Terminus" => "Lithgow St Terminus Fyshwick",
"Hospice Menindee Dr" => "Hospice / Menindee Dr", "Hospice Menindee Dr" => "Hospice / Menindee Dr",
"Gungahlin Market Place"=> "Gungahlin Marketplace", "Gungahlin Market Place"=> "Gungahlin Marketplace",
"Gwyder Square Kaleen"=> "Gwydir Square Kaleen", "Gwyder Square Kaleen"=> "Gwydir Square Kaleen",
"Flemington Road / Nullabor Ave"=>"Flemington Rd / Nullabor Ave", "Flemington Road / Nullabor Ave"=>"Flemington Rd / Nullabor Ave",
"Flemington Road / Sandford St"=>"Flemington Rd / Sandford St", "Flemington Road / Sandford St"=>"Flemington Rd / Sandford St",
"Heagney Cres Clift Cres Richardson"=> "Heagney / Clift Richardson", "Heagney Cres Clift Cres Richardson"=> "Heagney / Clift Richardson",
"Charnwood (Tillyard Drive)"=> "Charnwood", "Charnwood (Tillyard Drive)"=> "Charnwood",
  "Charnwood Tillyard Dr"=> "Charnwood",
"charnwood"=> "Charnwood", "charnwood"=> "Charnwood",
"Black Moutain- Telstra Tower"=>"Black Mountain Telstra Tower", "Black Moutain- Telstra Tower"=>"Black Mountain Telstra Tower",
"Bonython Primary"=> "Bonython Primary School", "Bonython Primary"=> "Bonython Primary School",
"Athllon Drive / Sulwood Dr Kambah"=>"Athllon / Sulwood Kambah", "Athllon Drive / Sulwood Dr Kambah"=>"Athllon / Sulwood Kambah",
"Alexander Machonochie Centre Hume"=>"Alexander Maconochie Centre", "Alexander Machonochie Centre Hume"=>"Alexander Maconochie Centre",
"Alexander Maconochie Centre Hume"=>"Alexander Maconochie Centre", "Alexander Maconochie Centre Hume"=>"Alexander Maconochie Centre",
"Anthony Rolfe Ave / Moonight Ave" =>"Anthony Rolfe Av / Moonlight Av", "Anthony Rolfe Ave / Moonight Ave" =>"Anthony Rolfe Av / Moonlight Av",
"Australian National Botanic Gardens"=>"Botanic Gardens", "Australian National Botanic Gardens"=>"Botanic Gardens",
"Calwell shops"=> "Calwell", "Calwell shops"=> "Calwell",
"Chuculba / William Slim Drive"=>"Chuculba / William Slim Dr", "Chuculba / William Slim Drive"=>"Chuculba / William Slim Dr",
"Fyshwick direct Factory Outlet"=>"Fyshwick Direct Factory Outlet", "Fyshwick direct Factory Outlet"=>"Fyshwick Direct Factory Outlet",
"Kaleen Village / Maibrynong"=>"Kaleen Village / Marybrynong", "Kaleen Village / Maibrynong"=>"Kaleen Village / Maribrynong",
"Kaleen Village / Marybrynong Ave"=>"Kaleen Village / Marybrynong", "Kaleen Village / Marybrynong Ave"=>"Kaleen Village / Maribrynong",
"National Aquarium"=>"National Zoo and Aquarium", "National Aquarium"=>"National Zoo and Aquarium",
"chisholm"=>"Chisholm", "chisholm"=>"Chisholm",
"O'connor"=>"O'Connor", "O'connor"=>"O'Connor",
"Mckellar"=>"McKellar", "Mckellar"=>"McKellar",
"William Web / Ginninderra Drive"=>"William Webb / Ginninderra Drive", "William Web / Ginninderra Drive"=>"William Webb / Ginninderra Drive",
"Procor / Mead"=>"Proctor / Mead", "Procor / Mead"=>"Proctor / Mead",
"Fyshwick DirectFactory Outlet"=>"Fyshwick Direct Factory Outlet", "Fyshwick DirectFactory Outlet"=>"Fyshwick Direct Factory Outlet",
"Yarrulumla"=>"Yarralumla", "Yarrulumla"=>"Yarralumla",
"Tharwa Dr / Pocket Ave"=>"Tharwa Dr / Pockett Ave",  
"Paul Coe / Mirrebei Dr"=>"Paul Coe / Mirrabei Dr", "Paul Coe / Mirrebei Dr"=>"Paul Coe / Mirrabei Dr",
"Mirrebei Drive / Dam Wall"=>"Mirrabei Drive / Dam Wall", "Mirrebei Drive / Dam Wall"=>"Mirrabei Drive / Dam Wall",
"Tharwa / Knoke" => "Tharwa Drive / Knoke Ave", "Tharwa / Knoke" => "Tharwa Drive / Pockett Ave",
  "Tharwa Drive / Knoke Ave" => "Tharwa Drive / Pockett Ave",
"Tharwa / Pocket" => "Tharwa Drive / Pockett Ave", "Tharwa / Pocket" => "Tharwa Drive / Pockett Ave",
'Tharwa Dr / Pockett Ave' => "Tharwa Drive / Pockett Ave", 'Tharwa Dr / Pockett Ave' => "Tharwa Drive / Pockett Ave",
  "Tharwa Dr / Pocket Ave"=>"Tharwa Dr / Pockett Ave",
"Outrim / Duggan" => "Outtrim / Duggan", "Outrim / Duggan" => "Outtrim / Duggan",
"ANU Burton and Garran Hall Daley Rd" => "Burton and Garran Hall Daley Road", "ANU Burton and Garran Hall Daley Rd" => "Burton and Garran Hall Daley Road",
"Farrer Primary"=>"Farrer Primary School", "Farrer Primary"=>"Farrer Primary School",
"St Thomas More Campbell"=>"St Thomas More's Campbell", "St Thomas More Campbell"=>"St Thomas More's Campbell",
  "Lyneham"=>"Lyneham / Wattle St",
"Lyneham Wattle Street"=>"Lyneham / Wattle St", "Lyneham Wattle Street"=>"Lyneham / Wattle St",
"Dickson" => "Dickson / Antill St", "Dickson" => "Dickson / Cowper St",
'Dickson Antill Street' => 'Dickson / Antill St', 'Dickson Antill Street' => 'Dickson / Antill St',
  "DicksonAntill Street"=> 'Dickson / Antill St',
"Livingston / Kambah" => "Kambah / Livingston St", "Livingston / Kambah" => "Kambah / Livingston St",
'Melba shops' => 'Melba', 'Melba shops' => 'Melba',
'St Clare of Assisi' => 'St Clare of Assisi Primary', 'St Clare of Assisi' => 'St Clare of Assisi Primary',
'War Memorial Limestone Ave' => 'War Memorial / Limestone Ave' 'War Memorial Limestone Ave' => 'War Memorial / Limestone Ave',
  'Flynn' => 'Kingsford Smith / Companion'
} }
time_point_corrections.each do |wrong, right| time_point_corrections.each do |wrong, right|
$time_points_sources[wrong].each do |wrongfile| $time_points_sources[wrong].each do |wrongfile|
badtimetable = YAML::load_file(wrongfile) badtimetable = YAML::load_file(wrongfile)
badentrynumber = badtimetable["time_points"].index wrong badentrynumber = badtimetable["time_points"].index wrong
badtimetable["time_points"][badentrynumber] = right badtimetable["time_points"][badentrynumber] = right
puts "Corrected '" + wrong + "' to '" + right + "' in " + wrongfile puts "Corrected '" + wrong + "' to '" + right + "' in " + wrongfile
File.open(wrongfile, "w") do |f| File.open(wrongfile, "w") do |f|
f.write badtimetable.to_yaml f.write badtimetable.to_yaml
end end
end end
end end
end end
   
getTimePoints() getTimePoints()
#pp $time_points.sort! #pp $time_points.sort!
#pp $time_points_sources.sort #pp $time_points_sources.sort
   
   
correctTimePoints() correctTimePoints()
getTimePoints() getTimePoints()
correctTimePoints() correctTimePoints()
getTimePoints() getTimePoints()
pp $time_points.sort! pp $time_points.sort!
   
<?php <?php
header('Content-Type: application/xml'); header('Content-Type: application/xml');
echo "<?xml version='1.0' encoding='UTF-8'?> echo "<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' generator='xapi: OSM Extended API 2.0' xmlns:xapi='http://www.informationfreeway.org/xapi/0.6' <osm version='0.6' generator='xapi: OSM Extended API 2.0' xmlns:xapi='http://www.informationfreeway.org/xapi/0.6'
xapi:uri='/api/0.6/*[bbox=148.98,-35.48,149.25,-35.15]' xapi:planetDate='20100630' xapi:copyright='2010 OpenStreetMap contributors' xapi:uri='/api/0.6/*[bbox=148.98,-35.48,149.21,-35.15]' xapi:planetDate='20100630' xapi:copyright='2010 OpenStreetMap contributors'
xapi:license='Creative commons CC-BY-SA 2.0' xapi:bugs='For assistance or to report bugs contact 80n80n@gmail.com' xapi:instance='zappyHyper'> xapi:license='Creative commons CC-BY-SA 2.0' xapi:bugs='For assistance or to report bugs contact 80n80n@gmail.com' xapi:instance='zappyHyper'>
"; ";
$conn = pg_connect("dbname=openstreetmap user=postgres password=snmc"); $conn = pg_connect("dbname=openstreetmap user=postgres password=snmc");
if (!$conn) { if (!$conn) {
echo "An error occured.\n"; echo "An error occured.\n";
exit; exit;
} }
$result_stops = pg_query($conn, "Select * FROM current_node_tags INNER JOIN current_nodes ON $result_stops = pg_query($conn, "Select * FROM current_node_tags INNER JOIN current_nodes ON
current_node_tags.id=current_nodes.id WHERE v LIKE '%bus%' "); current_node_tags.id=current_nodes.id WHERE v LIKE '%bus%' ");
if (!$result_stops) { if (!$result_stops) {
echo "An stops retirieve error occured.\n"; echo "An stops retirieve error occured.\n";
exit; exit;
} }
while ($stop = pg_fetch_assoc($result_stops)) { while ($stop = pg_fetch_assoc($result_stops)) {
$stop['latitude'] = $stop['latitude']/10000000; $stop['latitude'] = $stop['latitude']/10000000;
$stop['longitude'] = $stop['longitude']/10000000; $stop['longitude'] = $stop['longitude']/10000000;
echo "<node id='{$stop['id']}' lat='{$stop['latitude']}' lon='{$stop['longitude']}' version='1' changeset='242919' echo "<node id='{$stop['id']}' lat='{$stop['latitude']}' lon='{$stop['longitude']}' version='1' changeset='242919'
user='latch' uid='6647' visible='true' timestamp='2007-08-22T05:03:00Z'>\n"; user='latch' uid='6647' visible='true' timestamp='2007-08-22T05:03:00Z'>\n";
$result_stopkeys = pg_query($conn, "SELECT * from current_node_tags where id = {$stop['id']};"); $result_stopkeys = pg_query($conn, "SELECT * from current_node_tags where id = {$stop['id']};");
if (!$result_stopkeys) { if (!$result_stopkeys) {
echo "An stops keys retirieve error occured.\n"; echo "An stops keys retirieve error occured.\n";
exit; exit;
} }
$name = ""; $name = "";
while ($stopkeys = pg_fetch_assoc($result_stopkeys)) { while ($stopkeys = pg_fetch_assoc($result_stopkeys)) {
echo "<tag k='{$stopkeys['k']}' v='".htmlentities($stopkeys['v'])."'/>\n"; echo "<tag k='{$stopkeys['k']}' v='".htmlentities($stopkeys['v'])."'/>\n";
} }
echo "</node>\n"; echo "</node>\n";
} }
echo "\n</osm>\n"; echo "\n</osm>\n";
?> ?>
   
<?php <?php
function getPage($url) function getPage($url)
{ {
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_HEADER, 0 ); curl_setopt( $ch, CURLOPT_HEADER, 0 );
$page = curl_exec($ch); $page = curl_exec($ch);
curl_close($ch); curl_close($ch);
return $page; return $page;
} }
// //
// http://developers.cloudmade.com/wiki/geocoding-http-api/Documentation // http://developers.cloudmade.com/wiki/geocoding-http-api/Documentation
$conn = pg_connect("dbname=bus user=postgres password=snmc"); $conn = pg_connect("dbname=bus user=postgres password=snmc");
if (!$conn) { if (!$conn) {
echo "An error occured.\n"; echo "An error occured.\n";
exit; exit;
} }
$sql = "Select * from stops where name is null or suburb is null"; $sql = "Select * from stops where name is null or suburb is null";
$result_stops = pg_query($conn, $sql); $result_stops = pg_query($conn, $sql);
if (!$result_stops) { if (!$result_stops) {
echo("Error in SQL query: " . pg_last_error() ."<br>\n"); echo("Error in SQL query: " . pg_last_error() ."<br>\n");
} }
while ($stop = pg_fetch_assoc($result_stops)) { while ($stop = pg_fetch_assoc($result_stops)) {
echo "Processing ".$stop['geohash'] . " ... "; if ($stop['name'] == "") {
  echo "Processing ".$stop['geohash'] . " streetname ... ";
$url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".($stop['lat']/10000000).",".($stop['lng']/10000000)."&distance=closest&object_type=road"; $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".($stop['lat']/10000000).",".($stop['lng']/10000000)."&distance=closest&object_type=road";
$contents = json_decode(getPage($url)); $contents = json_decode(getPage($url));
print_r($contents); //print_r($contents);
$name = $contents->features[0]->properties->name; $name = $contents->features[0]->properties->name;
//todo suburb/locality select * from suburbs where the_geom @> 'POINT(149.075704592122 -35.21751569325)'::geometry  
echo "Saving $name ! <br>" ; echo "Saving $name ! <br>" ;
$result_save = pg_query($conn, "UPDATE stops set name = '".pg_escape_string($name)."' where geohash = '{$stop['geohash']}' "); $result_save = pg_query($conn, "UPDATE stops set name = '".pg_escape_string($name)."' where geohash = '{$stop['geohash']}' ");
if (!$result_save) { if (!$result_save) {
echo("Error in SQL query: " . pg_last_error() ."<br>\n"); echo("Error in SQL query: " . pg_last_error() ."<br>\n");
  }
  }
  if ($stop['suburb'] == "") {
  echo "Processing ".$stop['geohash'] . " suburb ... ";
  $sql = "select * from suburbs where the_geom @> 'POINT(".($stop['lng']/10000000)." ".($stop['lat']/10000000).")'::geometry";
  $result_suburbs = pg_query($conn, $sql);
  if (!$result_suburbs) {
  echo("Error in SQL query: " . pg_last_error() ."<br>\n");
} }
die(); $suburbs = "";
  while ($suburb = pg_fetch_assoc($result_suburbs)) {
  $suburbs .= $suburb['name_2006'].";";
  }
  echo "Saving $suburbs ! <br>" ;
  $result_save = pg_query($conn, "UPDATE stops set suburb = '".pg_escape_string($suburbs)."' where geohash = '{$stop['geohash']}' ");
  if (!$result_save) {
  echo("Error in SQL query: " . pg_last_error() ."<br>\n");
  }
  }
flush(); flush();
} }
   
?> ?>
   
   
require 'rubygems' require 'rubygems'
require 'postgres' require 'postgres'
require 'pp' require 'pp'
require 'yaml' require 'yaml'
class String class String
def escape_single_quotes def escape_single_quotes
self.gsub(/'/, "''") self.gsub(/'/, "''")
end end
end end
class Array class Array
def to_yaml_style def to_yaml_style
:inline :inline
end end
end end
Dir.chdir("output") Dir.chdir("output")
   
connbus = PGconn.connect("localhost", 5432, '', '', "bus", "postgres", "snmc") connbus = PGconn.connect("localhost", 5432, '', '', "bus", "postgres", "snmc")
   
Dir.glob("*.yml") { |file| Dir.glob("*.yml") { |file|
timetable = YAML::load_file(file) timetable = YAML::load_file(file)
if timetable if timetable
route_name = timetable["short_name"] route_name = timetable["short_name"]
timetable["between_stops"] = {} timetable["between_stops"] = {}
for i in 0..timetable["time_points"].length-2 for i in 0..timetable["time_points"].length-2
begin begin
searchFrom = timetable["time_points"][i].escape_single_quotes.split("(")[0].strip searchFrom = timetable["time_points"][i].escape_single_quotes.split("(")[0].strip
searchTo = timetable["time_points"][i+1].escape_single_quotes.split("(")[0].strip searchTo = timetable["time_points"][i+1].escape_single_quotes.split("(")[0].strip
# print "SELECT * from between_stops # print "SELECT * from between_stops
# WHERE fromlocation = '#{searchFrom}' # WHERE fromlocation = '#{searchFrom}'
# AND tolocation = '#{searchTo}' AND routes LIKE '%#{route_name};%'" # AND tolocation = '#{searchTo}' AND routes LIKE '%#{route_name};%'"
between_points = connbus.exec("SELECT * from between_stops between_points = connbus.exec("SELECT * from between_stops
WHERE fromlocation = '#{searchFrom}' WHERE fromlocation = '#{searchFrom}'
AND tolocation = '#{searchTo}' AND routes LIKE '%#{route_name};%'") AND tolocation = '#{searchTo}' AND routes LIKE '%#{route_name};%'")
rescue PGError => e rescue PGError => e
puts "Error selecting matching between points from DB #{e}" puts "Error selecting matching between points from DB #{e}"
#conn.close() if conn #conn.close() if conn
end end
between_points.each do |between_point_row| between_points.each do |between_point_row|
points = between_point_row['points'].split(";") points = between_point_row['points'].strip.split(";")
points.delete("") points.delete("")
timetable["between_stops"][timetable["time_points"][i] + '-' +timetable["time_points"][i+1]] = points; timetable["between_stops"][timetable["time_points"][i] + '-' +timetable["time_points"][i+1]] = points;
end end
end end
#pp timetable["between_stops"] #pp timetable["between_stops"]
File.open(file, "w") do |f| File.open(file, "w") do |f|
f.write timetable.to_yaml f.write timetable.to_yaml
end end
else else
print "error, #{file} empty\n" print "error, #{file} empty\n"
end end
} }
   
options: options:
start_date: 20101115 start_date: 20101115
end_date: 20111231 end_date: 20111231
remove_date: 20111231 remove_date: 20111231
agency_name: ACT Internal Omnibus Network (ACTION) agency_name: ACT Internal Omnibus Network (ACTION)
agency_url: http://www.action.act.gov.au/ agency_url: http://www.action.act.gov.au/
agency_timezone: Australia/Sydney agency_timezone: Australia/Sydney
   
   
stops: stops:
- { name: ACTEW AGL House,stop_code: ACTEW AGL House, lat: -35.282374, lng: 149.132047} - { name: ACTEW AGL House,stop_code: ACTEW AGL House, lat: -35.282374, lng: 149.132047}
- { name: ADFA,stop_code: ADFA, lat: -35.2937972, lng: 149.1643403} - { name: ADFA,stop_code: ADFA, lat: -35.2937972, lng: 149.1643403}
- { name: Ainslie,stop_code: Ainslie, lat: -35.2620105, lng: 149.1443302} - { name: Ainslie,stop_code: Ainslie, lat: -35.2620105, lng: 149.1443302}
- { name: Alexander Maconochie Centre,stop_code: Alexander Maconochie Centre, lat: -35.3720651, lng: 149.1696618} - { name: Alexander Maconochie Centre,stop_code: Alexander Maconochie Centre, lat: -35.3720651, lng: 149.1696618}
- { name: Alpen & Clifford St,stop_code: Alpen & Clifford St, lat: -35.20562, lng: 149.06259}  
- { name: Anthony Rolfe Av / Moonlight Av,stop_code: Anthony Rolfe Av / Moonlight Av, lat: -35.1856021, lng: 149.1543639} - { name: Anthony Rolfe Av / Moonlight Av,stop_code: Anthony Rolfe Av / Moonlight Av, lat: -35.1856021, lng: 149.1543639}
- { name: Aranda,stop_code: Aranda, lat: -35.257534, lng: 149.0762963} - { name: Aranda,stop_code: Aranda, lat: -35.257534, lng: 149.0762963}
- { name: Athllon / Sulwood Kambah,stop_code: Athllon / Sulwood Kambah, lat: -35.38442, lng: 149.09328} - { name: Athllon / Sulwood Kambah,stop_code: Athllon / Sulwood Kambah, lat: -35.38442, lng: 149.09328}
- { name: Australian Institute of Sport,stop_code: Australian Institute of Sport, lat: -35.246351, lng: 149.101478} - { name: Australian Institute of Sport,stop_code: Australian Institute of Sport, lat: -35.246351, lng: 149.101478}
- { name: Belconnen Community Bus Station,stop_code: Belconnen Community Bus Station, lat: -35.23987, lng: 149.0619} - { name: Belconnen Community Bus Station,stop_code: Belconnen Community Bus Station, lat: -35.2398858, lng: 149.0690795}
- { name: Belconnen Community Bus Station (Platform 1),stop_code: Belconnen Community Bus Station (Platform 1), lat: -35.23982, lng: 149.06978} - { name: Belconnen Community Bus Station (Platform 1),stop_code: Belconnen Community Bus Station (Platform 1), lat: -35.23982, lng: 149.06978}
- { name: Belconnen Community Bus Station (Platform 2),stop_code: Belconnen Community Bus Station (Platform 2), lat: -35.23982, lng: 149.06926} - { name: Belconnen Community Bus Station (Platform 2),stop_code: Belconnen Community Bus Station (Platform 2), lat: -35.23982, lng: 149.06926}
- { name: Belconnen Community Bus Station (Platform 3),stop_code: Belconnen Community Bus Station (Platform 3), lat: -35.23986, lng: 149.06847} - { name: Belconnen Community Bus Station (Platform 3),stop_code: Belconnen Community Bus Station (Platform 3), lat: -35.23986, lng: 149.06847}
- { name: Belconnen Community Bus Station (Platform 4),stop_code: Belconnen Community Bus Station (Platform 4), lat: -35.23994, lng: 149.06887} - { name: Belconnen Community Bus Station (Platform 4),stop_code: Belconnen Community Bus Station (Platform 4), lat: -35.23994, lng: 149.06887}
- { name: Belconnen Community Bus Station (Platform 5),stop_code: Belconnen Community Bus Station (Platform 5), lat: -35.23994, lng: 149.06928} - { name: Belconnen Community Bus Station (Platform 5),stop_code: Belconnen Community Bus Station (Platform 5), lat: -35.23994, lng: 149.06928}
- { name: Belconnen Community Bus Station (Platform 6),stop_code: Belconnen Community Bus Station (Platform 6), lat: -35.23994, lng: 149.0698} - { name: Belconnen Community Bus Station (Platform 6),stop_code: Belconnen Community Bus Station (Platform 6), lat: -35.23994, lng: 149.0698}
- { name: Belconnen Way,stop_code: Belconnen Way, lat: -35.24809, lng: 149.06765} - { name: Belconnen Way,stop_code: Belconnen Way, lat: -35.2410162, lng: 149.0409512}
- { name: Bimberi Centre,stop_code: Bimberi Centre, lat: -35.2219941, lng: 149.1546928} - { name: Bimberi Centre,stop_code: Bimberi Centre, lat: -35.2219941, lng: 149.1546928}
- { name: Black Mountain Telstra Tower,stop_code: Black Mountain Telstra Tower, lat: -35.2748058, lng: 149.0972461} - { name: Black Mountain Telstra Tower,stop_code: Black Mountain Telstra Tower, lat: -35.2748058, lng: 149.0972461}
- { name: Bonython,stop_code: Bonython, lat: -35.4297416, lng: 149.0814517} - { name: Bonython Primary School,stop_code: Bonython Primary School, lat: -35.4297416, lng: 149.0814517}
- { name: Bonython Primary School,stop_code: Bonython Primary School, lat: -35.431019, lng: 149.0831217}  
- { name: Botanic Gardens,stop_code: Botanic Gardens, lat: -35.278643, lng: 149.1093237} - { name: Botanic Gardens,stop_code: Botanic Gardens, lat: -35.278643, lng: 149.1093237}
- { name: Brindabella Business Park,stop_code: Brindabella Business Park, lat: -35.314496, lng: 149.189145} - { name: Brindabella Business Park,stop_code: Brindabella Business Park, lat: -35.314496, lng: 149.189145}
- { name: Brindabella Gardens Nursing Home,stop_code: Brindabella Gardens Nursing Home, lat: -35.3294459, lng: 149.0806116} - { name: Brindabella Gardens Nursing Home,stop_code: Brindabella Gardens Nursing Home, lat: -35.3294459, lng: 149.0806116}
- { name: Bugden Sternberg,stop_code: Bugden Sternberg, lat: -35.4017223, lng: 149.0992172} - { name: Bugden Sternberg,stop_code: Bugden Sternberg, lat: -35.403233, lng: 149.1073117}
- { name: Burton and Garran Hall Daley Road,stop_code: Burton and Garran Hall Daley Road, lat: -35.2753671, lng: 149.1172822} - { name: Burton and Garran Hall Daley Road,stop_code: Burton and Garran Hall Daley Road, lat: -35.2753671, lng: 149.1172822}
- { name: Calvary Hospital,stop_code: Calvary Hospital, lat: -35.25212, lng: 149.09088} - { name: Calvary Hospital,stop_code: Calvary Hospital, lat: -35.25212, lng: 149.09088}
- { name: Calwell,stop_code: Calwell, lat: -35.43524, lng: 149.113942} - { name: Calwell,stop_code: Calwell, lat: -35.43524, lng: 149.113942}
- { name: Cameron Ave Bus Station,stop_code: Cameron Ave Bus Station, lat: -35.2410195, lng: 149.0722506}  
- { name: Cameron Ave Bus Station (Platform 1),stop_code: Cameron Ave Bus Station (Platform 1), lat: -35.2410195, lng: 149.0722506}  
- { name: Cameron Ave Bus Station (Platform 2),stop_code: Cameron Ave Bus Station (Platform 2), lat: -35.2410108, lng: 149.0717142}  
- { name: Cameron Ave Bus Station (Platform 3),stop_code: Cameron Ave Bus Station (Platform 3), lat: -35.2410064, lng: 149.0710758}  
- { name: Cameron Ave Bus Station (Platform 4),stop_code: Cameron Ave Bus Station (Platform 4), lat: -35.2411773, lng: 149.0709793}  
- { name: Cameron Ave Bus Station (Platform 5),stop_code: Cameron Ave Bus Station (Platform 5), lat: -35.241186, lng: 149.0720789}  
- { name: Campbell Park Offices,stop_code: Campbell Park Offices, lat: -35.28368, lng: 149.17045} - { name: Campbell Park Offices,stop_code: Campbell Park Offices, lat: -35.28368, lng: 149.17045}
- { name: Canberra College Weston Campus,stop_code: Canberra College Weston Campus, lat: -35.3490278, lng: 149.0486277} - { name: Canberra College Weston Campus,stop_code: Canberra College Weston Campus, lat: -35.3490278, lng: 149.0486277}
- { name: Canberra Hospital,stop_code: Canberra Hospital, lat: -35.3459462, lng: 149.1012001} - { name: Canberra Hospital,stop_code: Canberra Hospital, lat: -35.3459462, lng: 149.1012001}
- { name: Canberra Times,stop_code: Canberra Times, lat: -35.3245431, lng: 149.1705533} - { name: Canberra Times,stop_code: Canberra Times, lat: -35.3245431, lng: 149.1705533}
- { name: Caswell Drive,stop_code: Caswell Drive, lat: -35.25922, lng: 149.08576} - { name: Caswell Drive,stop_code: Caswell Drive, lat: -35.25922, lng: 149.08576}
- { name: Causeway,stop_code: Causeway, lat: -35.31615, lng: 149.15058} - { name: Causeway,stop_code: Causeway, lat: -35.31615, lng: 149.15058}
- { name: Centrelink Tuggeranong,stop_code: Centrelink Tuggeranong, lat: -35.4207496, lng: 149.0700973} - { name: Centrelink Tuggeranong,stop_code: Centrelink Tuggeranong, lat: -35.4207496, lng: 149.0700973}
- { name: Chapman,stop_code: Chapman, lat: -35.3557877, lng: 149.0408111} - { name: Chapman,stop_code: Chapman, lat: -35.3557877, lng: 149.0408111}
- { name: Charnwood,stop_code: Charnwood, lat: -35.2052138, lng: 149.0337266} - { name: Charnwood,stop_code: Charnwood, lat: -35.2052138, lng: 149.0337266}
- { name: Charnwood Tillyard Dr,stop_code: Charnwood Tillyard Dr, lat: -35.20295, lng: 149.04027} - { name: Chifley,stop_code: Chifley, lat: -35.3529713, lng: 149.0759413}
- { name: Chifley,stop_code: Chifley, lat: -35.350985, lng: 149.077319} - { name: Chisholm,stop_code: Chisholm, lat: -35.41341, lng: 149.1308079}
- { name: Chisholm,stop_code: Chisholm, lat: -35.41341, lng: 149.12833}  
- { name: Chuculba / William Slim Dr,stop_code: Chuculba / William Slim Dr, lat: -35.208931, lng: 149.088499} - { name: Chuculba / William Slim Dr,stop_code: Chuculba / William Slim Dr, lat: -35.208931, lng: 149.088499}
- { name: CIT Weston,stop_code: CIT Weston, lat: -35.330234, lng: 149.058632} - { name: CIT Weston,stop_code: CIT Weston, lat: -35.330234, lng: 149.058632}
- { name: City Bus Station,stop_code: City Bus Station, lat: -35.2794346, lng: 149.1305879} - { name: City Bus Station,stop_code: City Bus Station, lat: -35.2794346, lng: 149.1305879}
- { name: City Bus Station (Platform 1),stop_code: City Bus Station (Platform 1), lat: -35.2794346, lng: 149.1305879} - { name: City Bus Station (Platform 1),stop_code: City Bus Station (Platform 1), lat: -35.2794346, lng: 149.1305879}
- { name: City Bus Station (Platform 10),stop_code: City Bus Station (Platform 10), lat: -35.2793571, lng: 149.1293659} - { name: City Bus Station (Platform 10),stop_code: City Bus Station (Platform 10), lat: -35.2793571, lng: 149.1293659}
- { name: City Bus Station (Platform 11),stop_code: City Bus Station (Platform 11), lat: -35.2787905, lng: 149.1288627} - { name: City Bus Station (Platform 11),stop_code: City Bus Station (Platform 11), lat: -35.2787905, lng: 149.1288627}
- { name: City Bus Station (Platform 2),stop_code: City Bus Station (Platform 2), lat: -35.278907, lng: 149.130612} - { name: City Bus Station (Platform 2),stop_code: City Bus Station (Platform 2), lat: -35.278907, lng: 149.130612}
- { name: City Bus Station (Platform 3),stop_code: City Bus Station (Platform 3), lat: -35.2787886, lng: 149.1304779} - { name: City Bus Station (Platform 3),stop_code: City Bus Station (Platform 3), lat: -35.2787886, lng: 149.1304779}
- { name: City Bus Station (Platform 4),stop_code: City Bus Station (Platform 4), lat: -35.2785658, lng: 149.1301727} - { name: City Bus Station (Platform 4),stop_code: City Bus Station (Platform 4), lat: -35.2785658, lng: 149.1301727}
- { name: City Bus Station (Platform 5),stop_code: City Bus Station (Platform 5), lat: -35.2785242, lng: 149.1297348} - { name: City Bus Station (Platform 5),stop_code: City Bus Station (Platform 5), lat: -35.2785242, lng: 149.1297348}
- { name: City Bus Station (Platform 7),stop_code: City Bus Station (Platform 7), lat: -35.27843, lng: 149.130345} - { name: City Bus Station (Platform 7),stop_code: City Bus Station (Platform 7), lat: -35.27843, lng: 149.130345}
- { name: City Bus Station (Platform 8),stop_code: City Bus Station (Platform 8), lat: -35.2778798, lng: 149.1305995} - { name: City Bus Station (Platform 8),stop_code: City Bus Station (Platform 8), lat: -35.2778798, lng: 149.1305995}
- { name: City Bus Station (Platform 9),stop_code: City Bus Station (Platform 9), lat: -35.2783224, lng: 149.130726} - { name: City Bus Station (Platform 9),stop_code: City Bus Station (Platform 9), lat: -35.2783224, lng: 149.130726}
- { name: City West,stop_code: City West, lat: -35.2788605, lng: 149.1257969} - { name: City West,stop_code: City West, lat: -35.2788605, lng: 149.1257969}
- { name: Cnr Kerrigan/Lhotsky,stop_code: Cnr Kerrigan/Lhotsky, lat: -35.1995716, lng: 149.0285277}  
- { name: Cnr Tillyard Dr & Spalding St,stop_code: Cnr Tillyard Dr & Spalding St, lat: -35.2040477, lng: 149.0393052}  
- { name: Cohen Street Bus Station,stop_code: Cohen Street Bus Station, lat: -35.2394775, lng: 149.0602031} - { name: Cohen Street Bus Station,stop_code: Cohen Street Bus Station, lat: -35.2394775, lng: 149.0602031}
- { name: Cohen Street Bus Station (Platform 1),stop_code: Cohen Street Bus Station (Platform 1), lat: -35.2394775, lng: 149.0602031} - { name: Cohen Street Bus Station (Platform 1),stop_code: Cohen Street Bus Station (Platform 1), lat: -35.2394775, lng: 149.0602031}
- { name: Cohen Street Bus Station (Platform 2),stop_code: Cohen Street Bus Station (Platform 2), lat: -35.2396467, lng: 149.0602152} - { name: Cohen Street Bus Station (Platform 2),stop_code: Cohen Street Bus Station (Platform 2), lat: -35.2396467, lng: 149.0602152}
- { name: Cohen Street Bus Station (Platform 3),stop_code: Cohen Street Bus Station (Platform 3), lat: -35.239764, lng: 149.0604531} - { name: Cohen Street Bus Station (Platform 3),stop_code: Cohen Street Bus Station (Platform 3), lat: -35.239764, lng: 149.0604531}
- { name: Cohen Street Bus Station (Platform 4),stop_code: Cohen Street Bus Station (Platform 4), lat: -35.239844, lng: 149.0600683} - { name: Cohen Street Bus Station (Platform 4),stop_code: Cohen Street Bus Station (Platform 4), lat: -35.239844, lng: 149.0600683}
- { name: Cohen Street Bus Station (Platform 5),stop_code: Cohen Street Bus Station (Platform 5), lat: -35.2401211, lng: 149.0597102} - { name: Cohen Street Bus Station (Platform 5),stop_code: Cohen Street Bus Station (Platform 5), lat: -35.2401211, lng: 149.0597102}
- { name: Cohen Street Bus Station (Platform 6),stop_code: Cohen Street Bus Station (Platform 6), lat: -35.2400028, lng: 149.060315} - { name: Cohen Street Bus Station (Platform 6),stop_code: Cohen Street Bus Station (Platform 6), lat: -35.2400028, lng: 149.060315}
- { name: Conder Primary,stop_code: Conder Primary, lat: -35.4643475, lng: 149.0986908} - { name: Conder Primary,stop_code: Conder Primary, lat: -35.4643475, lng: 149.0986908}
- { name: Cook,stop_code: Cook, lat: -35.2596, lng: 149.0638} - { name: Cook,stop_code: Cook, lat: -35.2596, lng: 149.0638}
- { name: Cooleman Court,stop_code: Cooleman Court, lat: -35.34147, lng: 149.05338} - { name: Cooleman Court,stop_code: Cooleman Court, lat: -35.34147, lng: 149.05338}
- { name: Copland College,stop_code: Copland College, lat: -35.2127018, lng: 149.0596387} - { name: Copland College,stop_code: Copland College, lat: -35.2127018, lng: 149.0596387}
- { name: Curtin,stop_code: Curtin, lat: -35.3248779, lng: 149.081441} - { name: Curtin,stop_code: Curtin, lat: -35.3253034, lng: 149.0840838}
- { name: Deakin,stop_code: Deakin, lat: -35.3158608, lng: 149.1084563} - { name: Deakin,stop_code: Deakin, lat: -35.3151707, lng: 149.1084563}
- { name: Deamer / Clift Richardson,stop_code: Deamer / Clift Richardson, lat: -35.4319597, lng: 149.1187876} - { name: Deamer / Clift Richardson,stop_code: Deamer / Clift Richardson, lat: -35.4294463, lng: 149.12}
- { name: Dickson / Antill St,stop_code: Dickson / Antill St, lat: -35.2489, lng: 149.14012} - { name: Dickson / Antill St,stop_code: Dickson / Antill St, lat: -35.2489, lng: 149.14012}
- { name: Dickson College,stop_code: Dickson College, lat: -35.24923, lng: 149.15315} - { name: Dickson College,stop_code: Dickson College, lat: -35.24923, lng: 149.15315}
- { name: Dickson / Cowper St,stop_code: Dickson / Cowper St, lat: -35.250297, lng: 149.141336} - { name: Dickson / Cowper St,stop_code: Dickson / Cowper St, lat: -35.250297, lng: 149.141336}
- { name: Duffy,stop_code: Duffy, lat: -35.3366908, lng: 149.0324311} - { name: Duffy,stop_code: Duffy, lat: -35.3366908, lng: 149.0324311}
- { name: Duffy Primary,stop_code: Duffy Primary, lat: -35.334219, lng: 149.033656} - { name: Duffy Primary,stop_code: Duffy Primary, lat: -35.334219, lng: 149.033656}
- { name: Dunlop,stop_code: Dunlop, lat: -35.1942693, lng: 149.0206702} - { name: Dunlop,stop_code: Dunlop, lat: -35.1981771, lng: 149.0207837}
- { name: Erindale Centre,stop_code: Erindale Centre, lat: -35.4038881, lng: 149.0992283} - { name: Erindale Centre,stop_code: Erindale Centre, lat: -35.4038881, lng: 149.0992283}
- { name: Erindale Dr / Charleston St Monash,stop_code: Erindale Dr / Charleston St Monash, lat: -35.414616, lng: 149.07888} - { name: Erindale Dr / Charleston St Monash,stop_code: Erindale Dr / Charleston St Monash, lat: -35.414616, lng: 149.07888}
- { name: Erindale / Sternberg Cres,stop_code: Erindale / Sternberg Cres, lat: -35.4014472, lng: 149.0956545} - { name: Erindale / Sternberg Cres,stop_code: Erindale / Sternberg Cres, lat: -35.4028919, lng: 149.1060672}
- { name: Evatt,stop_code: Evatt, lat: -35.2091093, lng: 149.0735343} - { name: Evatt,stop_code: Evatt, lat: -35.2091093, lng: 149.0735343}
- { name: Eye Hospital,stop_code: Eye Hospital, lat: -35.3341884, lng: 149.1656213} - { name: Eye Hospital,stop_code: Eye Hospital, lat: -35.3341884, lng: 149.1656213}
- { name: Fairbairn Park,stop_code: Fairbairn Park, lat: -35.3001773, lng: 149.2041185} - { name: Fairbairn Park,stop_code: Fairbairn Park, lat: -35.3038896, lng: 149.2038605}
- { name: Farrer Primary School,stop_code: Farrer Primary School, lat: -35.37887, lng: 149.10641} - { name: Farrer Primary School,stop_code: Farrer Primary School, lat: -35.37887, lng: 149.10641}
- { name: Farrer Terminus,stop_code: Farrer Terminus, lat: -35.3771794, lng: 149.1046948} - { name: Farrer Terminus,stop_code: Farrer Terminus, lat: -35.380274, lng: 149.1104016}
- { name: Federation Square,stop_code: Federation Square, lat: -35.1908726, lng: 149.0848153} - { name: Federation Square,stop_code: Federation Square, lat: -35.1908726, lng: 149.0848153}
- { name: Fisher,stop_code: Fisher, lat: -35.3605627, lng: 149.0576481} - { name: Fisher,stop_code: Fisher, lat: -35.3605627, lng: 149.0576481}
- { name: Flemington Rd,stop_code: Flemington Rd, lat: -35.20756, lng: 149.14778}  
- { name: Flemington Rd / Nullabor Ave,stop_code: Flemington Rd / Nullabor Ave, lat: -35.2008585, lng: 149.1493407} - { name: Flemington Rd / Nullabor Ave,stop_code: Flemington Rd / Nullabor Ave, lat: -35.2008585, lng: 149.1493407}
- { name: Flemington Rd / Sandford St,stop_code: Flemington Rd / Sandford St, lat: -35.221231, lng: 149.144645} - { name: Flemington Rd / Sandford St,stop_code: Flemington Rd / Sandford St, lat: -35.221231, lng: 149.144645}
- { name: Florey,stop_code: Florey, lat: -35.2258544, lng: 149.0546214} - { name: Florey,stop_code: Florey, lat: -35.2267757, lng: 149.0544025}
- { name: Flynn,stop_code: Flynn, lat: -35.2019283, lng: 149.0478356} - { name: Fraser,stop_code: Fraser, lat: -35.1929304, lng: 149.0433893}
- { name: Fraser,stop_code: Fraser, lat: -35.1896539, lng: 149.0435012} - { name: Fraser East Terminus,stop_code: Fraser East Terminus, lat: -35.1896539, lng: 149.04811}
- { name: Fraser East Terminus,stop_code: Fraser East Terminus, lat: -35.1896539, lng: 149.0435012}  
- { name: Fraser West Terminus,stop_code: Fraser West Terminus, lat: -35.191513, lng: 149.038006} - { name: Fraser West Terminus,stop_code: Fraser West Terminus, lat: -35.191513, lng: 149.038006}
- { name: Fyshwick Direct Factory Outlet,stop_code: Fyshwick Direct Factory Outlet, lat: -35.3359862, lng: 149.1796322} - { name: Fyshwick Direct Factory Outlet,stop_code: Fyshwick Direct Factory Outlet, lat: -35.3359862, lng: 149.1796322}
- { name: Fyshwick Terminus,stop_code: Fyshwick Terminus, lat: -35.3285202, lng: 149.1785592}  
- { name: Garran,stop_code: Garran, lat: -35.3423286, lng: 149.10811} - { name: Garran,stop_code: Garran, lat: -35.3423286, lng: 149.10811}
- { name: Geoscience Australia,stop_code: Geoscience Australia, lat: -35.3429702, lng: 149.1583893} - { name: Geoscience Australia,stop_code: Geoscience Australia, lat: -35.3429702, lng: 149.1583893}
- { name: Giralang,stop_code: Giralang, lat: -35.2115608, lng: 149.0960692} - { name: Giralang,stop_code: Giralang, lat: -35.2115608, lng: 149.0960692}
- { name: Gordon Primary,stop_code: Gordon Primary, lat: -35.455517, lng: 149.086978} - { name: Gordon Primary,stop_code: Gordon Primary, lat: -35.455517, lng: 149.086978}
- { name: Gowrie,stop_code: Gowrie, lat: -35.4120264, lng: 149.1110804} - { name: Gowrie,stop_code: Gowrie, lat: -35.4141373, lng: 149.1100798}
- { name: Gungahlin Marketplace,stop_code: Gungahlin Marketplace, lat: -35.1769532, lng: 149.1319017} - { name: Gungahlin Marketplace,stop_code: Gungahlin Marketplace, lat: -35.183259, lng: 149.1328249}
- { name: Gwydir Square Kaleen,stop_code: Gwydir Square Kaleen, lat: -35.2338677, lng: 149.1031998} - { name: Gwydir Square Kaleen,stop_code: Gwydir Square Kaleen, lat: -35.2338677, lng: 149.1031998}
- { name: Hackett,stop_code: Hackett, lat: -35.2481617, lng: 149.1626094} - { name: Hackett,stop_code: Hackett, lat: -35.2481617, lng: 149.1626094}
- { name: Hawker,stop_code: Hawker, lat: -35.2437386, lng: 149.0432804} - { name: Hawker,stop_code: Hawker, lat: -35.2437386, lng: 149.0432804}
- { name: Hawker College,stop_code: Hawker College, lat: -35.2454598, lng: 149.0324251} - { name: Hawker College,stop_code: Hawker College, lat: -35.2454598, lng: 149.0324251}
- { name: Heagney / Clift Richardson,stop_code: Heagney / Clift Richardson, lat: -35.4251299, lng: 149.11375} - { name: Heagney / Clift Richardson,stop_code: Heagney / Clift Richardson, lat: -35.4251299, lng: 149.11375}
- { name: Hibberson / Kate Crace,stop_code: Hibberson / Kate Crace, lat: -35.1861642, lng: 149.1391756} - { name: Hibberson / Kate Crace,stop_code: Hibberson / Kate Crace, lat: -35.1861642, lng: 149.1391756}
- { name: Higgins,stop_code: Higgins, lat: -35.2313901, lng: 149.0271811} - { name: Higgins,stop_code: Higgins, lat: -35.2313901, lng: 149.0271811}
- { name: Holder,stop_code: Holder, lat: -35.3378123, lng: 149.0449433} - { name: Holder,stop_code: Holder, lat: -35.3378123, lng: 149.0449433}
- { name: Holt,stop_code: Holt, lat: -35.223099, lng: 149.0126269} - { name: Holt,stop_code: Holt, lat: -35.223099, lng: 149.0126269}
- { name: Hoskins Street / Oodgeroo Ave,stop_code: Hoskins Street / Oodgeroo Ave, lat: -35.201095, lng: 149.139941} - { name: Hoskins Street / Oodgeroo Ave,stop_code: Hoskins Street / Oodgeroo Ave, lat: -35.201095, lng: 149.139941}
- { name: Hospice / Menindee Dr,stop_code: Hospice / Menindee Dr, lat: -35.303557, lng: 149.151627} - { name: Hospice / Menindee Dr,stop_code: Hospice / Menindee Dr, lat: -35.303557, lng: 149.151627}
- { name: Hughes,stop_code: Hughes, lat: -35.3339223, lng: 149.093854} - { name: Hughes,stop_code: Hughes, lat: -35.3324722, lng: 149.0923343}
- { name: Isaacs,stop_code: Isaacs, lat: -35.3669823, lng: 149.1119217} - { name: Isaacs,stop_code: Isaacs, lat: -35.3669823, lng: 149.1119217}
- { name: Isabella,stop_code: Isabella, lat: -35.4285703, lng: 149.0916837} - { name: Isabella,stop_code: Isabella, lat: -35.4285703, lng: 149.0916837}
- { name: Jamison Centre,stop_code: Jamison Centre, lat: -35.2527268, lng: 149.0713712} - { name: Jamison Centre,stop_code: Jamison Centre, lat: -35.2527268, lng: 149.0713712}
- { name: John James Hospital,stop_code: John James Hospital, lat: -35.3200295, lng: 149.0955996} - { name: John James Hospital,stop_code: John James Hospital, lat: -35.3200295, lng: 149.0955996}
- { name: Kaleen Village / Marybrynong,stop_code: Kaleen Village / Marybrynong, lat: -35.2274031, lng: 149.1075421} - { name: Kaleen Village / Maribrynong,stop_code: Kaleen Village / Maribrynong, lat: -35.2197554, lng: 149.1029934}
- { name: Kambah High,stop_code: Kambah High, lat: -35.3847749, lng: 149.0720245} - { name: Kambah High,stop_code: Kambah High, lat: -35.3926493, lng: 149.068179}
- { name: Kambah / Livingston St,stop_code: Kambah / Livingston St, lat: -35.3883359, lng: 149.0811471} - { name: Kambah / Livingston St,stop_code: Kambah / Livingston St, lat: -35.3902193, lng: 149.0781883}
- { name: Kambah Village,stop_code: Kambah Village, lat: -35.3800314, lng: 149.0576581} - { name: Kambah Village,stop_code: Kambah Village, lat: -35.3800314, lng: 149.0576581}
- { name: Katherine Ave / Horse Park Drive,stop_code: Katherine Ave / Horse Park Drive, lat: -35.1680901, lng: 149.1321801} - { name: Katherine Ave / Horse Park Drive,stop_code: Katherine Ave / Horse Park Drive, lat: -35.1688681, lng: 149.1387048}
- { name: Kerrigan / Lhotsky,stop_code: Kerrigan / Lhotsky, lat: -35.193801, lng: 149.035689} - { name: Kerrigan / Lhotsky,stop_code: Kerrigan / Lhotsky, lat: -35.193801, lng: 149.035689}
- { name: Kings Ave / National Circuit,stop_code: Kings Ave / National Circuit, lat: -35.305004, lng: 149.13262} - { name: Kings Ave / National Circuit,stop_code: Kings Ave / National Circuit, lat: -35.305004, lng: 149.13262}
- { name: Kingston,stop_code: Kingston, lat: -35.3197448, lng: 149.1375261} - { name: Kingsford Smith / Companion,stop_code: Kingsford Smith / Companion, lat: -35.2137074, lng: 149.0461359}
  - { name: Kingston,stop_code: Kingston, lat: -35.3161906, lng: 149.1398308}
- { name: Kippax,stop_code: Kippax, lat: -35.22225, lng: 149.0195627} - { name: Kippax,stop_code: Kippax, lat: -35.22225, lng: 149.0195627}
- { name: Kippax Centre,stop_code: Kippax Centre, lat: -35.22172, lng: 149.01995} - { name: Kosciuszko / Everard,stop_code: Kosciuszko / Everard, lat: -35.1951396, lng: 149.1265593}
- { name: Kosciuszko / Everard,stop_code: Kosciuszko / Everard, lat: -35.188901, lng: 149.1216937}  
- { name: Lanyon Marketplace,stop_code: Lanyon Marketplace, lat: -35.4573, lng: 149.09199} - { name: Lanyon Marketplace,stop_code: Lanyon Marketplace, lat: -35.4573, lng: 149.09199}
- { name: Latham,stop_code: Latham, lat: -35.21848, lng: 149.03214}  
- { name: Latham Post Office,stop_code: Latham Post Office, lat: -35.21906, lng: 149.03223} - { name: Latham Post Office,stop_code: Latham Post Office, lat: -35.21906, lng: 149.03223}
- { name: Lathlain St Bus Station,stop_code: Lathlain St Bus Station, lat: -35.2396657, lng: 149.0633993} - { name: Lithgow St Terminus Fyshwick,stop_code: Lithgow St Terminus Fyshwick, lat: -35.3310543, lng: 149.1635094}
- { name: Lathlain St Bus Station (Platform 1),stop_code: Lathlain St Bus Station (Platform 1), lat: -35.2408973, lng: 149.0639887} - { name: Lyneham / Wattle St,stop_code: Lyneham / Wattle St, lat: -35.251719, lng: 149.1239146}
- { name: Lathlain St Bus Station (Platform 2),stop_code: Lathlain St Bus Station (Platform 2), lat: -35.2406038, lng: 149.0638922} - { name: Lyons,stop_code: Lyons, lat: -35.3399554, lng: 149.0763376}
- { name: Lathlain St Bus Station (Platform 3),stop_code: Lathlain St Bus Station (Platform 3), lat: -35.2400517, lng: 149.0637152}  
- { name: Lathlain St Bus Station (Platform 4),stop_code: Lathlain St Bus Station (Platform 4), lat: -35.2396657, lng: 149.0633993}  
- { name: Lathlain St Bus Station (Platform 5),stop_code: Lathlain St Bus Station (Platform 5), lat: -35.2405468, lng: 149.0636669}  
- { name: Lathlain St Bus Station (Platform 6),stop_code: Lathlain St Bus Station (Platform 6), lat: -35.2410486, lng: 149.0638326}  
- { name: Lewis Luxton/Woodcock Dr,stop_code: Lewis Luxton/Woodcock Dr, lat: -35.4422566, lng: 149.0854375}  
- { name: Lithgow St Terminus Fyshwick,stop_code: Lithgow St Terminus Fyshwick, lat: -35.3296912, lng: 149.1668153}  
- { name: Lyneham,stop_code: Lyneham, lat: -35.2523304, lng: 149.1246184}  
- { name: Lyneham High,stop_code: Lyneham High, lat: -35.2524016, lng: 149.130254}  
- { name: Lyneham / Wattle St,stop_code: Lyneham / Wattle St, lat: -35.25205, lng: 149.12524}  
- { name: Lyons,stop_code: Lyons, lat: -35.3415779, lng: 149.0765703}  
- { name: Macarthur / Miller O'Connor,stop_code: Macarthur / Miller O'Connor, lat: -35.2587584, lng: 149.1153561} - { name: Macarthur / Miller O'Connor,stop_code: Macarthur / Miller O'Connor, lat: -35.2587584, lng: 149.1153561}
- { name: Macarthur / Northbourne Ave,stop_code: Macarthur / Northbourne Ave, lat: -35.26051, lng: 149.13224} - { name: Macarthur / Northbourne Ave,stop_code: Macarthur / Northbourne Ave, lat: -35.26051, lng: 149.13224}
- { name: Macgregor,stop_code: Macgregor, lat: -35.2100645, lng: 149.0122952} - { name: Macgregor,stop_code: Macgregor, lat: -35.2100645, lng: 149.0122952}
- { name: MacKillop College Isabella Campus,stop_code: MacKillop College Isabella Campus, lat: -35.42597, lng: 149.09172} - { name: MacKillop College Isabella Campus,stop_code: MacKillop College Isabella Campus, lat: -35.42597, lng: 149.09172}
- { name: MacKillop College Wanniassa Campus,stop_code: MacKillop College Wanniassa Campus, lat: -35.4056, lng: 149.089774} - { name: MacKillop College Wanniassa Campus,stop_code: MacKillop College Wanniassa Campus, lat: -35.4056, lng: 149.089774}
- { name: Macquarie,stop_code: Macquarie, lat: -35.2483414, lng: 149.0600666} - { name: Macquarie,stop_code: Macquarie, lat: -35.2483414, lng: 149.0600666}
- { name: Majura Business Park,stop_code: Majura Business Park, lat: -35.2987, lng: 149.18561} - { name: Majura Business Park,stop_code: Majura Business Park, lat: -35.2987, lng: 149.18561}
- { name: Manning Clarke / Oodgeroo,stop_code: Manning Clarke / Oodgeroo, lat: -35.193236, lng: 149.146534} - { name: Manning Clarke / Oodgeroo,stop_code: Manning Clarke / Oodgeroo, lat: -35.193236, lng: 149.146534}
- { name: Manuka,stop_code: Manuka, lat: -35.3200096, lng: 149.1341344} - { name: Manuka,stop_code: Manuka, lat: -35.3200096, lng: 149.1341344}
- { name: Manuka / Captain Cook Cres,stop_code: Manuka / Captain Cook Cres, lat: -35.3217, lng: 149.13445} - { name: Manuka / Captain Cook Cres,stop_code: Manuka / Captain Cook Cres, lat: -35.3217, lng: 149.13445}
- { name: McKellar,stop_code: McKellar, lat: -35.2174267, lng: 149.0742108} - { name: McKellar,stop_code: McKellar, lat: -35.2174267, lng: 149.0742108}
- { name: Melba,stop_code: Melba, lat: -35.2083104, lng: 149.0485366} - { name: Melba,stop_code: Melba, lat: -35.2083104, lng: 149.0485366}
- { name: Mentone View / Tharwa Drive,stop_code: Mentone View / Tharwa Drive, lat: -35.45144, lng: 149.0919} - { name: Mentone View / Tharwa Drive,stop_code: Mentone View / Tharwa Drive, lat: -35.45144, lng: 149.0919}
- { name: Merici College,stop_code: Merici College, lat: -35.266525, lng: 149.137037} - { name: Merici College,stop_code: Merici College, lat: -35.266525, lng: 149.137037}
- { name: Mirrabei Drive / Dam Wall,stop_code: Mirrabei Drive / Dam Wall, lat: -35.177453, lng: 149.124291} - { name: Mirrabei Drive / Dam Wall,stop_code: Mirrabei Drive / Dam Wall, lat: -35.177453, lng: 149.124291}
- { name: Monash,stop_code: Monash, lat: -35.4190254, lng: 149.0834805} - { name: Monash Goodwin Village,stop_code: Monash Goodwin Village, lat: -35.4152914, lng: 149.0947375}
- { name: Monash Goodwin Village,stop_code: Monash Goodwin Village, lat: -35.421084, lng: 149.097438}  
- { name: Monash Primary,stop_code: Monash Primary, lat: -35.414879, lng: 149.089411} - { name: Monash Primary,stop_code: Monash Primary, lat: -35.414879, lng: 149.089411}
- { name: Mount Neighbour School,stop_code: Mount Neighbour School, lat: -35.382445, lng: 149.051518} - { name: Mount Neighbour School,stop_code: Mount Neighbour School, lat: -35.382445, lng: 149.051518}
- { name: Narrabundah,stop_code: Narrabundah, lat: -35.332605, lng: 149.154049}  
- { name: Narrabundah College,stop_code: Narrabundah College, lat: -35.3362106, lng: 149.1471005} - { name: Narrabundah College,stop_code: Narrabundah College, lat: -35.3362106, lng: 149.1471005}
- { name: Narrabundah Terminus,stop_code: Narrabundah Terminus, lat: -35.332605, lng: 149.154049} - { name: Narrabundah Terminus,stop_code: Narrabundah Terminus, lat: -35.3311332, lng: 149.1584454}
- { name: National Circ / Canberra Ave,stop_code: National Circ / Canberra Ave, lat: -35.31407, lng: 149.13011} - { name: National Circ / Canberra Ave,stop_code: National Circ / Canberra Ave, lat: -35.31407, lng: 149.13011}
- { name: National Hockey Centre Lyneham,stop_code: National Hockey Centre Lyneham, lat: -35.2446729, lng: 149.1288303} - { name: National Hockey Centre Lyneham,stop_code: National Hockey Centre Lyneham, lat: -35.2446729, lng: 149.1288303}
- { name: National Museum of Australia,stop_code: National Museum of Australia, lat: -35.29248, lng: 149.1205367} - { name: National Museum of Australia,stop_code: National Museum of Australia, lat: -35.29248, lng: 149.1205367}
- { name: National Zoo and Aquarium,stop_code: National Zoo and Aquarium, lat: -35.29915, lng: 149.07025} - { name: National Zoo and Aquarium,stop_code: National Zoo and Aquarium, lat: -35.29915, lng: 149.07025}
- { name: Newcastle Street after Isa Street,stop_code: Newcastle Street after Isa Street, lat: -35.3255, lng: 149.173291} - { name: Newcastle Street after Isa Street,stop_code: Newcastle Street after Isa Street, lat: -35.3255, lng: 149.173291}
- { name: Ngunnawal Primary,stop_code: Ngunnawal Primary, lat: -35.1688551, lng: 149.1112569} - { name: Ngunnawal Primary,stop_code: Ngunnawal Primary, lat: -35.1688551, lng: 149.1112569}
- { name: Nicholls Primary,stop_code: Nicholls Primary, lat: -35.1905592, lng: 149.0876716} - { name: Nicholls Primary,stop_code: Nicholls Primary, lat: -35.1836886, lng: 149.099298}
- { name: Northbourne Avenue / Antill St,stop_code: Northbourne Avenue / Antill St, lat: -35.248287, lng: 149.134241} - { name: Northbourne Avenue / Antill St,stop_code: Northbourne Avenue / Antill St, lat: -35.248287, lng: 149.134241}
- { name: North Lyneham,stop_code: North Lyneham, lat: -35.2385618, lng: 149.1221188} - { name: North Lyneham,stop_code: North Lyneham, lat: -35.2401925, lng: 149.1255722}
- { name: O'Connor,stop_code: O'Connor, lat: -35.2640376, lng: 149.1226107} - { name: O'Connor,stop_code: O'Connor, lat: -35.2640376, lng: 149.1226107}
- { name: Olims Hotel,stop_code: Olims Hotel, lat: -35.27597, lng: 149.1428} - { name: Olims Hotel,stop_code: Olims Hotel, lat: -35.27597, lng: 149.1428}
- { name: Outtrim / Duggan,stop_code: Outtrim / Duggan, lat: -35.435871, lng: 149.097692} - { name: Outtrim / Duggan,stop_code: Outtrim / Duggan, lat: -35.435871, lng: 149.097692}
- { name: Page,stop_code: Page, lat: -35.2360695, lng: 149.0536554} - { name: Page,stop_code: Page, lat: -35.2400611, lng: 149.0523318}
- { name: Parliament House,stop_code: Parliament House, lat: -35.3081571, lng: 149.1244592} - { name: Parliament House,stop_code: Parliament House, lat: -35.3081571, lng: 149.1244592}
- { name: Paul Coe / Mirrabei Dr,stop_code: Paul Coe / Mirrabei Dr, lat: -35.17467, lng: 149.12005} - { name: Paul Coe / Mirrabei Dr,stop_code: Paul Coe / Mirrabei Dr, lat: -35.17467, lng: 149.12005}
- { name: Pearce,stop_code: Pearce, lat: -35.3625413, lng: 149.0815935} - { name: Pearce,stop_code: Pearce, lat: -35.3625413, lng: 149.0815935}
- { name: Police College Weston,stop_code: Police College Weston, lat: -35.33018, lng: 149.05458}  
- { name: Proctor / Mead,stop_code: Proctor / Mead, lat: -35.415305, lng: 149.127204} - { name: Proctor / Mead,stop_code: Proctor / Mead, lat: -35.415305, lng: 149.127204}
- { name: Railway Station Kingston,stop_code: Railway Station Kingston, lat: -35.319602, lng: 149.149083} - { name: Railway Station Kingston,stop_code: Railway Station Kingston, lat: -35.319602, lng: 149.149083}
- { name: Red Hill,stop_code: Red Hill, lat: -35.336505, lng: 149.131645} - { name: Red Hill,stop_code: Red Hill, lat: -35.3406993, lng: 149.1313712}
- { name: Rivett,stop_code: Rivett, lat: -35.3473758, lng: 149.0365438} - { name: Rivett,stop_code: Rivett, lat: -35.3473758, lng: 149.0365438}
- { name: Russell Offices,stop_code: Russell Offices, lat: -35.2973294, lng: 149.1508803} - { name: Russell Offices,stop_code: Russell Offices, lat: -35.2973294, lng: 149.1508803}
- { name: Sainsbury Street,stop_code: Sainsbury Street, lat: -35.3885, lng: 149.09643}  
- { name: Saint Andrews Village Hughes,stop_code: Saint Andrews Village Hughes, lat: -35.328097, lng: 149.088685} - { name: Saint Andrews Village Hughes,stop_code: Saint Andrews Village Hughes, lat: -35.328097, lng: 149.088685}
- { name: Scullin,stop_code: Scullin, lat: -35.23356, lng: 149.04056} - { name: Scullin,stop_code: Scullin, lat: -35.23356, lng: 149.04056}
- { name: Shoalhaven / Katherine Ave,stop_code: Shoalhaven / Katherine Ave, lat: -35.16823, lng: 149.12791} - { name: Shoalhaven / Katherine Ave,stop_code: Shoalhaven / Katherine Ave, lat: -35.16823, lng: 149.12791}
- { name: Southlands Mawson,stop_code: Southlands Mawson, lat: -35.3650685, lng: 149.0945962} - { name: Southlands Mawson,stop_code: Southlands Mawson, lat: -35.3650685, lng: 149.0945962}
- { name: Southwell Park,stop_code: Southwell Park, lat: -35.24573, lng: 149.1321} - { name: Southwell Park,stop_code: Southwell Park, lat: -35.24573, lng: 149.1321}
- { name: Spence,stop_code: Spence, lat: -35.194735, lng: 149.062352} - { name: Spence,stop_code: Spence, lat: -35.194735, lng: 149.062352}
- { name: Spence Terminus,stop_code: Spence Terminus, lat: -35.199684, lng: 149.0676196} - { name: Spence Terminus,stop_code: Spence Terminus, lat: -35.2007421, lng: 149.068409}
- { name: St Clare of Assisi Primary,stop_code: St Clare of Assisi Primary, lat: -35.4606284, lng: 149.0962704} - { name: St Clare of Assisi Primary,stop_code: St Clare of Assisi Primary, lat: -35.4606284, lng: 149.0962704}
- { name: St Francis Xavier Florey,stop_code: St Francis Xavier Florey, lat: -35.223951, lng: 149.0406888} - { name: St Francis Xavier Florey,stop_code: St Francis Xavier Florey, lat: -35.223951, lng: 149.0406888}
- { name: Stromlo High Waramanga,stop_code: Stromlo High Waramanga, lat: -35.3551186, lng: 149.0547624} - { name: Stromlo High Waramanga,stop_code: Stromlo High Waramanga, lat: -35.3551186, lng: 149.0547624}
- { name: St Thomas More's Campbell,stop_code: St Thomas More's Campbell, lat: -35.286717, lng: 149.156836} - { name: St Thomas More's Campbell,stop_code: St Thomas More's Campbell, lat: -35.286717, lng: 149.156836}
- { name: Sydney Ave,stop_code: Sydney Ave, lat: -35.31193, lng: 149.13105} - { name: Sydney Ave,stop_code: Sydney Ave, lat: -35.31193, lng: 149.13105}
- { name: Taverner St / Erindale Dr,stop_code: Taverner St / Erindale Dr, lat: -35.4059104, lng: 149.0809317} - { name: Taverner St / Erindale Dr,stop_code: Taverner St / Erindale Dr, lat: -35.4103948, lng: 149.0867553}
- { name: Tharwa Drive,stop_code: Tharwa Drive, lat: -35.458251, lng: 149.091652} - { name: Tharwa Drive,stop_code: Tharwa Drive, lat: -35.4440881, lng: 149.1029773}
- { name: Tharwa Drive / Knoke Ave,stop_code: Tharwa Drive / Knoke Ave, lat: -35.47281, lng: 149.08926}  
- { name: Tharwa Drive / Pockett Ave,stop_code: Tharwa Drive / Pockett Ave, lat: -35.47348, lng: 149.09178} - { name: Tharwa Drive / Pockett Ave,stop_code: Tharwa Drive / Pockett Ave, lat: -35.47348, lng: 149.09178}
- { name: Theodore,stop_code: Theodore, lat: -35.4464808, lng: 149.1234651} - { name: Theodore,stop_code: Theodore, lat: -35.4531254, lng: 149.1188345}
- { name: Tillyard / Spalding,stop_code: Tillyard / Spalding, lat: -35.199204, lng: 149.044556} - { name: Tillyard / Spalding,stop_code: Tillyard / Spalding, lat: -35.199204, lng: 149.044556}
- { name: Torrens,stop_code: Torrens, lat: -35.3730889, lng: 149.087327} - { name: Torrens,stop_code: Torrens, lat: -35.3730889, lng: 149.087327}
- { name: Tuggeranong Bus Station,stop_code: Tuggeranong Bus Station, lat: -35.41465, lng: 149.06537} - { name: Tuggeranong Bus Station,stop_code: Tuggeranong Bus Station, lat: -35.41465, lng: 149.06537}
- { name: Tuggeranong Bus Station (Platform 3),stop_code: Tuggeranong Bus Station (Platform 3), lat: -35.4147569, lng: 149.0657435} - { name: Tuggeranong Bus Station (Platform 3),stop_code: Tuggeranong Bus Station (Platform 3), lat: -35.4147569, lng: 149.0657435}
- { name: Tuggeranong Bus Station (Platform 4),stop_code: Tuggeranong Bus Station (Platform 4), lat: -35.4144924, lng: 149.0655423} - { name: Tuggeranong Bus Station (Platform 4),stop_code: Tuggeranong Bus Station (Platform 4), lat: -35.4144924, lng: 149.0655423}
- { name: Tuggeranong Bus Station (Platform 5),stop_code: Tuggeranong Bus Station (Platform 5), lat: -35.414217, lng: 149.0653492} - { name: Tuggeranong Bus Station (Platform 5),stop_code: Tuggeranong Bus Station (Platform 5), lat: -35.414217, lng: 149.0653492}
- { name: Tuggeranong Bus Station (Platform 7),stop_code: Tuggeranong Bus Station (Platform 7), lat: -35.4146761, lng: 149.0654565} - { name: Tuggeranong Bus Station (Platform 7),stop_code: Tuggeranong Bus Station (Platform 7), lat: -35.4146761, lng: 149.0654565}
- { name: Tuggeranong Bus Station (Platform 8),stop_code: Tuggeranong Bus Station (Platform 8), lat: -35.4149428, lng: 149.0656523} - { name: Tuggeranong Bus Station (Platform 8),stop_code: Tuggeranong Bus Station (Platform 8), lat: -35.4149428, lng: 149.0656523}
- { name: University of Canberra,stop_code: University of Canberra, lat: -35.2423222, lng: 149.0831522} - { name: University of Canberra,stop_code: University of Canberra, lat: -35.2423222, lng: 149.0831522}
- { name: Wanniassa High,stop_code: Wanniassa High, lat: -35.3952462, lng: 149.0852655} - { name: Wanniassa High,stop_code: Wanniassa High, lat: -35.3952462, lng: 149.0852655}
- { name: Waramanga,stop_code: Waramanga, lat: -35.3526825, lng: 149.0594712} - { name: Waramanga,stop_code: Waramanga, lat: -35.3526825, lng: 149.0594712}
- { name: War Memorial / Limestone Ave,stop_code: War Memorial / Limestone Ave, lat: -35.280477, lng: 149.149085} - { name: War Memorial / Limestone Ave,stop_code: War Memorial / Limestone Ave, lat: -35.280477, lng: 149.149085}
- { name: Watson,stop_code: Watson, lat: -35.2389399, lng: 149.1535345} - { name: Watson,stop_code: Watson, lat: -35.2374698, lng: 149.1534553}
- { name: Watson Terminus,stop_code: Watson Terminus, lat: -35.2374698, lng: 149.1534553} - { name: Watson Terminus,stop_code: Watson Terminus, lat: -35.2298957, lng: 149.1628978}
- { name: Weetangera,stop_code: Weetangera, lat: -35.248393, lng: 149.0506342} - { name: Weetangera,stop_code: Weetangera, lat: -35.248393, lng: 149.0506342}
- { name: Westfield Bus Station,stop_code: Westfield Bus Station, lat: -35.23875, lng: 149.0638} - { name: Westfield Bus Station,stop_code: Westfield Bus Station, lat: -35.23875, lng: 149.0638}
- { name: Westfield Bus Station (Platform 1),stop_code: Westfield Bus Station (Platform 1), lat: -35.23872, lng: 149.06387} - { name: Westfield Bus Station (Platform 1),stop_code: Westfield Bus Station (Platform 1), lat: -35.23872, lng: 149.06387}
- { name: Westfield Bus Station (Platform 2),stop_code: Westfield Bus Station (Platform 2), lat: -35.23882, lng: 149.0637} - { name: Westfield Bus Station (Platform 2),stop_code: Westfield Bus Station (Platform 2), lat: -35.23882, lng: 149.0637}
- { name: West Macgregor,stop_code: West Macgregor, lat: -35.21207, lng: 149.00165} - { name: West Macgregor,stop_code: West Macgregor, lat: -35.2137337, lng: 149.0037677}
- { name: Weston Creek Terminus,stop_code: Weston Creek Terminus, lat: -35.342728, lng: 149.0524906} - { name: Weston Creek Terminus,stop_code: Weston Creek Terminus, lat: -35.3439374, lng: 149.0269098}
- { name: Weston Primary,stop_code: Weston Primary, lat: -35.3305221, lng: 149.0524281} - { name: Weston Primary,stop_code: Weston Primary, lat: -35.3369272, lng: 149.0579376}
- { name: William Webb / Ginninderra Drive,stop_code: William Webb / Ginninderra Drive, lat: -35.222395, lng: 149.0706} - { name: William Webb / Ginninderra Drive,stop_code: William Webb / Ginninderra Drive, lat: -35.222395, lng: 149.0706}
- { name: Woden Bus Station,stop_code: Woden Bus Station, lat: -35.34433, lng: 149.08742} - { name: Woden Bus Station,stop_code: Woden Bus Station, lat: -35.34433, lng: 149.08742}
- { name: Woden Bus Station (Platform 10),stop_code: Woden Bus Station (Platform 10), lat: -35.3439501, lng: 149.0877369} - { name: Woden Bus Station (Platform 10),stop_code: Woden Bus Station (Platform 10), lat: -35.3439501, lng: 149.0877369}
- { name: Woden Bus Station (Platform 11),stop_code: Woden Bus Station (Platform 11), lat: -35.3439129, lng: 149.0876216} - { name: Woden Bus Station (Platform 11),stop_code: Woden Bus Station (Platform 11), lat: -35.3439129, lng: 149.0876216}
- { name: Woden Bus Station (Platform 12),stop_code: Woden Bus Station (Platform 12), lat: -35.3442094, lng: 149.0876444} - { name: Woden Bus Station (Platform 12),stop_code: Woden Bus Station (Platform 12), lat: -35.3442094, lng: 149.0876444}
- { name: Woden Bus Station (Platform 14),stop_code: Woden Bus Station (Platform 14), lat: -35.34438, lng: 149.0872662} - { name: Woden Bus Station (Platform 14),stop_code: Woden Bus Station (Platform 14), lat: -35.34438, lng: 149.0872662}
- { name: Woden Bus Station (Platform 15),stop_code: Woden Bus Station (Platform 15), lat: -35.3444271, lng: 149.0869631} - { name: Woden Bus Station (Platform 15),stop_code: Woden Bus Station (Platform 15), lat: -35.3444271, lng: 149.0869631}
- { name: Woden Bus Station (Platform 16),stop_code: Woden Bus Station (Platform 16), lat: -35.344484, lng: 149.0866144} - { name: Woden Bus Station (Platform 16),stop_code: Woden Bus Station (Platform 16), lat: -35.344484, lng: 149.0866144}
- { name: Woden Bus Station (Platform 2),stop_code: Woden Bus Station (Platform 2), lat: -35.3447574, lng: 149.0862912} - { name: Woden Bus Station (Platform 2),stop_code: Woden Bus Station (Platform 2), lat: -35.3447574, lng: 149.0862912}
- { name: Woden Bus Station (Platform 3),stop_code: Woden Bus Station (Platform 3), lat: -35.344566, lng: 149.086774} - { name: Woden Bus Station (Platform 3),stop_code: Woden Bus Station (Platform 3), lat: -35.344566, lng: 149.086774}
- { name: Woden Bus Station (Platform 4),stop_code: Woden Bus Station (Platform 4), lat: -35.3445222, lng: 149.0870436} - { name: Woden Bus Station (Platform 4),stop_code: Woden Bus Station (Platform 4), lat: -35.3445222, lng: 149.0870436}
- { name: Woden Bus Station (Platform 5),stop_code: Woden Bus Station (Platform 5), lat: -35.3444741, lng: 149.0873533} - { name: Woden Bus Station (Platform 5),stop_code: Woden Bus Station (Platform 5), lat: -35.3444741, lng: 149.0873533}
- { name: Woden Bus Station (Platform 6),stop_code: Woden Bus Station (Platform 6), lat: -35.34445, lng: 149.0875371} - { name: Woden Bus Station (Platform 6),stop_code: Woden Bus Station (Platform 6), lat: -35.34445, lng: 149.0875371}
- { name: Woden Bus Station (Platform 9),stop_code: Woden Bus Station (Platform 9), lat: -35.3442083, lng: 149.0877771} - { name: Woden Bus Station (Platform 9),stop_code: Woden Bus Station (Platform 9), lat: -35.3442083, lng: 149.0877771}
- { name: Woodcock / Clare Dennis,stop_code: Woodcock / Clare Dennis, lat: -35.4422566, lng: 149.0854375} - { name: Woodcock / Clare Dennis,stop_code: Woodcock / Clare Dennis, lat: -35.4422566, lng: 149.0854375}
- { name: Yarralumla,stop_code: Yarralumla, lat: -35.30725, lng: 149.0972} - { name: Yarralumla,stop_code: Yarralumla, lat: -35.30725, lng: 149.0972}
- { name: Andrea Place,stop_code: Wjz1ceG, lat: -35.4375289, lng: 149.0757996} - { name: Cowper Street,stop_code: Wjz5SWN, lat: -35.2535974, lng: 149.1390827}
- { name: Tarlton Place,stop_code: Wjz1kvl, lat: -35.4366017, lng: 149.0890756} - { name: Learmonth Drive,stop_code: Wjz230G, lat: -35.4032475, lng: 149.0634951}
- { name: Don Dunstan Drive,stop_code: Wjz16U7, lat: -35.4302659, lng: 149.0722593} - { name: Hurtle Avenue,stop_code: Wjz1dX2, lat: -35.4341379, lng: 149.0831762}
- { name: Salmon Place,stop_code: WjrWY3_, lat: -35.3952466, lng: 149.0527528} - { name: Copland Drive,stop_code: Wjz67xQ, lat: -35.2046532, lng: 149.0691406}
- { name: Crozier Circuit,stop_code: WjrWSUa, lat: -35.3867455, lng: 149.0504459} - { name: Baddeley Crescent,stop_code: Wjz67nz, lat: -35.2006201, lng: 149.0659965}
- { name: Mouat Street,stop_code: Wjz5LYB, lat: -35.2464052, lng: 149.1278592} - { name: King Edward Terrace,stop_code: Wjz4S1U, lat: -35.2983385, lng: 149.1296979}
- { name: Mackennal Street,stop_code: Wjz5LsC, lat: -35.2463364, lng: 149.1223897} - { name: Theodore Street,stop_code: Wjz3fCx, lat: -35.333256, lng: 149.0798309}
- { name: Clianthus Street,stop_code: Wjz5Krx, lat: -35.2529666, lng: 149.1223781} - { name: Hopetoun Circuit,stop_code: Wjz4A7o, lat: -35.3052441, lng: 149.107042}
- { name: Way Street,stop_code: Wjz5BWh, lat: -35.2591172, lng: 149.1164155} - { name: Schlich Street,stop_code: Wjz4tpE, lat: -35.3038329, lng: 149.1005569}
  - { name: Hopetoun Circuit,stop_code: Wjz4A2c, lat: -35.3082791, lng: 149.1066534}
  - { name: Lawrence Wackett Crescent,stop_code: Wjz1HEb, lat: -35.4471149, lng: 149.1245306}
  - { name: Chippindall Circuit,stop_code: Wjz1xWZ, lat: -35.4565002, lng: 149.1174205}
  - { name: Goyder Street,stop_code: Wjzb705, lat: -35.3370433, lng: 149.1505109}
  - { name: Clift Crescent,stop_code: Wjz1CdY, lat: -35.4270927, lng: 149.1090734}
  - { name: Kingsford Smith Drive,stop_code: Wjr_UPA, lat: -35.1977713, lng: 149.0605874}
  - { name: Clarey Crescent,stop_code: Wjz707Z, lat: -35.1948745, lng: 149.0637273}
  - { name: Owen Dixon Drive,stop_code: Wjz70IY, lat: -35.1970964, lng: 149.0706179}
  - { name: Copland Drive,stop_code: Wjz67BD, lat: -35.2015929, lng: 149.0686908}
  - { name: Bimbimbie Street,stop_code: Wjz68Y0, lat: -35.2413091, lng: 149.0832098}
  - { name: Bimbimbie Street,stop_code: Wjz68Ip, lat: -35.2412881, lng: 149.0809439}
  - { name: Bandjalong Crescent,stop_code: Wjz5dQt, lat: -35.2573605, lng: 149.0822652}
  - { name: Cooyong Street,stop_code: Wjz5NAQ, lat: -35.2794375, lng: 149.1349942}
  - { name: Kambah pool Road,stop_code: WjrXMN9, lat: -35.3751239, lng: 149.0489789}
  - { name: Hodgson Crescent,stop_code: Wjz3i6e, lat: -35.3603188, lng: 149.084779}
  - { name: Melrose Drive,stop_code: Wjz3k1J, lat: -35.3528521, lng: 149.0854118}
  - { name: Amy Ackman Street,stop_code: Wjz7ZaP, lat: -35.1710474, lng: 149.141884}
  - { name: Cowper Street,stop_code: Wjz5Za5, lat: -35.2588175, lng: 149.1409439}
  - { name: Gundaroo Drive,stop_code: Wjz7xp9, lat: -35.193896, lng: 149.1108506}
  - { name: Constitution Avenue,stop_code: Wjz5MsT, lat: -35.2846782, lng: 149.133671}
  - { name: Hindmarsh Drive,stop_code: WjrXBSS, lat: -35.3438051, lng: 149.0278253}
  - { name: Northbourne Avenue,stop_code: Wjz5SrO, lat: -35.2528485, lng: 149.1336705}
  - { name: Northbourne Avenue,stop_code: Wjz5Pl0, lat: -35.2681201, lng: 149.1312}
  - { name: Northbourne Avenue,stop_code: Wjz5N5h, lat: -35.2790396, lng: 149.1288222}
  - { name: Northbourne Avenue,stop_code: Wjz5RkN, lat: -35.2577065, lng: 149.1322899}
  - { name: Kitchener Street,stop_code: Wjz3uK7, lat: -35.3382669, lng: 149.1024969}
  - { name: Baldwin Drive,stop_code: Wjz6keB, lat: -35.2175697, lng: 149.0866478}
  - { name: O'Loghlen Street,stop_code: Wjr-IGJ, lat: -35.2203467, lng: 149.0373003}
  - { name: White Crescent,stop_code: Wjzd0oD, lat: -35.2874406, lng: 149.1552177}
  - { name: Parliament Drive,stop_code: Wjz4INj, lat: -35.3091118, lng: 149.1261312}
  - { name: Holman Street,stop_code: Wjz3fO2, lat: -35.3359729, lng: 149.0817737}
  - { name: Scantlebury Crescent,stop_code: Wjz1HOf, lat: -35.4453654, lng: 149.1258946}
  - { name: Lawrence Wackett Crescent,stop_code: Wjz1GsO, lat: -35.4499519, lng: 149.1226442}
  - { name: Louis Loder Street,stop_code: Wjz1G32, lat: -35.4506139, lng: 149.1174495}
  - { name: Heagney Crescent,stop_code: Wjz1TgM, lat: -35.4253782, lng: 149.1323625}
  - { name: Baskerville Street,stop_code: Wjz1LBV, lat: -35.4218605, lng: 149.1241279}
  - { name: O'Halloran Circuit,stop_code: WjrWYDO, lat: -35.3929049, lng: 149.058196}
  - { name: Canopus Crescent,stop_code: Wjz6t9w, lat: -35.21597, lng: 149.09763}
  - { name: Haydon Drive,stop_code: Wjz6hxB, lat: -35.2374959, lng: 149.0907853}
  - { name: Baldwin Drive,stop_code: Wjz6rrI, lat: -35.2252509, lng: 149.1005016}
  - { name: College Street,stop_code: Wjz681S, lat: -35.2428905, lng: 149.0745728}
  - { name: Maribyrnong Avenue,stop_code: Wjz6y90, lat: -35.2324006, lng: 149.1079069}
  - { name: Ellenborough Street,stop_code: Wjz6yzQ, lat: -35.2307289, lng: 149.1130906}
  - { name: Aikman Drive,stop_code: Wjz69ht, lat: -35.2375061, lng: 149.0768646}
  - { name: Boddington Crescent,stop_code: WjrWZA3, lat: -35.3893963, lng: 149.0571767}
  - { name: Anketell Street,stop_code: Wjz213w, lat: -35.4123171, lng: 149.0633299}
  - { name: Athllon Drive,stop_code: Wjz3gQn, lat: -35.3725942, lng: 149.0931105}
  - { name: Athllon Drive,stop_code: Wjz3gMq, lat: -35.3757982, lng: 149.0932419}
  - { name: Baldwin Drive,stop_code: Wjz6rhW, lat: -35.2267553, lng: 149.0994502}
  - { name: Liversidge Street,stop_code: Wjz5E4O, lat: -35.2851023, lng: 149.1186022}
  - { name: Bradley Street,stop_code: Wjz3ldj, lat: -35.3447574, lng: 149.0862912}
  - { name: Pitman,stop_code: Wjz20nk, lat: -35.4147569, lng: 149.0657435}
  - { name: Bradley Street,stop_code: Wjz3lm0, lat: -35.34438, lng: 149.0872661}
  - { name: Callam Street,stop_code: Wjz3lmi, lat: -35.3442093, lng: 149.0876443}
  - { name: Pitman,stop_code: Wjz21g2, lat: -35.414217, lng: 149.0653492}
  - { name: Cohen Street,stop_code: Wjr-USa, lat: -35.2398454, lng: 149.0600442}
  - { name: Darwinia Terrace,stop_code: WjrXBWn, lat: -35.3465295, lng: 149.0286032}
  - { name: Perry Drive,stop_code: WjrXPbD, lat: -35.356823, lng: 149.0426424}
  - { name: Darwinia Terrace,stop_code: WjrXIbK, lat: -35.3514081, lng: 149.0319332}
  - { name: Darwinia Terrace,stop_code: WjrXI5u, lat: -35.3499839, lng: 149.0301495}
  - { name: Namatjira Drive,stop_code: WjrXPFn, lat: -35.358206, lng: 149.0478792}
  - { name: Fremantle Drive,stop_code: WjrXQO9, lat: -35.352521, lng: 149.0490119}
  - { name: Parkinson Street,stop_code: WjrX-90, lat: -35.3423165, lng: 149.0529937}
  - { name: Parkinson Street,stop_code: WjrXZv3, lat: -35.3434037, lng: 149.0557375}
  - { name: Hopetoun Circuit,stop_code: Wjz4z9H, lat: -35.3145885, lng: 149.1087065}
  - { name: Langton Crescent,stop_code: Wjz4KVc, lat: -35.2979705, lng: 149.1272674}
  - { name: Sainsbury Street,stop_code: Wjz2t4u, lat: -35.389126, lng: 149.096025}
  - { name: Castleton Crescent,stop_code: Wjz2wnQ, lat: -35.4147625, lng: 149.1103909}
  - { name: Longmore Crescent,stop_code: Wjz2lAS, lat: -35.389126, lng: 149.0910254}
  - { name: Yiman Street,stop_code: WjrXYVm, lat: -35.3528022, lng: 149.0616284}
  - { name: Gladstone Street,stop_code: Wjzch4h, lat: -35.3236753, lng: 149.1727255}
  - { name: Moonlight Avenue,stop_code: Wjzf1mZ, lat: -35.1901394, lng: 149.154362}
  - { name: Ratcliffe Crescent,stop_code: Wjr-Ws2, lat: -35.230167, lng: 149.0557628}
  - { name: Anthony Rolfe Avenue,stop_code: Wjzf24l, lat: -35.1860007, lng: 149.1507571}
  - { name: Erldunda Circuit,stop_code: WjrZKZn, lat: -35.2510294, lng: 149.0396391}
  - { name: Badimara Street,stop_code: WjrXXNb, lat: -35.3584898, lng: 149.060019}
  - { name: Denison Street,stop_code: Wjz4hPC, lat: -35.323921, lng: 149.0935136}
  - { name: Groom Street,stop_code: Wjz4gou, lat: -35.3314972, lng: 149.0892541}
  - { name: Shiels Place,stop_code: Wjz4arc, lat: -35.3185933, lng: 149.0779149}
  - { name: Mair Place,stop_code: Wjz48dZ, lat: -35.3281016, lng: 149.0761465}
  - { name: Carruthers Street,stop_code: Wjz48qI, lat: -35.3302472, lng: 149.0785498}
  - { name: Burnie Street,stop_code: Wjz3d3K, lat: -35.3459087, lng: 149.0743512}
  - { name: Namatjira Drive,stop_code: WjrX-sE, lat: -35.3402511, lng: 149.0565615}
  - { name: Newman Morris Circuit,stop_code: Wjz29Ya, lat: -35.4114741, lng: 149.0833189}
  - { name: Cusack Place,stop_code: Wjr_Ow3, lat: -35.1889085, lng: 149.0461463}
  - { name: Southern Cross Drive,stop_code: Wjr-s5D, lat: -35.2180783, lng: 149.0083939}
  - { name: Wiluna Street,stop_code: Wjzc8l0, lat: -35.3285713, lng: 149.1642018}
  - { name: Daley Crescent,stop_code: Wjr_Nwy, lat: -35.1944531, lng: 149.0468698}
  - { name: Goyder Street,stop_code: Wjz3-aW, lat: -35.3414521, lng: 149.1420263}
  - { name: Bingley Crescent,stop_code: Wjr_Vbj, lat: -35.1923583, lng: 149.0533723}
  - { name: Jarrahdale Street,stop_code: WjrXWQ8, lat: -35.3621767, lng: 149.0600261}
  - { name: Adinda Street,stop_code: WjrXYL4, lat: -35.3488355, lng: 149.0584095}
  - { name: Bangalay Crescent,stop_code: WjrXQ65, lat: -35.349419, lng: 149.040696}
  - { name: Tantangara Street,stop_code: WjrXKBE, lat: -35.3395611, lng: 149.0360582}
  - { name: Dixon Drive,stop_code: WjrYMHm, lat: -35.3294538, lng: 149.0477466}
  - { name: Blackwood Terrace,stop_code: WjrXTIp, lat: -35.3346742, lng: 149.0480789}
  - { name: Bingley Crescent,stop_code: Wjr_V2c, lat: -35.192985, lng: 149.0517177}
  - { name: Glenmaggie Street,stop_code: WjrXLgs, lat: -35.3371612, lng: 149.0328459}
  - { name: McCay Place,stop_code: Wjz39PE, lat: -35.3683683, lng: 149.0827167}
  - { name: Dakota Drive,stop_code: Wjzcuw1, lat: -35.2989793, lng: 149.188937}
  - { name: Kerrigan Street,stop_code: Wjr_xLL, lat: -35.1892698, lng: 149.0264062}
  - { name: Shakespeare Crescent,stop_code: Wjr_FXR, lat: -35.1922038, lng: 149.0402464}
  - { name: Bingley Crescent,stop_code: Wjr_Vt9, lat: -35.191134, lng: 149.055871}
  - { name: Tillyard Drive,stop_code: Wjr-Tf_, lat: -35.2002734, lng: 149.0432168}
  - { name: Osburn Drive,stop_code: Wjr-tbm, lat: -35.2140927, lng: 149.0093105}
  - { name: Kerrigan Street,stop_code: Wjr_o_j, lat: -35.1950629, lng: 149.0175978}
  - { name: Kerrigan Street,stop_code: Wjr_oJA, lat: -35.1964177, lng: 149.0152805}
  - { name: Archdall Street,stop_code: Wjr-vJY, lat: -35.2019113, lng: 149.0157184}
  - { name: Brownless Street,stop_code: Wjr-s_F, lat: -35.2172009, lng: 149.0180976}
  - { name: Krefft Street,stop_code: Wjr-Q8c, lat: -35.2217975, lng: 149.042121}
  - { name: Starke Street,stop_code: Wjr-sV3, lat: -35.2212162, lng: 149.0172455}
  - { name: Spofforth Street,stop_code: Wjr-jRn, lat: -35.2235756, lng: 149.0053113}
  - { name: Beaurepaire Crescent,stop_code: Wjr-rjD, lat: -35.2249706, lng: 149.0111289}
  - { name: Fullagar Crescent,stop_code: Wjr-ywh, lat: -35.2330631, lng: 149.0245222}
  - { name: Starke Street,stop_code: Wjr-zWb, lat: -35.2259772, lng: 149.0283569}
  - { name: Fullagar Crescent,stop_code: Wjr-xLK, lat: -35.2332476, lng: 149.0263679}
  - { name: Tanumbirini Street,stop_code: Wjr-Ekp, lat: -35.2412759, lng: 149.032879}
  - { name: Hennessy Street,stop_code: Wjz57T_, lat: -35.2441569, lng: 149.0719751}
  - { name: Crisp Circuit,stop_code: Wjz68g-, lat: -35.2436119, lng: 149.0775571}
  - { name: Federal Highway,stop_code: Wjze2va, lat: -35.2281576, lng: 149.1547483}
  - { name: Krantzcke Circuit,stop_code: Wjz7pfP, lat: -35.189616, lng: 149.0978803}
  - { name: Temperley Street,stop_code: Wjz7iG_, lat: -35.1872252, lng: 149.0926713}
  - { name: McClelland Avenue,stop_code: Wjz7i7r, lat: -35.1841251, lng: 149.0850218}
  - { name: Oldershaw Court,stop_code: Wjz7qvq, lat: -35.1841768, lng: 149.1001944}
  - { name: Biddell Place,stop_code: Wjz7rMm, lat: -35.1831434, lng: 149.104114}
  - { name: Gilmore Crescent,stop_code: Wjz3Bea, lat: -35.3442178, lng: 149.1080098}
  - { name: Anthony Rolfe Avenue,stop_code: Wjz7WRq, lat: -35.1855476, lng: 149.1482315}
  - { name: Longmore Crescent,stop_code: Wjz2sPc, lat: -35.3954933, lng: 149.1039}
  - { name: Norriss Street,stop_code: Wjz2E43, lat: -35.4169003, lng: 149.1175471}
  - { name: Heagney Crescent,stop_code: Wjz1Lxi, lat: -35.4244718, lng: 149.1234372}
  - { name: Deamer Crescent,stop_code: Wjz1Kwp, lat: -35.4308013, lng: 149.1235016}
  - { name: Clift Crescent,stop_code: Wjz1K3c, lat: -35.4284584, lng: 149.1176436}
  - { name: Tharwa Drive,stop_code: Wjz1rQ2, lat: -35.4444028, lng: 149.1038463}
  - { name: Heagney Crescent,stop_code: Wjz1KTJ, lat: -35.4256696, lng: 149.1266129}
  - { name: Bugden Avenue,stop_code: Wjz2wcE, lat: -35.4171364, lng: 149.1088245}
  - { name: Fincham Crescent,stop_code: Wjz2bJV, lat: -35.399901, lng: 149.0816269}
  - { name: Southern Cross Drive,stop_code: Wjr-HhG, lat: -35.2267451, lng: 149.033272}
  - { name: Longmore Crescent,stop_code: Wjz2lSC, lat: -35.387814, lng: 149.093493}
  - { name: Downard Street,stop_code: Wjz1sjb, lat: -35.4395254, lng: 149.0985034}
  - { name: Davenport Street,stop_code: Wjz3eeL, lat: -35.3382488, lng: 149.0758602}
  - { name: Stuart Street,stop_code: Wjz4NQF, lat: -35.3236228, lng: 149.1376314}
  - { name: Flemington Road,stop_code: Wjz7WVd, lat: -35.1880905, lng: 149.149283}
  - { name: Companion Crescent,stop_code: Wjr-Sbz, lat: -35.2087898, lng: 149.0426061}
  - { name: Fremantle Drive,stop_code: WjrXQRP, lat: -35.3502995, lng: 149.0498588}
  - { name: Namatjira Drive,stop_code: WjrXZw7, lat: -35.3478405, lng: 149.0570686}
  - { name: Namatjira Drive,stop_code: WjrX-l4, lat: -35.3392378, lng: 149.0544079}
  - { name: Nemarang Crescent,stop_code: WjrXXSj, lat: -35.3550948, lng: 149.0601049}
  - { name: Bangalay Crescent,stop_code: WjrXJxI, lat: -35.3474117, lng: 149.0359435}
  - { name: Marr Street,stop_code: Wjz3ilp, lat: -35.3614122, lng: 149.0878174}
  - { name: Carruthers Street,stop_code: Wjz4h1M, lat: -35.3258199, lng: 149.0856502}
  - { name: Starke Street,stop_code: Wjr-H48, lat: -35.2249002, lng: 149.0298281}
  - { name: Fullagar Crescent,stop_code: Wjr-yt4, lat: -35.2293611, lng: 149.0227471}
  - { name: Hurtle Avenue,stop_code: Wjz1lat, lat: -35.43454, lng: 149.0864163}
  - { name: Furneaux Street,stop_code: Wjz4O0J, lat: -35.3205589, lng: 149.1293434}
  - { name: Boddington Crescent,stop_code: WjrWSUa, lat: -35.3867455, lng: 149.0504459}
  - { name: Brigalow Street,stop_code: Wjz5Krx, lat: -35.2529666, lng: 149.1223781}
  - { name: Jabanungga Avenue,stop_code: Wjz7tOr, lat: -35.1710517, lng: 149.1042404}
  - { name: Horse Park Drive,stop_code: Wjz7tvK, lat: -35.1673308, lng: 149.1005105}
  - { name: Wanganeen Avenue,stop_code: Wjz7Bg7, lat: -35.1720853, lng: 149.109298}
  - { name: Wanganeen Avenue,stop_code: Wjz7BJK, lat: -35.1687262, lng: 149.1142923}
  - { name: Amagula Avenue,stop_code: Wjz7AEw, lat: -35.1781829, lng: 149.1141659}
  - { name: Milari Street,stop_code: Wjz7HfF, lat: -35.178803, lng: 149.1197924}
  - { name: Tyenna Close,stop_code: Wjz7JP1, lat: -35.1705349, lng: 149.1257982}
  - { name: Katherine Avenue,stop_code: Wjz7R5z, lat: -35.1690363, lng: 149.1291488}
  - { name: Tesselaar Street,stop_code: Wjz7X3O, lat: -35.1814007, lng: 149.1404901}
  - { name: The Valley Avenue,stop_code: Wjz7Gxm, lat: -35.188002, lng: 149.1234035}
  - { name: Kosciuszko Avenue,stop_code: Wjz7F5C, lat: -35.1906966, lng: 149.118141}
  - { name: Kosciuszko Avenue,stop_code: Wjz7Ezf, lat: -35.1975304, lng: 149.1231277}
  - { name: Brookes Street,stop_code: Wjz6Z8D, lat: -35.216009, lng: 149.1414929}
  - { name: Brookes Street,stop_code: Wjz6Yc1, lat: -35.2193016, lng: 149.1407817}
  - { name: Flemington Road,stop_code: Wjz6XiO, lat: -35.226071, lng: 149.143256}
  - { name: Federal Highway,stop_code: Wjze3Vq, lat: -35.2267416, lng: 149.1606727}
  - { name: Fison Street,stop_code: Wjze8bf, lat: -35.2414165, lng: 149.1630705}
  - { name: Dickinson Street,stop_code: Wjze1c2, lat: -35.2356747, lng: 149.1518427}
  - { name: Melba Street,stop_code: Wjz6Ugw, lat: -35.2441014, lng: 149.142992}
  - { name: Madigan Street,stop_code: Wjzdfaz, lat: -35.2479426, lng: 149.1635256}
  - { name: Phillip Avenue,stop_code: Wjzd6Pn, lat: -35.2524079, lng: 149.1590701}
  - { name: Nyrang Street,stop_code: Wjzc1qE, lat: -35.3251161, lng: 149.1555115}
  - { name: Yamba Drive,stop_code: Wjz3mQ4, lat: -35.3398419, lng: 149.0928819}
  - { name: Gilmore Crescent,stop_code: Wjz3C9Q, lat: -35.3419855, lng: 149.108934}
  - { name: Kent Street,stop_code: Wjz4gXk, lat: -35.3296011, lng: 149.0945736}
  - { name: McCaughey Street,stop_code: Wjz5Iw8, lat: -35.2660466, lng: 149.1231132}
  - { name: Scrivener Street,stop_code: Wjz5JuJ, lat: -35.2560391, lng: 149.1225279}
  - { name: Ainslie Avenue,stop_code: Wjz5V64, lat: -35.2780918, lng: 149.1394963}
  - { name: Gooreen Street,stop_code: Wjz5Vls, lat: -35.2787911, lng: 149.1427895}
  - { name: Fairbairn Avenue,stop_code: Wjzd8br, lat: -35.2857037, lng: 149.16333}
  - { name: Blamey Crescent,stop_code: Wjz5UHK, lat: -35.2854924, lng: 149.1472635}
  - { name: Chauvel Street,stop_code: Wjzc7si, lat: -35.2905765, lng: 149.1549056}
  - { name: Canberra Avenue,stop_code: Wjz4VRQ, lat: -35.3226878, lng: 149.148704}
  - { name: Bremer Street,stop_code: Wjz4MAz, lat: -35.3290192, lng: 149.1346333}
  - { name: McIntyre Street,stop_code: Wjz4UwD, lat: -35.3313913, lng: 149.1456952}
  - { name: Kootara Crescent,stop_code: Wjzb7nW, lat: -35.3324815, lng: 149.1544899}
  - { name: Goyder Street,stop_code: Wjzb7wf, lat: -35.3368722, lng: 149.1561338}
  - { name: Narrabundah Lane,stop_code: Wjzb4vx, lat: -35.3490259, lng: 149.1553622}
  - { name: Newcastle Street,stop_code: Wjzc9WV, lat: -35.3250576, lng: 149.1722805}
  - { name: Gladstone Street,stop_code: WjzchQP, lat: -35.3235189, lng: 149.1817987}
  - { name: Antill Street,stop_code: Wjzd72S, lat: -35.2476842, lng: 149.1515789}
  - { name: Lambrigg Street,stop_code: Wjz3oih, lat: -35.3744422, lng: 149.0986886}
  - { name: Beasley Street,stop_code: Wjz3gcu, lat: -35.3726637, lng: 149.0864364}
  - { name: Beasley Street,stop_code: Wjz3gB5, lat: -35.3720623, lng: 149.0900243}
  - { name: Gundaroo Drive,stop_code: Wjz7PQK, lat: -35.1804441, lng: 149.1376744}
  - { name: Mirrabei Drive,stop_code: Wjz7CKo, lat: -35.1631057, lng: 149.1139536}
  - { name: Coyne Street,stop_code: Wjz2F_q, lat: -35.4093651, lng: 149.1276548}
  - { name: Learmonth Drive,stop_code: WjrWQRL, lat: -35.3938608, lng: 149.049706}
  - { name: Boddington Crescent,stop_code: WjrWSX9, lat: -35.3847561, lng: 149.0504459}
  - { name: Wheeler Crescent,stop_code: Wjz2khI, lat: -35.3968751, lng: 149.08815}
  - { name: Were Street,stop_code: Wjz1IhB, lat: -35.4407491, lng: 149.1209803}
  - { name: Longmore Crescent,stop_code: Wjz2sN9, lat: -35.3971025, lng: 149.1039429}
  - { name: Partridge Street,stop_code: Wjz2zNZ, lat: -35.4023147, lng: 149.1160557}
  - { name: Giles Street,stop_code: Wjz4OOr, lat: -35.3193771, lng: 149.1373203}
  - { name: Castleton Crescent,stop_code: Wjz2pW_, lat: -35.4123885, lng: 149.1062979}
  - { name: Clive Steele Avenue,stop_code: Wjz2pC1, lat: -35.4101412, lng: 149.1011212}
  - { name: Clive Steele Avenue,stop_code: Wjz2o7y, lat: -35.414898, lng: 149.0962718}
  - { name: Clare Dennis Avenue,stop_code: Wjz1jim, lat: -35.4454866, lng: 149.0877316}
  - { name: Longmore Crescent,stop_code: Wjz2t7A, lat: -35.3872717, lng: 149.0961967}
  - { name: Tom Roberts Avenue,stop_code: Wjz1oP8, lat: -35.4617393, lng: 149.1040287}
  - { name: Templestowe Avenue,stop_code: Wjz1woz, lat: -35.4635395, lng: 149.1113243}
  - { name: Tom Roberts Avenue,stop_code: Wjz0vfE, lat: -35.4644832, lng: 149.0977524}
  - { name: Pocket Avenue,stop_code: Wjz0v2g, lat: -35.4679435, lng: 149.0958641}
  - { name: Knoke Avenue,stop_code: Wjz0mvg, lat: -35.4699707, lng: 149.0890405}
  - { name: Longmore Crescent,stop_code: Wjz2tl5, lat: -35.3885837, lng: 149.0982781}
  - { name: Murdoch Street,stop_code: Wjz5SjK, lat: -35.2525469, lng: 149.1321597}
  - { name: Mouat Street,stop_code: Wjz5L_c, lat: -35.2444379, lng: 149.1272298}
  - { name: Jerrabomberra Avenue,stop_code: Wjz3_Ow, lat: -35.336122, lng: 149.1483495}
  - { name: Archibald Street,stop_code: Wjz5LSr, lat: -35.2452046, lng: 149.1262374}
  - { name: Tyagarah Street,stop_code: Wjz3s-P, lat: -35.3495819, lng: 149.106153}
  - { name: Ngunawal Drive,stop_code: Wjz3yfH, lat: -35.3598722, lng: 149.1087065}
  - { name: Julia Flynn Avenue,stop_code: Wjz3wJD, lat: -35.3718847, lng: 149.1141353}
  - { name: Lambrigg Street,stop_code: Wjz2D3z, lat: -35.3791456, lng: 149.1071508}
  - { name: Stuart Street,stop_code: Wjz4NJT, lat: -35.3225023, lng: 149.1363654}
  - { name: Northbourne Avenue,stop_code: Wjz5N5k, lat: -35.2787905, lng: 149.1288627}
  - { name: Tillyard Drive,stop_code: Wjr-LNq, lat: -35.2048275, lng: 149.0383141}
  - { name: Mackennal Street,stop_code: Wjz5Lpi, lat: -35.2487591, lng: 149.1218966}
  - { name: Haydon Drive,stop_code: Wjz5maK, lat: -35.2532079, lng: 149.0867657}
  - { name: Flinders Way,stop_code: Wjz4Ox0, lat: -35.3203301, lng: 149.1339648}
  - { name: Kingscote Crescent,stop_code: Wjz1egm, lat: -35.4303788, lng: 149.076696}
  - { name: Flinders Way,stop_code: Wjz4OpP, lat: -35.320064, lng: 149.1335699}
  - { name: Ashkanasy Crescent,stop_code: Wjz66kP, lat: -35.2081588, lng: 149.066382}
  - { name: Copland Drive,stop_code: Wjz664q, lat: -35.2082119, lng: 149.0631086}
  - { name: Bateson Road,stop_code: Wjz3toH, lat: -35.3482518, lng: 149.1004882}
  - { name: Miller Street,stop_code: Wjz5CW3, lat: -35.2534813, lng: 149.1160707}
  - { name: Fairfax Street,stop_code: Wjz5BaH, lat: -35.2589798, lng: 149.1087583}
  - { name: Dumas Street,stop_code: Wjz6c8c, lat: -35.2217598, lng: 149.0751026}
  - { name: Bennetts Close,stop_code: Wjz6c7A, lat: -35.2169478, lng: 149.074177}
  - { name: Kerrigan Street,stop_code: Wjr_F9a, lat: -35.1938253, lng: 149.031231}
  - { name: Handcock Crescent,stop_code: Wjr-CnE, lat: -35.206318, lng: 149.0223041}
  - { name: Spofforth Street,stop_code: Wjr-kZV, lat: -35.2186221, lng: 149.0075381}
  - { name: Robert Campbell Road,stop_code: Wjzceyq, lat: -35.2975234, lng: 149.1674683}
  - { name: Collie Street,stop_code: WjzcgLt, lat: -35.3267279, lng: 149.1797667}
  - { name: Wormald Street,stop_code: Wjzbfr6, lat: -35.3349204, lng: 149.1655287}
  - { name: Ipswich Street,stop_code: Wjzc8c1, lat: -35.3291272, lng: 149.1628031}
  - { name: Angliss Place,stop_code: Wjz2rtc, lat: -35.3996562, lng: 149.0999088}
  - { name: Barraclough Crescent,stop_code: Wjz2odG, lat: -35.416297, lng: 149.0977738}
  - { name: Longmore Crescent,stop_code: Wjz2rKm, lat: -35.3987816, lng: 149.1026983}
  - { name: Casey Crescent,stop_code: Wjz1I92, lat: -35.4409939, lng: 149.118856}
  - { name: Goyder Street,stop_code: Wjz3-Jk, lat: -35.3392028, lng: 149.1466758}
  - { name: Canberra Avenue,stop_code: WjzbfPL, lat: -35.3348529, lng: 149.1706441}
  - { name: Lewis Luxton Avenue,stop_code: Wjz1imh, lat: -35.4486564, lng: 149.0876136}
  - { name: National Circuit,stop_code: Wjz4Pk_, lat: -35.3121631, lng: 149.1324213}
  - { name: Yamba Drive,stop_code: Wjz3mPO, lat: -35.3407241, lng: 149.0937831}
  - { name: Kitchener Street,stop_code: Wjz3vqN, lat: -35.3360119, lng: 149.1006409}
  - { name: Gilmore Crescent,stop_code: Wjz3uQf, lat: -35.339661, lng: 149.1040329}
  - { name: Ainsworth Street,stop_code: Wjz3lVM, lat: -35.3477625, lng: 149.0952366}
  - { name: Launceston Street,stop_code: Wjz3mAg, lat: -35.3402021, lng: 149.0903851}
  - { name: Kent Street,stop_code: Wjz4p2R, lat: -35.3247128, lng: 149.0966244}
  - { name: McCaughey Street,stop_code: Wjz5HDd, lat: -35.2662951, lng: 149.1231711}
  - { name: Macpherson Street,stop_code: Wjz5IjX, lat: -35.2637604, lng: 149.1215219}
  - { name: Hovea Street,stop_code: Wjz5JzP, lat: -35.2582197, lng: 149.123961}
  - { name: Alpen Street,stop_code: Wjr-_Uj, lat: -35.2054305, lng: 149.0615985}
  - { name: Russell Drive,stop_code: Wjzc54R, lat: -35.3013866, lng: 149.1515283}
  - { name: Russell Drive,stop_code: Wjz4-WZ, lat: -35.2972194, lng: 149.1503113}
  - { name: Kings Avenue,stop_code: Wjz4RFJ, lat: -35.3034224, lng: 149.1361467}
  - { name: Copland Drive,stop_code: Wjr--W0, lat: -35.2097244, lng: 149.0611869}
  - { name: MacFarland Crescent,stop_code: Wjz3bdl, lat: -35.3556201, lng: 149.075221}
  - { name: Eggleston Crescent,stop_code: Wjz3ceV, lat: -35.3497899, lng: 149.0761589}
  - { name: Kingsford Smith Drive,stop_code: Wjr-RKi, lat: -35.2123821, lng: 149.0478391}
  - { name: Verbrugghen Street,stop_code: Wjr-Zk5, lat: -35.2134943, lng: 149.0543506}
  - { name: Alpen Street,stop_code: Wjz66fw, lat: -35.2063185, lng: 149.0646037}
  - { name: Alfred Hill Drive,stop_code: Wjr--Lw, lat: -35.2063011, lng: 149.059093}
  - { name: Alfred Hill Drive,stop_code: Wjr--6k, lat: -35.2066759, lng: 149.0519744}
  - { name: Lathlain Street,stop_code: Wjz60c5, lat: -35.2408972, lng: 149.0639885}
  - { name: Daley Road,stop_code: Wjz5yXo, lat: -35.2749982, lng: 149.1166312}
  - { name: Kingsford Smith Drive,stop_code: Wjr-_3A, lat: -35.2032823, lng: 149.0522538}
  - { name: Baddeley Crescent,stop_code: Wjz67k1, lat: -35.2028461, lng: 149.0653269}
  - { name: Baddeley Crescent,stop_code: Wjz67kk, lat: -35.2025967, lng: 149.0657125}
  - { name: John Cleland Crescent,stop_code: Wjr-Xky, lat: -35.2247107, lng: 149.0549856}
  - { name: Bowman Street,stop_code: Wjz56XB, lat: -35.2526099, lng: 149.0728793}
  - { name: Fulton Street,stop_code: Wjz5711, lat: -35.2488233, lng: 149.0625779}
  - { name: London Circuit,stop_code: Wjz5Nht, lat: -35.281465, lng: 149.131837}
  - { name: Yamba Drive,stop_code: Wjz3mQ5, lat: -35.339761, lng: 149.0927558}
  - { name: Moynihan Street,stop_code: Wjz65rA, lat: -35.2142446, lng: 149.0673143}
  - { name: Moynihan Street,stop_code: Wjz65Hy, lat: -35.2143691, lng: 149.0701627}
  - { name: Clancy Street,stop_code: Wjz66XM, lat: -35.2090851, lng: 149.0732672}
  - { name: Marconi Crescent,stop_code: WjrW_Qk, lat: -35.3783254, lng: 149.0600973}
  - { name: Marconi Crescent,stop_code: Wjz27k8, lat: -35.3787048, lng: 149.065524}
  - { name: Summerland Circuit,stop_code: Wjz26P8, lat: -35.3848854, lng: 149.0709314}
  - { name: Summerland Circuit,stop_code: Wjz2def, lat: -35.3876959, lng: 149.0750942}
  - { name: O'Halloran Circuit,stop_code: Wjz24vP, lat: -35.3928088, lng: 149.0677265}
  - { name: O'Halloran Circuit,stop_code: Wjz24cK, lat: -35.3946419, lng: 149.0647484}
  - { name: Vansittart Crescent,stop_code: Wjz2347, lat: -35.4000362, lng: 149.0625}
  - { name: Callaway Crescent,stop_code: Wjz18KG, lat: -35.459505, lng: 149.0813694}
  - { name: Cossington Smith Crescent,stop_code: Wjz6EIv, lat: -35.2407183, lng: 149.1248641}
  - { name: Lewis Luxton Avenue,stop_code: Wjz1igo, lat: -35.4528675, lng: 149.0877906}
  - { name: Carnegie Cresent,stop_code: Wjz3_kV, lat: -35.3346691, lng: 149.1435001}
  - { name: Ginninderra Drive,stop_code: Wjr-DF9, lat: -35.2048888, lng: 149.0256331}
  - { name: Yambina Crescent,stop_code: WjrXXGN, lat: -35.3580173, lng: 149.0594611}
  - { name: Marrawah Street,stop_code: Wjz3eSa, lat: -35.3387126, lng: 149.0819166}
  - { name: Fullagar Crescent,stop_code: Wjr-ypw, lat: -35.2324635, lng: 149.0233908}
  - { name: Castieau Street,stop_code: Wjr-yYy, lat: -35.2301674, lng: 149.0289912}
  - { name: Isabella Drive,stop_code: Wjz1nzY, lat: -35.4229506, lng: 149.0912343}
  - { name: Taverner Street,stop_code: Wjz2b8J, lat: -35.4029944, lng: 149.0757807}
  - { name: Cowper Street,stop_code: Wjz5Z5c, lat: -35.2568022, lng: 149.1396491}
  - { name: Newman Morris Circuit,stop_code: Wjz2aGG, lat: -35.4073408, lng: 149.0812511}
  - { name: Newman Morris Circuit,stop_code: Wjz2arg, lat: -35.4068086, lng: 149.0779936}
  - { name: William Webb Drive,stop_code: Wjz6dtx, lat: -35.2131085, lng: 149.0784233}
  - { name: Newman Morris Circuit,stop_code: Wjz29ea, lat: -35.4101319, lng: 149.0751278}
  - { name: Boldrewood Street,stop_code: Wjz5zOq, lat: -35.2700411, lng: 149.1153216}
  - { name: Hebblewhite Street,stop_code: Wjz2haF, lat: -35.4129406, lng: 149.0867361}
  - { name: Harricks Crescent,stop_code: Wjz2iEO, lat: -35.40876, lng: 149.0925039}
  - { name: Kalgoorlie Crescent,stop_code: WjrXWsn, lat: -35.3616093, lng: 149.055979}
  - { name: Beasley Street,stop_code: Wjz3hu6, lat: -35.3658261, lng: 149.0887408}
  - { name: Laverton Avenue,stop_code: WjzcJ38, lat: -35.3024713, lng: 149.2056109}
  - { name: Bingley Crescent,stop_code: Wjr_N-q, lat: -35.1903433, lng: 149.0507803}
  - { name: Commonwealth Avenue,stop_code: Wjz4KO9, lat: -35.2975962, lng: 149.1259252}
  - { name: Ashkanasy Crescent,stop_code: Wjz66kG, lat: -35.2081931, lng: 149.0662542}
  - { name: Alfred Hill Drive,stop_code: Wjr--r_, lat: -35.2084885, lng: 149.0569758}
  - { name: Reg Saunders Way,stop_code: Wjz4-YV, lat: -35.2961803, lng: 149.1503194}
  - { name: Melrose Drive,stop_code: Wjz3eZ4, lat: -35.3392098, lng: 149.0831308}
  - { name: Eggleston Crescent,stop_code: Wjz3ceY, lat: -35.3495185, lng: 149.0761236}
  - { name: Verbrugghen Street,stop_code: Wjr-RZE, lat: -35.2132014, lng: 149.0511677}
  - { name: Verbrugghen Street,stop_code: Wjr-ZBY, lat: -35.2128526, lng: 149.0583185}
  - { name: Alfred Hill Drive,stop_code: Wjr--m3, lat: -35.2067416, lng: 149.0543264}
  - { name: Lathlain Street,stop_code: Wjz604Y, lat: -35.2410486, lng: 149.0638326}
  - { name: Kingsford Smith Drive,stop_code: Wjr-_kG, lat: -35.2027328, lng: 149.0551853}
  - { name: John Cleland Crescent,stop_code: Wjr-Yg7, lat: -35.2215188, lng: 149.0543538}
  - { name: John Cleland Crescent,stop_code: Wjr-XyN, lat: -35.226202, lng: 149.0581637}
  - { name: Launceston Street,stop_code: Wjz3m3b, lat: -35.3406241, lng: 149.0847703}
  - { name: Bandjalong Crescent,stop_code: Wjz5dCr, lat: -35.2561978, lng: 149.0795805}
  - { name: Lyttleton Crescent,stop_code: Wjz54CS, lat: -35.2614333, lng: 149.0690577}
  - { name: Templeton Street,stop_code: Wjz551Q, lat: -35.2595831, lng: 149.0636761}
  - { name: Coulter Drive,stop_code: WjrZ_o2, lat: -35.2493991, lng: 149.055711}
  - { name: Gillespie Street,stop_code: WjrZTu1, lat: -35.2453967, lng: 149.044759}
  - { name: Beetaloo Street,stop_code: WjrZT5e, lat: -35.245649, lng: 149.0408365}
  - { name: Yamba Drive,stop_code: Wjz3mI-, lat: -35.3396854, lng: 149.092654}
  - { name: Moynihan Street,stop_code: Wjz65rQ, lat: -35.2142653, lng: 149.0676927}
  - { name: Ashkanasy Crescent,stop_code: Wjz66oJ, lat: -35.2107077, lng: 149.0674989}
  - { name: Marconi Crescent,stop_code: Wjz27k0, lat: -35.3786939, lng: 149.0653235}
  - { name: Summerland Circuit,stop_code: Wjz26tw, lat: -35.38347, lng: 149.0674733}
  - { name: Vowels Crescent,stop_code: Wjz5nUS, lat: -35.2490745, lng: 149.0952032}
  - { name: O'Halloran Circuit,stop_code: Wjz24uT, lat: -35.3931517, lng: 149.0676751}
  - { name: Vansittart Crescent,stop_code: Wjz234e, lat: -35.4001412, lng: 149.0627055}
  - { name: Learmonth Drive,stop_code: Wjz230Q, lat: -35.4030936, lng: 149.0635466}
  - { name: Kingsford Smith Drive,stop_code: Wjr_UUM, lat: -35.2001188, lng: 149.062303}
  - { name: Kingsford Smith Drive,stop_code: Wjr_UTJ, lat: -35.1949558, lng: 149.0607434}
  - { name: Lousia Lawson Crescent,stop_code: Wjz2V0k, lat: -35.4140263, lng: 149.1397991}
  - { name: Martin Street,stop_code: Wjz49Ui, lat: -35.3262888, lng: 149.0835377}
  - { name: Jenkins Street,stop_code: Wjz49dp, lat: -35.3229961, lng: 149.075421}
  - { name: Badimara Street,stop_code: Wjz33CI, lat: -35.3549749, lng: 149.0689295}
  - { name: Bangalay Crescent,stop_code: WjrXIKK, lat: -35.3493279, lng: 149.0374035}
  - { name: Warragamba Avenue,stop_code: WjrYEWc, lat: -35.3302839, lng: 149.0394086}
  - { name: Tillyard Drive,stop_code: Wjr_McO, lat: -35.1972013, lng: 149.0429389}
  - { name: Lhotsky Street,stop_code: Wjr-DTC, lat: -35.2002855, lng: 149.0276101}
  - { name: Lance Hill Avenue,stop_code: Wjr_wf4, lat: -35.1950004, lng: 149.0199737}
  - { name: Copland Drive,stop_code: Wjz67_v, lat: -35.2002563, lng: 149.0727607}
  - { name: Osburn Drive,stop_code: Wjr-te3, lat: -35.2122382, lng: 149.0090273}
  - { name: Handcock Crescent,stop_code: Wjr-CsO, lat: -35.2082115, lng: 149.0237453}
  - { name: Southern Cross Drive,stop_code: Wjr-sQ8, lat: -35.2193706, lng: 149.0159919}
  - { name: Beaurepaire Crescent,stop_code: Wjr-rxG, lat: -35.2267918, lng: 149.0140227}
  - { name: Beaurepaire Crescent,stop_code: Wjr-rNr, lat: -35.226697, lng: 149.016389}
  - { name: Hardwick Crescent,stop_code: Wjr-zcC, lat: -35.2243517, lng: 149.0207165}
  - { name: Drake Brockman Drive,stop_code: Wjr-wDP, lat: -35.2389936, lng: 149.0252414}
  - { name: Ross Smith Crescent,stop_code: Wjr-F_m, lat: -35.233261, lng: 149.039515}
  - { name: Murranji Street,stop_code: Wjr-E8A, lat: -35.2437543, lng: 149.031741}
  - { name: Shumack Street,stop_code: WjrZSWs, lat: -35.2533983, lng: 149.050782}
  - { name: Coulter Drive,stop_code: WjrZZeD, lat: -35.2558247, lng: 149.0536901}
  - { name: Bugden Avenue,stop_code: Wjz2Gu5, lat: -35.404351, lng: 149.1216336}
  - { name: Sternberg Crescent,stop_code: Wjz2ri7, lat: -35.4014577, lng: 149.0982244}
  - { name: Bugden Avenue,stop_code: Wjz2z1O, lat: -35.4025246, lng: 149.1075156}
  - { name: Bugden Avenue,stop_code: Wjz2F6x, lat: -35.4102199, lng: 149.118121}
  - { name: Cockcroft Avenue,stop_code: Wjz2ob-, lat: -35.4173112, lng: 149.0981386}
  - { name: Charleston Street,stop_code: Wjz28Bd, lat: -35.4160434, lng: 149.0792451}
  - { name: Downard Street,stop_code: Wjz1sPq, lat: -35.4396128, lng: 149.1043506}
  - { name: Novar Street,stop_code: Wjz4t8Z, lat: -35.3041348, lng: 149.0981922}
  - { name: La Perouse Street,stop_code: Wjz3TDn, lat: -35.3320346, lng: 149.1342948}
  - { name: Ginninderra Drive,stop_code: Wjr-DqS, lat: -35.2037667, lng: 149.0237448}
  - { name: Larakia Street,stop_code: Wjz344h, lat: -35.3511395, lng: 149.0628944}
  - { name: Parkhill Street,stop_code: Wjz39tZ, lat: -35.3666092, lng: 149.0789018}
  - { name: McGinness Street,stop_code: Wjr-Nfn, lat: -35.2332346, lng: 149.0422735}
  - { name: Bennelong Crescent,stop_code: WjrZ-GZ, lat: -35.2532951, lng: 149.0596327}
  - { name: Braybrooke Street,stop_code: Wjz6oJz, lat: -35.2403705, lng: 149.1030403}
  - { name: MacFarland Crescent,stop_code: Wjz3bdj, lat: -35.3557447, lng: 149.0753424}
  - { name: Temperley Street,stop_code: Wjz7hZW, lat: -35.1910485, lng: 149.0953265}
  - { name: Whatmore Court,stop_code: Wjz7rzg, lat: -35.1815933, lng: 149.1014588}
  - { name: Freda Bennett Circuit,stop_code: Wjz7rRa, lat: -35.1800948, lng: 149.1039243}
  - { name: Bicentennial National Trail,stop_code: Wjz7thn, lat: -35.1713618, lng: 149.0985507}
  - { name: Wanganeen Avenue,stop_code: Wjz7BsE, lat: -35.1699148, lng: 149.1115106}
  - { name: Tuggeranong Parkway,stop_code: WjrXUAm, lat: -35.3726375, lng: 149.0574471}
  - { name: Kambah pool Road,stop_code: WjrXMFM, lat: -35.3752866, lng: 149.0485475}
  - { name: Melrose Drive,stop_code: Wjz3jei, lat: -35.3551755, lng: 149.0862349}
  - { name: Gundaroo Drive,stop_code: Wjz7xpa, lat: -35.1938349, lng: 149.1107761}
  - { name: O'Connell Street,stop_code: Wjz5YAK, lat: -35.2627902, lng: 149.1458623}
  - { name: Campbell Street,stop_code: Wjz5XnQ, lat: -35.2664452, lng: 149.1432384}
  - { name: Gooreen Street,stop_code: Wjz5W3H, lat: -35.2747063, lng: 149.1403907}
  - { name: Foveaux Street,stop_code: Wjz5Y1_, lat: -35.2648034, lng: 149.1406151}
  - { name: Ipima Street,stop_code: Wjz5PLJ, lat: -35.2663315, lng: 149.136253}
  - { name: Fawkner Street,stop_code: Wjz5OLh, lat: -35.2721844, lng: 149.135684}
  - { name: Doonkuna Street,stop_code: Wjz5OOo, lat: -35.2757106, lng: 149.1372297}
  - { name: Fairbairn Avenue,stop_code: Wjzd0CK, lat: -35.283446, lng: 149.156771}
  - { name: Vasey Crescent,stop_code: Wjzc7Ay, lat: -35.2905765, lng: 149.1566757}
  - { name: Robert Campbell Road,stop_code: WjzceHt, lat: -35.2965216, lng: 149.168833}
  - { name: Dominion Circuit,stop_code: Wjz4Ofi, lat: -35.3160439, lng: 149.1301934}
  - { name: Northbourne Avenue,stop_code: Wjz5SDc, lat: -35.2499285, lng: 149.1341368}
  - { name: Coranderrk Street,stop_code: Wjz5MI3, lat: -35.2850249, lng: 149.1353935}
  - { name: Streeton Drive,stop_code: WjrXQeH, lat: -35.3495777, lng: 149.0428125}
  - { name: Mirrabei Drive,stop_code: Wjz7BST, lat: -35.167951, lng: 149.1157463}
  - { name: Gungahlin Cycleway,stop_code: Wjz7IFg, lat: -35.1774595, lng: 149.1246602}
  - { name: Cultivation Street,stop_code: Wjzf0Zf, lat: -35.1960839, lng: 149.1602736}
  - { name: Kate Crace Street,stop_code: Wjz7W61, lat: -35.1849836, lng: 149.1395562}
  - { name: Kosciuszko Avenue,stop_code: Wjz7xO6, lat: -35.1928051, lng: 149.1147348}
  - { name: Kosciuszko Avenue,stop_code: Wjz7EJ7, lat: -35.1960839, lng: 149.1244553}
  - { name: Antill Street,stop_code: Wjze0VY, lat: -35.2430274, lng: 149.1613003}
  - { name: Moonlight Avenue,stop_code: Wjzf2op, lat: -35.1890872, lng: 149.1551345}
  - { name: Stott Street,stop_code: Wjzd6Cq, lat: -35.2507889, lng: 149.1563997}
  - { name: Brisbane Avenue,stop_code: Wjz4Qhl, lat: -35.3089153, lng: 149.1316018}
  - { name: Sir Harold Raggatt Drive,stop_code: Wjzb6EM, lat: -35.342941, lng: 149.1583643}
  - { name: Narrabundah Lane,stop_code: Wjz3YW3, lat: -35.3523419, lng: 149.1490844}
  - { name: Townsville Street,stop_code: Wjzcg-_, lat: -35.3272591, lng: 149.1832438}
  - { name: Moodie Street,stop_code: Wjz3gUQ, lat: -35.3755566, lng: 149.0951557}
  - { name: Basedow Street,stop_code: Wjz2f_R, lat: -35.3761632, lng: 149.0842481}
  - { name: Wheeler Crescent,stop_code: Wjz2civ, lat: -35.3959622, lng: 149.0767882}
  - { name: Sternberg Crescent,stop_code: Wjz2jPU, lat: -35.401368, lng: 149.0939538}
  - { name: Hambidge Crescent,stop_code: Wjz2ExG, lat: -35.4190337, lng: 149.1238556}
  - { name: Webber Crescent,stop_code: Wjz1BFG, lat: -35.4354872, lng: 149.1142337}
  - { name: Knox Street,stop_code: Wjze1fs, lat: -35.2334888, lng: 149.1522978}
  - { name: Clift Crescent,stop_code: Wjz1vMs, lat: -35.4250115, lng: 149.1042483}
  - { name: Froggatt Street,stop_code: Wjz5H0p, lat: -35.2714838, lng: 149.1180142}
  - { name: Macrossan Crescent,stop_code: Wjr-Jm9, lat: -35.2124379, lng: 149.0325045}
  - { name: Dalley Crescent,stop_code: Wjr-AY4, lat: -35.2190044, lng: 149.0282415}
  - { name: Maribyrnong Avenue,stop_code: Wjz6zon, lat: -35.2269858, lng: 149.1109391}
  - { name: Belconnen Way,stop_code: Wjr-EYe, lat: -35.2408449, lng: 149.0394925}
  - { name: Krefft Street,stop_code: Wjr-PyX, lat: -35.2259882, lng: 149.0472724}
  - { name: King George Terrace,stop_code: Wjz4RbQ, lat: -35.3021238, lng: 149.1308574}
  - { name: Andrews Street,stop_code: Wjze0l8, lat: -35.2407007, lng: 149.1533599}
  - { name: Musgrave Street,stop_code: Wjz4tUp, lat: -35.3044055, lng: 149.1056974}
  - { name: Hartung Crescent,stop_code: Wjz1zN3, lat: -35.4464057, lng: 149.1147796}
  - { name: Chippindall Circuit,stop_code: Wjz1xRC, lat: -35.4544199, lng: 149.1154761}
  - { name: Johnson Drive,stop_code: Wjz1BrK, lat: -35.4337687, lng: 149.1114553}
  - { name: Outtrim Avenue,stop_code: Wjz1tE0, lat: -35.4363442, lng: 149.1024781}
  - { name: Constitution Avenue,stop_code: Wjz4_kA, lat: -35.290428, lng: 149.1429573}
  - { name: Gundaroo Drive,stop_code: Wjz7PcG, lat: -35.1807394, lng: 149.1308015}
  - { name: Anthony Rolfe Avenue,stop_code: Wjz7WeI, lat: -35.1846679, lng: 149.1417449}
  - { name: Goodwin Street,stop_code: Wjz5Sk7, lat: -35.2517234, lng: 149.1312585}
  - { name: Antill Street,stop_code: Wjz5_N2, lat: -35.2487006, lng: 149.1476629}
  - { name: Bromby Street,stop_code: Wjz3y3C, lat: -35.3623309, lng: 149.107183}
  - { name: Hawkesbury Crescent,stop_code: Wjz2CDy, lat: -35.3819798, lng: 149.1127298}
  - { name: Horse Park Drive,stop_code: Wjz7Y64, lat: -35.1737092, lng: 149.1394124}
  - { name: Mirrabei Drive,stop_code: Wjz7If9, lat: -35.1733145, lng: 149.1190391}
  - { name: Bugden Avenue,stop_code: Wjz2ziM, lat: -35.4020349, lng: 149.1102622}
  - { name: Bugden Avenue,stop_code: Wjz2Gi8, lat: -35.4075441, lng: 149.1204868}
  - { name: Bugden Avenue,stop_code: Wjz2wuu, lat: -35.415274, lng: 149.1111044}
  - { name: Bugden Avenue,stop_code: Wjz2w2r, lat: -35.4182643, lng: 149.1070918}
  - { name: Ellerston Avenue,stop_code: Wjz1u7M, lat: -35.4260193, lng: 149.0965722}
  - { name: Stuart Street,stop_code: Wjz4V11, lat: -35.3256973, lng: 149.1394661}
  - { name: Barraclough Crescent,stop_code: Wjz2osM, lat: -35.4171276, lng: 149.1006384}
  - { name: Downard Street,stop_code: Wjz1sG6, lat: -35.4399974, lng: 149.1023765}
  - { name: Johnson Drive,stop_code: Wjz1tbe, lat: -35.4337687, lng: 149.0971677}
  - { name: Northbourne Avenue,stop_code: Wjz5RvC, lat: -35.2552151, lng: 149.1332875}
  - { name: Northbourne Avenue,stop_code: Wjz5PdJ, lat: -35.2676612, lng: 149.1306865}
  - { name: Cameron Avenue,stop_code: Wjz60QI, lat: -35.2410106, lng: 149.0717141}
  - { name: Cameron Avenue,stop_code: Wjz60Qc, lat: -35.2410063, lng: 149.0710758}
  - { name: Chuculba Crescent,stop_code: Wjz6u3h, lat: -35.2089622, lng: 149.095889}
  - { name: Maribyrnong Avenue,stop_code: Wjz6sZ1, lat: -35.21859, lng: 149.10511}
  - { name: O'Halloran Circuit,stop_code: WjrWYHH, lat: -35.3956133, lng: 149.0592665}
  - { name: O'Halloran Circuit,stop_code: WjrWYHE, lat: -35.3958129, lng: 149.0592983}
  - { name: Haydon Drive,stop_code: Wjz5nwb, lat: -35.2493711, lng: 149.0901523}
  - { name: Bindubi Street,stop_code: Wjz55V-, lat: -35.2594169, lng: 149.0733684}
  - { name: William Slim Drive,stop_code: Wjz6mip, lat: -35.2096535, lng: 149.0878294}
  - { name: Aikman Drive,stop_code: Wjz69vO, lat: -35.2336108, lng: 149.0786617}
  - { name: Anketell Street,stop_code: Wjz213q, lat: -35.4121336, lng: 149.063177}
  - { name: Baldwin Drive,stop_code: Wjz6qe4, lat: -35.2286658, lng: 149.0969557}
  - { name: Bradley Street,stop_code: Wjz3ldS, lat: -35.3445222, lng: 149.0870435}
  - { name: Florey Drive,stop_code: Wjr-CS2, lat: -35.2068071, lng: 149.0268212}
  - { name: Bradley Street,stop_code: Wjz3ldT, lat: -35.3444271, lng: 149.0869631}
  - { name: Athllon Drive,stop_code: Wjz3kyX, lat: -35.3523555, lng: 149.0913002}
  - { name: Badimara Street,stop_code: WjrXXqW, lat: -35.3578948, lng: 149.056972}
  - { name: Dalley Crescent,stop_code: Wjr-AHx, lat: -35.2199899, lng: 149.0262529}
  - { name: Darwinia Terrace,stop_code: WjrXIqk, lat: -35.3522608, lng: 149.0341457}
  - { name: Bugden Avenue,stop_code: Wjz2zGA, lat: -35.4016851, lng: 149.1141675}
  - { name: Clift Crescent,stop_code: Wjz1CRl, lat: -35.4269745, lng: 149.1151677}
  - { name: Noarlunga Crescent,stop_code: Wjz1kv5, lat: -35.4365971, lng: 149.0887401}
  - { name: Drumston Street,stop_code: Wjz1mDW, lat: -35.4258444, lng: 149.0913151}
  - { name: Heagney Crescent,stop_code: Wjz1TLL, lat: -35.4199685, lng: 149.1361715}
  - { name: Dyson Street,stop_code: Wjz5Kve, lat: -35.2497723, lng: 149.1218849}
  - { name: Groom Street,stop_code: Wjz3nLq, lat: -35.3325054, lng: 149.0919265}
  - { name: Miller Street,stop_code: Wjz5zJi, lat: -35.2679801, lng: 149.113807}
  - { name: Carruthers Street,stop_code: Wjz49Wd, lat: -35.324698, lng: 149.0833563}
  - { name: Hambidge Crescent,stop_code: Wjz2Ep9, lat: -35.4191211, lng: 149.1218171}
  - { name: Ellerston Avenue,stop_code: Wjz1uHh, lat: -35.428677, lng: 149.1028378}
  - { name: Wheeler Crescent,stop_code: Wjz2jFt, lat: -35.4023147, lng: 149.0919266}
  - { name: Dumas Street,stop_code: Wjz6cjg, lat: -35.2200412, lng: 149.0766172}
  - { name: Kerrigan Street,stop_code: Wjr_FV4, lat: -35.1935916, lng: 149.039268}
  - { name: Wilson Crescent,stop_code: Wjz0udw, lat: -35.4713366, lng: 149.0976343}
  - { name: Starke Street,stop_code: Wjr-yDR, lat: -35.2278849, lng: 149.0252438}
  - { name: Downard Street,stop_code: Wjz1srs, lat: -35.4394729, lng: 149.1002307}
  - { name: Southern Cross Drive,stop_code: Wjr-Hi1, lat: -35.2261454, lng: 149.032398}
  - { name: Blackwood Terrace,stop_code: WjrXTgl, lat: -35.3370298, lng: 149.0436997}
  - { name: Mulley Street,stop_code: WjrXTSe, lat: -35.3328347, lng: 149.0489873}
  - { name: Kerrigan Street,stop_code: Wjr_xnT, lat: -35.1892671, lng: 149.0223682}
  - { name: Osburn Drive,stop_code: Wjr-thp, lat: -35.2158247, lng: 149.0109263}
  - { name: Tillyard Drive,stop_code: Wjr_MjV, lat: -35.1979805, lng: 149.0445264}
  - { name: Lithgow Street,stop_code: Wjzc8im, lat: -35.3300635, lng: 149.1644887}
  - { name: Caley Crescent,stop_code: Wjz3_o2, lat: -35.3372978, lng: 149.1435685}
  - { name: Jerrabomberra Avenue,stop_code: Wjzb5vw, lat: -35.3436462, lng: 149.155296}
  - { name: Alinga Street,stop_code: Wjz5F-1, lat: -35.2783161, lng: 149.1271286}
  - { name: La Perouse Street,stop_code: Wjz3S3t, lat: -35.340463, lng: 149.1289947}
  - { name: Gilmore Crescent,stop_code: Wjz3tCe, lat: -35.3438411, lng: 149.1012607}
  - { name: Cunningham Street,stop_code: Wjz4WYQ, lat: -35.3179239, lng: 149.150152}
  - { name: Giles Street,stop_code: Wjz4OYm, lat: -35.3177313, lng: 149.1384361}
  - { name: Canberra Avenue;Manuka Circle,stop_code: Wjz4OqF, lat: -35.3195494, lng: 149.1335622}
  - { name: East Row,stop_code: Wjz5Nds, lat: -35.2787886, lng: 149.1304779}
  - { name: Gilmore Crescent,stop_code: Wjz3C4O, lat: -35.3400601, lng: 149.1074834}
  - { name: Ainsworth Street,stop_code: Wjz3lVG, lat: -35.3476365, lng: 149.095065}
  - { name: Kent Street,stop_code: Wjz4gYg, lat: -35.329258, lng: 149.0944878}
  - { name: McCaughey Street,stop_code: Wjz5Hw8, lat: -35.2715996, lng: 149.1231371}
  - { name: Macarthur Avenue,stop_code: Wjz5Jpp, lat: -35.2597672, lng: 149.1221194}
  - { name: Scrivener Street,stop_code: Wjz5Juf, lat: -35.2558204, lng: 149.1217923}
  - { name: Marcus Clarke Street,stop_code: Wjz5GMT, lat: -35.2764151, lng: 149.1267199}
  - { name: Iron Knob Street,stop_code: WjzbnGh, lat: -35.3359862, lng: 149.1796321}
  - { name: Alpen Street,stop_code: Wjr-_Ua, lat: -35.2054509, lng: 149.0613315}
  - { name: Copland Drive,stop_code: Wjz66lY, lat: -35.2073806, lng: 149.0665685}
  - { name: Lennox Crossing,stop_code: Wjz4Lh5, lat: -35.2924038, lng: 149.1201999}
  - { name: Russell Drive,stop_code: Wjz4-WL, lat: -35.2970826, lng: 149.149927}
  - { name: National Circuit,stop_code: Wjz4PuC, lat: -35.3109115, lng: 149.1332413}
  - { name: Sydney Avenue,stop_code: Wjz4P6x, lat: -35.3112617, lng: 149.1291119}
  - { name: Ellerston Avenue,stop_code: Wjz1lun, lat: -35.4316552, lng: 149.0890556}
  - { name: Ellerston Avenue,stop_code: Wjz1lKC, lat: -35.4317601, lng: 149.0920382}
  - { name: Box Hill Avenue,stop_code: Wjz1p8y, lat: -35.4581564, lng: 149.0976236}
  - { name: Templestowe Avenue,stop_code: Wjz1whX, lat: -35.4629103, lng: 149.1104982}
  - { name: Pocket Avenue,stop_code: Wjz0mNo, lat: -35.4741647, lng: 149.0932462}
  - { name: Jim Pike Avenue,stop_code: Wjz18th, lat: -35.4602703, lng: 149.078022}
  - { name: Tharwa Drive,stop_code: Wjz1ixR, lat: -35.4517314, lng: 149.0910093}
  - { name: Jenolan Street,stop_code: Wjzf0LE, lat: -35.1953415, lng: 149.1582308}
  - { name: Goodwin Street,stop_code: Wjz5Tho, lat: -35.2488671, lng: 149.1317091}
  - { name: Northbourne Avenue,stop_code: Wjz6MyH, lat: -35.2424532, lng: 149.1348634}
  - { name: Campbell Street,stop_code: Wjz5XwW, lat: -35.2714003, lng: 149.1461465}
  - { name: Streeton Drive,stop_code: WjrXPR4, lat: -35.3556673, lng: 149.048857}
  - { name: Shakespeare Crescent,stop_code: Wjr_O0I, lat: -35.1888592, lng: 149.0415483}
  - { name: Parkinson Street,stop_code: WjrX-0-, lat: -35.3424839, lng: 149.052828}
  - { name: Edinburgh Avenue,stop_code: Wjz5EKJ, lat: -35.28346, lng: 149.1252}
  - { name: Chippindall Circuit,stop_code: Wjz1F5W, lat: -35.4547272, lng: 149.1186974}
  - { name: Fullagar Crescent,stop_code: Wjr-yQP, lat: -35.2301148, lng: 149.0278969}
  - { name: Harrison Street,stop_code: Wjr-Nmt, lat: -35.2340935, lng: 149.0438829}
  - { name: Dunstan Street,stop_code: Wjz4aH6, lat: -35.3184453, lng: 149.0804542}
  - { name: O'Loghlen Street,stop_code: Wjr-IMR, lat: -35.2216889, lng: 149.0389433}
  - { name: Drakeford Drive,stop_code: Wjz2a26, lat: -35.4069683, lng: 149.0736259}
  - { name: Whyalla Street,stop_code: Wjzbnmb, lat: -35.3331064, lng: 149.1753196}
  - { name: Kalgoorlie Crescent,stop_code: WjrXW7A, lat: -35.3597972, lng: 149.0523061}
  - { name: Larakia Street,stop_code: Wjz351q, lat: -35.3476392, lng: 149.0630875}
  - { name: Bunbury Street,stop_code: WjrXZhO, lat: -35.3476305, lng: 149.0552983}
  - { name: Kalgoorlie Crescent,stop_code: WjrXXk0, lat: -35.3567398, lng: 149.0543328}
  - { name: Beaurepaire Crescent,stop_code: Wjr-syd, lat: -35.2203046, lng: 149.0133355}
  - { name: Warragamba Avenue,stop_code: WjrYEpn, lat: -35.3306598, lng: 149.0341649}
  - { name: Hardwick Crescent,stop_code: Wjr-zom, lat: -35.2270626, lng: 149.0231771}
  - { name: Brazel Street,stop_code: Wjr-GeX, lat: -35.2287693, lng: 149.0321955}
  - { name: Brindabella Circuit,stop_code: Wjzcrp_, lat: -35.3142011, lng: 149.1887666}
  - { name: Alinga Street,stop_code: Wjz5FSY, lat: -35.2780524, lng: 149.1269928}
  - { name: Lhotsky Street,stop_code: Wjr_Es4, lat: -35.1970405, lng: 149.0338265}
  - { name: Brindabella Circuit,stop_code: WjzcrrQ, lat: -35.3131274, lng: 149.188611}
  - { name: Leverrier Crescent,stop_code: Wjz6oEz, lat: -35.243821, lng: 149.1030282}
  - { name: Curran Drive,stop_code: Wjz7ilp, lat: -35.1856235, lng: 149.0877402}
  - { name: McClelland Avenue,stop_code: Wjz7jsi, lat: -35.1807665, lng: 149.0890046}
  - { name: Ryder Place,stop_code: Wjz7qkM, lat: -35.1864502, lng: 149.0992461}
  - { name: Anne Clark Avenue,stop_code: Wjz7rOj, lat: -35.1820066, lng: 149.104114}
  - { name: Kelleway Avenue,stop_code: Wjz7r-a, lat: -35.1793714, lng: 149.1053784}
  - { name: Battye Street,stop_code: Wjz5vj2, lat: -35.2473747, lng: 149.0982287}
  - { name: William Webb Drive,stop_code: Wjz6ddQ, lat: -35.212863, lng: 149.0759771}
  - { name: Kingsford Smith Drive,stop_code: Wjr-Rry, lat: -35.2143707, lng: 149.0454751}
  - { name: Gungurra Crescent,stop_code: WjrXRmc, lat: -35.3440337, lng: 149.0435395}
  - { name: Jabanungga Avenue,stop_code: Wjz7tLG, lat: -35.1677443, lng: 149.1032921}
  - { name: Deumonga Court,stop_code: Wjz7BED, lat: -35.1720853, lng: 149.1141026}
  - { name: Naas Close,stop_code: Wjz7IDY, lat: -35.1730154, lng: 149.1242809}
  - { name: Shoalhaven Avenue,stop_code: Wjz7IuJ, lat: -35.1736356, lng: 149.1225108}
  - { name: Oodgeroo Avenue,stop_code: Wjz6_7M, lat: -35.2008784, lng: 149.1404901}
  - { name: Burrowa Street,stop_code: Wjz7xJz, lat: -35.191011, lng: 149.1141277}
  - { name: Kosciuszko Avenue,stop_code: Wjz7EjH, lat: -35.1978404, lng: 149.1211679}
  - { name: Hindmarsh Drive,stop_code: Wjz3knt, lat: -35.3486981, lng: 149.0879033}
  - { name: Grimwade Street,stop_code: Wjz6QPM, lat: -35.2200763, lng: 149.1377788}
  - { name: Federal Highway,stop_code: Wjzebjj, lat: -35.2253369, lng: 149.1645164}
  - { name: Officer Crescent,stop_code: Wjzd6lW, lat: -35.2515158, lng: 149.1544172}
  - { name: National Circuit,stop_code: Wjz4Pt5, lat: -35.3116531, lng: 149.1326324}
  - { name: Gilmore Crescent,stop_code: Wjz3uJV, lat: -35.339486, lng: 149.1035524}
  - { name: McCaughey Street,stop_code: Wjz5Guy, lat: -35.2727878, lng: 149.1223747}
  - { name: Brigalow Street,stop_code: Wjz5KgT, lat: -35.2544701, lng: 149.1213129}
  - { name: Ainslie Avenue,stop_code: Wjz5NRJ, lat: -35.2787111, lng: 149.1375365}
  - { name: White Crescent,stop_code: Wjzd0yM, lat: -35.2866868, lng: 149.1570161}
  - { name: Blamey Crescent,stop_code: Wjzc7bs, lat: -35.2911202, lng: 149.1523397}
  - { name: Morshead Drive,stop_code: Wjzcd8D, lat: -35.3039101, lng: 149.1635732}
  - { name: Yamba Drive,stop_code: Wjz3tp2, lat: -35.3475867, lng: 149.0997372}
  - { name: Kootara Crescent,stop_code: Wjzc090, lat: -35.3312849, lng: 149.15186}
  - { name: Monaro Crescent,stop_code: Wjz3ShE, lat: -35.3422498, lng: 149.1321257}
  - { name: Arthur Circle,stop_code: Wjz4F-D, lat: -35.3217932, lng: 149.127895}
  - { name: Sturt Avenue,stop_code: Wjz3_JM, lat: -35.3340521, lng: 149.1474054}
  - { name: Gladstone Street,stop_code: Wjzcod5, lat: -35.3281204, lng: 149.1848684}
  - { name: Bugden Avenue,stop_code: Wjz2z-1, lat: -35.3992364, lng: 149.1161738}
  - { name: Heagney Crescent,stop_code: Wjz1LhA, lat: -35.4243494, lng: 149.1210339}
  - { name: Duggan Street,stop_code: Wjz1scZ, lat: -35.4387125, lng: 149.0981386}
  - { name: Gouger Street,stop_code: Wjz2nug, lat: -35.3773453, lng: 149.0890124}
  - { name: Lhotsky Street,stop_code: Wjr-L8R, lat: -35.2052394, lng: 149.0319524}
  - { name: Fincham Crescent,stop_code: Wjz2cy0, lat: -35.3964903, lng: 149.0791164}
  - { name: Kareelah Vista,stop_code: Wjz3z3D, lat: -35.3568273, lng: 149.1071615}
  - { name: Julia Flynn Avenue,stop_code: Wjz3xDo, lat: -35.3656556, lng: 149.1125474}
  - { name: Julia Flynn Avenue,stop_code: Wjz3wEM, lat: -35.3759264, lng: 149.1143713}
  - { name: Joynton Smith Drive,stop_code: Wjr-WVG, lat: -35.2322356, lng: 149.062079}
  - { name: Golden Grove,stop_code: Wjz4M0c, lat: -35.3316757, lng: 149.1286729}
  - { name: Combes Road,stop_code: Wjzcdvn, lat: -35.2991044, lng: 149.1658966}
  - { name: Bradfield Street,stop_code: Wjz6Upw, lat: -35.2433821, lng: 149.1442189}
  - { name: Knox Street,stop_code: Wjze0vc, lat: -35.2389219, lng: 149.1547225}
  - { name: Shumack Street,stop_code: WjrZSQm, lat: -35.251846, lng: 149.0492258}
  - { name: Antill Street,stop_code: Wjzd7Av, lat: -35.2462823, lng: 149.1564391}
  - { name: Genoa Street,stop_code: Wjz7JZQ, lat: -35.1689499, lng: 149.1281264}
  - { name: Tipiloura Street,stop_code: Wjz7CqS, lat: -35.1653247, lng: 149.1116147}
  - { name: Eggleston Crescent,stop_code: Wjz3cal, lat: -35.3521568, lng: 149.0752845}
- { name: Cockle Street,stop_code: Wjz5AGB, lat: -35.2642702, lng: 149.1141435} - { name: Cockle Street,stop_code: Wjz5AGB, lat: -35.2642702, lng: 149.1141435}
- { name: Froggatt Street,stop_code: Wjz5H0p, lat: -35.2714838, lng: 149.1180142} - { name: Verbrugghen Street,stop_code: Wjr-RZx, lat: -35.213153, lng: 149.050965}
- { name: McClintock Street,stop_code: Wjz6ElH, lat: -35.2404264, lng: 149.1210434} - { name: Copland Drive,stop_code: Wjr-ZRJ, lat: -35.2127453, lng: 149.0607491}
- { name: Cossington Smith Crescent,stop_code: Wjz6FEI, lat: -35.2382959, lng: 149.1252507} - { name: Ellenborough Street,stop_code: Wjz6FEI, lat: -35.2382959, lng: 149.1252507}
- { name: Dumas Street,stop_code: Wjz6cz2, lat: -35.2199304, lng: 149.0791416} - { name: Alpen Street,stop_code: Wjz66fx, lat: -35.2062629, lng: 149.0647145}
- { name: Buggy Crescent,stop_code: Wjz64OE, lat: -35.2207286, lng: 149.0717368} - { name: Dumas Street,stop_code: Wjz64OE, lat: -35.2207286, lng: 149.0717368}
- { name: Owen Dixon Drive,stop_code: Wjz6eWi, lat: -35.2096321, lng: 149.0835148} - { name: Kingsford Smith Drive,stop_code: Wjr-SS5, lat: -35.2065999, lng: 149.0489353}
  - { name: Macarthur Avenue,stop_code: Wjz5Jaa, lat: -35.2590481, lng: 149.1191164}
  - { name: Kingsford Smith Drive,stop_code: Wjr-_Hp, lat: -35.2034703, lng: 149.0589653}
  - { name: Copland Drive,stop_code: Wjr-YdU, lat: -35.2186771, lng: 149.0542242}
  - { name: Coulter Drive,stop_code: WjrZ_so, lat: -35.2468109, lng: 149.0562979}
  - { name: O'Hanlon Place,stop_code: Wjz79-a, lat: -35.1903384, lng: 149.0833628}
  - { name: Moynihan Street,stop_code: Wjr-ZXo, lat: -35.214551, lng: 149.0617978}
  - { name: William Webb Drive,stop_code: Wjz6eNd, lat: -35.2100405, lng: 149.0820067}
  - { name: Moynihan Street,stop_code: Wjz65GS, lat: -35.2147682, lng: 149.0705542}
  - { name: Ashkanasy Crescent,stop_code: Wjz66Fg, lat: -35.2104421, lng: 149.0698018}
  - { name: Marconi Crescent,stop_code: Wjz27dd, lat: -35.3775909, lng: 149.0640777}
  - { name: Summerland Circuit,stop_code: Wjz26WN, lat: -35.3854988, lng: 149.073226}
  - { name: Summerland Circuit,stop_code: Wjz25Ox, lat: -35.3909341, lng: 149.0714764}
  - { name: Learmonth Drive,stop_code: WjrWXNL, lat: -35.4020721, lng: 149.0607315}
  - { name: Copland Drive,stop_code: Wjz66Cd, lat: -35.2065831, lng: 149.0682105}
  - { name: Copland Drive,stop_code: Wjz67yW, lat: -35.2040813, lng: 149.0692143}
  - { name: Baddeley Crescent,stop_code: Wjz701y, lat: -35.1992909, lng: 149.0633518}
  - { name: Kingsford Smith Drive,stop_code: Wjr_UTL, lat: -35.1947749, lng: 149.060646}
  - { name: Clarey Crescent,stop_code: Wjz70zz, lat: -35.1978567, lng: 149.0687555}
  - { name: Copland Drive,stop_code: Wjz67_t, lat: -35.200411, lng: 149.0727116}
  - { name: Bimbimbie Street,stop_code: Wjz68IH, lat: -35.2411129, lng: 149.0812786}
  - { name: Bandjalong Crescent,stop_code: Wjz5d81, lat: -35.2605056, lng: 149.0749293}
  - { name: Carbeen Street,stop_code: WjrXJ-g, lat: -35.3443528, lng: 149.0396647}
  - { name: Amy Ackman Street,stop_code: Wjz7-xb, lat: -35.1662448, lng: 149.1450965}
  - { name: Gundaroo Drive,stop_code: Wjz7oZp, lat: -35.1966204, lng: 149.1057315}
  - { name: Barritt Street,stop_code: WjrWTJo, lat: -35.3779591, lng: 149.0479511}
  - { name: Northbourne Avenue,stop_code: Wjz5P8K, lat: -35.2710632, lng: 149.1307122}
  - { name: Northbourne Avenue,stop_code: Wjz5O3Q, lat: -35.274617, lng: 149.1295599}
  - { name: Northbourne Avenue,stop_code: Wjz5Qi2, lat: -35.2645608, lng: 149.1311834}
  - { name: Mulley Street,stop_code: WjrXTX5, lat: -35.3350148, lng: 149.0502343}
  - { name: Dalley Crescent,stop_code: Wjr-I4P, lat: -35.2191133, lng: 149.0306838}
  - { name: Maribyrnong Avenue,stop_code: Wjz6zth, lat: -35.2241129, lng: 149.1109391}
  - { name: Le Souef Crescent,stop_code: Wjr-PWf, lat: -35.225611, lng: 149.0504341}
  - { name: Ellerston Avenue,stop_code: Wjz1mTF, lat: -35.4259406, lng: 149.0936003}
  - { name: Vonwiller Crescent,stop_code: Wjz1zWz, lat: -35.4457437, lng: 149.1168111}
  - { name: Deamer Crescent,stop_code: Wjz1S2v, lat: -35.4289254, lng: 149.1290251}
  - { name: Chuculba Crescent,stop_code: Wjz6sdJ, lat: -35.21822, lng: 149.09782}
  - { name: Baldwin Drive,stop_code: Wjz6rsL, lat: -35.2242562, lng: 149.1005043}
  - { name: Bindubi Street,stop_code: Wjz5eb2, lat: -35.252833, lng: 149.0749872}
  - { name: Maribyrnong Avenue,stop_code: Wjz6pLi, lat: -35.2336222, lng: 149.1026958}
  - { name: Maribyrnong Avenue,stop_code: Wjz6Apq, lat: -35.2212504, lng: 149.1111434}
  - { name: Baldwin Drive,stop_code: Wjz6iYm, lat: -35.2298806, lng: 149.0944438}
  - { name: Athllon Drive,stop_code: Wjz239F, lat: -35.4026063, lng: 149.0647649}
  - { name: Athllon Drive,stop_code: Wjz238T, lat: -35.4027681, lng: 149.0650277}
  - { name: Baldwin Drive,stop_code: Wjz6qea, lat: -35.2288148, lng: 149.0970523}
  - { name: Pitman,stop_code: Wjz20ni, lat: -35.4149428, lng: 149.0656523}
  - { name: Bradley Street,stop_code: Wjz3ll7, lat: -35.3444741, lng: 149.0873533}
  - { name: Cohen Street,stop_code: Wjr-UJ-, lat: -35.240121, lng: 149.0597101}
  - { name: David Walsh Avenue,stop_code: Wjz7YzW, lat: -35.1759253, lng: 149.1462691}
  - { name: Darwinia Terrace,stop_code: WjrXIbT, lat: -35.351342, lng: 149.0321099}
  - { name: Perry Drive,stop_code: WjrXHuL, lat: -35.3547054, lng: 149.0346008}
  - { name: Perry Drive,stop_code: WjrXPgO, lat: -35.3592839, lng: 149.0444246}
  - { name: Streeton Drive,stop_code: WjrXPJX, lat: -35.3557253, lng: 149.0486263}
  - { name: Fremantle Drive,stop_code: WjrXQTy, lat: -35.3489683, lng: 149.0495709}
  - { name: Streeton Drive,stop_code: WjrXRBJ, lat: -35.344588, lng: 149.0469995}
  - { name: McBryde Crescent,stop_code: Wjz2i3o, lat: -35.4068322, lng: 149.0850166}
  - { name: Newman Morris Circuit,stop_code: Wjz2aaw, lat: -35.4075241, lng: 149.0756429}
  - { name: Newman Morris Circuit,stop_code: Wjz29yh, lat: -35.4129642, lng: 149.0794301}
  - { name: Amsinck Street,stop_code: Wjz2iPv, lat: -35.4062172, lng: 149.093302}
  - { name: Burrinjuck Crescent,stop_code: WjrXLtK, lat: -35.3335671, lng: 149.0346289}
  - { name: Horse Park Drive,stop_code: Wjz7smv, lat: -35.1734671, lng: 149.0988597}
  - { name: Lhotsky Street,stop_code: Wjr_Ej0, lat: -35.1981116, lng: 149.0323079}
  - { name: Antill Street,stop_code: Wjz5_0v, lat: -35.2490065, lng: 149.1400861}
  - { name: Ratcliffe Crescent,stop_code: Wjr-Xhh, lat: -35.2268712, lng: 149.0546156}
  - { name: Wattle Place,stop_code: Wjz5KHe, lat: -35.2524812, lng: 149.124612}
  - { name: Cossington Smith Crescent,stop_code: Wjz6Es1, lat: -35.2412615, lng: 149.1216026}
  - { name: Gawler Crescent,stop_code: Wjz4yIs, lat: -35.3178977, lng: 149.1139422}
  - { name: Beattie Crescent,stop_code: Wjz2wOo, lat: -35.418544, lng: 149.1153584}
  - { name: Bugden Avenue,stop_code: Wjz2I99, lat: -35.3971025, lng: 149.119092}
  - { name: Giles Street,stop_code: Wjz4OZS, lat: -35.3170485, lng: 149.1391013}
  - { name: Mugga Lane,stop_code: Wjz3RXq, lat: -35.3462565, lng: 149.1385756}
  - { name: Russell Drive,stop_code: Wjzc55s, lat: -35.3007195, lng: 149.1509863}
  - { name: Cowper Street,stop_code: Wjz5-5y, lat: -35.2514497, lng: 149.1400942}
  - { name: Russell Drive,stop_code: Wjz4-KO, lat: -35.2946955, lng: 149.147399}
  - { name: Cowper Street,stop_code: Wjz5YfD, lat: -35.2606676, lng: 149.1416317}
  - { name: Verbrugghen Street,stop_code: Wjr-R_3, lat: -35.2115401, lng: 149.0502887}
  - { name: Herbert Crescent,stop_code: Wjz5YKO, lat: -35.2618095, lng: 149.1473796}
  - { name: Alfred Hill Drive,stop_code: Wjr--6t, lat: -35.2065912, lng: 149.0521439}
  - { name: Macarthur Avenue,stop_code: Wjz5J9d, lat: -35.2594616, lng: 149.1190821}
  - { name: Kingsford Smith Drive,stop_code: Wjr-_zv, lat: -35.2030129, lng: 149.0575605}
  - { name: O'Hanlon Place,stop_code: Wjz79ZQ, lat: -35.190906, lng: 149.0842116}
  - { name: Lyttleton Crescent,stop_code: Wjz54_n, lat: -35.2606623, lng: 149.072551}
  - { name: Redfern Street,stop_code: WjrZZB7, lat: -35.2565133, lng: 149.0570071}
  - { name: Gillespie Street,stop_code: WjrZTua, lat: -35.2452775, lng: 149.0448362}
  - { name: Beetaloo Street,stop_code: WjrZT6b, lat: -35.2452004, lng: 149.0407936}
  - { name: Moynihan Street,stop_code: Wjz65aB, lat: -35.2148653, lng: 149.0646456}
  - { name: Marconi Crescent,stop_code: WjrW_RH, lat: -35.3777568, lng: 149.0607135}
  - { name: Summerland Circuit,stop_code: Wjz2df1, lat: -35.3875049, lng: 149.0748933}
  - { name: Summerland Circuit,stop_code: Wjz2d32, lat: -35.3901917, lng: 149.0734943}
  - { name: Copland Drive,stop_code: Wjz66C2, lat: -35.2068343, lng: 149.0681005}
  - { name: Captain Cook Crescent,stop_code: Wjz3_z-, lat: -35.3349223, lng: 149.1461306}
  - { name: La Perouse Street,stop_code: Wjz4Mq1, lat: -35.3305291, lng: 149.1325996}
  - { name: Kidston Crescent,stop_code: Wjz4aMo, lat: -35.3209613, lng: 149.082268}
  - { name: Taverner Street,stop_code: Wjz2aVu, lat: -35.4076897, lng: 149.0836236}
  - { name: Gibbons Street,stop_code: Wjz2E0l, lat: -35.4194359, lng: 149.117826}
  - { name: Matina Street,stop_code: Wjzb7Hz, lat: -35.3351417, lng: 149.1580162}
  - { name: Hellyer Street,stop_code: WjrXLY1, lat: -35.3346674, lng: 149.0391656}
  - { name: Tillyard Drive,stop_code: Wjr_MhY, lat: -35.1991196, lng: 149.0445095}
  - { name: Kerrigan Street,stop_code: Wjr_pVW, lat: -35.1938099, lng: 149.0184155}
  - { name: Ginninderra Drive,stop_code: Wjr-Df8, lat: -35.2008175, lng: 149.0201835}
  - { name: Brownless Street,stop_code: Wjr-sKW, lat: -35.2178207, lng: 149.0156953}
  - { name: Spofforth Street,stop_code: Wjr-kVk, lat: -35.2210905, lng: 149.0066193}
  - { name: Brazel Street,stop_code: Wjr-G5f, lat: -35.2290792, lng: 149.0298564}
  - { name: Anketell Street,stop_code: Wjz17Xr, lat: -35.4230293, lng: 149.0727434}
  - { name: Ross Smith Crescent,stop_code: Wjr-Fzd, lat: -35.2360739, lng: 149.0353153}
  - { name: Redfern Street,stop_code: Wjz55vN, lat: -35.2557214, lng: 149.0677248}
  - { name: Goulburn Street,stop_code: WjrZ-WW, lat: -35.2535016, lng: 149.0623511}
  - { name: Crisp Circuit,stop_code: Wjz5fm2, lat: -35.2452775, lng: 149.0763507}
  - { name: Dobbin Circuit,stop_code: Wjz7iKx, lat: -35.1849518, lng: 149.0920391}
  - { name: Kelleway Avenue,stop_code: Wjz7jW4, lat: -35.181955, lng: 149.0941886}
  - { name: Bandjalong Crescent,stop_code: Wjz5l2U, lat: -35.2592266, lng: 149.0857332}
  - { name: Carbeen Street,stop_code: WjrXJZ6, lat: -35.3445279, lng: 149.0392999}
  - { name: Barritt Street,stop_code: WjrW_1f, lat: -35.3801683, lng: 149.051853}
  - { name: Mort Street,stop_code: Wjz5Ok1, lat: -35.2742265, lng: 149.1312268}
  - { name: Northbourne Avenue,stop_code: Wjz5Sqk, lat: -35.2533948, lng: 149.1329835}
  - { name: Perry Drive,stop_code: WjrXHZU, lat: -35.3560382, lng: 149.0404158}
  - { name: Paul Coe Crescent,stop_code: Wjz7Iax, lat: -35.1766844, lng: 149.1196027}
  - { name: Mavis Latham Street,stop_code: Wjz6_vY, lat: -35.2004651, lng: 149.1448522}
  - { name: Wattle Street,stop_code: Wjz5KBe, lat: -35.2511276, lng: 149.123169}
  - { name: Davenport Street,stop_code: Wjz3f1S, lat: -35.3363058, lng: 149.074562}
  - { name: Bugden Avenue,stop_code: Wjz2Ioh, lat: -35.3978546, lng: 149.1219888}
  - { name: Hambidge Crescent,stop_code: Wjz2EWD, lat: -35.4178621, lng: 149.1278682}
  - { name: Kingsford Smith Drive,stop_code: Wjr-Hwn, lat: -35.2269992, lng: 149.0354339}
  - { name: Belconnen Way,stop_code: Wjr-EeE, lat: -35.2399953, lng: 149.0319202}
  - { name: Badimara Street,stop_code: WjrXXl5, lat: -35.3556198, lng: 149.0543328}
  - { name: Casey Crescent,stop_code: Wjz1AvL, lat: -35.4364397, lng: 149.1114638}
  - { name: Giles Street,stop_code: Wjz4Xhv, lat: -35.3142208, lng: 149.1427384}
  - { name: Hindmarsh Drive,stop_code: Wjz3slg, lat: -35.3505095, lng: 149.0986214}
  - { name: Monaro Crescent,stop_code: Wjz4FRP, lat: -35.3227824, lng: 149.1267256}
  - { name: Springvale Drive,stop_code: WjrZRPq, lat: -35.2583292, lng: 149.0493331}
  - { name: Davenport Street,stop_code: Wjz37RN, lat: -35.3339689, lng: 149.0718047}
  - { name: Petterd Street,stop_code: Wjr-Mfb, lat: -35.2390183, lng: 149.0422199}
  - { name: Chewings Street,stop_code: Wjr-Njs, lat: -35.2362142, lng: 149.0439258}
  - { name: Namatjira Drive,stop_code: WjrXZy7, lat: -35.3465366, lng: 149.0571652}
  - { name: Ellerston Avenue,stop_code: Wjz1mJc, lat: -35.4271296, lng: 149.0915833}
  - { name: Castieau Street,stop_code: Wjr-GkU, lat: -35.2303952, lng: 149.033551}
  - { name: Petterd Street,stop_code: Wjr-U5B, lat: -35.2402319, lng: 149.0522728}
  - { name: La Perouse Street,stop_code: Wjz3SjZ, lat: -35.3405155, lng: 149.1324333}
  - { name: Heagney Crescent,stop_code: Wjz2MHq, lat: -35.4176172, lng: 149.1359148}
  - { name: Namatjira Drive,stop_code: WjrXP_E, lat: -35.3546397, lng: 149.0510497}
  - { name: Majura Avenue,stop_code: Wjz5-wb, lat: -35.2548248, lng: 149.145206}
  - { name: Heysen Street,stop_code: WjrYUxL, lat: -35.3307129, lng: 149.0578894}
  - { name: Wakelin Crescent,stop_code: Wjz35am, lat: -35.3465716, lng: 149.0643106}
  - { name: Hilder Street,stop_code: WjrX_xU, lat: -35.3368309, lng: 149.0583346}
  - { name: Badimara Street,stop_code: Wjz33z1, lat: -35.3573173, lng: 149.0681086}
  - { name: Renmark Street,stop_code: WjrXCZu, lat: -35.3390452, lng: 149.0287016}
  - { name: Blacklock Close,stop_code: Wjz7qZT, lat: -35.1851647, lng: 149.1061108}
  - { name: Arrabri Street,stop_code: Wjz7uwD, lat: -35.166579, lng: 149.1018085}
  - { name: Windradyne Street,stop_code: Wjz7CDa, lat: -35.162176, lng: 149.1122262}
  - { name: Cowper Street,stop_code: Wjz5Ycz, lat: -35.2631, lng: 149.1415634}
  - { name: Kosciuszko Avenue,stop_code: Wjz7Fmf, lat: -35.1899217, lng: 149.1203537}
  - { name: Learmonth Drive,stop_code: WjrWY3_, lat: -35.3952466, lng: 149.0527528}
  - { name: Hoskins Street,stop_code: Wjz6RQW, lat: -35.2136848, lng: 149.1379368}
  - { name: Sandford Street,stop_code: Wjz6Yaq, lat: -35.2205928, lng: 149.1414139}
  - { name: Ellerston Avenue,stop_code: Wjz1mqt, lat: -35.429085, lng: 149.0892702}
  - { name: Antill Street,stop_code: Wjz5Tx_, lat: -35.2483326, lng: 149.1351531}
  - { name: Bugden Avenue,stop_code: Wjz2HEe, lat: -35.4028569, lng: 149.1245208}
  - { name: Carnegie Cresent,stop_code: Wjz3TEu, lat: -35.3369272, lng: 149.1358665}
  - { name: Casey Crescent,stop_code: Wjz1AkS, lat: -35.4385726, lng: 149.1102836}
  - { name: Crisp Circuit,stop_code: Wjz5fcz, lat: -35.2466065, lng: 149.0756831}
  - { name: Heagney Crescent,stop_code: Wjz2MAp, lat: -35.4170052, lng: 149.1344986}
  - { name: Kingsford Smith Drive,stop_code: Wjr-FaP, lat: -35.2369634, lng: 149.032049}
  - { name: Kennedy Street,stop_code: Wjz4WdC, lat: -35.3170135, lng: 149.1415045}
  - { name: Streeton Drive,stop_code: WjrXRgw, lat: -35.3484443, lng: 149.0440974}
  - { name: Springvale Drive,stop_code: WjrZRBn, lat: -35.256577, lng: 149.0465007}
  - { name: Canberra Avenue,stop_code: Wjzc1ak, lat: -35.3247957, lng: 149.1522656}
  - { name: Luke Street,stop_code: Wjr-r_9, lat: -35.2227135, lng: 149.0173907}
  - { name: Hawdon Street,stop_code: Wjz5-Oz, lat: -35.2534932, lng: 149.1484676}
  - { name: Hodgson Crescent,stop_code: Wjz3aPr, lat: -35.3626721, lng: 149.0822706}
  - { name: Castieau Street,stop_code: Wjr-G4U, lat: -35.2303339, lng: 149.030901}
  - { name: William Webb Drive,stop_code: Wjz64L1, lat: -35.217196, lng: 149.0694819}
  - { name: Heysen Street,stop_code: WjrX_SB, lat: -35.3329186, lng: 149.0604857}
  - { name: Brindabella Circuit,stop_code: WjzcrG7, lat: -35.3135511, lng: 149.1903315}
  - { name: Barr Smith Avenue,stop_code: Wjz1dDS, lat: -35.4310636, lng: 149.0801678}
  - { name: Florey Drive,stop_code: Wjr-A5E, lat: -35.2186861, lng: 149.0194265}
  - { name: Hindmarsh Drive,stop_code: WjrXZ6V, lat: -35.3442262, lng: 149.0527449}
  - { name: Companion Crescent,stop_code: Wjr-RsJ, lat: -35.2134269, lng: 149.0456746}
  - { name: Southern Cross Drive,stop_code: Wjr-GSZ, lat: -35.2285724, lng: 149.0390978}
  - { name: Parnell Road,stop_code: Wjzcdml, lat: -35.2999752, lng: 149.1646145}
  - { name: A'Beckett Street,stop_code: Wjze19V, lat: -35.2378003, lng: 149.1531131}
  - { name: Flemington Road,stop_code: Wjz6-IS, lat: -35.2078342, lng: 149.147459}
  - { name: Owen Dixon Drive,stop_code: Wjz6fs9, lat: -35.2028549, lng: 149.0778289}
  - { name: Ainsworth Street,stop_code: Wjz3t4S, lat: -35.3452239, lng: 149.0966044}
  - { name: Heard Street,stop_code: Wjz3pb7, lat: -35.3677991, lng: 149.0969262}
  - { name: Gundaroo Drive,stop_code: Wjz7GCd, lat: -35.1846035, lng: 149.123116}
  - { name: Drakeford Drive,stop_code: Wjz2b2-, lat: -35.4015218, lng: 149.0747826}
- { name: Baldwin Drive,stop_code: Wjz6kCT, lat: -35.217402, lng: 149.0910262} - { name: Baldwin Drive,stop_code: Wjz6kCT, lat: -35.217402, lng: 149.0910262}
- { name: Jacob Place,stop_code: Wjr-TRM, lat: -35.2021703, lng: 149.0498418} - { name: Spalding Street,stop_code: Wjr-TRM, lat: -35.2021703, lng: 149.0498418}
- { name: Love Street,stop_code: Wjr_MMi, lat: -35.200018, lng: 149.0491234} - { name: Dalley Crescent,stop_code: Wjr-IeY, lat: -35.2176259, lng: 149.032238}
- { name: Box Place,stop_code: Wjr-IeY, lat: -35.2176259, lng: 149.032238} - { name: Knoke Avenue,stop_code: Wjz0f-r, lat: -35.4649404, lng: 149.0837298}
- { name: Macrossan Crescent,stop_code: Wjr-J8t, lat: -35.2161747, lng: 149.0315719} - { name: Hibberson Street,stop_code: Wjz7OtB, lat: -35.185267, lng: 149.1332326}
- { name: Want Place,stop_code: Wjr-Jm9, lat: -35.2124379, lng: 149.0325045} - { name: Hopetoun Circuit,stop_code: Wjz4za9, lat: -35.3140282, lng: 149.1080413}
- { name: Fellows Street,stop_code: Wjr-J44, lat: -35.2135626, lng: 149.0296181} - { name: Heagney Crescent,stop_code: Wjz1TJt, lat: -35.421473, lng: 149.1358612}
- { name: Osburn Drive,stop_code: Wjr-BB3, lat: -35.2129096, lng: 149.0241561} - { name: La Perouse Street,stop_code: Wjz3THj, lat: -35.3351417, lng: 149.1357593}
- { name: Solomon Crescent,stop_code: Wjr-AY4, lat: -35.2190044, lng: 149.0282415} - { name: Casey Crescent,stop_code: Wjz1AyS, lat: -35.4399887, lng: 149.1130946}
  - { name: Sainsbury Street,stop_code: Wjz2u8E, lat: -35.3868869, lng: 149.0976987}
  - { name: Fremantle Drive,stop_code: WjrXPDA, lat: -35.354316, lng: 149.0467689}
  - { name: Southern Cross Drive,stop_code: Wjr-H6y, lat: -35.2232919, lng: 149.0303753}
  - { name: Eyre Street,stop_code: Wjz4W3r, lat: -35.3187118, lng: 149.1400025}
  - { name: Sheaffe Street,stop_code: WjrXSso, lat: -35.3402005, lng: 149.0451918}
  - { name: Springvale Drive,stop_code: WjrZSiu, lat: -35.2532303, lng: 149.0438185}
  - { name: Starke Street,stop_code: Wjr-sWn, lat: -35.2201542, lng: 149.0175409}
  - { name: Morrison Circuit,stop_code: WjzcdbC, lat: -35.3019589, lng: 149.1635899}
  - { name: Gillespie Street,stop_code: WjrZTAV, lat: -35.2467467, lng: 149.0472517}
  - { name: Forsythe Street,stop_code: Wjz0mV8, lat: -35.4741064, lng: 149.0944157}
  - { name: Phillip Avenue,stop_code: Wjzd7ky, lat: -35.2466766, lng: 149.1539071}
  - { name: Owen Dixon Drive,stop_code: Wjz6eKC, lat: -35.2064842, lng: 149.0811548}
  - { name: Kitchener Street,stop_code: Wjz3td5, lat: -35.3446288, lng: 149.0969048}
  - { name: Wilkins Street,stop_code: Wjz3on-, lat: -35.3705987, lng: 149.0995655}
  - { name: Lexcen Avenue,stop_code: Wjz7zga, lat: -35.1835162, lng: 149.1093724}
  - { name: Mawson Drive,stop_code: Wjz3iNO, lat: -35.3641274, lng: 149.0938692}
  - { name: Dalley Crescent,stop_code: Wjr-J8t, lat: -35.2161747, lng: 149.0315719}
  - { name: Macrossan Crescent,stop_code: Wjr-J44, lat: -35.2135626, lng: 149.0296181}
  - { name: Florey Drive,stop_code: Wjr-BB3, lat: -35.2129096, lng: 149.0241561}
  - { name: Callaway Crescent,stop_code: Wjz18Pt, lat: -35.4613271, lng: 149.0822867}
  - { name: Wattle Street,stop_code: Wjz5KMK, lat: -35.2545971, lng: 149.1265378}
  - { name: Denison Street,stop_code: Wjz4iW6, lat: -35.3191233, lng: 149.0941367}
  - { name: Heagney Crescent,stop_code: Wjz1TJ1, lat: -35.4218927, lng: 149.1354535}
  - { name: Tallara Parkway,stop_code: Wjz3_QR, lat: -35.3343365, lng: 149.1488109}
  - { name: Casey Crescent,stop_code: Wjz1AUn, lat: -35.4412474, lng: 149.1165707}
  - { name: Gaunson Crescent,stop_code: Wjz2thr, lat: -35.3914613, lng: 149.0987448}
  - { name: Bunbury Street,stop_code: WjrXRUs, lat: -35.3481643, lng: 149.0506742}
  - { name: Southern Cross Drive,stop_code: Wjr-Ayn, lat: -35.2201542, lng: 149.0244529}
  - { name: Kootara Crescent,stop_code: Wjz4U-l, lat: -35.3274305, lng: 149.1494868}
  - { name: Streeton Drive,stop_code: WjrXQ80, lat: -35.3539222, lng: 149.042016}
  - { name: Springvale Drive,stop_code: WjrZSnl, lat: -35.2498834, lng: 149.0437756}
  - { name: Eucumbene Drive,stop_code: WjrXCNB, lat: -35.3418283, lng: 149.0275536}
  - { name: Lhotsky Street,stop_code: Wjr-DQE, lat: -35.2028856, lng: 149.0277547}
  - { name: Morrison Circuit,stop_code: Wjzcd4Y, lat: -35.3013986, lng: 149.1626994}
  - { name: Kinsella Street,stop_code: Wjr-xEt, lat: -35.2381595, lng: 149.0260301}
  - { name: Forsythe Street,stop_code: Wjz0t7T, lat: -35.4748549, lng: 149.0964971}
  - { name: Phillip Avenue,stop_code: Wjzd7p6, lat: -35.2483939, lng: 149.1545615}
  - { name: Heydon Crescent,stop_code: Wjz6eJR, lat: -35.2073083, lng: 149.0815196}
  - { name: Ainsworth Street,stop_code: Wjz3kSP, lat: -35.3495644, lng: 149.0939007}
  - { name: Beasley Street,stop_code: Wjz3ovI, lat: -35.3708086, lng: 149.1004882}
  - { name: Manning Clark Crescent,stop_code: Wjz7Wqb, lat: -35.1875672, lng: 149.1438549}
  - { name: Beasley Street,stop_code: Wjz3om2, lat: -35.3716164, lng: 149.0983753}
  - { name: Learmonth Drive,stop_code: WjrWXIP, lat: -35.4004264, lng: 149.0594265}
  - { name: Eagle Circuit,stop_code: WjrWSBZ, lat: -35.383041, lng: 149.0472484}
  - { name: Tom Roberts Avenue,stop_code: Wjz1olx, lat: -35.4603062, lng: 149.0989218}
  - { name: Soward Way,stop_code: Wjz20xf, lat: -35.4185878, lng: 149.0681837}
  - { name: Clare Dennis Avenue,stop_code: Wjz1j87, lat: -35.4467627, lng: 149.0860043}
  - { name: Tallara Parkway,stop_code: Wjzb73I, lat: -35.335098, lng: 149.1512571}
  - { name: Archibald Street,stop_code: Wjz5LCR, lat: -35.2450118, lng: 149.1240058}
  - { name: Scantlebury Crescent,stop_code: Wjz1Iwx, lat: -35.4417543, lng: 149.1237805}
  - { name: Maribyrnong Avenue,stop_code: Wjz6qc3, lat: -35.2301323, lng: 149.0969048}
  - { name: Strickland Crescent,stop_code: Wjz4iXK, lat: -35.3184054, lng: 149.094995}
  - { name: Wheeler Crescent,stop_code: Wjz2jsF, lat: -35.4005569, lng: 149.0895394}
  - { name: Namatjira Drive,stop_code: WjrX-x5, lat: -35.3418633, lng: 149.0570257}
  - { name: Springvale Drive,stop_code: WjrZTlr, lat: -35.2459406, lng: 149.043797}
  - { name: O'Reilly Street,stop_code: Wjr-tgp, lat: -35.216543, lng: 149.0108488}
  - { name: Sternberg Crescent,stop_code: Wjz2rqk, lat: -35.4017026, lng: 149.0999303}
  - { name: Sturt Avenue,stop_code: Wjz4VN-, lat: -35.3253297, lng: 149.1489933}
  - { name: Hindmarsh Drive,stop_code: WjrXKxW, lat: -35.3421259, lng: 149.0363083}
  - { name: William Webb Drive,stop_code: Wjz64Gx, lat: -35.220702, lng: 149.0701685}
  - { name: General Bridges Drive,stop_code: WjzceCW, lat: -35.2947043, lng: 149.1682408}
  - { name: Kinsella Street,stop_code: Wjr-xZ1, lat: -35.2350925, lng: 149.0282402}
  - { name: Heard Street,stop_code: Wjz3h_Y, lat: -35.3652794, lng: 149.0954242}
  - { name: Flemington Road,stop_code: Wjz7Wrb, lat: -35.1868629, lng: 149.1438112}
  - { name: Owen Dixon Drive,stop_code: Wjz6f7z, lat: -35.2006106, lng: 149.0742884}
  - { name: Forsythe Street,stop_code: Wjz0tmp, lat: -35.4760956, lng: 149.098836}
  - { name: Majura Avenue,stop_code: Wjz5RQM, lat: -35.2578561, lng: 149.1378031}
  - { name: Heydon Crescent,stop_code: Wjz6e4_, lat: -35.2078167, lng: 149.0747605}
  - { name: Ainsworth Street,stop_code: Wjz3kQJ, lat: -35.3507895, lng: 149.0935788}
  - { name: Burdekin Avenue,stop_code: Wjz7KWi, lat: -35.165658, lng: 149.127439}
  - { name: Paperbark Street,stop_code: Wjz0vV_, lat: -35.46806, lng: 149.1064105}
  - { name: Ainsworth Street,stop_code: Wjz3qfM, lat: -35.3601522, lng: 149.0979991}
  - { name: Whitford Place,stop_code: Wjz1iJO, lat: -35.4492507, lng: 149.092506}
  - { name: McInnes Street,stop_code: WjrX-Hd, lat: -35.340498, lng: 149.0586457}
  - { name: Gozzard Street,stop_code: Wjz7Pqv, lat: -35.1816893, lng: 149.1331682}
  - { name: Proctor Street,stop_code: Wjz2M6L, lat: -35.4151166, lng: 149.1293059}
  - { name: Clift Crescent,stop_code: Wjz1CL2, lat: -35.4259056, lng: 149.1134272}
  - { name: Burdekin Avenue,stop_code: Wjz7JmE, lat: -35.1685523, lng: 149.1211305}
  - { name: Baskerville Street,stop_code: Wjz1LGi, lat: -35.4237899, lng: 149.1247997}
  - { name: Burdekin Avenue,stop_code: Wjz7Jpk, lat: -35.1716219, lng: 149.1220317}
  - { name: Anketell Street,stop_code: Wjz20ut, lat: -35.4153439, lng: 149.0672617}
  - { name: Bywaters Street,stop_code: Wjz7Jjj, lat: -35.1703882, lng: 149.1206162}
  - { name: Launceston Street,stop_code: Wjz3eJ0, lat: -35.339582, lng: 149.0804045}
- { name: Onslow Street,stop_code: Wjr-IcO, lat: -35.2191858, lng: 149.0319716} - { name: Onslow Street,stop_code: Wjr-IcO, lat: -35.2191858, lng: 149.0319716}
- { name: Onslow Street,stop_code: Wjr-IqS, lat: -35.2202741, lng: 149.034858} - { name: Tallara Parkway,stop_code: Wjzb7qP, lat: -35.3358857, lng: 149.1555593}
- { name: Kingsford Smith Drive,stop_code: Wjr-H-a, lat: -35.2232851, lng: 149.039343} - { name: Gilmore Crescent,stop_code: Wjz3tP_, lat: -35.345819, lng: 149.1049514}
- { name: Krefft Street,stop_code: Wjr-Q4G, lat: -35.2192221, lng: 149.0415189} - { name: Canopus Crescent,stop_code: Wjz6lZb, lat: -35.2129711, lng: 149.0943513}
- { name: Maribyrnong Avenue,stop_code: Wjz6zon, lat: -35.2269858, lng: 149.1109391} - { name: Yamba Drive,stop_code: Wjz3tqd, lat: -35.3466766, lng: 149.0998445}
  - { name: Clare Dennis Avenue,stop_code: Wjz1bUp, lat: -35.4472172, lng: 149.0837405}
  - { name: Paramatta Street,stop_code: Wjz3jlt, lat: -35.355611, lng: 149.0877423}
  - { name: Clive Steele Avenue,stop_code: Wjz2gTN, lat: -35.4149942, lng: 149.0938363}
  - { name: Archdall Street,stop_code: Wjr_oEZ, lat: -35.1996945, lng: 149.0157411}
  - { name: Hindmarsh Drive,stop_code: WjrXS9Y, lat: -35.3419508, lng: 149.0431318}
  - { name: Barrier Street,stop_code: Wjzc9ws, lat: -35.326135, lng: 149.1675112}
  - { name: Athllon Drive,stop_code: Wjz20g4, lat: -35.4195233, lng: 149.0653405}
  - { name: Onslow Street,stop_code: Wjr-Iqi, lat: -35.2206012, lng: 149.0340821}
  - { name: Sainsbury Street,stop_code: Wjz2lWW, lat: -35.3909103, lng: 149.0953598}
  - { name: Ogilby Crescent,stop_code: Wjr-UfX, lat: -35.2390533, lng: 149.0542094}
  - { name: Dumas Street,stop_code: Wjz6d1l, lat: -35.2155043, lng: 149.0738592}
  - { name: Northcott Drive,stop_code: Wjzcfkd, lat: -35.2903958, lng: 149.1643141}
  - { name: Findlay Street,stop_code: Wjr-xTP, lat: -35.2335151, lng: 149.027854}
  - { name: Forsythe Street,stop_code: Wjz0tt-, lat: -35.4763315, lng: 149.1008208}
  - { name: Majura Avenue,stop_code: Wjz5RGR, lat: -35.2588023, lng: 149.1364727}
  - { name: Nellie Hamilton Avenue,stop_code: Wjz7PKW, lat: -35.1794094, lng: 149.1366015}
  - { name: Ainsworth Street,stop_code: Wjz3kOX, lat: -35.3523296, lng: 149.0940294}
  - { name: Macfarlane Burnet Avenue,stop_code: Wjr-lwL, lat: -35.2160653, lng: 149.0029738}
  - { name: Soward Way,stop_code: Wjz17vf, lat: -35.4199255, lng: 149.0668755}
  - { name: Beasley Street,stop_code: Wjz3gZn, lat: -35.3718963, lng: 149.0945237}
  - { name: Boddington Crescent,stop_code: WjrWRY-, lat: -35.3891639, lng: 149.0514903}
  - { name: Sulwood Drive,stop_code: WjrXUjI, lat: -35.373541, lng: 149.0551596}
  - { name: Kingsford Smith Drive,stop_code: Wjr-Q4G, lat: -35.2192221, lng: 149.0415189}
- { name: Maribyrnong Avenue,stop_code: Wjz6ytu, lat: -35.2291622, lng: 149.1110812} - { name: Maribyrnong Avenue,stop_code: Wjz6ytu, lat: -35.2291622, lng: 149.1110812}
- { name: Belconnen Way,stop_code: Wjz5mpm, lat: -35.2538531, lng: 149.0889493} - { name: Phillip Avenue,stop_code: Wjzd7no, lat: -35.2447665, lng: 149.1536603}
- { name: Belconnen Way,stop_code: Wjz5mxf, lat: -35.2538241, lng: 149.0902637} - { name: Mary Potter Circuit,stop_code: Wjz5mpm, lat: -35.2538531, lng: 149.0889493}
  - { name: Canopus Crescent,stop_code: Wjz6mxi, lat: -35.2102537, lng: 149.0904031}
  - { name: Hospital Road,stop_code: Wjz3tzF, lat: -35.346309, lng: 149.1019688}
  - { name: Bromby Street,stop_code: Wjz3y2V, lat: -35.363512, lng: 149.1076873}
  - { name: Langdon Avenue,stop_code: Wjz2rfK, lat: -35.398117, lng: 149.0976987}
  - { name: Preddey Way,stop_code: Wjz1a_U, lat: -35.4480737, lng: 149.0843198}
  - { name: Townshend Street,stop_code: Wjz3jv9, lat: -35.3545522, lng: 149.0888367}
  - { name: Ginninderra Drive,stop_code: Wjr_oVO, lat: -35.199278, lng: 149.0183268}
  - { name: Barrier Street,stop_code: Wjzc8Sn, lat: -35.3272379, lng: 149.1700862}
  - { name: Carbeen Street,stop_code: WjrXSoJ, lat: -35.3425634, lng: 149.0456317}
  - { name: Charleston Street,stop_code: Wjz28WY, lat: -35.4181593, lng: 149.0843413}
  - { name: Langdon Avenue,stop_code: Wjz2lUf, lat: -35.3918549, lng: 149.0942869}
  - { name: Strickland Crescent,stop_code: Wjz4qjC, lat: -35.3184536, lng: 149.0989486}
  - { name: Burkitt Street,stop_code: Wjr-ViH, lat: -35.2369503, lng: 149.055175}
  - { name: Christina Stead Street,stop_code: Wjz6_R5, lat: -35.2017591, lng: 149.1476629}
  - { name: Fullagar Crescent,stop_code: Wjr-yOJ, lat: -35.2313242, lng: 149.0277252}
  - { name: Forsythe Street,stop_code: Wjz0uw1, lat: -35.4746831, lng: 149.1010032}
  - { name: Limestone Avenue,stop_code: Wjz5QNt, lat: -35.2649345, lng: 149.1372881}
  - { name: Maria Smith Lane,stop_code: Wjz7QEd, lat: -35.1777783, lng: 149.1356144}
  - { name: Ainsworth Street,stop_code: Wjz3s0s, lat: -35.3536247, lng: 149.0960036}
  - { name: Burdekin Avenue,stop_code: Wjz7KFS, lat: -35.166003, lng: 149.1254013}
- { name: Belconnen Way,stop_code: Wjr-MNh, lat: -35.2433401, lng: 149.0492618} - { name: Belconnen Way,stop_code: Wjr-MNh, lat: -35.2433401, lng: 149.0492618}
- { name: Belconnen Way,stop_code: Wjr-Mqd, lat: -35.2422956, lng: 149.0448568} - { name: Belconnen Way,stop_code: Wjr-Mqd, lat: -35.2422956, lng: 149.0448568}
- { name: Belconnen Way,stop_code: Wjr-EYe, lat: -35.2408449, lng: 149.0394925} - { name: Mapleton Avenue,stop_code: Wjzf0TD, lat: -35.1947102, lng: 149.1594002}
- { name: Belconnen Way,stop_code: Wjr-EA_, lat: -35.2407288, lng: 149.0362953} - { name: Shirley Street,stop_code: Wjze09i, lat: -35.2432594, lng: 149.1521583}
- { name: Mackinolty Street,stop_code: Wjr-Fw4, lat: -35.2382916, lng: 149.035194} - { name: Canopus Crescent,stop_code: Wjz6lCb, lat: -35.2122523, lng: 149.0902958}
- { name: Challinor Crescent,stop_code: Wjr-Vnf, lat: -35.2331848, lng: 149.054555} - { name: Bateson Road,stop_code: Wjz3twg, lat: -35.3484618, lng: 149.1014323}
- { name: Lightfoot Crescent,stop_code: Wjr-Ws2, lat: -35.230167, lng: 149.0557628} - { name: Julia Flynn Avenue,stop_code: Wjz3yhr, lat: -35.363967, lng: 149.1097901}
- { name: Nanson Place,stop_code: Wjr-PyX, lat: -35.2259882, lng: 149.0472724} - { name: Soward Way,stop_code: Wjz20QI, lat: -35.4168303, lng: 149.0716491}
- { name: Kulgera Street,stop_code: WjrZKZn, lat: -35.2510294, lng: 149.0396391} - { name: Kirkton Street,stop_code: Wjz2kVV, lat: -35.3971025, lng: 149.0952954}
- { name: King Edward Terrace,stop_code: Wjz4S1U, lat: -35.2983385, lng: 149.1296979} - { name: Townshend Street,stop_code: Wjz3khK, lat: -35.3527672, lng: 149.0882466}
- { name: King George Terrace,stop_code: Wjz4RbQ, lat: -35.3021238, lng: 149.1308574} - { name: Akuna Street,stop_code: Wjz5NyR, lat: -35.2807097, lng: 149.1350994}
- { name: James Street,stop_code: Wjz3fCx, lat: -35.333256, lng: 149.0798309} - { name: Dawes Street,stop_code: Wjz4Ws5, lat: -35.3177926, lng: 149.1435967}
  - { name: Burrinjuck Crescent,stop_code: WjrXLTo, lat: -35.332656, lng: 149.0384648}
  - { name: Langdon Avenue,stop_code: Wjz2kv_, lat: -35.3924846, lng: 149.0899096}
  - { name: Burkitt Street,stop_code: Wjr-NQD, lat: -35.2352414, lng: 149.0495101}
  - { name: Stradbroke Street,stop_code: Wjz4q-b, lat: -35.3166239, lng: 149.1052572}
  - { name: Ratcliffe Crescent,stop_code: Wjr-Wil, lat: -35.2312716, lng: 149.0546439}
  - { name: Owen Dixon Drive,stop_code: Wjz6l5Q, lat: -35.2128308, lng: 149.0856395}
  - { name: Fullagar Crescent,stop_code: Wjr-zMF, lat: -35.2275557, lng: 149.0277252}
  - { name: Paperbark Street,stop_code: Wjz0uHo, lat: -35.4727434, lng: 149.1029344}
  - { name: Limestone Avenue,stop_code: Wjz5X3a, lat: -35.2693144, lng: 149.1396485}
  - { name: Maria Smith Lane,stop_code: Wjz7QpP, lat: -35.177217, lng: 149.1337047}
  - { name: Ainsworth Street,stop_code: Wjz3rcB, lat: -35.3562498, lng: 149.0975914}
  - { name: Curran Drive,stop_code: Wjz7aYu, lat: -35.1858633, lng: 149.0836554}
  - { name: Forlonge Street,stop_code: Wjz2bGs, lat: -35.4016792, lng: 149.0808766}
  - { name: Anthony Rolfe Avenue,stop_code: Wjz7WBn, lat: -35.1851618, lng: 149.1452704}
  - { name: Lysaght Street,stop_code: Wjz6Z97, lat: -35.2153728, lng: 149.1409359}
  - { name: Briggs Street,stop_code: Wjz6VqV, lat: -35.2371606, lng: 149.1448198}
  - { name: Baldwin Drive,stop_code: Wjz6k-u, lat: -35.2174589, lng: 149.094759}
  - { name: Corlette Crescent,stop_code: Wjz2guG, lat: -35.4155625, lng: 149.0896092}
  - { name: Palmer Street,stop_code: Wjz3tEh, lat: -35.3483568, lng: 149.1027842}
  - { name: Gaunson Crescent,stop_code: Wjz2sbG, lat: -35.3957032, lng: 149.0977631}
  - { name: Kareelah Vista,stop_code: Wjz3z6u, lat: -35.3548322, lng: 149.1071079}
  - { name: Southern Cross Drive,stop_code: Wjr-OHp, lat: -35.2309824, lng: 149.0479652}
  - { name: Akuna Street,stop_code: Wjz5NpT, lat: -35.2812703, lng: 149.1336296}
  - { name: MacFarland Crescent,stop_code: Wjz3aGI, lat: -35.3632146, lng: 149.0813694}
  - { name: Brisbane Avenue,stop_code: Wjz4QMt, lat: -35.3095632, lng: 149.1372237}
  - { name: Athllon Drive,stop_code: Wjz3gK-, lat: -35.3712753, lng: 149.0926679}
  - { name: Athllon Drive,stop_code: Wjz3iFK, lat: -35.3637163, lng: 149.0922629}
  - { name: Dixon Drive,stop_code: WjrXLGN, lat: -35.335982, lng: 149.0375421}
  - { name: Ashburton Circuit,stop_code: Wjz6zAP, lat: -35.2246234, lng: 149.113116}
  - { name: Bradley Street,stop_code: Wjz3ldJ, lat: -35.344566, lng: 149.086774}
  - { name: Macgregor Street,stop_code: Wjz4qJ7, lat: -35.3169478, lng: 149.1023818}
  - { name: Pitman,stop_code: Wjz20nf, lat: -35.4144924, lng: 149.0655423}
  - { name: Cohen Street,stop_code: Wjr-USo, lat: -35.2400027, lng: 149.0603149}
  - { name: Chisholm Street,stop_code: Wjz5Wmw, lat: -35.2729408, lng: 149.1428886}
  - { name: Darwinia Terrace,stop_code: WjrXI5s, lat: -35.3501807, lng: 149.0301549}
  - { name: Perry Drive,stop_code: WjrXOn_, lat: -35.359526, lng: 149.0445552}
  - { name: Starke Street,stop_code: Wjr-y7q, lat: -35.2281166, lng: 149.0190993}
  - { name: Fremantle Drive,stop_code: WjrXQOh, lat: -35.3524926, lng: 149.049231}
  - { name: Fremantle Drive,stop_code: WjrXRzE, lat: -35.3464066, lng: 149.0469632}
  - { name: Gilmore Crescent,stop_code: Wjz3BfO, lat: -35.3434784, lng: 149.1088951}
  - { name: Constitution Avenue,stop_code: Wjz4_7i, lat: -35.2885802, lng: 149.1398674}
  - { name: Constitution Avenue,stop_code: Wjz4_xZ, lat: -35.2923896, lng: 149.1462296}
  - { name: Menindee Drive,stop_code: Wjzc51P, lat: -35.3035978, lng: 149.1515081}
  - { name: Menindee Drive,stop_code: Wjzc51o, lat: -35.3038736, lng: 149.1509932}
  - { name: Paperbark Street,stop_code: Wjz0uSv, lat: -35.4701046, lng: 149.1043077}
  - { name: Mackennal Street,stop_code: Wjz5Ls_, lat: -35.2462532, lng: 149.1227978}
  - { name: Benjamin Way,stop_code: Wjz57tz, lat: -35.2459378, lng: 149.0673726}
  - { name: Limestone Avenue,stop_code: Wjz5Wki, lat: -35.2741145, lng: 149.1425667}
  - { name: Hennessy Street,stop_code: Wjz57Rp, lat: -35.2460429, lng: 149.0712994}
  - { name: Hennessy Street,stop_code: Wjz5f20, lat: -35.2482159, lng: 149.0735953}
  - { name: Gundaroo Drive,stop_code: Wjz7Pt9, lat: -35.1801635, lng: 149.1328464}
  - { name: Federal Highway,stop_code: Wjz6Vie, lat: -35.2367108, lng: 149.1423457}
  - { name: Tillyard Drive,stop_code: Wjr_Nj3, lat: -35.1923664, lng: 149.0432864}
  - { name: Ainsworth Street,stop_code: Wjz3ran, lat: -35.3574923, lng: 149.0972696}
  - { name: Lind Close,stop_code: Wjr_NgT, lat: -35.1940674, lng: 149.0444665}
  - { name: William Webb Drive,stop_code: Wjz65Yz, lat: -35.2136695, lng: 149.0728014}
  - { name: Temperley Street,stop_code: Wjz7pj1, lat: -35.1925446, lng: 149.0982466}
  - { name: Kneebone Street,stop_code: Wjz1ebG, lat: -35.4286654, lng: 149.0758806}
  - { name: Laurens Street,stop_code: Wjz2aXM, lat: -35.4068387, lng: 149.0841811}
  - { name: Hoskins Street,stop_code: Wjz6SVl, lat: -35.2100433, lng: 149.1385112}
  - { name: Hoskins Street,stop_code: Wjz6_2a, lat: -35.2041349, lng: 149.1396699}
  - { name: Baldwin Drive,stop_code: Wjz6s4T, lat: -35.2187386, lng: 149.0965829}
  - { name: Barr Smith Avenue,stop_code: Wjz1dCc, lat: -35.4319028, lng: 149.0791593}
  - { name: Shakespeare Crescent,stop_code: Wjr_FiT, lat: -35.1926498, lng: 149.0333901}
  - { name: Gawler Crescent,stop_code: Wjz4yDo, lat: -35.3161818, lng: 149.112483}
  - { name: Palmer Street,stop_code: Wjz3tGi, lat: -35.3469041, lng: 149.1027627}
  - { name: Heysen Street,stop_code: WjrYUi3, lat: -35.3303715, lng: 149.0543864}
  - { name: McInnes Street,stop_code: WjrX-LF, lat: -35.3380475, lng: 149.0593646}
  - { name: McInnes Street,stop_code: Wjz3556, lat: -35.3444888, lng: 149.0625725}
  - { name: Collings Street,stop_code: Wjz3au8, lat: -35.3608522, lng: 149.0779362}
  - { name: Southern Cross Drive,stop_code: Wjr-ANt, lat: -35.2210131, lng: 149.0274356}
  - { name: Giles Street,stop_code: Wjz4Xqk, lat: -35.3137831, lng: 149.1439239}
  - { name: Norriss Street,stop_code: Wjz2Ek6, lat: -35.416638, lng: 149.1202507}
  - { name: Proctor Street,stop_code: Wjz2EK5, lat: -35.4152915, lng: 149.1244564}
  - { name: Gaunson Crescent,stop_code: Wjz2su2, lat: -35.3936391, lng: 149.0996299}
  - { name: Scantlebury Crescent,stop_code: Wjz1HSo, lat: -35.4432403, lng: 149.1262481}
  - { name: Ratcliffe Crescent,stop_code: Wjr-OSy, lat: -35.2288528, lng: 149.0495423}
  - { name: Bradfield Street,stop_code: Wjz6UOi, lat: -35.2425584, lng: 149.1479955}
  - { name: Mapleton Avenue,stop_code: Wjzf11h, lat: -35.1938773, lng: 149.1508064}
  - { name: Belconnen Way,stop_code: Wjr-EAb, lat: -35.2411038, lng: 149.0352891}
  - { name: Southern Cross Drive,stop_code: Wjr-OlW, lat: -35.2295189, lng: 149.0445481}
  - { name: Dobinson Place,stop_code: Wjr-KOL, lat: -35.2091755, lng: 149.0387116}
  - { name: Anzac Parade,stop_code: Wjz5Ug6, lat: -35.2874971, lng: 149.1421805}
  - { name: Anthony Rolfe Avenue,stop_code: Wjz7Ph1, lat: -35.1828994, lng: 149.1312485}
  - { name: Unaipon Avenue,stop_code: Wjz7CsN, lat: -35.1644038, lng: 149.111604}
  - { name: Mirrabei Drive,stop_code: Wjz7BVT, lat: -35.1714114, lng: 149.1171079}
- { name: Kent Street,stop_code: Wjz4peM, lat: -35.322342, lng: 149.0979263} - { name: Kent Street,stop_code: Wjz4peM, lat: -35.322342, lng: 149.0979263}
- { name: Fuller Street,stop_code: Wjz4qgy, lat: -35.3208475, lng: 149.098981}  
- { name: Hopetoun Circuit,stop_code: Wjz4A7o, lat: -35.3052441, lng: 149.107042}  
- { name: De Chair Street,stop_code: Wjz4qTw, lat: -35.3162151, lng: 149.1045086}  
- { name: Macgregor Street,stop_code: Wjz4qs0, lat: -35.3182278, lng: 149.09964}  
- { name: Stonehaven Crescent,stop_code: Wjz4yzk, lat: -35.3186155, lng: 149.1123352}  
- { name: Dominion Circuit,stop_code: Wjz4H0P, lat: -35.3152936, lng: 149.1185178}  
- { name: Schlich Street,stop_code: Wjz4tpE, lat: -35.3038329, lng: 149.1005569}  
- { name: Weston Street,stop_code: Wjz4z67, lat: -35.3107704, lng: 149.1065979} - { name: Weston Street,stop_code: Wjz4z67, lat: -35.3107704, lng: 149.1065979}
- { name: Musgrave Street,stop_code: Wjz4tUp, lat: -35.3044055, lng: 149.1056974} - { name: Chippindall Circuit,stop_code: Wjz1G89, lat: -35.4527651, lng: 149.1190457}
- { name: Hopetoun Circuit,stop_code: Wjz4A2c, lat: -35.3082791, lng: 149.1066534}  
- { name: Lienhop Street,stop_code: Wjz1HTi, lat: -35.4423392, lng: 149.1260397}  
- { name: Hartung Crescent,stop_code: Wjz1zN3, lat: -35.4464057, lng: 149.1147796}  
- { name: Lawrence Wackett Crescent,stop_code: Wjz1HEb, lat: -35.4471149, lng: 149.1245306}  
- { name: Callister Crescent,stop_code: Wjz1xWZ, lat: -35.4565002, lng: 149.1174205}  
- { name: Chippindall Circuit,stop_code: Wjz1Gjj, lat: -35.4504956, lng: 149.1205257}  
- { name: Fidge Street,stop_code: Wjz1rQ6, lat: -35.4440887, lng: 149.1038388}  
- { name: Weavers Crescent,stop_code: Wjz1xRC, lat: -35.4544199, lng: 149.1154761}  
- { name: Kiddle Crescent,stop_code: Wjz1CdY, lat: -35.4270927, lng: 149.1090734}  
- { name: Fairley Crescent,stop_code: Wjz1G89, lat: -35.4527651, lng: 149.1190457}  
- { name: Fairley Crescent,stop_code: Wjz1F5W, lat: -35.4547272, lng: 149.1186974}  
- { name: Muscio Place,stop_code: Wjz2EdX, lat: -35.416214, lng: 149.120065}  
- { name: Clift Crescent,stop_code: Wjz1CRl, lat: -35.4269745, lng: 149.1151677}  
- { name: Southern Close,stop_code: Wjz1K49, lat: -35.428009, lng: 149.1176708}  
- { name: Clift Crescent,stop_code: Wjz1J4T, lat: -35.4330044, lng: 149.1185777} - { name: Clift Crescent,stop_code: Wjz1J4T, lat: -35.4330044, lng: 149.1185777}
- { name: Prichard Circuit,stop_code: Wjz1K89, lat: -35.4308171, lng: 149.1191218}  
- { name: Twamley Crescent,stop_code: Wjz1JD7, lat: -35.4309354, lng: 149.1230759}  
- { name: Monaro Highway,stop_code: Wjz1JTP, lat: -35.4312901, lng: 149.126776}  
- { name: Deamer Crescent,stop_code: Wjz1S5I, lat: -35.4271223, lng: 149.1292791} - { name: Deamer Crescent,stop_code: Wjz1S5I, lat: -35.4271223, lng: 149.1292791}
- { name: Monaro Highway,stop_code: Wjz1SfM, lat: -35.4260286, lng: 149.1309478} - { name: Gillies Street,stop_code: Wjz49Y5, lat: -35.3233291, lng: 149.0831296}
- { name: Henry Melville Crescent,stop_code: Wjz1TLL, lat: -35.4199685, lng: 149.1361715}  
- { name: Muntz Street,stop_code: Wjz1Lxu, lat: -35.4241367, lng: 149.1234749}  
- { name: Mofflin Street,stop_code: Wjz1Liw, lat: -35.4239889, lng: 149.1208993}  
- { name: Tuck Place,stop_code: Wjz1DLm, lat: -35.4200572, lng: 149.1136804}  
- { name: Proctor Street,stop_code: Wjz2M5R, lat: -35.4160071, lng: 149.129533}  
- { name: Hynes Place,stop_code: Wjz2wY-, lat: -35.4166279, lng: 149.1173443}  
- { name: Sweet Place,stop_code: Wjz2EL2, lat: -35.4149132, lng: 149.1244544}  
- { name: Schoales Place,stop_code: WjrXZiM, lat: -35.3470777, lng: 149.0553331}  
- { name: Logue Place,stop_code: WjrXRW0, lat: -35.3471147, lng: 149.0502999}  
- { name: Finlayson Place,stop_code: Wjz2NPZ, lat: -35.4118681, lng: 149.1378765}  
- { name: Namatjira Drive,stop_code: WjrXZz3, lat: -35.3461161, lng: 149.0570563}  
- { name: Wark Street,stop_code: Wjz3nLq, lat: -35.3325054, lng: 149.0919265}  
- { name: McCulloch Street,stop_code: Wjz49Y5, lat: -35.3233291, lng: 149.0831296}  
- { name: Novar Street,stop_code: Wjz4shf, lat: -35.3086912, lng: 149.0984092} - { name: Novar Street,stop_code: Wjz4shf, lat: -35.3086912, lng: 149.0984092}
- { name: Novar Street,stop_code: Wjz4rk2, lat: -35.3126013, lng: 149.0982349} - { name: Groom Street,stop_code: Wjz4gt5, lat: -35.3281248, lng: 149.0887511}
- { name: Denison Street,stop_code: Wjz4hPC, lat: -35.323921, lng: 149.0935136} - { name: Carruthers Street,stop_code: Wjz499S, lat: -35.3252899, lng: 149.0759651}
- { name: Jensen Street,stop_code: Wjz4gou, lat: -35.3314972, lng: 149.0892541} - { name: Wheeler Crescent,stop_code: Wjz2aLs, lat: -35.4037395, lng: 149.081019}
- { name: Denison Street,stop_code: Wjz4hMe, lat: -35.3259558, lng: 149.0929241}  
- { name: Yarra Glen,stop_code: Wjz4gt5, lat: -35.3281248, lng: 149.0887511}  
- { name: Carruthers Street,stop_code: Wjz49Wd, lat: -35.324698, lng: 149.0833563}  
- { name: Shiels Place,stop_code: Wjz4arc, lat: -35.3185933, lng: 149.0779149}  
- { name: Heysen Street,stop_code: WjrYUG8, lat: -35.3306155, lng: 149.058622}  
- { name: Dunstan Street,stop_code: Wjz4aH6, lat: -35.3184453, lng: 149.0804542}  
- { name: Mair Place,stop_code: Wjz48dZ, lat: -35.3281016, lng: 149.0761465}  
- { name: Jennings Street,stop_code: Wjz499S, lat: -35.3252899, lng: 149.0759651}  
- { name: O'Loghlen Street,stop_code: Wjr-IMR, lat: -35.2216889, lng: 149.0389433}  
- { name: Carruthers Street,stop_code: Wjz48qI, lat: -35.3302472, lng: 149.0785498}  
- { name: Heysen Street,stop_code: WjrYUj0, lat: -35.3299526, lng: 149.0543559}  
- { name: Heysen Street,stop_code: Wjz37Lm, lat: -35.3321544, lng: 149.0697369}  
- { name: Burnie Street,stop_code: Wjz3d3K, lat: -35.3459087, lng: 149.0743512}  
- { name: Derwent Street,stop_code: Wjz3ee-, lat: -35.3383098, lng: 149.0761505}  
- { name: Anne Place,stop_code: Wjz3fa8, lat: -35.3360845, lng: 149.0750477}  
- { name: McInnes Street,stop_code: WjrX-Lw, lat: -35.3381915, lng: 149.0592024}  
- { name: Lycett Street,stop_code: WjrX_xY, lat: -35.3364869, lng: 149.0583028}  
- { name: Meldrum Street,stop_code: WjrX_iU, lat: -35.3361318, lng: 149.0556038}  
- { name: Namatjira Drive,stop_code: WjrX-m2, lat: -35.3386886, lng: 149.0543559}  
- { name: Mather Street,stop_code: WjrX-sE, lat: -35.3402511, lng: 149.0565615}  
- { name: Buvelot Street,stop_code: Wjz354b, lat: -35.345459, lng: 149.062772}