--- /dev/null
+++ b/betweenpoint.php
@@ -1,1 +1,254 @@
-
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <script src="openlayers/OpenLayers.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">
+
+function init()
+{
+ // create the ol map object
+ var map = new OpenLayers.Map('map');
+
+ 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
+ markers = new OpenLayers.Layer.Markers("Between Stop Markers");
+
+ //hanlde mousedown on regions that are not points by reporting latlng
+OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
+ defaultHandlerOptions: {
+ 'single': true,
+ 'double': false,
+ 'pixelTolerance': 0,
+ 'stopSingle': false,
+ 'stopDouble': false
+ },
+
+ initialize: function(options) {
+ this.handlerOptions = OpenLayers.Util.extend(
+ {}, this.defaultHandlerOptions
+ );
+ OpenLayers.Control.prototype.initialize.apply(
+ this, arguments
+ );
+ this.handler = new OpenLayers.Handler.Click(
+ this, {
+ 'click': this.trigger
+ }, this.handlerOptions
+ );
+ },
+
+ trigger: function(e) {
+ var lonlat = map.getLonLatFromViewPortPx(e.xy).transform(
+ new OpenLayers.Projection("EPSG:900913"),
+ new OpenLayers.Projection("EPSG:4326")
+ );
+ $('form input[name="newlatlng"]').val(lonlat.lat + ";" + lonlat.lon );
+ }
+
+ });
+ var click = new OpenLayers.Control.Click();
+ map.addControl(click);
+ click.activate();
+<?php
+ $conn = pg_connect("dbname=bus user=postgres password=snmc");
+ if (!$conn) {
+ echo "An error occured.\n";
+ exit;
+ }
+ $result_stops = pg_query($conn, "Select * FROM stops");
+
+ while ($stop = pg_fetch_assoc($result_stops)) {
+ echo 'marker = new OpenLayers.Marker(new OpenLayers.LonLat(' . ($stop['lng'] / 10000000) . "," . ($stop['lat'] / 10000000) . ')
+ .transform(
+ new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
+ new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection
+ ));';
+
+ echo '
+ marker.id="' . $stop['geohash'] . '";
+ markers.addMarker(marker);
+marker.events.register("mousedown", marker, function() {
+
+document.getElementById("between_points").innerHTML += this.id+";";
+$(\'form input[name="oldgeopo"]\').val(this.id);
+});
+';
+ }
+?>
+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 });
+
+ map.addLayers([osmtiles, markers,timepoints]);
+ map.addControl(new OpenLayers.Control.LayerSwitcher());
+ map.zoomToExtent(markers.getDataExtent());
+ }
+ </script>
+ <script type="text/javascript">
+function submitBetween () {
+ $.post("betweenpoint.submit.php", $("#inputform").serialize(), function(html){
+ $("#response").html(html);
+ clearForms();
+ return false;
+ });
+};
+function submitMove () {
+ $.post("betweenpoint.move.php", $("#moveform").serialize(), function(html){
+ $("#response").html(html);
+ clearForms();
+ return false;
+ });
+};
+function submitDelete () {
+ $.post("betweenpoint.delete.php", $("#moveform").serialize(), function(html){
+ $("#response").html(html);
+ clearForms();
+ return false;
+ });
+};
+function submitAdd () {
+ $.post("betweenpoint.add.php", $("#moveform").serialize(), function(html){
+ $("#response").html(html);
+ clearForms();
+ return false;
+ });
+};
+function OnChange(dropdown)
+{
+ var myindex = dropdown.selectedIndex
+ var selValue = dropdown.options[myindex].value;
+ $("#routes").val(selValue.split(":",2)[0]);
+ fromto = selValue.split(":",2)[1];
+ $("#from").val(fromto.split("->",2)[0]);
+ $("#to").val(fromto.split("->",2)[1]);
+ document.getElementById("between_points").innerHTML = "";
+ return true;
+}
+
+// function will clear input elements on each form
+function clearForms(){
+document.getElementById("between_points").innerHTML = "";
+ // declare element type
+ var type = null;
+ // loop through forms on HTML page
+ for (var x=0; x<document.forms.length; x++){
+ // loop through each element on form
+ for (var y=0; y<document.forms[x].elements.length; y++){
+ // define element type
+ type = document.forms[x].elements[y].type
+ // alert before erasing form element
+ //alert('form='+x+' element='+y+' type='+type);
+ // switch on element type
+ switch(type){
+ case "text":
+ case "textarea":
+ case "password":
+ //case "hidden":
+ document.forms[x].elements[y].value = "";
+ break;
+ case "radio":
+ case "checkbox":
+ document.forms[x].elements[y].checked = true;
+ break;
+ case "select-one":
+ document.forms[x].elements[y].options[0].selected = true;
+ break;
+ case "select-multiple":
+ for (z=0; z<document.forms[x].elements[y].options.length; z++){
+ document.forms[x].elements[y].options[z].selected = false;
+ }
+ break;
+ }
+ }
+ }
+}
+ </script>
+
+ </head>
+ <body onload="init()">
+ <div id="inputpane"><form id="inputform">
+<select name=selectPair onchange='OnChange(this.form.selectPair);'>
+<option>Select a from/to pair...</option>
+<?php
+ include('spyc/spyc.php');
+ //$timetable = Spyc::YAMLLoad('../spyc.yaml');
+ $path = "maxious-canberra-transit-feed/output/";
+ $dhandle = opendir("maxious-canberra-transit-feed/output/");
+ // define an array to hold the files
+ $files = array();
+ $paths = array();
+
+ if ($dhandle) {
+ // loop through all of the files
+ while (false !== ($fname = readdir($dhandle))) {
+ if (($fname != '.') && ($fname != '..')) {
+ $timetable = Spyc::YAMLLoad("maxious-canberra-transit-feed/output/" . $fname);
+ // Strip off individual platforms because it usually doesn't matter for routes
+ $timetable["time_points"] = preg_replace("/\(Platform.*/","",$timetable["time_points"]);
+ for ($i = 0; $i < sizeof($timetable["time_points"]) - 1; $i++) {
+ $key = trim($timetable["time_points"][$i]) . "->" . trim($timetable["time_points"][$i + 1]);
+ if (strstr($paths[$key],";" . $timetable["short_name"] . ";") === false)
+ @$paths[$key] .= $timetable["short_name"] . ";";
+ }
+ }
+ }
+ }
+ ksort($paths);
+
+ $completedPaths = array();
+ $result_betweenstops = pg_query($conn, "Select * FROM between_stops");
+ while ($path = pg_fetch_assoc($result_betweenstops)) {
+ $key = trim($path['fromlocation']) . "->" . trim($path['tolocation']);
+ $completedPaths[$key].= trim($path['routes']);
+
+ }
+
+ $processed = 0;
+ foreach ($paths as $path => $routes) {
+ if (!in_array($path, array_keys($completedPaths))) {
+ echo "<option value=\"$routes:$path\"> $path ($routes) </option>\n";
+ $processed++;
+ } else {
+ $completedRoutes = explode(";", $completedPaths[$path]);
+ $incompleteRoutes = "";
+ foreach (explode(";", $routes) as $route) {
+
+ if (!in_array($route,$completedRoutes) && strstr($incompleteRoutes,';'.$route.';') === false) {
+ $incompleteRoutes .= $route.';';
+ }
+
+ }
+ if ($incompleteRoutes != "") {
+ echo "<option value=\"$incompleteRoutes:$path\"> $path ($incompleteRoutes) </option>\n";
+ $processed++;
+ }
+ }
+
+ }
+ echo "</select>$processed";
+?>
+ from <input type="text" name="from" id="from"/>
+ to <input type="text" name="to" id="to"/>
+<br>
+ on routes <input type="text" name="routes" id="routes"/>
+Reverse? <input type="checkbox" name="reverse" id="reverse" checked="true"/>
+<input type="button" onclick="javascript:submitBetween()" value="Submit!">
+<input type="button" value="Clear" onclick="javascript:clearForms()" title="Start clearForms() JavaScript function">
+<br>
+<textarea name="between_points" id="between_points" rows="1" cols="120"></textarea>
+</form>
+ <form id="moveform">
+oldgeopo <input type="text" name="oldgeopo" id="oldgeopo"/>
+newlatlng <input type="text" name="newlatlng" id="newlatlng" size="60"/>
+ <input type="button" onclick="javascript:submitMove()" value="Move!">
+ <input type="button" onclick="javascript:submitAdd()" value="Add!">
+ <input type="button" onclick="javascript:submitDelete()" value="Delete!">
+</form>
+<div id="response">
+ <!-- Our message will be echoed out here -->
+ </div>
+</div>
+ <div id="map" width="100%" height="100%"></div>
+ </body>
+</html>
+
--- /dev/null
+++ b/jquery.1.3.2.min.js
@@ -1,1 +1,19 @@
-
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table&