/*
	main.js for vanillasite trunk (c)2006 Featurecreep Ltd.
	You are free to use any code you find in this file as long as you credit www.featurecreep.com
	Please send comments or questions to info@featurecreep.com
*/



/*************************************************************************************
	JSON LOADING
*************************************************************************************/

function loadJSON(url, params, HttpMethod, callBack){
	if(!HttpMethod) HttpMethod = "GET";
	var req = null;
	if(window.XMLHttpRequest) req = new XMLHttpRequest();
	else if(typeof ActiveXObject != "undefined") req = new ActiveXObject("Microsoft.XMLHTTP");
	if(req){
		req.onreadystatechange = function(){
			var ready = req.readyState;
			if(ready == 4){
				var data = req.responseText;
				var returnObject;
				try{returnObject = eval("(" + data + ")");}
				catch(error){returnObject = null};
				callBack(returnObject);
			}
		}
		req.open(HttpMethod, url, true);
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.send(params);
	}
}

/*************************************************************************************
	ALERT if #
*************************************************************************************/

function _alert(str){
	if(location.hash.length > 0) alert(str);
}




/*************************************************************************************
	SCROLL Y
*************************************************************************************/
function getScrollY(){
	var scrollY = 0;
	if(document.body && typeof document.body.scrollTop != "undefined") {
		scrollY = document.body.scrollTop;
		if(document.body.parentNode && typeof document.body.parentNode.scrollTop != "undefined") scrollY += document.body.parentNode.scrollTop;
	}
	else if(typeof window.pageYOffset != "undefined") scrollY = window.pageYOffset;
	return scrollY;
}

/*************************************************************************************
	GET ELEMENTS BY CLASS NAME
*************************************************************************************/
function getElementsByClassName(className, parent){
	var children = document.all ? parent.all : parent.getElementsByTagName("*");
	var matchedChildren = new Array();
	for(var i = 0 ; i < children.length ; i++){
		if(children[i].className.indexOf(className) > -1)matchedChildren[matchedChildren.length] = children[i]
	}
	return matchedChildren;
}

/*************************************************************************************
	DIAGNOSTICS
*************************************************************************************/

function initialiseDiagnostics(){
		window.diagnostics = new Object();
		diagnostics.display = document.createElement("DIV");
		diagnostics.display.setAttribute("STYLE","position:absolute;z-index:100;color:black;font-family:monospace;font-size:12px;border:1px inset #333333;background:#eeeeee;width:200px;height:90%;top:20px;left:20px;overflow:auto;text-align:left;");
		document.body.appendChild(diagnostics.display);
		diagnostics.trace = function(HTML){this.display.innerHTML += HTML + "<br/>"};
}

/*************************************************************************************
	CURRENT STYLE
*************************************************************************************/


function getCurrentStyle(elem, property, ieProperty) {
	var computedStyleProperty;
	if(document.defaultView && document.defaultView.getComputedStyle) {
		//condition to stop Safari error
		if(document.defaultView.getComputedStyle(elem, "")){
			computedStyleProperty = document.defaultView.getComputedStyle(elem, "").getPropertyValue(property);
		}
	} else if(elem.currentStyle) {
		computedStyleProperty = eval('elem.currentStyle.' + ieProperty)
	}
	return computedStyleProperty;
}

/*************************************************************************************
	FORM VALIDATION
*************************************************************************************/

function submitForm(button){
	var errorString = "";
	var labels  = button.form.getElementsByTagName("LABEL");
	
	for(var i = 0 ; i < labels.length ; i++){
		var label = new Label(labels[i]);
		errorString += label.validate();
	}
	if(errorString.length == 0) button.form.submit();
	else {
		errorString = "Sorry, your form has not been sent.\n\n" + errorString + "\n\nPlease enter the correct information and try sending again.";
		alert(errorString);
	}
	return false;
}
function Label(label){
	this.label = label;
	var _for = label.getAttribute("FOR");
	//IE6 works differently:
	if(!_for)_for = label.attributes["for"].value;
	this.subject = document.getElementById(_for);
}
Label.prototype.validate = function(){
	if(this.subject.className.indexOf("required")>-1){
	
		var pattern = /\s/g;
		var test = this.subject.value.replace(pattern, "");
		if(test.length == 0) return "- " + this.label.firstChild.nodeValue + " must contain some text\n";

		if(this.subject.className.indexOf("email")>-1){
			var validPattern =  /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/
			if(!validPattern.test(this.subject.value)) return "- " + this.label.firstChild.nodeValue + " is not valid\n";
		}
	}
	return "";
}

/*************************************************************************************
	EVENT CLASS
*************************************************************************************/


// Event class
function _Event(evt){
	this._rawEvent = evt ? evt : window.event ? event : null;
}

_Event.prototype.getRawEvent = function(){
	return(this._rawEvent);
}

_Event.prototype.getTargetNode = function(){
	var evt = this.getRawEvent();
	var target = evt.target ? evt.target : evt.srcElement ? evt.srcElement : null;
	while(target.nodeType > 1) target = target.parentNode;
	return target;
}

_Event.prototype.getFirstAncestor = function(name, property, value) {
	var evt = this.getRawEvent();
	var target = this.getTargetNode();
	
	//Because of multiple class names, see if the property contains the value
	if(property == "className") while(target && (target.nodeName !== name || target[property].indexOf(value) == -1)) target = target.parentNode;
	
	//Any other property must be equal to the value
	else while(target && (target.nodeName !== name || target[property] != value)) target = target.parentNode;
	return target;	
}

/*************************************************************************************
	ELEMENTS BY CLASS
*************************************************************************************/

function createClassNameHash(){
	var elements = document.all ? document.all : document.getElementsByTagName("*");
	
	for(var i = 0 ; i < elements.length ; i++){
	
		var element = elements[i];
		var name = element.className;
		if(name.length == 0) continue;
		
		//pop the element onto the array
		
		classNameHash[classNameHash.length] = element;
		
		//Accomodate multiple classes
		var classes = name.split(" ");
		
		//Create an array as a property to the array if one doesn't already exist for each class of the element
		
		for(var j = 0 ; j < classes.length ; j++){
			if(!classNameHash[classes[j]])classNameHash[classes[j]] = new Array();
			classNameHash[classes[j]][classNameHash[classes[j]].length] = element;
		}
	
	}
}


/*************************************************************************************
	APPEND TO CLASSNAME
*************************************************************************************/

function appendToClassName(node, sAppend){
	var sClassName = node.className;
	if(sClassName == null){
		sClassName = sAppend;
	} else {
		sClassName = sClassName.normalize() + (sClassName == "" ? "" : " ") + sAppend;
	};
	node.className = sClassName;
};
String.prototype.normalize = function(){
	return this.replace(/\s+/g, " ");
}

/*************************************************************************************
	TRANSPARENT PNG
*************************************************************************************/

	function TransparentPNG(src, width, height,onloadHandler){
		if(browser == "msie5win" || browser == "msie5.5" || browser == "msie6"){
			var div= document.createElement("DIV");
			if(browser == "msie5win") div.style.backgroundImage = "url(" + src + ".gif)";
			else div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+".png', sizingMethod='scale')";
			if(onloadHandler) div.onload = onloadHandler;
			div.style.width = width + "px";
			div.style.height = height + "px";
			div.style.lineHeight = "1px";
			div.className = "transparentPNG";
			return div;
		}
		else{
			var img = document.createElement("IMG");
			img.src = src + ".png";
			img.width = width;
			img.height = height;
			img.className = "transparentPNG";
			return img;
		}
	}



/*************************************************************************************
	FLIP HANDLERS
*************************************************************************************/

function addFlipHandlers(anchor, containerName, rolloverIndex){

	var container = getNextOutermost(anchor, containerName);
	var rolloverIndex = rolloverIndex;
	var height = anchor.offsetHeight;
	
	//Add flip handlers if dropdowns are not supported or if no dropdown
	if((!allowDropDowns || rolloverIndex == -1) && container){
		anchor.onmouseover = function() {container.style.backgroundPosition = "0px -" + height + "px";}
		anchor.onmouseout = function() {container.style.backgroundPosition = container.className.indexOf("selected")>-1 ? "0px -68px" : "0px 0px";}
	}
	//else if(allowDropDowns && rolloverIndex > -1) dropDownMenus[rolloverIndex].addKey(container, height);
}

function getNextOutermost(element, targetNodeName){
	var examine = element.parentNode;
	while(examine && examine.nodeName != targetNodeName) examine = examine.parentNode;
	return examine;
}

/*************************************************************************************
	SNIFFING
*************************************************************************************/

function sniffPlatform(){
	var platform = "generic";
	if(navigator.platform.toLowerCase().indexOf("win") > -1) platform = "win";
	else if(navigator.platform.toLowerCase().indexOf("mac") > -1) platform = "mac";
	return platform;
}

function sniffBrowser(){
	var uA = navigator.userAgent.toLowerCase();
	var browser = "generic";
	if (uA.indexOf("opera") > -1) browser = "opera";
	if (uA.indexOf("opera 8.5") > -1) browser = "opera8.5";
	else if(uA.indexOf("msie 5") > -1 && sniffPlatform() == "mac")  browser = "msie5mac";
	else if(uA.indexOf("msie 5.5") > -1)  browser = "msie5.5";
	else if(uA.indexOf("msie 5") > -1 && sniffPlatform() == "win") browser = "msie5win";
	else if(uA.indexOf("msie 6") > -1) browser = "msie6";
	else if(uA.indexOf("msie 7") > -1) browser = "msie7";
	else if(uA.indexOf("safari") > -1) {
		var build = parseInt(uA.substr(uA.indexOf("safari/")+7))
		browser = "safari" 
		if (build < 412) browser += "1";
		else if (build <= 312) browser += "1.3";
		else browser += "2";
	}
	else if(uA.indexOf("mozilla") > -1) browser = "mozilla";
	return browser;
}