var activityImage=null;
var deleteKey=false;
var tFInstr="Enter postcode";
var dontDelErMes=false;

HTTP={};
HTTP._factories=[
    function(){ return new XMLHttpRequest(); },
    function(){ return new ActiveXObject("Msxml2.XMLHTTP"); },
    function(){ return new ActiveXObject("Microsoft.XMLHTTP"); }
];
HTTP._factory=null;
HTTP.newRequest=function(){
    if(HTTP._factory!=null) return HTTP._factory();
    for(var i=0; i < HTTP._factories.length; i++){
        try {
            var factory=HTTP._factories[i];
            var request=factory();
            if(request!=null){
                HTTP._factory=factory;
                HTTP.XMLHttpRequestSupported=true;
                return request;
            }
        }
        catch(e){
            continue;
        }
    }
    HTTP._factory=false;
    return false;
}
HTTP.get=function(callback, options){
	var url="postcode-ajax.php";
    var request=HTTP.newRequest();
    if(request==false) return false;
    var div=document.getElementById("in");
	div.insertBefore(activityImage, div.firstChild.nextSibling);
    var n=0;
    var timer;
    timer=setTimeout(function(){request.abort();if(options.timeoutHandler) options.timeoutHandler(url); }, options.timeout);
    request.onreadystatechange=function(){
        if(request.readyState==4){
            if(timer) clearTimeout(timer);
            if(request.status==200) callback(request.responseText);
            else {
                if(options.errorHandler)
                    options.errorHandler(request.status,
                                         request.statusText);
                else callback(null);
            }
        }
        else if(options.progressHandler){
            options.progressHandler(++n);
        }
    }
    var target=url;
    target += "?" + options.parameters;
    request.open("GET", target, true);
    request.send(null);
    return true;
};
function setHowFarFormUp(){
	var instru=document.getElementById("instr");
	instru.parentNode.removeChild(instru);
	document.forms.howfar.onsubmit=howFarSubmission;
	var textfield=document.getElementsByName("postcode")[0];
	if(textfield.hasfocus!=true) outOfField();
	else if(textfield.value==tFInstr) textfield.value="";
	removeErrorMessage();
	textfield.onfocus=function(){
			//textfield.setAttribute("style", "color:#000");
			textfield.style.color='#000';
			if(textfield.value==tFInstr)
				textfield.value="";
		};
	textfield.onkeypress=keypresshandler;
	textfield.onblur=function(){
			removeErrorMessage();
			if(this.value.replace(/\s/g,"")=="")
				outOfField();
		};
}
function setNewPCFormUp(){
	document.forms.newpc.onsubmit=newPCSubmission;
}
function runOnLoad(){
	// init how far stuff
	if(document.forms.howfar) setHowFarFormUp();
	else if(document.forms.newpc) setNewPCFormUp();
	activityImage=document.createElement('IMG');
	activityImage.src="images/activity.gif";
	activityImage.id="activity";
	if(form_page=='where-we-are') switchWhereWeAreText();
}
function switchWhereWeAreText(){
	var t=document.getElementById("JSone");
	var s=t.innerHTML;
	t.innerHTML=s.replace(/Driving/, "Route map and driving");
	t=document.getElementById("JStwo");
	t.innerHTML="Route map and driving directions";
}
function outOfField(){
	var textfield=document.getElementsByName("postcode")[0];
	//textfield.setAttribute("style", "color:#777");
	textfield.style.color='#777';
	textfield.value=tFInstr;
}
function removeErrorMessage(){
	if(dontDelErMes==false){
		var errMes
		if(errMes=document.getElementById("error")) errMes.parentNode.removeChild(errMes);
	}
	else dontDelErMes=false;
}
function keypresshandler(e){
	removeErrorMessage();
	var e=e || window.event;
	var code=e.charCode || e.keyCode;
	if(e.charCode==0 || e.ctrlKey || e.altKey || code < 32){
		deleteKey=true;
		return true;
	}
	return true;
}
function howFarSubmission(){
	var textfield=document.getElementsByName("postcode")[0];
	var pc=textfield.value.toUpperCase();
	pc=pc.replace(/[^0-9A-Z]/g,"");
	if(!(pc.match(/^[A-Z][0-9R]\d{1,2}[ABD-HJLNP-UW-Z]{2}$/) || pc.match(/^[A-Z][0-9R][A-Z]\d[ABD-HJLNP-UW-Z]{2}$/) || pc.match(/^[A-Z][A-Z][0-9R]\d{1,2}[ABD-HJLNP-UW-Z]{2}$/) || pc.match(/^[A-Z][A-Z][0-9R][A-Z]\d[ABD-HJLNP-UW-Z]{2}$/)))
		return postcodeNotOK(textfield.value);
	// supplied postcode at least has the right format here
	removeErrorMessage();
	var session=document.cookie.indexOf("session=");
	if(session==-1){	//if no session cookie set
		document.cookie="session="+newSessionID+"; path=/";
	}
	var options={
		parameters: "pc="+encodeURI(pc)+'&hf=1&fp='+form_page,
		timeout: 35000,
		timeoutHandler: timeoutHandler
	};
	if(HTTP.get(postcodeReturned, options)==false)
		return true;	//HTTP failed, allow normal submission
	return false;	//HTTP OK, stop normal submission
}
function newPCSubmission(){
	var difb = document.getElementById("diffb");
	difb.parentNode.removeChild(difb);
	var options={
		parameters: 'newpc=1&fp='+form_page,
		timeout: 15000,
		timeoutHandler: timeoutHandler
	};
	if(HTTP.get(newPCFormReturned, options)==false) return true; //allow normal submission
	return false;	//stop normal submission
}
function postcodeNotOK($pc){
	var textfield=document.getElementsByName("postcode")[0];
	var div=document.getElementById("in");
	var errMes;
	if(errMes=document.createElement("p")) div.appendChild(errMes);
	else errMes=document.getElementById("error");
	if(textfield.value=='' || textfield.value==tFInstr)
		errMes.innerHTML="No postcode provided";
	else errMes.innerHTML="Not recognised as a UK postcode";
	errMes.setAttribute("id", "error");
	textfield.focus();
	return false; // to block submission
}
function timeoutHandler(){
	var div=document.getElementById("in");
	var errMes;
	var actImg;
	if(errMes=document.createElement("p")) div.appendChild(errMes);
	else errMes=document.getElementById("error");
	if(actImg=document.getElementById("activity")) actImg.parentNode.removeChild(actImg);
	errMes.setAttribute("id", "error");
	errMes.innerHTML='Sorry, something&rsquo;s not working.';
}
function postcodeReturned(results){
	if(results.charAt(0)!=' '){ //if a results response
		results=addLabelToMap(results);
		var oE=document.getElementById("howfar");
		var f=document.createDocumentFragment();
		var res=document.createElement("div");
		res.innerHTML=results;
		res.id="results";
		f.appendChild(res);
		oE.parentNode.replaceChild(f,oE)
		setNewPCFormUp();
	} else newPCFormReturned(results); //not a results response
}
function newPCFormReturned(pCForm){
	var oE=document.getElementById("results") || document.getElementById("howfar");
	var f=document.createElement("form");
	f.action=form_page;
	f.method="post";
	f.id="howfar";
	f.innerHTML=pCForm;
	oE.parentNode.replaceChild(f,oE);
	if(document.forms.newpc!=null) {
		
		setNewPCFormUp();
	}else{
		removeLabelFromMap();
		dontDelErMes=true;
		var textfield=document.getElementsByName("postcode")[0];
		if(document.getElementById("error")) textfield.focus();
		setHowFarFormUp();
	}
}
function addLabelToMap(results){
	var x=results.indexOf('l_a_b_e_l')
	if(x==-1) return results;
	var m=document.getElementById("maps");
	if(!m) return results.substr(0,x);
	var s=results.substr(x+9);
	var a=s.split('*');
	img=document.createElement('IMG');
	img.src='images/pcgenimage.php?pc='+a[0];
	img.id="label";
	img.style.left=a[1]+'px';
	img.style.top=a[2]+'px';
	m.appendChild(img);
	return results.substr(0,x);
}
function removeLabelFromMap() {
	var img=document.getElementById("label");
	if(img) img.parentNode.removeChild(img);
}
window.onload=runOnLoad;