// NextSydneyFerry.com 2009 v0.0.13
//

function addEvent(element,type,handler,useCapture){if(element.addEventListener){element.addEventListener(type,handler,useCapture);}else{if(!handler.$$guid){handler.$$guid=addEvent.guid++;}
if(!element.events){element.events={};}
var handlers=element.events[type];if(!handlers){handlers=element.events[type]={};if(element['on'+type]){handlers[0]=element['on'+type];}
element['on'+type]=handleEvent;}
handlers[handler.$$guid]=handler;}}
addEvent.guid=1;function removeEvent(element,type,handler,useCapture){if(element.removeEventListener){element.removeEventListener(type,handler,useCapture);}else if(element.events&&element.events[type]&&handler.$$guid){delete element.events[type][handler.$$guid];}}
function handleEvent(event){event=event||fixEvent(window.event);var returnValue=true;var handlers=this.events[event.type];for(var i in handlers){if(!Object.prototype[i]){this.$$handler=handlers[i];if(this.$$handler(event)===false){returnValue=false;}}}
if(this.$$handler){this.$$handler=null;}
return returnValue;}
function fixEvent(event){event.preventDefault=fixEvent.preventDefault;event.stopPropagation=fixEvent.stopPropagation;return event;}
fixEvent.preventDefault=function(){this.returnValue=false;};fixEvent.stopPropagation=function(){this.cancelBubble=true;};if(!window.addEventListener){document.onreadystatechange=function(){if(window.onload&&window.onload!=handleEvent){addEvent(window,'load',window.onload,false);window.onload=handleEvent;}};}
String.prototype.trim=function(){return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/,"$1");};var NXTSF={formID:"ttForm",timetableId:"tt",noteId:"note",loaderId:"loader",bookmarkId:"bookmark",debug:true,form:{},ttEmt:{},defaultTimeDispl:"--.--",defaultNone:"Sorry, no ferries at this time!",defaultError:"Oops, something went wrong! Sorry!",noResultError:"No data received through YQL!",serviceOnlySummer:false,serviceFriSatNight:false,serviceNotSunday:false,serviceDOW:"WEEK",isiPhone:false,hostname:"http://query.yahooapis.com/v1/public/yql?",defaultXPath:"//table[@summary=\"Sydney Ferries ferry timetable\"]",sundayXPath:"//p[span[@class=\"range\"]=\"(Sunday)\"]/following::table",hostNSF:"http://nextsydneyferry.com",hostTimetable:"http://nextsydneyferry.com",timeTable:{'darling-harbour':['darling','dh-tt-weekend','WE'],'manly-ferry':['manly','manly-ferry-weekend-and-public-holidays','WE'],'mosman':['mosman','mossman-weekemd','SUN'],'neutral-bay':['neutral','neutral-bay-weekend','SUN'],'parramatta-river':['parra','parramatta-weekend','WE'],'taronga-zoo':['taronga','taronga-zoo-weekend','SUN'],'watsons-bay':['watsons','watsons-bay-weekend','WE'],'woolwich-balmain':['woolwich','woolwich-balmain-weekend','SUN']},init:function(){if((navigator.userAgent.indexOf('iPhone')!=-1)||(navigator.userAgent.indexOf('iPod')!=-1)){NXTSF.isiPhone=true;}
var jsField=document.getElementById("js");var form=document.getElementById(NXTSF.formID);if(form){if(jsField){jsField.value="js";}
NXTSF.form=form;NXTSF.handleForm();}
var tt=document.getElementById(NXTSF.timetableId);if(tt){NXTSF.ttEmt=tt;}
if(NXTSF.isiPhone){NXTSF.ipodHideURLbar();window.addEventListener("load",function(){setTimeout(NXTSF.ipodHideURLbar,0);},false);}},handleForm:function(){var form=NXTSF.form;if(form){addEvent(form,"submit",function(e){if(e.cancelable){e.preventDefault();}
e.returnValue=false;NXTSF.getYQLUrl();var time=new Date();time=(time.getTime()).toString();time=time.substring(0,time.length-5);NXTSF.loadJSON({"url":"sydneyTime/?callback=handleTime&"+time,"id":"jsTime"});return false;},false);}},getYQLUrl:function(){var tt=NXTSF.ttEmt;var ttSelection=document.getElementById("timetable");var currentDay=document.getElementById("currentDay");if(ttSelection&&currentDay&&tt){tt.innerHTML=NXTSF.createResult({});NXTSF.handleLoader(true);ttSelection=ttSelection.value;currentDay=currentDay.value;if(NXTSF.debug){}
NXTSF.serviceOnlySummer=false;NXTSF.serviceFriSatNight=false;NXTSF.serviceDOW="WEEK";var xpath=NXTSF.defaultXPath;var page=(ttSelection!=="")?ttSelection:'manly-ferry';var styleClass=(NXTSF.timeTable[page])?NXTSF.timeTable[page][0]:'manly';var weekendPage=(NXTSF.timeTable[page]!=="")?NXTSF.timeTable[page][1]:'manly-ferry-weekend-and-public-holidays';if(currentDay.toUpperCase()=="SAT"||currentDay.toUpperCase()=="SUN"){NXTSF.serviceDOW="WE";if(currentDay.toUpperCase()=="SUN"&&NXTSF.timeTable[page][2]=="SUN"){xpath=NXTSF.sundayXPath;NXTSF.serviceDOW="SUN";}
page=weekendPage;}
var select=encodeURI("select * from html where url in ('"+NXTSF.hostTimetable+"/timetables/"+page+".htm') and xpath='"+xpath+"'");var query='q='+select+'&callback=handleResult';query=query+'&format=json';var url=NXTSF.hostname+query;if(NXTSF.debug){}
NXTSF.setBookmark(ttSelection);NXTSF.loadJSON({"url":url});}},loadJSON:function(obj){var url=obj.url||undefined;var jsId=obj.id||"extjson";if(NXTSF.debug){}
if(url){var headID=document.getElementsByTagName("head")[0];var newScript=document.createElement('script');newScript.type='text/javascript';newScript.src=url;newScript.id=jsId;headID.appendChild(newScript);}},setTimeTable:function(data){var tt=document.getElementById(NXTSF.timetableId);var result=NXTSF.createResult({missed:"xx.xx",next:"xx.xx",then:"xx.xx"})+"<hr>"+NXTSF.defaultNone;if(data&&data.query&&data.query.results&&data.query.results.table){try{if(NXTSF.debug){}
result=NXTSF.parseFerryTT(data.query.results.table);}catch(e){result=NXTSF.defaultError;NXTSF.handleError(e);}}else{result=NXTSF.noResultError;}
tt.innerHTML=result;NXTSF.setNote();NXTSF.handleLoader(false);},setNote:function(){var note=document.getElementById(NXTSF.noteId);note.innerHTML="&nbsp;";switch(NXTSF.serviceDOW){case"SUN":note.innerHTML="This is the <strong>Sunday</strong> service.";break;case"WE":note.innerHTML="This is the <strong>Weekend</strong> service.";break;default:note.innerHTML="This is the <strong>weekday</strong> service.";}
if(NXTSF.serviceOnlySummer){note.innerHTML=note.innerHTML+"<br>* this service does not operate on Sunday and/or only operates during summer";}
if(NXTSF.serviceFriSatNight){note.innerHTML=note.innerHTML+"<br>+ this service operates Friday and Saturday nights only";}},setBookmark:function(value){var bm=document.getElementById(NXTSF.bookmarkId);if(bm){bm.setAttribute("href","/?timetable="+value);}},handleLoader:function(show){var loader=document.getElementById(NXTSF.loaderId);if(loader){if(show){loader.setAttribute("class","loading");}else{loader.setAttribute("class","");}}},isAMorPM:function(){return NXTSF.form.ampm.value;},getCalculatedTime:function(pTime,pAmpm){var dt;if((pTime.indexOf("..")==-1)){var ampm=pAmpm||"PM";var divider=(pTime.indexOf(".")>0)?'.':':';var aTime=pTime.split(divider);dt=new Date();var hour=Number(aTime[0].trim());dt.setHours(hour+((ampm.toUpperCase()==="PM"&&hour<12)?Number(12):Number(0)));var minutes=aTime[1].trim();minutes=(minutes.indexOf('*')===-1)?minutes:minutes.substring(0,minutes.indexOf('*'));minutes=(minutes.indexOf('+')===-1)?minutes:minutes.substring(0,minutes.indexOf('+'));dt.setMinutes(minutes);}else{dt="....";}
return dt;},parseFerryTT:function(data){var dataLng=data.length;if(NXTSF.debug){}
var circQuay=[];var missed,next,then;var found=false;var result=NXTSF.createResult({missed:"xx.xx",next:"xx.xx",then:"xx.xx"})+"<hr>"+NXTSF.defaultNone;var currentTime=document.getElementById("currentTime").value;currentTime=(currentTime.indexOf("0")===0)?currentTime.substring(1,currentTime.length):currentTime;var currentAMPM=document.getElementById("ampm").value;var realTime=NXTSF.getCalculatedTime(currentTime,currentAMPM);if(NXTSF.debug){}
for(var x=0;x<dataLng&&!found;x++){if(NXTSF.debug){}
var table=data[x];var headings=table.thead.tr.th;var rowsLength=table.tbody.tr.length;for(var y=0;y<rowsLength&&!found;y++){if(NXTSF.debug){}
var row=table.tbody.tr[y];var clmLength=row.td.length;var lookup=true;for(var z=0;z<clmLength&&lookup&&!found;z++){if(NXTSF.debug){}
var clm=row.td[z];if(row.td[0].p=="Departing Circular Quay"){lookup=true;if(NXTSF.debug){}
if(z>0){var time=clm.p;if(time&&time.indexOf("..")<0){var ampm=headings[z].p;var ttTime=NXTSF.getCalculatedTime(time,ampm);if(NXTSF.debug){}
if(ttTime=="...."||realTime>ttTime){missed=ttTime;}else{next=ttTime;if(time.indexOf('*')>-1){NXTSF.serviceOnlySummer=true;NXTSF.serviceNotSunday=true;}else if(time.indexOf('+')>-1){NXTSF.serviceFriSatNight=true;}
if('undefined'==typeof(missed)){missed=NXTSF.defaultTimeDispl;}}
if(('undefined'!=typeof(next))&&('undefined'!=typeof(missed))){found=true;if(NXTSF.debug){}
if(z<clmLength-1){then=row.td[z+1].p;}else if(x<dataLng-1){then=data[x+1].tbody.tr[0].td[1].p;if(data[x+1].tbody.tr[0].td[0].p!="Departing Circular Quay"){then="xx.xx";}}else{then=NXTSF.defaultTimeDispl;}
var noon=Number(12);if(missed!=NXTSF.defaultTimeDispl){missed=((missed.getHours()>noon)?missed.getHours()-noon:missed.getHours())+"."+((missed.getMinutes()=="0")?missed.getMinutes()+"0":((missed.getMinutes()<10)?"0"+missed.getMinutes():missed.getMinutes()));}
if(next!=NXTSF.defaultTimeDispl){next=((next.getHours()>noon)?next.getHours()-noon:next.getHours())+"."+((next.getMinutes()=="0")?next.getMinutes()+"0":((next.getMinutes()<10)?"0"+next.getMinutes():next.getMinutes()))+
((!NXTSF.serviceOnlySummer)?"":"*")+
((!NXTSF.serviceFriSatNight)?"":"+");}
result=NXTSF.createResult({missed:missed,next:next,then:then});if(NXTSF.debug){}}
if(NXTSF.debug){}}}}else{lookup=false;}}}}
return result;},createResult:function(obj){var missed=obj.missed||NXTSF.defaultTimeDispl;var next=obj.next||NXTSF.defaultTimeDispl;var then=obj.then||NXTSF.defaultTimeDispl;var result="<dt class='mssd'>Missed:</dt><dd class='mssd'>"+missed+"</dd>"+"<dt class='nxt'>Next:</dt><dd class='nxt'>"+next+"</dd>"+"<dt class='thn'>Then:</dt><dd class='thn'>"+then+"</dd>";return result;},setSydneyTime:function(data){var sydTime=document.getElementById("yourTime");if(sydTime&&data&&data.sydneyTime){sydTime.innerHTML=data.sydneyTime;}},handleError:function(er){if(er=="100"){}
if(NXTSF.debug){console.error("ERROR "+er);alert(er);}},ipodHideURLbar:function(){window.scrollTo(0,0);}};function handleResult(data){NXTSF.setTimeTable(data);}
function handleTime(data){NXTSF.setSydneyTime(data);var jsTime=document.getElementById("jsTime");if(jsTime){jsTime.parentNode.removeChild(jsTime);}}
NXTSF.init();