// JavaScript Document

function findElementsByTag(_tag){
	var returnArray = new Array();
	if('getElementsByTagName' in document){
		returnArray = document.getElementsByTagName(_tag);
	} else if('all' in document && 'tags' in document.all){
		returnArray = document.all.tags(_tag);
	} else if('links' in document){
		returnArray = document.links;
	}
	return returnArray;
}
/* end findElementsByTag */


var eventQue = new Array();

function elementEventQue(e){
	var _element = null;
	var _event = null;
	if(!e){ e = window.event; };
	if('srcElement' in e){
		_element = e.srcElement;
	} else {
		if('target' in e){
			if('tagName' in e.target && e.target.tagName != 'A'){
				_element = e.target.parentNode;
			} else {
				_element = e.target;
			}
		}
	}
	if('type' in e){
		_event = e.type;
	}
	_event = 'on' + _event;
	
	for(var i=0; i<eventQue.length; i++){
		if('element' in eventQue[i] && eventQue[i].element == _element){
			if(_event in eventQue[i].event){
				for(var j=0; j<eventQue[i].event[_event].length; j++){
					eventQue[i].event[_event][j]();
				}
			}
		}
	}
}


function elementEventQueuer(_element){
	this.element = _element;
	this.event = new Object();
	function addElementEvent(_event, _fun){
		if(_event in this.event){
			this.event.push(_fun);
			return true;
		} else {
			this.event[_event] = new Array();
			this.event[_event].push(_fun);
			return true;
		}
	}
	function removeElementEvent(_event, _fun){
		if(_event in this.event){
			var isRemoved = false;
			for(var i=0; i<this.event[_event].length; i++){
				if(this.event[_event][i] == _fun){
					this.event[_event].splice(i, 1);
					isRemoved = true;
					break;
				}
			}
			return isRemoved;
		} else {
			return false;
		}
	}
}

function returnedQueuedElement(_element){
	var theElem = undefined;
	for(var i=0; i<eventQue.length; i++){
		if('element' in eventQue[i] && eventQue[i].element == _element){
			return eventQue[i];
		}
	}
	return theElem;
}

function eventAssignment(elem, _event, _fun, _bub){
	var onEvent = 'on' + _event;
	if('addEventListener' in elem){
		elem.addEventListener(_event, _fun, _bub);
		return true;
	} else if('attachEvent' in elem){
		elem.attachEvent(onEvent, _fun);
		return true;
	} else if(onEvent in elem){
		if(elem.onEvent != undefined){
			if(elem.onEvent != elementEventQueuer){
				var qe = returnedQueuedElement(elem);
				if(qe != undefined){
					return qe.addElementEvent(onEvent, _fun);
				} else {
					qe = eventQue.push(new elementEventQueuer(elem));
					var firstadd = false;
					var secondadd = false;
					firstadd = qe.addElementEvent(onEvent, elem.onEvent);
					secondadd = qe.addElementEvent(onEvent, _fun);
					qe.onEvent = elementEventQueuer;
					return (firstadd && secondadd);
				}
			} else {
				return qe.addElementEvent(onEvent, _fun);
			}
		} else {
			elem.onEvent = _fun;
			return true;
		}
	} else {
		return false;
	}
}

/* end eventAssignment */
var bodyOnloadFunctions = new Array();
var pageLoaded = false;

function runBodyLoadFunctions(){
	for(var i=0; i<bodyOnloadFunctions.length; i++){ bodyOnloadFunctions[i](); }
}
//this needs more work see eventAssignment.js for extension work;
function addBodyLoadFunction(fun){
	if(window.addEventListener){
		window.addEventListener('load', fun, true);
	} else if(window.attachEvent){
		window.attachEvent('onload', fun);
	} else {
		//IE4 should get here and break;
		if(document.getElementById){
			if(window.onload != undefined && window.onload != runBodyLoadFunctions){bodyOnloadFunctions.push(window.onload);}
			bodyOnloadFunctions.push(fun);
			window.onload = runBodyLoadFunctions;
		}
	}
}
//document.layers? other ways then readstate or body element existing to see if document is loaded?
function assignLoadedFunction(_fun){
	if('readyState' in document){
		if(document.readyState == 'complete'){pageLoaded = true;};
	} else {
		var bodyElemArr = new Array();
		if('getElementsByTagName' in document){
			bodyElemArr = document.getElementsByTagName('body');
		} else if('all' in document){
			bodyElemArr = document.all.tags('body');
		}
		if(bodyElemArr.length != 0){pageLoaded = true;}
	}
	
	if(!pageLoaded){
		addBodyLoadFunction(_fun);
	} else {
		_fun();
	}
}


//Javascript Document;
//Requires findElementsByTag function (findElementsByTag.js);
//Requires eventAssignment function (eventAssignment.js);
//Requires assignLoadedFunction (assignLoadedFunctiton.js);
var externalLinkOpen = true;

function prepareExternalLinks(){
	if(window.open && externalLinkOpen){
		//window.open used to see if pop ups preferred;
		var docLinks = new Array();
		docLinks = findElementsByTag('a');
		externalLinkRunner(docLinks);
	} else {
		externalLinkOpen = false;
	}
	function externalLinkRunner(arr){
		for(var i=0; i<arr.length; i++){
			if('href' in arr[i]){
				if(arr[i].href.indexOf("leestaffordltd.com") == -1 && arr[i].href.indexOf("http://") != -1){
					var targetElem = arr[i];
					if('setAttribute' in targetElem){targetElem.setAttribute('target', '_blank');}
					if('target' in targetElem){
						targetElem.target = '_blank';
						if(externalLinkOpen != false){externalLinkOpen = true;}
					} else {
						var wk = eventAssignment(targetElem, 'click', externalLinkOnClick, false);
						if(!wk){
							externalLinkOpen = false;
						} else {
							if(externalLinkOpen != false){ externalLinkOpen = true; };
						}
					}
				}
			}
		}
	}
}

// Consequences of stopPropagation and preventDefault on other events?
function externalLinkOnClick(e){
	if(window.open && externalLinkOpen){
		if(this.href){
			window.open(this.href, 'ls_external');
			if(e.preventDefault){
				if(e.cancelable){e.preventDefault();};
			}
			if(e.stopPropagation){e.stopPropagation();}
			if(e.returnValue){e.returnValue = false;}
			return false;
		} else {
			return true;
		}
	} else {
		return true;
	}
}

assignLoadedFunction(prepareExternalLinks);


// html5shiv MIT @rem remysharp.com/html5-enabling-script
// iepp v1.5.1 MIT @jon_neal iecss.com/print-protector
/*@cc_on@if(@_jscript_version<9)(function(p,e){function q(a,b){if(g[a])g[a].styleSheet.cssText+=b;else{var c=r[l],d=e[j]("style");d.media=a;c.insertBefore(d,c[l]);g[a]=d;q(a,b)}}function s(a,b){for(var c=new RegExp("\\b("+m+")\\b(?!.*[;}])","gi"),d=function(k){return".iepp_"+k},h=-1;++h<a.length;){b=a[h].media||b;s(a[h].imports,b);q(b,a[h].cssText.replace(c,d))}}function t(){for(var a,b=e.getElementsByTagName("*"),c,d,h=new RegExp("^"+m+"$","i"),k=-1;++k<b.length;)if((a=b[k])&&(d=a.nodeName.match(h))){c=new RegExp("^\\s*<"+d+"(.*)\\/"+
d+">\\s*$","i");i.innerHTML=a.outerHTML.replace(/\r|\n/g," ").replace(c,a.currentStyle.display=="block"?"<div$1/div>":"<span$1/span>");c=i.childNodes[0];c.className+=" iepp_"+d;c=f[f.length]=[a,c];a.parentNode.replaceChild(c[1],c[0])}s(e.styleSheets,"all")}function u(){for(var a=-1,b;++a<f.length;)f[a][1].parentNode.replaceChild(f[a][0],f[a][1]);for(b in g)r[l].removeChild(g[b]);g={};f=[]}for(var m="abbr article aside audio canvas command datalist details figure figcaption footer header hgroup mark meter nav output progress section summary time video".replace(/ /g,
"|"),n=m.split("|"),r=e.documentElement,i=e.createDocumentFragment(),g={},f=[],o=-1,l="firstChild",j="createElement";++o<n.length;){e[j](n[o]);i[j](n[o])}i=i.appendChild(e[j]("div"));p.attachEvent("onbeforeprint",t);p.attachEvent("onafterprint",u)})(this,document)@end@*/


