// JavaScript Document
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

function AJAX(ContentElement, URL, PostMethod, SendData, FinishFunction, LoadingType, ContentType){
	var xmlHttpReq;
	if (!ContentType) ContentType="application/x-www-form-urlencoded" //multipart/form-data
	if (!LoadingType) LoadingType=10;
	var gLoadingHTML="<div align=\"center\"><img src=\"/admin/images/loading/loading" + LoadingType + ".gif\" border=\"0\" /></div>";
	
	xmlHttpReq = false;
	
	if (ContentElement){
		if (typeof(ContentElement) == "string") ContentElement = document.getElementById(ContentElement);
		ContentElement.innerHTML = gLoadingHTML;
	};
	
	// Mozilla/Safari
	if (window.XMLHttpRequest) {
		xmlHttpReq = new XMLHttpRequest();
	}
	// IE
	else if (window.ActiveXObject) {
		xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	}
	xmlHttpReq.open(PostMethod.toUpperCase(), URL, true);
	xmlHttpReq.setRequestHeader('Content-Type', ContentType);
	//xmlHttpReq["ContentElement"]=ContentElement; //This throws an error in IE6, so referencing the variable from the parameters instead, rather then using this relative object method.
	xmlHttpReq.onreadystatechange = function() {
		if (xmlHttpReq.readyState == 4) {
			if (FinishFunction)
				FinishFunction(xmlHttpReq);
			else
				//if (xmlHttpReq.ContentElement) xmlHttpReq.ContentElement.innerHTML=xmlHttpReq.responseText;
				if (ContentElement) ContentElement.innerHTML=xmlHttpReq.responseText;
		};
	};
	
	xmlHttpReq.send(SendData);
};

function AddStyleSheet(url){
	if(document.createStyleSheet){
		document.createStyleSheet(url);
	}
	else{
		var newSS=document.createElement('link');
		newSS.rel='stylesheet';
		newSS.type="text/css"
		newSS.href=url;
		document.getElementsByTagName("head")[0].appendChild(newSS);
	};
};

// The version if you expect any IE 5.0 users whatsoever
function getStyle(oElm, strCssRule){
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if(oElm.currentStyle){
		try{
			strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
				return p1.toUpperCase();
			});
			strValue = oElm.currentStyle[strCssRule];
		}
		catch(e){
			// Used to prevent an error in IE 5.0
		}
	}
	return strValue;
};

function isEmailValid(email){
	var emailEx=/^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$/i;
	return email.match(emailEx);
};
function isPostcodeValid(val){
	var postEx=/^([A-PR-UWYZa-pr-uwyz]([0-9]{1,2}|([A-HK-Ya-hk-y][0-9]|[A-HK-Ya-hk-y][0-9]([0-9]|[ABEHMNPRV-Yabehmnprv-y]))|[0-9][A-HJKS-UWa-hjks-uw])\ {0,1}[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}|([Gg][Ii][Rr]\ 0[Aa][Aa])|([Ss][Aa][Nn]\ {0,1}[Tt][Aa]1)|([Bb][Ff][Pp][Oo]\ {0,1}([Cc]\/[Oo]\ )?[0-9]{1,4})|(([Aa][Ss][Cc][Nn]|[Bb][Bb][Nn][Dd]|[BFSbfs][Ii][Qq][Qq]|[Pp][Cc][Rr][Nn]|[Ss][Tt][Hh][Ll]|[Tt][Dd][Cc][Uu]|[Tt][Kk][Cc][Aa])\ {0,1}1[Zz][Zz]))$/i
	return val.match(postEx);
};
function isTelephoneValid(val){
	var teleEx=/^(((\+44\s?\d{4}|\(?0\d{4}\)?)\s?\d{3}\s?\d{3})|((\+44\s?\d{3}|\(?0\d{3}\)?)\s?\d{3}\s?\d{4})|((\+44\s?\d{2}|\(?0\d{2}\)?)\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$/
	return val.match(teleEx);
};

function WindowSize(){
	var ret={"width": 0, "height": 0};
	ret.width=document.documentElement.clientWidth;
	ret.height=document.documentElement.clientHeight;
	return ret;
};

function GetParentAttrName(elm){
	var parentName="offsetParent";
	if(elm.parentNode) parentName="parentNode";
	if(elm.offsetParent) parentName="offsetParent";
	
	return parentName;
};

function GetActualPosition(elm){
	var ret={"left": 0, "top": 0, "x":0, "y":0, "relative": {"left": 0, "top": 0, "x": 0, "y": 0}};
	var dim=GetActualDimensions(elm);
	var parPos = {"left": 0, "top": 0, "x":0, "y":0};
	var parentName = GetParentAttrName(elm);
	
	parPos.left=elm.offsetLeft;
	parPos.top=elm.offsetTop;
	parPos.x=parPos.left;
	parPos.y=parPos.top;
	
	ret.left=dim.left;
	ret.top=dim.top;
	ret.x=ret.left;
	ret.y=ret.top;
	ret.relative = parPos;
	return ret;
};

function GetActualDimensions(elm){
	var ret={"left": 0, "top": 0, "x":0, "y":0, "width": 0, "height": 0};
	var obj;
	if (typeof(elm)=="string") elm=document.getElementById(elm);
	obj=elm;
	
	var parentName = GetParentAttrName(obj);
	
	if (obj[parentName]){
		ret.width+=obj.offsetWidth;
		ret.height+=obj.offsetHeight;
		do{
			ret.left+=obj.offsetLeft;
			ret.top+=obj.offsetTop;
			//ret.width+=obj.offsetWidth;
			//ret.height+=obj.offsetHeight;
		} while(obj=obj[parentName]);
	}else{
		ret.left=obj.offsetLeft;
		ret.top=obj.offsetTop;
		ret.width=obj.offsetWidth;
		ret.height=obj.offsetHeight;
	};
	ret.x=ret.left;
	ret.y=ret.top;
	
	return ret;
};

function GetMousePosition(evt){
	var ret={"x":0,"y":0};
	if (evt.pageX){
		ret.x=evt.pageX;
	}else{
		ret.x=evt.clientX + GetScrollPosition().x;
	};
	if (evt.pagey){
		ret.y=evt.pageY;
	}else{
		ret.y=evt.clientY + GetScrollPosition().y;
	};
	return ret;
};

function GetScrollPosition(){
	var ret={"x":0,"y":0};
	if (window.pageXOffset){
		ret.x=window.pageXOffset;
		ret.y=window.pageYOffset;
	}else{
		ret.x=document.body.scrollLeft;
		ret.y=document.body.scrollTop;
		if (document.documentElement.scrollLeft>document.body.scrollLeft||document.documentElement.scrollTop>document.body.scrollTop){
			ret.x=document.documentElement.scrollLeft;
			ret.y=document.documentElement.scrollTop;
		};
	};
	return ret;
};

function SetScrollPosition(x, y){
	if (window.pageXOffset){
		window.pageXOffset=x;
		window.pageYOffset=y;
	}else{
		if (document.documentElement.scrollLeft>document.body.scrollLeft||document.documentElement.scrollTop>document.body.scrollTop){
			document.documentElement.scrollLeft=x;
			document.documentElement.scrollTop=y;
		}else{
			document.body.scrollLeft=x;
			document.body.scrollTop=y;
		};
	};
};

function isKeyCodeAlphaNum(keyCode){
	return ((keyCode >= 48 && keyCode <= 90) || keyCode==32 || (keyCode >= 96 && keyCode <= 105));
};
function isKeyCodeNum(keyCode){
	return ((keyCode >= 48 && keyCode <= 57) || keyCode==32 || (keyCode >= 96 && keyCode <= 105)); //32 = space
};

function isKeyCodeFunctions(keyCode){
	return ((keyCode >= 37 && keyCode <= 40) || keyCode==8 || keyCode==9 || keyCode==12 || (keyCode>=16 && keyCode<=18) || keyCode==92 || (keyCode>=33 && keyCode<=36)  || (keyCode>=45 && keyCode<=46) || keyCode==13)
};

function getCaretPosition(ctrl) {
	var CaretPos = 0;	// IE Support
	if (document.selection) {
		ctrl.focus();
		var Sel = document.selection.createRange();
		Sel.moveStart ('character', -ctrl.value.length);
		CaretPos = Sel.text.length;
	}
	// Firefox support
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;
	return (CaretPos);
}

function setCaretPosition(ctrl, pos){
	if(ctrl.setSelectionRange)
	{
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

function isDefined(variable){
    return (typeof(window[variable]) != "undefined")
};
function isDefinedObj(object,variable){
	return (typeof((object)[variable]) != "undefined")
};

function GetEventTarget(evt){
	var targ;
	if (!evt)
		var evt = window.event;
	if (evt.target){
		targ = evt.target;
	}else if (evt.srcElement)
		targ = evt.srcElement;
	
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	
	return targ;
};

function CastVote(form){
	var x, vote="";
	for (x=0; x<form.vote.length; x++){
		if (form.vote[x].checked){
			vote=form.vote[x].value;
			break;
		};
	};
	
	if (vote==""){
		alert("You must select your vote before submitting.");
	}else{
		AJAX("voteresp", "/vote/cast.asp", "POST", "vote="+vote, 
				function(xml){
					document.getElementById("voteresp").innerHTML=xml.responseText;
				}, 6);
	};
	return false;
};

function DisplayVoteResults(){
	AJAX("voteresp", "/vote/results.asp", "POST", "", 
			function(xml){
				document.getElementById("voteresp").innerHTML=xml.responseText;
			}, 6);
};

function EmailToFriend(title, link){
	window.open("/news/emailfriend.asp?title=" + title + "&url=" + link, "sendtofriend", 'width=470,height=420,scrollbars=no,top=10,left=20,resizable=no,scrollbars=no,menubar=no,toolbar=no,status=no,location=no');
	return false;
};

//ADD EVENT FUNCTION

/*OLD LEAKING ADD EVENT-----------------------------------------------------------------------------------------------------------
if (typeof addEvent != 'function')
{
 var addEvent = function(o, t, f, l)
 {
  var d = 'addEventListener', n = 'on' + t, rO = o, rT = t, rF = f, rL = l;
  if (o[d] && !l) return o[d](t, f, false);
  if (!o._evts) o._evts = {};
  if (!o._evts[t])
  {
   o._evts[t] = o[n] ? { b: o[n] } : {};
   o[n] = new Function('e',
    'var r = true, o = this, a = o._evts["' + t + '"], i; try{ for (i in a) {' +
     'o._f = a[i]; r = o._f(e||window.event) != false && r; o._f = null;' +
     '}}catch(e){}; return r');
   if (t != 'unload') addEvent(window, 'unload', function() {
    removeEvent(rO, rT, rF, rL);
   });
  }
  if (!f._i) f._i = addEvent._i++;
  o._evts[t][f._i] = f;
 };
 addEvent._i = 1;
 var removeEvent = function(o, t, f, l)
 {
  var d = 'removeEventListener';
  if (o[d] && !l) return o[d](t, f, false);
  if (o._evts && o._evts[t] && f._i){ delete o._evts[t][f._i]; delete o._evts[t];}
 };
}
-------------------------------------------------------------------------------------------------------------------------------------------*/

function addEvent( obj, type, fn )
{
	if (obj.addEventListener) {
		// standard
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn); // bugzilla bug #241518
		} else if (obj.attachEvent) {
		// IE
		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 {
		// really old
		obj["on"+type] = obj["e"+type+fn];
	}
}
function removeEvent( obj, type, fn )
{
	EventCache.remove(obj, type, fn);
}
var EventCache = function()
{
var listEvents = [];
return {
listEvents : listEvents,
add : function(node, sEventName, fHandler)
{
listEvents.push(arguments);
},
remove : function(node, sEventName, fHandler)
{
var i, item;
for(i = listEvents.length - 1; i >= 0; i = i - 1) {
if(node == listEvents[i][0] && sEventName == listEvents[i][1] && fHandler == listEvents[i][2]) {
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[0][sEventName+fHandler]);
}
item[0][item[1]] = null;
}
}
},
flush : function()
{
var i, item, eventtype;
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]);
}
eventtype = item[1];
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].detachEvent(item[1], item[0][eventtype+item[2]]);
}
item[0][item[1]] = null;
}
}
}
}();


// Optional cancelEvent() function you can call within your event handlers to
// stop them performing the normal browser action or kill the event entirely.
// Pass an event object, and the second "c" parameter cancels event bubbling.
function cancelEvent(e, c)
{
 e.returnValue = false;
 if (e.preventDefault) e.preventDefault();
 if (c)
 {
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
 }
};