var browserIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1;
var monthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var latlngBrighton = {lat:50.84025205614279,lng:-0.13647079467773438}
var selectedStationObj = {code:"BTN"};
// ******* CALORIE CALCULATIONS START FUNCTIONS *******
function calcCals(frm){
	//weightCal(frm.calcweight);
	// Calories burned by exercise = ((METs * 3.5 * weightKg) / 200) * timeMin.
	var miles2KmFactor = 1.60934
	var metFactor = 2
	var cals = 0;
	var dist;
	var pace = frm.calcpace.value; // mph
	var mode = frm.calcmode.value; 
	var weight = (frm.calcweightunits.value.toLowerCase() == "kg")?frm.calcweight.value:frm.calcweight.value/2.2; // kg
	if (frm.calcdistunits.value == "miles"){
		dist = frm.calcdist.value*1000*miles2KmFactor;
	} else {
		dist = frm.calcdist.value*1000;
	}
	if (Number(pace) == 2) {
		metFactor = 2
	} else if (Number(pace) == 3) {
		metFactor = 4.2
	} else if (Number(pace) == 4) {
		metFactor = 8
	}
	if (mode == "cycle"){
		metFactor = metFactor * 1.2
		pace = Number(pace)*4;
	}
	cals = ((Number(metFactor) * 3.5 * Number(weight))/200)*(Number(dist)/(Number(pace)*Number(miles2KmFactor)*1000*(1/60)))	
	document.getElementById('calcresult').innerHTML = Math.round(cals) +" calories";
	document.getElementById('calcresult').style.border = 'solid 1px #f37c18';
	document.getElementById('calcresult').style.padding = '6px';
}

function weightCal(obj) {
    var weightStone = document.getElementById('weightstone').value;
    var weightIbs = document.getElementById('weightibs').value;
    var weightKg = document.getElementById('weightkg').value;
    var objWeightKg = document.getElementById('weightkg');
    if (obj.name != "weightkg") {
        objWeightKg.value = Math.round((Number(weightStone * 14) + Number(weightIbs)) / 2.2); // 2.2 Ibs per Kilo
    } else {
    }
}

function weightCal2(obj) {
    var objWeightStone = document.getElementById('weightstone');
    var objWeightIbs = document.getElementById('weightibs');
    var objWeightKg = document.getElementById('weightkg');
    if (!isNaN(objWeightKg.value)) {
        var stone = Math.floor((objWeightKg.value * 2.2) / 14);
        var Ibs = Math.round(((objWeightKg.value) * 2.2) - (stone * 14));
        sel_func(objWeightStone, stone);
        sel_func(objWeightIbs, Ibs);
        weightCal(obj);
    } else {
        weightCal(obj);
    }
}

function heightCal(obj) {
    var heightFeet = document.getElementById('heightfeet').value;
    var heightInch = document.getElementById('heightinch').value;
    var heightCm = document.getElementById('heightcm').value;
    var objHeightCm = document.getElementById('heightcm');
    if (obj.name != "heightcm") {
        objHeightCm.value = Math.round((Number(heightFeet * 12) + Number(heightInch)) * 2.5); // 2.5 cm per inch
    }
}
function heightCal2(obj) {
    var objHeightFeet = document.getElementById('heightfeet');
    var objHeightInch = document.getElementById('heightinch');
    var objHeightCm = document.getElementById('heightcm');
    if (!isNaN(objHeightCm.value)) {
        var feet = Math.floor((objHeightCm.value * (1 / 2.5)) / 12);
        var inch = Math.round(((objHeightCm.value) * (1 / 2.5)) - (feet * 12));
        sel_func(objHeightFeet, feet);
        sel_func(objHeightInch, inch);
        heightCal(obj)
    } else {
        heightCal(obj);
    }
}
// ******* CALORIE CALCULATIONS END FUNCTIONS *******

function openWindow_func(url, wname, topleft, fullscreen, appw, apph, scroll) {
	fscreen = (fullscreen == 1)?"fullscreen":"";	
	if (topleft == 1){
		screenx = 0
		screeny = 0
	} else {
		screenx = (screen.width - appw)/2
		screeny = (screen.height - apph)/2
	}
	newWin = window.open(url, wname, "toolbar=no,status=yes,"+fscreen+",scrollbars="+scroll+",resizable=yes,menubar=no,width="+appw+",height="+apph+",left="+screenx+",top="+screeny+", maximize=yes");
	//return newWin;
}

function txtboxInit(txtboxObj, initVal){
	if (txtboxObj.value == initVal){
		txtboxObj.value = '';		
	}
	if (txtboxObj.className.substr(txtboxObj.className.length-4,4) == "init"){
		//txtboxObj.className = txtboxObj.className.substr(0,txtboxObj.className.length-4);// Bug in IE
		txtboxObj.style.color='#003366';
	} else if (txtboxObj.className.substr(txtboxObj.className.length-4,4) == "warn"){
		txtboxObj.style.color='#003366';
	}
}

function setStyle_func(obj, stylevar, styleval){
	if (navigator.userAgent.toLowerCase().indexOf("msie") > -1){
		obj.style[stylevar]=styleval;
	} else {
		obj.style[stylevar]=styleval;
	}
}

function replaceTxt_func(txtStr,replaceSelStr,replaceWithTxt){
	return txtStr.split(replaceSelStr).join(replaceWithTxt);
}

function decPlaces(no,noDecPlaces){
	return Math.round(no*Math.pow(10,noDecPlaces))/Math.pow(10,noDecPlaces);
}


function db2frm(dbValArr,frmObjArr,frm){ // Loads database values into a specified form
	var dbArrLen = dbValArr.length;
	for(i=0;i<dbArrLen;i++){
		if (frm[frmObjArr[i]]){
			if (frm[frmObjArr[i]].type == undefined){ // radio
				radSet_func(frm[frmObjArr[i]], dbValArr[i]);
			} else if (frm[frmObjArr[i]].type == "text" || frm[frmObjArr[i]].type == "textarea" || frm[frmObjArr[i]].type == "hidden"){
				frm[frmObjArr[i]].value = dbValArr[i];
			} else if (frm[frmObjArr[i]].type.indexOf("check") != -1){
				frm[frmObjArr[i]].checked=(dbValArr[i] != 0)?true:false;
				//alert(frmObjArr[i]+" "+frm[frmObjArr[i]].checked)
			} else if (frm[frmObjArr[i]].type == "select"){
				sel_func(frm[frmObjArr[i]], dbValArr[i]);
			}
		}
	}
}

function sel_func(selObj, selVal){ // Positions the select object at given index
	selL = selObj.length;
	for(p=0;p<selL;p++){
		if (String(selObj.options[p].value)==String(selVal)){
			selObj.selectedIndex=p;
			break;
		}
	}
}

function addZero(str){
	var res = str;	
	if (str.toString().length <= 1){
		res = "0"+str;
	}
	return res;
}
function inputIsPostcode(postcodetxt){
	var isFullPostcode = true;
	if (postcodetxt.length >=5 && postcodetxt.length <= 9){
		if (!isNaN(postcodetxt.substr(0,1))){
			isFullPostcode = false;
		}
		if (postcodetxt.indexOf(" ") == -1){
			postcodetxt = postcodetxt.substr(0,postcodetxt.length-3)+" "+postcodetxt.substr(postcodetxt.length-3,3);
		}
		postcode2ndPart = postcodetxt.substr(postcodetxt.length-3,3);
		if (isNaN(postcode2ndPart.substr(0,1))){ // first number of second part of postcode has to be a number
			isFullPostcode = false;
		}
		if (!isNaN(postcode2ndPart.substr(1,1)) || !isNaN(postcode2ndPart.substr(2,1))){  // second and third numbers of second part of postcode has to be a letters
			isFullPostcode = false;
		}
	} else {
		isFullPostcode = false;
	}
	return isFullPostcode;
}

function addPostcodeSpace(postcodetxt){	
	if (postcodetxt.indexOf(" ") == -1){		
		postcodetxt = postcodetxt.substr(0,postcodetxt.length-3)+" "+postcodetxt.substr(postcodetxt.length-3,3);
	}
	return postcodetxt;
}

// ******* FORM FUNCTIONS *******
function radioListCheckedVal_func(frm,radGroupName){ // Gets radiobox selected value
	res = "";
	var radObj = frm[radGroupName];
	l = radObj.length;
	for(i=0;i<l;i++){
		if (radObj[i].checked){
			res = radObj[i].value;
		}
	}
	return res;
}

function radValidate_func(radGroup){// Checks to see if a radio group has been checked
	rL = radGroup.length;
	radChked=0;
	for(a=0;a<rL;a++){
		if (radGroup[a].checked){
			radChked=1;
		}
	}
	if (radChked==1){
		return true;
	} else {
		return false;
	}
}

function sel_func(selObj, selVal){ // Positions the select object at given index
	selL = selObj.length;
	for(p=0;p<selL;p++){
		if (String(selObj.options[p].value)==String(selVal)){
			selObj.selectedIndex=p;
			break;
		}
	}
}

function radSet_func(radObj, radVal){ // Sets the radiobox group based on a radiobox value
	radL = radObj.length;
	for(p=0;p<radL;p++){
		if (String(radObj[p].value)==String(radVal)){
			radObj[p].checked=true;
			break;
		}
	}
}

function radHasVal_func(radObj, radVal){ // Checks whether the radiobox group has is checked on the given value
	var res=false;
	radL = radObj.length;
	for(p=0;p<radL;p++){
		if (String(radObj[p].value)==String(radVal) && radObj[p].checked){
			res=true;
		}
	}
	return res;
}

function radioListChecked_func(radGroupName){ // Checks if a radiobox group is checked
	radChecked=false;
	radObj = document.forms[0][radGroupName];
	l = radObj.length;
	for(i=0;i<l;i++){
		if (radObj[i].checked){
			radChecked=true;
		}
	}
	return radChecked;
}

function radSelIndex_func(radObj){ // Checks whether the radiobox group has is checked on the given value
	var radIndex=-1;
	radL = radObj.length;
	for(p=0;p<radL;p++){
		if (radObj[p].checked){
			radIndex=p;
		}
	}
	return radIndex;
}

// *************************** //






function sendXmlHttpRequestPost(url,callback,postdata) {	
	var xmlhttp=false;
	try  {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); /* for IE < 5 */
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}

	/* mozilla & opera */
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();
	}	

	xmlhttp.open("POST",url,true);
	xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
	xmlhttp.onreadystatechange=function() {
		//alert(xmlhttp.readyState)
		if(xmlhttp.readyState == 4){ 
			if (xmlhttp.status == 200) {
				callback(xmlhttp.responseText);
				//alert(xmlhttp.responseText);
			}
		} else if(xmlhttp.readyState == 4 && xmlhttp.status != 200) {
			alert("Error:\n"+xmlhttp.error);
		}
	}
	xmlhttp.send(postdata); /* are sending null because we dont have any data to post */
}

function sendXmlHttpRequestGet(url,callback,callbackParam,getdata) {	// callbackParam is an array
	var xmlhttp=false;
	try  {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); /* for IE < 5 */
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}

	/* mozilla & opera */
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') { 
		xmlhttp = new XMLHttpRequest();
	}
	xmlhttp.open("GET",url,true);
	xmlhttp.onreadystatechange=function() {
		if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
			callback(xmlhttp.responseText, callbackParam);
			//alert(xmlhttp.responseText);
		} else if(xmlhttp.readyState == 4 && xmlhttp.status != 200) {
			//alert("Error:\n"+xmlhttp.error);			
			window.status = 'http request aborted/error.';
		//} else if (xmlhttp.status == 500){
			//alert("There was an error retrieving live departure information for this station - it may not be available.")
		}
	}
	xmlhttp.send(getdata); /* are sending null because we dont have any data to post */
}

function sendXmlHttpRequestPostUpload(url,callback,postdata) {	
	var xmlhttp=false;
	try  {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); /* for IE < 5 */
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}

	/* mozilla & opera */
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();
	}

	xmlhttp.open("POST",url,true);
	//xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
	xmlhttp.setRequestHeader("Content-type", "multipart/form-data")
	xmlhttp.onreadystatechange=function() {
		if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
			callback(xmlhttp.responseText);
			//alert(xmlhttp.responseText);
		} else if(xmlhttp.readyState == 4 && xmlhttp.status != 200) {
			alert("Error:\n"+xmlhttp.error);
		}
	}
	xmlhttp.send(postdata); /* are sending null because we dont have any data to post */
}

function validateForm(frm,inputsArr){
	var inputObjsL = inputsArr.length;
	var frmValid = true;
	for(i=0;i<inputObjsL;i++){
		frm[inputsArr[i]].className = 'required';
		if (frm[inputsArr[i]].type == "text" || frm[inputsArr[i]].type.indexOf("select") != -1 || frm[inputsArr[i]].type == "password"){
			if (frm[inputsArr[i]].value == ""){
				frm[inputsArr[i]].className = 'isrequired';
				frmValid = false;
			}
		}		
	}	
	return frmValid;
}


// ***** JOURNEY PLANNER FUNCTIONS ******

function gotoRAC(from,to){
	window.open("http://www.rac.co.uk/route-planner/results/?qs_1="+from+"&qs_3=&qs_2=&qs_4="+to+"&countryCode_4=UK&countryCode_1=UK&countryCode_3=UK&countryCode_2=UK&rpref=true&optimizeIntermediates=true&mapType=interactive&rtype=true&jsOption=1", "winRAC")
}

function jpStartAgain(){	
	location.href="jplanner1.asp";
}

function gotoJPlanner(fromtxt,totxt){
	frm = document.getElementById('minijplanner');
	frm.addrfrom.value = fromtxt;
	frm.addrto.value = totxt;
	frm.submit();
}

function jpTimesEarlier(){
	showloader_func();
	location.href="jplanner3.asp?planjourney=1&earlier=1"
}

function jpTimesLater(){
	showloader_func();
	location.href="jplanner3.asp?planjourney=1&later=1"
}

function showOnMap(mode,markerID,fromOSX,fromOSY,toOSX,toOSY,txt,naptanid){
	var ptFrom = OS2LatLonWGS84_func(fromOSX,fromOSY);
	ptFrom = new GLatLng(ptFrom.lat, ptFrom.lng);
	var ptTo = OS2LatLonWGS84_func(toOSX,toOSY);
	ptTo = new GLatLng(ptTo.lat, ptTo.lng);
	if (mode == "walk"){
		imageUrl = "images/mapicon_walk.png";
		lineColor = "#817bb9";
	} else if (mode == "rail"){
		imageUrl = "images/mapicon_rail.png";
		lineColor = "#67bc77";
	} else if (mode == "bus" || mode == "coach"){
		imageUrl = "images/mapicon_bus.png";
		lineColor = "#f17278";
	}
	
	map.addOverlay(new GPolyline([ptFrom, ptTo], lineColor, 6, 0.6, {geodesic:true}));
	
	// Create our marker icon
	var icon = new GIcon();
	icon.image = imageUrl
	icon.shadow = "images/mapicon_sqshad.png";
	icon.iconSize = new GSize(41, 41);
	icon.shadowSize = new GSize(60, 41);
	icon.iconAnchor = new GPoint(1, 41);
	icon.infoWindowAnchor = new GPoint(21, 35);	
	
	
	addJMarker2Map(ptFrom,16,icon,markerID,imageUrl,txt,naptanid);
}

function gotoMarker_func(pt){
	map.setCenter(pt, 16);
}

function showloader_func(){
	var windowHeight = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight;
	scroll(0, 0);
	loaderObj = document.getElementById('loader');
	loaderObj.style.display='block';
	loaderObj.style.position=(detectIsIE6())?'absolute':'fixed';
	loaderObj.style.width=document.body.clientWidth+'px';
	loaderObj.style.height=windowHeight+'px';

	loaderObj = document.getElementById('loaderbg');
	loaderObj.style.width=document.body.clientWidth+'px';
	loaderObj.style.height=windowHeight+'px';
	loaderObj.style.display='block';
	loaderObj.style.position=(detectIsIE6())?'absolute':'fixed';
}

function detectIsIE6() {
	var browser = navigator.appName;
	var b_version = navigator.appVersion;
	var version = parseFloat(b_version);
	if (browser.indexOf("Microsoft") != -1 && (version <= 6) ){
		// IE 6-
		return true;
	} else {
		// other browsers or IE 7+
		return false;
	}
}

function detectIEversion(){
	var ieversion = "na";
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
		ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
	}
	return ieversion
}

function setAddressFav(selObj, txtbox){
	txtbox.value = selObj.value;	
	selObj.selectedIndex = 0;
}


function saveJPAddrToFav(addrtxt,lat,lng,htmlResObj){	
	htmlResObj.innerHTML += " <img src='images/ajax-loader-facebook.gif' />";
	sendXmlHttpRequestGet("ajax_mtimanagefavs.asp?servact=saveaddress&xpos="+lat+"&ypos="+lng+"&address="+addrtxt,saveJPAddrToFavRes,htmlResObj,null);
}

function saveJPAddrToFavRes(res,htmlResObj){
	//alert(htmlResObj.parentNode.innerHTML)
	htmlResObj.parentNode.innerHTML = "<div class='success'>Address saved to favourites!</div>"
}

function showHideEmailResults(elId){
	var obj = document.getElementById(elId);
	if (obj.style.display == "" || obj.style.display == "none"){
		obj.style.display = 'block';
	} else {
		obj.style.display = 'none';
	}
}

// generic function - get the html object with a class name
function getTagCssName(parentObj, htmlTag, className, func){
	var htmlTags = parentObj.getElementsByTagName(htmlTag);
	var htmlTagsLen = htmlTags.length;
	var resObj = null;
	for (z=0;z<htmlTagsLen;z++){
		if (htmlTags[z].className == className){
			resObj = htmlTags[z];
			break;
		}
	}
	return resObj;
}

function updateMapControls(){ // this is only a hack
	var images = map.getContainer().getElementsByTagName("img");
	var imgUpdates=0;
	for(var i=0; i<images.length; i++){		
		if (images[i].src.indexOf("mapcontrols3d") != -1){
			imgUpdates=1;
		}
		images[i].src = images[i].src.replace(/mapcontrols2/,"mapcontrols3d");
	}
	if (imgUpdates==0){
		setTimeout(updateMapControls, 500);
	}
	//window.status += imgUpdates+", ";
}

// ***** NEXTBUSES FUNCTIONS START *******
function getNextBuses(naptanCode, serviceNo, resObj, loaderObj, jtime){
	//alert(naptanCode+" ,"+resObj+", "+loaderObj)
	realTimeResultsObj = resObj;
	realTimeLoaderObj = loaderObj;
	if (realTimeLoaderObj){realTimeLoaderObj.innerHTML = "&nbsp;&nbsp;loading...";}
	if (loaderObj){
		loaderObj.style.display="inline";
	} else {
		alert("LoaderObj does not exist!");
	}
	var jtimeqry = "";
	if (jtime != undefined){
		jtimeqry = "&time="+jtime;
	}
	if (naptanCode != ""){
		sendXmlHttpRequestGet("data/nextbuses/?naptan="+naptanCode+"&serviceno="+serviceNo,getNextBusesResult,{results:resObj,loaderObj:loaderObj,naptanCode:naptanCode,serviceNo:serviceNo, jtime:jtime},"");
	}
}

function getNextBusesResult(res,objs){
	objs.loaderObj.style.display="none";
	objs.results.innerHTML = res+"<div class='clear'></div>";
}
// ***** NEXTBUSES FUNCTIONS END *******

// ***** DATABROKER FUNCTIONS START *******
var currGetDataBrokerUrl = "";
var currGetDataBrokerServiceNo = "";
function getDataBroker(naptanCode, serviceNo, resObj, loaderObj, dest, no2show, title, jtime){
	currGetDataBrokerServiceNo = serviceNo;
	//alert(naptanCode+" ,"+resObj+", "+loaderObj)
	realTimeResultsObj = resObj;
	realTimeLoaderObj = loaderObj;
	if (realTimeLoaderObj){realTimeLoaderObj.innerHTML = "&nbsp;&nbsp;loading...";}
	if (loaderObj){
		loaderObj.style.display="inline";
	} else {
		alert("LoaderObj does not exist!");
	}
	if (naptanCode != ""){
		if (dest != undefined){
			destqry = "&dirname="+dest
		} else {
			destqry = ""
		}
		if (nextbusesNum != undefined){
			numqry = "&num="+nextbusesNum
		} else {
			numqry = ""
		}	
		var titleqry = "";
		if (title == undefined){
			title = "";
		} else {
			titleqry = "&title="+title;
		}
		var jtimeqry = "";
		if (jtime != undefined){
			if (jtime != ""){
				jtimeqry = "&time="+jtime;
			}
		}
		currGetDataBrokerUrl = "data/databroker/?naptan="+naptanCode+"&serviceno="+serviceNo+destqry+numqry+jtimeqry+titleqry
		sendXmlHttpRequestGet("data/databroker/?naptan="+naptanCode+"&serviceno="+serviceNo+destqry+numqry+jtimeqry+titleqry,getDataBrokerResult,{results:resObj,loaderObj:loaderObj,naptanCode:naptanCode,serviceNo:serviceNo, title:title, jtime:jtime},"");
	}
}

function refreshDataBroker(){
	if (currGetDataBrokerUrl != ""){
		sendXmlHttpRequestGet("data/databroker/?naptan="+naptanCode+"&serviceno="+serviceNo+destqry+numqry+jtimeqry+titleqry,getDataBrokerResult,{results:resObj,loaderObj:loaderObj,naptanCode:naptanCode,serviceNo:serviceNo, title:title, jtime:jtime},"");
	}
}

function getDataBrokerResult(res,objs){
	objs.loaderObj.style.display="none";
	if (objs.title != ""){
		res = "<h4 style='color:#ffffff'>"+objs.title+"</h4>"+res;
	}
	objs.results.innerHTML = res+"<div class='clear'></div>";
	if (browserIE){
		var footer = document.getElementById('footer');		
		footer.style.display = "none";	
	}
}

function getBrowserWidthHeight(){	
	return {w:document.body.clientWidth,h:document.body.clientHeight}
}
// ***** DATABROKER FUNCTIONS END *******

function getStyle(el,styleProp) {
	var x = document.getElementById(el);
	if (window.getComputedStyle) {
		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp); 
	} else if (x.currentStyle) {
		var y = x.currentStyle[styleProp];
	}                     
	return y;
}

// ***** Dropdown functions start *****
function initDropdown(ddObj){
	var divTags = ddObj.getElementsByTagName('div');
	var divTagsLen = divTags.length;
	for (a=0;a<divTagsLen;a++){
		if (divTags[a].className == "sel" || divTags[a].className == "warning"){

			divTags[a].onclick = function(){
				openDropdown(this.parentNode.parentNode);
			}
		}
	}
}

var currDDObjChildren;
function openDropdown(ddObj){
	if (currDDObjChildren){
		currDDObjChildren.style.display='none';
	}
	var selObj = null;
	var divTags = ddObj.getElementsByTagName('div');
	var divTagsLen = divTags.length;
	for (i=0;i<divTagsLen;i++){
		if (divTags[i].className == "list"){
			divTags[i].style.display=(divTags[i].style.display=='block')?'none':'block';
			currDDObjChildren = divTags[i];
		} else if (divTags[i].className == "sel"){
			selObj = divTags[i];
		}
	}
	var ignoreDiv = false;
	for (p=0;p<ddIgnoreList.length;p++){
		if (ddIgnoreList[p] == ddObj.id){
			ignoreDiv = true;
		}
	}
	if (!ignoreDiv){
		var aTags = ddObj.getElementsByTagName('a');
		var aTagsLen = aTags.length;
		for (i=0;i<aTagsLen;i++){
			aTags[i].onmouseup = function(){
				if (this.getElementsByTagName("span").length > 0){
					chooseDropDownVal(ddObj, this.getElementsByTagName("span")[0].innerHTML)
				}
				return false;
			}
		}
	}
}

function chooseDropDownVal(ddObj, val, callbackFunc, callbackVars){
	var selObj = null;
	var divTags = ddObj.getElementsByTagName('div');
	var divTagsLen = divTags.length;
	//alert(ddObj)
	for (i=0;i<divTagsLen;i++){
		if (divTags[i].className == "list"){
			currDDObjChildren = divTags[i];
			divTags[i].style.display="none";
		} else if (divTags[i].className == "sel"){
			selObj = divTags[i];
			selObj.getElementsByTagName("span")[0].innerHTML = val;
		}
	}
	if (callbackFunc != undefined){
		callbackFunc(callbackVars);
	}
}

function getSelectedDDOpt(ddObj){
	var res = "";
	var divTags = ddObj.getElementsByTagName('div');
	var divTagsLen = divTags.length;
	for (i=0;i<divTagsLen;i++){
		if (divTags[i].className == "sel"){
			res = divTags[i].getElementsByTagName("span")[0].innerHTML;
		}
	}
	return res;
}

function appendToSelectObj(selectObj, optTxt, optVal) {
	var elOptNew = document.createElement('option');
	elOptNew.text = optTxt;
	elOptNew.value = optVal;
	try {
		selectObj.add(elOptNew, null); // standards compliant; doesn't work in IE
	} catch(ex) {
		selectObj.add(elOptNew); // IE only
	}
}



function daySupersctip_func(dy){
	var ss;
	var sn;
	if (Number(dy) >= 10 && Number(dy) <= 20){
		ss = "th";
	} else {
		if (Number(dy) < 10){
			sn=0;
		} else if (Number(dy) > 20){
			sn=1;
		}
		if (String(dy).substr(0,1) == "0"){
			dy = String(dy).substr(1,1);
		}
		if (Number(String(dy).substr(sn,1)) == 1){
			ss="st"
		} else if (Number(String(dy).substr(sn,1)) == 2){
			ss="nd"
		} else if (Number(String(dy).substr(sn,1)) == 3){
			ss="rd"
		} else {
			ss="th"
		}
	}
	return ss;
}

function xmlChildTxtExists_func(xmlObj, tagname){
	var fchildExists=false;
	if (xmlObj.getElementsByTagName(tagname)[0]){
		if (xmlObj.getElementsByTagName(tagname)[0].firstChild){
			fchildExists=true;
		}
	}
	return fchildExists;
}

function getXMLChildTxt_func(xmlObj, tagname){
	var fchildtxt="";
	if (xmlChildTxtExists_func(xmlObj, tagname)){
		fchildtxt=xmlObj.getElementsByTagName(tagname)[0].firstChild.nodeValue;
	}
	return fchildtxt;
}

function getUrlFileName(){
	var pathArr = location.pathname.split("/");
	return pathArr[pathArr.length-1];
}


// ***** Dropdown functions end *****

function preloadImgs(imgSrcArr){
	var img;
	for(i=0;i<imgSrcArr.length;i++){
		img = new Image();
		img.src = imgSrcArr[i];
	}
}

function getObjProperties(obj){
	var res = "";	
	for (prop in obj){
		res += prop+"\n";
	}
	return res;
}

function closeObj(objId){
	var obj = document.getElementById(objId)
	if (obj != undefined){
		obj.style.display = "none";
	}
}


// **** Mouse Poistion Capture Function *** 
var mouseX, mouseY;
function mouseMove(evt) {
	var IE = document.all?true:false;
	if (window.event) {
		mouseX = event.x; // there are other values depending on your needs
		mouseY = event.y; // one is clientX. Can't remember the others offhand
		mouseX = event.clientX// + document.body.scrollLeft;
		mouseY = event.clientY// + document.body.scrollTop;
	} else {
		mouseX = evt.pageX;
		mouseY = evt.pageY;
	}
}
document.onmousemove = mouseMove;
if (window.captureEvents) {
	window.captureEvents(Event.MOUSEMOVE);
}

function rmoveWhite_space(str){
     return (str).replace(/^\s*|\s*$/g,'');
}



function searchKeyPress(e, func, params){
	// look for window.event in case event isn't passed in
	if (window.event) { e = window.event; }
	if (e.keyCode == 13){
			func(params);
			return false; // disables submitting form, must have "return searchKeyPress" on the keypress event in textbox
	}
}

function gotourl_func(url){
	location.href=url;
}



function loadRailStations(resID, htmlOrDropdown){
	if (window.XMLHttpRequest) {
		xhttp=new XMLHttpRequest();
	} else { // IE 5/6
		xhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	xhttp.open("GET","data/railwaystations.xml",false);
	xhttp.send();
	xmlDoc=xhttp.responseXML;
	ptArr = xmlDoc.getElementsByTagName('XML_Railway_Station');
	noPts = ptArr.length;
	divHtml = "";
	var selI = 0;
	for(i=0;i<noPts;i++){
		pnorth = getXMLChildTxt_func(ptArr[i], 'Northing');
		peast = getXMLChildTxt_func(ptArr[i], 'Easting');
		pcode = getXMLChildTxt_func(ptArr[i], 'StationCode');
		pinfo = getXMLChildTxt_func(ptArr[i], 'ShortDescription');
		if (pinfo.toLowerCase() == "brighton station"){
			selI = i+1;
		}
		realtimeurl = getXMLChildTxt_func(ptArr[i], 'WebsiteUrl');
		//ptlat = OS2LatLonWGS84_func(peast, pnorth).lat;
		//ptlng = OS2LatLonWGS84_func(peast, pnorth).lng;
		//ptsr = new GLatLng(ptlat, ptlng);
		if (htmlOrDropdown == "html"){
			divHtml += "<div><strong>"+pinfo+"</strong> <a href='"+realtimeurl+"' target='_blank'>&raquo; more information.</a></div>";
		} else {			
			appendToSelectObj(document.getElementById(resID), pinfo, pcode)
		}
	}
	if (htmlOrDropdown == "html"){
		document.getElementById(resID).innerHTML = divHtml
	} else {
		document.getElementById(resID).selectedIndex = selI;
	}
}


function refreshRailArrDeps(){
	if (selectedStationObj.code != ""){	
		ajaxLoadLiveRailInfo(selectedStationObj.code, selectedStationObj.resID, selectedStationObj.arrdepVal, selectedStationObj.loaderID ,selectedStationObj.num2show);
	}
}

function ajaxLoadLiveRailInfo(stationCode, resID, arrdepVal, loaderID ,num2show){
	if (stationCode != ""){
		selectedStationObj.code = stationCode;
		selectedStationObj.resID = resID;
		selectedStationObj.arrdepVal = arrdepVal;
		selectedStationObj.loaderID = loaderID;
		selectedStationObj.num2show = num2show;
		document.getElementById(loaderID).style.display='inline';
		//alert("nationalrailwebservice/?stationcode="+stationCode+"&arrdep="+arrdepVal)
		sendXmlHttpRequestGet("data/nationalrailwebservice/?stationcode="+stationCode+"&arrdep="+arrdepVal+"&num="+num2show,ajaxLoadLiveRailInfoRes,{resID:resID,arrdepVal:arrdepVal,loaderID:loaderID},null);
	}
}

function ajaxLoadLiveRailInfoRes(res, resParams){
	res = res.split("<!--// @@@ OUTPUT START @@@ //-->")[1].split("<!--// @@@ OUTPUT END @@@ //-->")[0]
	//alert(res)
	document.getElementById(resParams.loaderID).style.display='none';
	document.getElementById(resParams.resID).innerHTML=res;
	if (document.getElementById('nationrailnotice')){
		document.getElementById('nationrailnotice').style.display = "block";
	}
	if (document.getElementById('nationrailnotice')){
		document.getElementById('footer').style.display = "inline";
		setTimeout(function(){
			document.getElementById('footer').style.display = "block";
		},100);
	}
}

function formatTime(min){
	res = min+"min"
	if (min > 60){
		hr = Math.floor(min/60)
		min = min-(hr*60);
		res = hr+"hr "+min+"min";
	}
	return res;
}

function googleSearch(qry) {
	location.href="searchresults.asp?q="+qry;
}

function googleSearchKey(e) {	
    if (e.keyCode == 13) {
    	googleSearch(document.getElementById('googleqry').value);
    }
}


var llBottomLeft = {lat:50.786838126951494,lng:-0.340576171875}
var llTopRight = {lat:50.870978137947134,lng:-0.00274658203125}
var locationMarker;
function getCurrentLocation(noticeID, buspage) {
	if (navigator.geolocation)
	{
		navigator.geolocation.getCurrentPosition(

			function (position) {

			// Did we get the position correctly?
			// alert ("Your current position: "+position.coords.latitude+", "+position.coords.longitude);

			// To see everything available in the position.coords array:
			// for (key in position.coords) {alert(key)}

			//mapServiceProvider(position.coords.latitude,position.coords.longitude);
			var ll = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
			// *** Uncomment line below to test for Brighton ***
			//ll = new google.maps.LatLng(50.82437289802585,-0.14333724975585938);
			if (ll.lat() > llBottomLeft.lat && ll.lat() < llTopRight.lat && ll.lng() > llBottomLeft.lng && ll.lng() < llTopRight.lng){
				map.setCenter(ll);
				map.setZoom(16);
				if (buspage){
					en = LatLonWGS842OS_func(ll.lat(), ll.lng());					
					getStopsGoByCoord(parseInt(en.easting), parseInt(en.northing));					
				}
				document.getElementById(noticeID).style.display="block";
				document.getElementById(noticeID).innerHTML = "Your current location is highlighted on map. <img src='../images/icons/mylocation.png' align='middle' width='14' height='14' />"				
			} else {
				document.getElementById(noticeID).style.display="block";
				document.getElementById(noticeID).innerHTML = "Your current location is outside the Brighton &amp; Hove area. <a href='#' onclick='javacscript:map.setCenter(new google.maps.LatLng("+ll.lat()+","+ ll.lng()+"));map.setZoom(12);return false'><img src='../images/icons/mylocation.png' align='middle' width='14' height='14' /> Go to my location</a>"
			}
			locationMarker = gmapAddMarker({position: ll,title:'My location (approx)',map:map, icon:'../images/icons/mylocation.png'});

			},
			// next function is the error callback
			function (error)
			{
				switch(error.code)
				{
					case error.TIMEOUT:
						alert ('Timeout');
						break;
					case error.POSITION_UNAVAILABLE:
						alert ('Position unavailable');
						break;
					case error.PERMISSION_DENIED:
						alert ('Permission denied');
						break;
					case error.UNKNOWN_ERROR:
						alert ('Unknown error');
						break;
				}
			}
		);
	}
}

function jqueryOrderSelectOpts(selId) {
	var my_options = $("#"+selId+" option");
	my_options.sort(function(a,b) {
		if (a.text > b.text) return 1;
		else if (a.text < b.text) return -1;
		else return 0
	})
	$("#"+selId).empty().append( my_options );
	$("select#"+selId).val('');
}


function sortJsonArr(jsonArr, elName) {
	//alert(jsonArr[0][elName]);
	jsonArr = jsonArr.sort(function(a,b) {
	    return a[elName] > b[elName];
	});
	//alert(jsonArr[0][elName]);
}


var currSearchedMarker;
function search4Location(address){
	var sw = new google.maps.LatLng(50.80767039437801,-0.37628173828125);
	var ne = new google.maps.LatLng(50.92900693240739,0.072784423828125);
	var bds = new google.maps.LatLngBounds(sw,ne);
	geoCodeAddr(geocoder,{'address': address+", Brighton & Hove, UK", bounds:bds, region:"gb"}, function(res){
		if (bds.contains(res)){
			map.setCenter(res);
			map.setZoom(15);
		} else {
			alert("Outside Brighton & Hove!\nPlease refine your search.")
		}
		if (currSearchedMarker != undefined){
			currSearchedMarker.setMap(null);
		}
		currSearchedMarker = gmapAddMarker({position: res,title:address,map:map, icon:'../images/icons/gmapicons/arrow.png'});
	});
}
