//
//	AJAX - addEvent - Cookie - Error Handling
//

/* Dependencies:
		sf.asp?Lat='+Lng+'&Lng='+Lat+'&Rad='+fRadius+'&eventType='+eventType
		getCentreFromBranchID.asp?eID=
		get.event.info.asp?eID=

*/
function addEvent( obj, type, fn ){
	if (obj.addEventListener){
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent){
		obj["e"+type+fn]=fn;
		obj[type+fn]=function(){ obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type]=obj["e"+type+fn];
	}
}

var EventCache=function(){
	var listEvents=[];
	return {
		listEvents:listEvents,
		add:function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush:function(){
			var i, item;
			for(i=listEvents.length - 1; i >= 0; i=i - 1){
				item=listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				}
				if(item[1].substring(0, 2) != "on"){
					item[1]="on" + item[1];
				}
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				}
				item[0][item[1]]=null;
			}
		}
	};
}();


var AJAX={
	http:Object,
	httpCookie:Object,
	httpEvent:Object,
	ro:Object,
	createRequestObject:function(){
		var browser=navigator.appName;
		if(browser=="Microsoft Internet Explorer"){AJAX.ro=new ActiveXObject("Microsoft.XMLHTTP");}
		else{AJAX.ro=new XMLHttpRequest();}
		return AJAX.ro;
	},
	sndReq:function(Lng,Lat,fRadius,eventType){
		try{
			AJAX.http=AJAX.createRequestObject();
			AJAX.http.open('get','sf.asp?Lat='+Lng+'&Lng='+Lat+'&Rad='+fRadius+'&eventType='+eventType,true);
			AJAX.http.onreadystatechange=AJAX.handleResponse;
			AJAX.http.send(null);
		}catch (error){ }
	},
	handleResponse:function(){
		try{
			if(AJAX.http.readyState==4){
				var response=AJAX.http.responseText;
//alert('handleResponse: '+response)
				eventFinder.json=response;
				eventFinder.handleResults();
			}
		}catch (error){ }
	},

	sndReqCoord:function(Lng,Lat,fRadius,eventType){
		try{
			AJAX.httpCoord=AJAX.createRequestObject();
			AJAX.httpCoord.open('get','sf.asp?Lat='+Lng+'&Lng='+Lat+'&Rad='+fRadius+'&eventType='+eventType,true);
			AJAX.httpCoord.onreadystatechange=AJAX.handleCoord;
			AJAX.httpCoord.send(null);
		}catch (error){ }
	},
	handleCoord:function(){
		try{
			if(AJAX.httpCoord.readyState==4){
				var response=AJAX.httpCoord.responseText;
//alert('handleCoord response: '+response)
				eventFinder.json=response;
				eventFinder.handleResultsCoord();
			}
		}catch (error){ }
	},

/* I don't think this is used (couldn't find a reference to: getCookieCentre)*/
	getCookieCentre:function(eID){
		try{
			AJAX.httpCookie=AJAX.createRequestObject();
			AJAX.httpCookie.open('get','getCentreFromBranchID.asp?BranchID='+eID,true);
			AJAX.httpCookie.onreadystatechange=AJAX.handleCookieCentre;
			AJAX.httpCookie.send(null);		
		}catch (error){ }
	},
	handleCookieCentre:function(){
		try{
			if(AJAX.httpCookie.readyState==4){
				var response=AJAX.httpCookie.responseText;			
				var aSplit=response.split('|');					
				if (aSplit){
					eventFinder.map.setCenter(new GLatLng(aSplit[0], aSplit[1]), 12);
				}
				eventFinder.handleResults();
			}
		}catch(error){ }
	},


	getMoreEventInfo:function(eID){
		try{			
			AJAX.httpEvent=null;
			AJAX.httpEvent=AJAX.createRequestObject();
//alert("eID: "+eID);
			AJAX.httpEvent.open('get','get.event.info.asp?eID='+eID,true);
			AJAX.httpEvent.onreadystatechange=AJAX.handleMoreEventInfo;
			AJAX.httpEvent.send(null);		
		}catch (error){ }
	},
	handleMoreEventInfo:function(){
		try{
			if(AJAX.httpEvent.readyState==4){
				var response=AJAX.httpEvent.responseText;
				results.jsonEvent=response;
//alert('handleMoreEventInfo: '+response);
				results.showDetailedEventInformation();
			}
		}catch(error){ }
	}
};

//Error Handling
var mapError={
	notCompatible:function(){
		//Clear map pane
		//write error message
	},
	ajaxBadReturn:function(){
		//attempt retry
		//display meesage
	},
	writeErrorMessage:function(errorMessage){
		//display errorMessage param
	}
};

var cookies={
	oEventFinderCookie:Object,
	sName:'BranchNumber',
	iCookieValue:'1111',
	sDefaultExpiry:'',
	getIt:function(){
		cookie.iCookieValue=readCookie(cookies.sName);
		if (cookies.oEventFinderCookie){
			return cookies.oEventFinderCookie;
		}
	},
	createIt:function(cookieValue){
		document.cookie= cookise.sName + "=" + cookieValue + ";expires=" + cookies.sDefaultExpiry;
	},
	readIt:function(){
		if (document.cookie.length > 0){
			sName=document.cookie.indexOf(cookie.sName + "=");
			if (sName != -1){ 
				iValueStart=sName + cookies.sName.length + 1;
				iValueEnd=document.cookie.indexOf(";",iValueStart);
				if (iValueEnd==-1){
					iValueEnd=document.cookie.length;
				}
				return document.cookie.substring(iValueStart,iValueEnd);
			} 
		  }
		return "";
	},
	updateIt:function(){
		//DO
	}
};

var uti={
	fFig:function(v){
		var s=v+"";
		if (s.length==3){x="0"+s;}
		else{x=s;}
		return x;
}	}

var admin={
	myEventTester:function(e){
		var events ="<p>LatLong: " + e.view.LatLong + "</p>";
		document.getElementById('adminMode').innerHTML=events;
	}
};




/* Added functions MJF */

// jsCSS(action,object,class1,class2) -  className: swap, add, remove, check or toggle - author: Christian Heilmann - http://www.onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html
function jsCSS(a,o,c1,c2){switch(a){case'swap':o.className=!jsCSS('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);break;case'add':if(!jsCSS('check',o,c1)){o.className+=o.className?' '+c1:c1};break;case'remove':var rep=o.className.match(' '+c1)?' '+c1:c1;o.className=o.className.replace(rep,'');break;case'check':return new RegExp('\\b'+c1+'\\b').test(o.className);break;case'toggle':if(jsCSS('check',o,c1)){jsCSS('remove',o,c1)}else{jsCSS('add',o,c1)};break}return false}

// author: mike foskett - http://webSemantics.co.uk/
function $id(id){return(document.getElementById(id)?document.getElementById(id):false)}
function idExists(id){return($id(id)?true:false)}
function replaceContent(id,content){if(idExists(id))$id(id).innerHTML=content}


function replaceIfContent(id,b4,content,l8){
	if(idExists(id)){
		if (content){
			$id(id).innerHTML=b4+content+l8;
			$id(id).style.display="block";
		}else{
			$id(id).style.display="none";
		}
	}
}

/* SEARCH FORM FUNCTIONS */

if(idExists('searchForm')){
	/* Logical checkbox behaviour */
	/* Check all set3 checkboxes when "all events" is clicked */
	$id('allEvents').onclick=function(){
		if ($id('allEvents').checked){
			var inputs=$id('set3').getElementsByTagName('input');
			for(var i=0;i<inputs.length;i++){	
				if(inputs[i].type=='checkbox'){
					inputs[i].checked=true;
	}	}	}	}
	/* if any set3 checked box clicked, and "all events" checked, then uncheck "all events" */
	var inputs=$id('set3').getElementsByTagName('input');
	for (var i=1;i<inputs.length;i++){
		if(inputs[i].type=='checkbox'){
			inputs[i].onclick=function(){
				if ($id('allEvents').checked && !this.checked){
					$id('allEvents').checked=false;
	}	}	}	}


	/* Validation of search form */
	function setCheck(oSet){
		var inputs=$id(oSet).getElementsByTagName('input');
		var checks=0;
		for(var i=0;i<inputs.length;i++){	
			if(inputs[i].type=='checkbox'){
				checks+=(inputs[i].checked)?1:0;
		}	}
		if (checks==0){
			jsCSS('add',$id(oSet),'inpError')
			$id(oSet).focus();
		}
		return checks;
	}
	$id('searchForm').onsubmit=function(){
		switchResults("0");
		switchDetails("0");
		// Check minimum one of family, baby or toddler is checked
		if (setCheck('set2')==0){
			switchSearch("1");
			alert('At least one of Family, Baby or Toddler must be checked.');
		}else{
			jsCSS('remove',$id('set2'),'inpError');
			// Check minimum one of event is checked
			if (setCheck('set3')==0){
				switchSearch("1");
				alert('Please check at least one event type.');
			}else{
				jsCSS('remove',$id('set3'),'inpError');
				var o=$id('searchTextBox')
				if(o.value==o.defaultValue){
					jsCSS('add',o,'inpError');
					switchSearch("1");
					alert('Please enter your town, or post code, to locate an event near you.');
					o.focus();
				}else{
					jsCSS('remove',o,'inpError');
					searchBox.showAddress(this.address.value);

					// Valid form entry so hide most of search and show results
					switchSearch("0"); // close search
					idBlock('rs',"1"); // show results section
					idBlock('pleaseWait',"1"); // show please wait message
			
			}	}	}
		return false;
}	}

/* Links with rel="external" get launched into new window */
if (document.getElementsByTagName){
	var anchors=document.getElementsByTagName("a");
	for (var i=0;i<anchors.length;i++){
		var anchor=anchors[i];
		if (anchor.getAttribute("href") && anchor.getAttribute("rel")=="external"){
			anchor.target="_blank";
			anchor.title="Launches in new window";
}	}	}

// repair Excel mishaps with leading zeros on opening / closing times
// this function would be better in the xsl if possible?
function addLeadZeroToTableHoursLessThan1000(id){
	if(idExists(id)){
		var tds=$id(id).getElementsByTagName('td')
		for (var i=0;i<tds.length;i++){
			// if 3 digits add a lead 0
			tds[i].innerHTML=(tds[i].innerHTML.search(/^\d{3}$/)!=-1)?"0"+tds[i].innerHTML:tds[i].innerHTML;
}	}	}
/* run when ajax updates like so: 
	addLeadZeroToTableHoursLessThan1000('event_times');
*/





/* Folding functions */
function idSlide(id,state){
	if (idExists(id)){
		id="#"+id;
		switch (state){
			case "T": $(id).slideToggle('slow'); break;
			case "1": $(id).slideDown('slow'); break;
			default : $(id).slideUp('slow');
}	}	}

function idBlock(id,state){
	if (idExists(id)){
		switch (state){
			case "T": $id(id).style.display=($id(id).style.display=="block")?"none":"block"; break;
			case "1": $id(id).style.display="block"; break;
			default : $id(id).style.display="none";
}	}	}



function switchSearch(set){
	switch (set){
		case "T":	
					switchSearch(($('#searchHeading a:first').attr('class')=='open')?"0":"1");
					break;
		case "1":	
					switchResults("0");// close results
					switchDetails("0");// close details

					//0pen search
					idSlide('checkboxes',"1");
					idBlock('searchLabelHeading',"1");
					$('#searchLabelHeading a:first').attr('class','open');
					$('#searchLabelHeading a:first').attr('title','Hide search options');
					break;
		default :
					// close search
					idSlide('checkboxes',"0");
					idBlock('searchLabelHeading',"0");
					$('#searchHeading a:first').attr('class','');
					$('#searchHeading a:first').attr('title','Show search options');
}	}

function switchResults(set){
	switch (set){
		case "T":	
					switchResults(($('#rTitleJS a:first').attr('class')=='open')?"0":"1");
					break;
		case "1":	
					switchSearch("0"); // close search
					switchDetails("0"); // close details
					// open results
					idSlide('results',"1");
					$('#rTitleJS a:first').attr('class','open');
					$('#rTitleJS a:first').attr('title','Hide results');
					break;
		default :
					// close results
					idSlide('results',"0");
					$('#rTitleJS a:first').attr('class','');
					$('#rTitleJS a:first').attr('title','Show results');
}	}

function switchDetails(set){
	switch (set){
		case "T":	
					switchDetails(($('#eventDetailsHeading a:first').attr('class')=='open')?"0":"1");
					break;
		case "1":	
					switchSearch("0"); // close search
					switchResults("0"); // close results
					// open details
					idSlide('eventDetails',"1");
					$('#eventDetailsHeading a:first').attr('class','open');
					$('#eventDetailsHeading a:first').attr('title','Hide event details');
					break;
		default :
					// close details
					idSlide('eventDetails',"0");
					$('#eventDetailsHeading a:first').attr('class','');
					$('#eventDetailsHeading a:first').attr('title','Show event details');
}	}

/* add fold links to headings */
if(idExists('searchHeading')){$('#searchHeading').wrapInner('<a class="open" title="Hide search options" onclick="switchSearch(\'T\');return false;" href="#"></a>')}
if(idExists('rTitleJS')){$('#rTitleJS').wrapInner('<a title="Show results" onclick="switchResults(\'T\');return false;" href="#"></a>')}
if(idExists('eventDetailsHeading')){$('#eventDetailsHeading').wrapInner('<a title="Show event details" onclick="switchDetails(\'T\');return false;" href="#"></a>')}
switchSearch("1");



/* IEv6 navigation behaviour */
var links=$id("navigation").getElementsByTagName("li");
for (var i=0;i<links.length;i++){
	links[i].onmouseover=function(){jsCSS('add',this,'iehover')}
	links[i].onmouseout=function(){jsCSS('remove',this,'iehover')}
	links[i].onfocus=function(){jsCSS('add',this,'iehover')}
	links[i].onblur=function(){jsCSS('remove',this,'iehover')}
}





// onLoad remove "loading" graphic from search box
if(idExists('searchTextBox')){jsCSS('remove',$id('searchTextBox'),"loading")};
