// VERY IMPORTANT - DO NOT DELETE
// prevents flicker with moving background images for those IE users who have their cache
// settings for those IE users who have their cache settings to 'every visit to the page'
try { document.execCommand("BackgroundImageCache",false,true); } catch(e) {};

var FormUtils				= {
	sErrorShowClass : 'showError',
	sErrorHideClass : 'hideError',
	
	checkLength : function(eElem, nMinLength) {
		var sValue						= eElem.value;
		var nLength						= sValue.replace(/^(\s)*/, '').replace(/(\s)*$/, '').length;
		return nLength >= nMinLength;
	},
	
	isPostCode : function (ePostCode) {
		var rePostCode					= /^\w{1,2}[\dR][\d\w]? \d\w{2}$/i;
		var sPostCode					= ePostCode.value.replace(/^(\s)*/, '').replace(/(\s)*$/, '');
		return rePostCode.test(sPostCode);
	},
	
	isZipCode : function (eZipCode) {
		var reZipCode					= /^(\d{5}-\d{4})|(\d{5})$/i;
		var sZipCode					= eZipCode.value.replace(/^(\s)*/, '').replace(/(\s)*$/, '');
		return reZipCode.test(sZipCode);
	},
	
	isURL : function(eURL, bRP) {
		// default is to check for a prefix
		var bRequirePrefix = (typeof bRP == 'undefined') ? true : bRP;
		if (bRequirePrefix) {
			var reURL = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
		} else {
			var reURL = /((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
		}
	  	return reURL.test(eURL.value);
	},
	
	isNumeric : function (eElem) {
		var reNumber					= /^(-)?(\d+)(\.?)(\d*)$/;
		return reNumber.test(eElem.value);
	},
	
	checkEmail : function (eEmail) {
		var sEmail						= eEmail.value;
		var at							= "@";
		var dot							= ".";
		var lat							= sEmail.indexOf(at);
		var lstr						= sEmail.length;
		var ldot						= sEmail.indexOf(dot);
		
		if (sEmail.indexOf(at) == -1) {return false;}
		if (sEmail.indexOf(at) == -1 || sEmail.indexOf(at)==0 || sEmail.indexOf(at)==lstr) {return false;}
		if (sEmail.indexOf(dot) == -1 || sEmail.indexOf(dot)==0 || sEmail.indexOf(dot)==lstr) {return false;}
		if (sEmail.indexOf(at,(lat+1)) != -1) {return false;}
		if (sEmail.substring(lat-1,lat) == dot || sEmail.substring(lat+1,lat+2)==dot) {return false;}
		if (sEmail.indexOf(dot,(lat+2)) == -1) {return false;}
		if (sEmail.indexOf(" ")!=-1) {return false;}
		return true;
	},
	
	checkPassword : function (ePassword) {
		var rePassword					= /^[\da-z]+$/i;
		var sPassword					= ePassword.value;
		return rePassword.test(sPassword);
	},
	
	checkFileType : function(eFileURL, lstFileTypes, cDelimeter) {
		var cDelimeter 					= cDelimeter || ",";
		var aFileTypes					= lstFileTypes.split(cDelimeter);
		
		for (i = 0; i < aFileTypes.length; i++) {
	  		eval("format = /(\." + aFileTypes[i] + ")$/");
	  		if (format.test(eFileURL.value)) return true;
		}
		
		return false;
	},
	
	getRadioValue : function(eElem) {
		var sValue						= '';
		var i							= 0;
		
		if (eElem.length > 1) {
			for (i = 0; i < eElem.length; i++) {
				if (eElem[i].checked) {
					sValue				= eElem[i].value;
					break;
				}
			}
		} else {
			if (eElem.checked) {
				sValue					= eElem.value;
			}
		}
		
		return sValue;
	},
	
	showError : function (sHelperID, sMessage) {
		var eHelper						= document.getElementById(sHelperID);
		if (eHelper) {
			eHelper.innerHTML			= '<p>' + sMessage + '</p>';
			DOMUtils.cssjs('remove', eHelper, FormUtils.sErrorHideClass);
			DOMUtils.cssjs('add', eHelper, FormUtils.sErrorShowClass);
		}
	},
	
	hideError : function (sHelperID) {
		var eHelper						= document.getElementById(sHelperID);
		if (eHelper) {
			eHelper.innerHTML			= '';
			DOMUtils.cssjs('remove', eHelper, FormUtils.sErrorShowClass);
			DOMUtils.cssjs('add', eHelper, FormUtils.sErrorHideClass);
		}
	},
	
	
	/*
	 * bPassed: 			if the error passed the validation or not
	 * sFocusOnErrorName:	Used so that the page can be positioned to focus on a certain area of the page
	 * 						eg. have <a name="[sFocusOnErrorName]"></a> above the <div id="regError"> and 
	 * 						if there is an error it will show "regError" at the top of the window.
	 * 						Useful if you have a really long form, and if the error is at the top, the user
	 * 						wont be able to see it when they click the submit button.
	 */
	errorDisplay : function (bPassed, sFocusOnErrorName) {
		sFocusOnErrorName		= (typeof sFocusOnErrorName == 'undefined') ? '' : sFocusOnErrorName;
		
		if (!bPassed) {
			FormUtils.showMainErrorMessage('regError');
			if (sFocusOnErrorName.length > 0) {
				// append the sFocusOnErrorName to the location URL, to focus on error message
				window.location	= DOMUtils.getWindowLocation(true) + '#' + sFocusOnErrorName;
			}
		}
		else {
			FormUtils.hideMainErrorMessage('regError');
		}		
	},
	
	showMainErrorMessage : function (sHelperID) {
		var eHelper						= document.getElementById(sHelperID);
		if (eHelper) {
			DOMUtils.cssjs('remove', eHelper, 'hide');
		}
	},
	
	hideMainErrorMessage : function (sHelperID) {
		var eHelper						= document.getElementById(sHelperID);
		if (eHelper) {
			DOMUtils.cssjs('add', eHelper, 'hide');
		}
	}
}

var FieldClearer				= {
	oFieldCollection : new Object(),
	
	init : function (lstFields) {
		if(!document.getElementById||!document.createTextNode){return;}
		var aFields				= lstFields.split(',');
		if (aFields.length) {
			FieldClearer.initialiseCollection(aFields);
			FieldClearer.initialiseEvents(aFields);
		}
	},
	
	initialiseEvents : function (aFields) {
		for (var i = 0; i < aFields.length; i++) {
			FieldClearer.addEvent(aFields[i]);
			FieldClearer.addSubmitEvent(aFields[i]);
		}
	},
	
	addEvent : function (sField) {
		var eField				= document.getElementById(sField);
		if (!eField) {
			return;
		}
		eField.onfocus			= function () {
			if (FieldClearer.checkInitialValue(this)) {
				this.value		= '';
			}
		}
	},
	
	addSubmitEvent : function (sField) {
		var eField				= document.getElementById(sField);
		if (!eField) {
			return;
		}
		var eForm				= DOMUtils.getParent(eField, 'form');
		if (!eForm) {
			return;
		} 
		eForm.onsubmit			= function () {
			if (FieldClearer.checkInitialValue(eField)) {
				eField.value	= '';
			}
		}
	},
	
	initialiseCollection : function (aFields) {
		for (var i = 0; i < aFields.length; i++) {
			FieldClearer.addField(aFields[i]);
		}
	},
	
	addField : function (sField) {
		var eField				= document.getElementById(sField);
		if (!eField) {
			return;
		}
		FieldClearer.oFieldCollection[sField]= eField.value;
	},
	
	checkInitialValue : function (eElem) {
		var sValue				= eElem.value;
		var sID					= eElem.id;
		var sInitial			= FieldClearer.oFieldCollection[sID];
		return sValue == sInitial;
	}
}

// ------------------------------------------------------------------
// These functions use the same 'format' strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
//              | NNN (abbr.)        |
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Day of Week  | EE (name)          | E (abbr)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "M/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------
var DateUtils				= {
	MONTH_NAMES :  new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'),
	DAY_NAMES : new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat'),
	
	LZ : function(x) {return(x<0||x>9?"":"0")+x},
	
	isDate : function (val,format) {
		var date			= DateUtils.getDateFromFormat(val,format);
		if (date==0) { return false; }
		return true;
	},
	
	isPastDate : function (date, dateFormat) {
		var dToday			= DateUtils.formatDate(new Date(), dateFormat);
		return (DateUtils.compareDates(date, dateFormat, dToday, dateFormat) < 0) ? true : false;
	},
	
	compareDates : function(date1,dateformat1,date2,dateformat2) {
		var d1				= DateUtils.getDateFromFormat(date1,dateformat1);
		var d2				= DateUtils.getDateFromFormat(date2,dateformat2);
		if (d1 < d2) {
			return -1;
			}
		else if (d1 > d2) {
			return 1;
			}
		return 0;
	},
	
	formatDate : function (date,format) {
		format=format+"";
		var result="";
		var i_format=0;
		var c="";
		var token="";
		var y=date.getYear()+"";
		var M=date.getMonth()+1;
		var d=date.getDate();
		var E=date.getDay();
		var H=date.getHours();
		var m=date.getMinutes();
		var s=date.getSeconds();
		var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
		// Convert real date parts into formatted versions
		var value=new Object();
		if (y.length < 4) {y=""+(y-0+1900);}
		value["y"]=""+y;
		value["yyyy"]=y;
		value["yy"]=y.substring(2,4);
		value["M"]=M;
		value["MM"]=DateUtils.LZ(M);
		value["MMM"]=DateUtils.MONTH_NAMES[M-1];
		value["NNN"]=DateUtils.MONTH_NAMES[M+11];
		value["d"]=d;
		value["dd"]=DateUtils.LZ(d);
		value["E"]=DateUtils.DAY_NAMES[E+7];
		value["EE"]=DateUtils.DAY_NAMES[E];
		value["H"]=H;
		value["HH"]=DateUtils.LZ(H);
		if (H==0){value["h"]=12;}
		else if (H>12){value["h"]=H-12;}
		else {value["h"]=H;}
		value["hh"]=DateUtils.LZ(value["h"]);
		if (H>11){value["K"]=H-12;} else {value["K"]=H;}
		value["k"]=H+1;
		value["KK"]=DateUtils.LZ(value["K"]);
		value["kk"]=DateUtils.LZ(value["k"]);
		if (H > 11) { value["a"]="PM"; }
		else { value["a"]="AM"; }
		value["m"]=m;
		value["mm"]=DateUtils.LZ(m);
		value["s"]=s;
		value["ss"]=DateUtils.LZ(s);
		while (i_format < format.length) {
			c=format.charAt(i_format);
			token="";
			while ((format.charAt(i_format)==c) && (i_format < format.length)) {
				token += format.charAt(i_format++);
				}
			if (value[token] != null) { result=result + value[token]; }
			else { result=result + token; }
			}
		return result;
	},
	
	getDateFromFormat : function(val,format) {
		val=val+"";
		format=format+"";
		var i_val=0;
		var i_format=0;
		var c="";
		var token="";
		var token2="";
		var x,y;
		var now=new Date();
		var year=now.getYear();
		var month=now.getMonth()+1;
		var date=1;
		var hh=now.getHours();
		var mm=now.getMinutes();
		var ss=now.getSeconds();
		var ampm="";
		
		while (i_format < format.length) {
			// Get next token from format string
			c=format.charAt(i_format);
			token="";
			while ((format.charAt(i_format)==c) && (i_format < format.length)) {
				token += format.charAt(i_format++);
				}
			// Extract contents of value based on format token
			if (token=="yyyy" || token=="yy" || token=="y") {
				if (token=="yyyy") { x=4;y=4; }
				if (token=="yy")   { x=2;y=2; }
				if (token=="y")    { x=2;y=4; }
				year=PrivateUtils._getInt(val,i_val,x,y);
				if (year==null) { return 0; }
				i_val += year.length;
				if (year.length==2) {
					if (year > 70) { year=1900+(year-0); }
					else { year=2000+(year-0); }
					}
				}
			else if (token=="MMM"||token=="NNN"){
				month=0;
				for (var i=0; i<DateUtils.MONTH_NAMES.length; i++) {
					var month_name=DateUtils.MONTH_NAMES[i];
					if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
						if (token=="MMM"||(token=="NNN"&&i>11)) {
							month=i+1;
							if (month>12) { month -= 12; }
							i_val += month_name.length;
							break;
							}
						}
					}
				if ((month < 1)||(month>12)){return 0;}
				}
			else if (token=="EE"||token=="E"){
				for (var i=0; i<DateUtils.DAY_NAMES.length; i++) {
					var day_name=DateUtils.DAY_NAMES[i];
					if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
						i_val += day_name.length;
						break;
						}
					}
				}
			else if (token=="MM"||token=="M") {
				month=PrivateUtils._getInt(val,i_val,token.length,2);
				if(month==null||(month<1)||(month>12)){return 0;}
				i_val+=month.length;}
			else if (token=="dd"||token=="d") {
				date=PrivateUtils._getInt(val,i_val,token.length,2);
				if(date==null||(date<1)||(date>31)){return 0;}
				i_val+=date.length;}
			else if (token=="hh"||token=="h") {
				hh=PrivateUtils._getInt(val,i_val,token.length,2);
				if(hh==null||(hh<1)||(hh>12)){return 0;}
				i_val+=hh.length;}
			else if (token=="HH"||token=="H") {
				hh=PrivateUtils._getInt(val,i_val,token.length,2);
				if(hh==null||(hh<0)||(hh>23)){return 0;}
				i_val+=hh.length;}
			else if (token=="KK"||token=="K") {
				hh=PrivateUtils._getInt(val,i_val,token.length,2);
				if(hh==null||(hh<0)||(hh>11)){return 0;}
				i_val+=hh.length;}
			else if (token=="kk"||token=="k") {
				hh=PrivateUtils._getInt(val,i_val,token.length,2);
				if(hh==null||(hh<1)||(hh>24)){return 0;}
				i_val+=hh.length;hh--;}
			else if (token=="mm"||token=="m") {
				mm=PrivateUtils._getInt(val,i_val,token.length,2);
				if(mm==null||(mm<0)||(mm>59)){return 0;}
				i_val+=mm.length;}
			else if (token=="ss"||token=="s") {
				ss=PrivateUtils._getInt(val,i_val,token.length,2);
				if(ss==null||(ss<0)||(ss>59)){return 0;}
				i_val+=ss.length;}
			else if (token=="a") {
				if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
				else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
				else {return 0;}
				i_val+=2;}
			else {
				if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
				else {i_val+=token.length;}
				}
			}
		// If there are any trailing characters left in the value, it doesn't match
		if (i_val != val.length) { return 0; }
		// Is date valid for month?
		if (month==2) {
			// Check for leap year
			if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
				if (date > 29){ return 0; }
				}
			else { if (date > 28) { return 0; } }
			}
		if ((month==4)||(month==6)||(month==9)||(month==11)) {
			if (date > 30) { return 0; }
			}
		// Correct hours value
		if (hh<12 && ampm=="PM") { hh=hh-0+12; }
		else if (hh>11 && ampm=="AM") { hh-=12; }
		var newdate=new Date(year,month-1,date,hh,mm,ss);
		return newdate.getTime();
	},
	// ------------------------------------------------------------------
	// parseDate( date_string [, prefer_euro_format] )
	// ------------------------------------------------------------------
	parseDate : function(val) {
		var preferEuro=(arguments.length==2)?arguments[1]:false;
		generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
		monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
		dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
		var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
		var d=null;
		for (var i=0; i<checkList.length; i++) {
			var l=window[checkList[i]];
			for (var j=0; j<l.length; j++) {
				d=DateUtils.DateUtils.getDateFromFormat(val,l[j]);
				if (d!=0) { return new Date(d); }
				}
			}
		return null;
	} 
}

var DOMUtils				= {
	Node : {ELEMENT_NODE : 1, TEXT_NODE : 3},
	
	checkNode : function (node,filter) {
		return(node==null||node.nodeType==DOMUtils.Node[filter]||node.nodeName.toUpperCase()== filter.toUpperCase());
	},
	
	getAllChildren : function (node,filter) {
		var result = new Array();
		var children = (node.all)? node.all:node.getElementsByTagName('*');
		for(var i=0;i<children.length;i++){
	  		if(node.all){
				var test = new Array();
				if(children[i].tagName==filter.toUpperCase()){
	    			result[result.length] = children[i];
	    		}
	    	}else{
	    		if(DOMUtils.checkNode(children[i],filter)) result[result.length] = children[i];
			}
		}
	  	return result;
	},
	
	getChildren : function (node,filter) {
		var result = new Array();
		var children = (node.all)? node.all:node.getElementsByTagName('*');
	 	for(i=0;i<children.length;i++){
			if(node.all){
				var test = new Array();
				if(children[i].tagName==filter.toUpperCase()){
	    			result[result.length] = children[i];
	    		}
	    	}else{
	    		if(DOMUtils.checkNode(children[i],filter)) result[result.length] = children[i];
	    	}
		}
	  	return result;
	},
	
	getParent : function (el,pTagName) {
		if(el==null){
			return null;
		}else if(el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()){
			return el;
		}else{
			return DOMUtils.getParent(el.parentNode, pTagName);
		}
	},
	
	getElementsByClassName : function(oElm, strTagName, strClassName) {
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
		    oElement = arrElements[i];      
		    if(oRegExp.test(oElement.className)){
		        arrReturnElements.push(oElement);
		    }   
		}
		return (arrReturnElements);
	},
	
	getNextSibling : function(node, filter) {
		for(var sibling = node.nextSibling; sibling != null; sibling = sibling.nextSibling){
			if(DOMUtils.checkNode(sibling, filter)) return sibling;
		}
		return null;
	},
	
	cssjs:function(sAction,eElem,c1,c2){
		switch (sAction){
			case 'swap':
				eElem.className=!DOMUtils.cssjs('check',eElem,c1)?eElem.className.replace(c2,c1):eElem.className.replace(c1,c2);
			break;
			case 'add':
				if(!DOMUtils.cssjs('check',eElem,c1)){eElem.className+=eElem.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=eElem.className.match(' '+c1)?' '+c1:c1;
				eElem.className=eElem.className.replace(rep,'');
			break;
			case 'check':
				var bFound=false;
				var aTemp=eElem.className.split(' ');
				for(var i=0;i<aTemp.length;i++){
					if(aTemp[i]==c1){bFound=true;}
				}
				return bFound;
			break;
		}
	},
	
	getWindowLocation:function(bRemoveHashValue){
		var sURL			= window.location.href;
		bRemoveHashValue	= (typeof bRemoveHashValue == 'undefined') ? false : bRemoveHashValue;
		
		if (bRemoveHashValue && sURL.indexOf('#') > 0) {
			sURL			= sURL.substring(0, sURL.indexOf('#'));
		}
		
		return sURL;
	},
	
	// this will get the computed style of the element even if it is not set in the css. e.g. the exact width of an image
	// even if not set by the css or html
	getStyle : function(el,att){
		var sAttribute								= null;
		if (document.defaultView && document.defaultView.getComputedStyle) {
			var cs									= document.defaultView.getComputedStyle(el,null);
			if (cs && cs.getPropertyValue) {
				sAttribute							= cs.getPropertyValue(att);
			}
		}
		if(!sAttribute && el.currentStyle){
			sAttribute								= el.currentStyle[DOMUtils.camelCase(att)];	
		}
		return sAttribute;
	},
	
	camelCase : function (s){
		for (var exp=/-([a-z])/; exp.test(s); s = s.replace(exp,RegExp.$1.toUpperCase()));
		return s;
	},
	
	//This gets the x and y position of an element obj such as a div
	getObjPosition : function (obj) {
		var curleft = curtop = 0;
		
		if (obj.offsetParent) {
			do {
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
			} while (obj = obj.offsetParent);
		}	

		return [curleft,curtop];
	}
}

var UserUtils							= {
	nUKID : 207,
	nUSID : 208,
	sErrorShowClass : 'showError',
	sErrorHideClass : 'hideError',
	sPostCodeHideClass : 'hide',
	sPostCodeLabel : 'Post Code:<span class="required">*</span>',
	sZipCodeLabel : 'Zip Code:<span class="required">*</span>',
	
	checkAddressCode : function (ePostCode, eCountry, sPostCodeLabel) {
		var nIndex						= eCountry.selectedIndex;
		var nCountryID					= eCountry.options[nIndex].value;
		var oResult						= new Object();
		oResult.bPassed					= true;
		if (nCountryID == UserUtils.nUKID) {
			if (!FormUtils.isPostCode(ePostCode)) {
				oResult.bPassed			= false;
				oResult.sMessage		= 'Post Code is not in the correct format.';
			}
			UserUtils.showPostCode(ePostCode, sPostCodeLabel, UserUtils.sPostCodeLabel);
		}
		else if (nCountryID == UserUtils.nUSID) {
			if (!FormUtils.isZipCode(ePostCode)) {
				oResult.bPassed			= false;
				oResult.sMessage		= 'Zip Code is not in the correct format.';
			}
			UserUtils.showPostCode(ePostCode, sPostCodeLabel, UserUtils.sZipCodeLabel);
		}
		else {
			UserUtils.hidePostCode(ePostCode);
		}
		
		return oResult;
	},
	
	showPostCode : function (ePostCode, sPostCodeLabelID, sLabelText) {
		var eDiv						= ePostCode.parentNode;
		var eLabel						= document.getElementById(sPostCodeLabelID);
		eLabel.innerHTML				= sLabelText;
		DOMUtils.cssjs('remove', eDiv, UserUtils.sPostCodeHideClass);
	},
	
	hidePostCode : function (ePostCode) {
		var eDiv						= ePostCode.parentNode;
		ePostCode.value					= '';
		DOMUtils.cssjs('add', eDiv, UserUtils.sPostCodeHideClass);
	}
}

// NOTE: not meant to be called from websites - Private functions
var PrivateUtils			 = {
	jan	: 1,
	feb : 2,
	mar : 3,
	apr : 4,
	may : 5,
	jun : 6,
	jul : 7,
	aug : 8,
	sep : 9,
	oct : 10,
	nov : 11,
	dec : 12,
	
	isDdMmYyyyDate : function(sDate) {
		// get delimeter
		var getFirstChar	= /[^\d]/;
		chrDel 				= getFirstChar.exec(sDate);
		
		// check that date is in a valid format (ie dd/mm/yyyy)
		eval("var dateFormat = /^[0-3][0-9]\\" + chrDel + "[0-1][0-9]\\" + chrDel + "[0-9]{4}$/");
		if (!dateFormat.test(sDate)) return false;
	  	
	  	tmpDateArray		= sDate.split(chrDel);
	  	nDay				= parseInt(tmpDateArray[0],10);
	  	nMonth				= parseInt(tmpDateArray[1],10);
	  	nYear				= parseInt(tmpDateArray[2],10);
	  
	  	// valid month
	  	if (nMonth < 1 || nMonth > 12)	return false;	
	  	// check that have correct number of days
		if (nDay < 1 || nDay > PrivateUtils.daysInMonth(nMonth, nYear))	return false;
	  	
	  	return true;
	},
	
	isDdMmmYyyyDate : function(sDate) {
		// get delimeter
		var getFirstChar	= /[^\d]/;
		chrDel 				= getFirstChar.exec(sDate);
		
		// check that date is in a valid format (ie dd/mm/yyyy)
		eval("var dateFormat = /^[0-3][0-9]\\" + chrDel + "[\\w]{3}\\" + chrDel + "[0-9]{4}$/");
		if (!dateFormat.test(sDate)) return false;
	  	
	  	tmpDateArray		= sDate.split(chrDel);
	  	nDay				= parseInt(tmpDateArray[0],10);
	  	sMonth				= tmpDateArray[1].toLowerCase();
	  	nYear				= parseInt(tmpDateArray[2],10);
	  	
	  	nMonth = 0;
	  	eval("var nMonth = PrivateUtils." + sMonth);
		
	  	// valid month
	  	if (nMonth < 1 || nMonth > 12)	return false;	
	  	// check that have correct number of days
		if (nDay < 1 || nDay > PrivateUtils.daysInMonth(nMonth, nYear))	return false;
	  	
	  	return true;
	},
	
	daysInMonth : function(monthNumber, yearNumber) {
		if (monthNumber == 4 || monthNumber == 6 || monthNumber == 9 || monthNumber == 11) {
			return 30;
		} else if (monthNumber == 2) {
			if ((yearNumber % 4) == 0) {
				return 29;
			} else {
				return 28;
			}
		} else {
			return 31;
		}
	},
	
	_isInteger : function(val) {
		var digits				= "1234567890";
		for (var i=0; i < val.length; i++) {
			if (digits.indexOf(val.charAt(i))==-1) { return false; }
			}
		return true;
	},
	
	_getInt : function(str,i,minlength,maxlength) {
		for (var x=maxlength; x>=minlength; x--) {
			var token=str.substring(i,i+x);
			if (token.length < minlength) { return null; }
			if (PrivateUtils._isInteger(token)) { return token; }
		}
		return null;
	}
}

// add our functions
var WindowListener = {
  add : function(event,func){
	//Check for jQuery and bypass traditional event handling
	if ((typeof jQuery != 'undefined') && (event == "load")){
		  jQuery(document).ready(function(){
			  eval(func);
			  }
		  );
	 }
	//Otherwise continue as normal
	else{
		  var e = this.Functions[event];
		  e[func] = func;
	}
  },
  remove : function(event,func){
    var e = this.Functions[event];
    delete e[func];
  },
  addEvent : function(event){
  	//If no jQuery continue as normal, otherwise we don't add the event
	if ((typeof jQuery == 'undefined')){
		 window["on"+event] = function(){WindowListener.run(event)};
   		 this.Functions[event] = {};
	 }
   
  },
  removeEvent : function(event){
    window["on"+event] = null;
    delete this.Functions[event];
  },
  run : function(event){// Private
    var e = this.Functions[event];
    for(var i in e) eval(e[i]);
  },
  Functions : {}
};

WindowListener.addEvent("load");
