// UX main.js  20080818.0 SL 
//window.onerror = function() { return true; };

function UX_$(x){return document.getElementById(x);}

var UX = {
	myAppPath:UX_$("UX_SCRIPT_INCLUDE").getAttribute("src").replace(/\/main\.js[\s\n]*$/,""),
	myCfgName:'necco_store',
	libraries:['mbox'],
	scriptOff:false,
	showDebug:false
};

UX.getArgs = function() {
 var args = new Object();
 var query = location.search.substring(1);
 var pairs = query.split(",");
 for(var i=0; i<pairs.length; i++) {
	var pos = pairs[i].indexOf('=');
	if(pos == -1) continue;
	var argname = pairs[i].substring(0,pos);
	var value = pairs[i].substring(pos+1);
	args[argname] = unescape(value);
 }
 return args;
}

UX.onDOMLoadRun = function(func) {
	// Run function 'func' when DOM tree is available (ie. prior to window.onload).
	// Parse function name (IE6 doesn't get func.name)
	if(typeof func != 'function') return;
	var z = func.toString();
	var ss = z.substring(z.indexOf("function ")+9, z.indexOf("{"));
	var funcName='',z='';
	for(var k=0; k < ss.length; k++) {
		z = ss.charAt(k);
		funcName += ((z != " ") && (z != "(") && (z != ")")) ? z : '';
	}
	
	var handled = false;
	_timer = null; // Set global var

	/* for Mozilla */
	if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", func, false);
		handled = true;
	}

	/* for Internet Explorer */
	/*@cc_on @*/
	/*@if (@_win32)
		if(location.protocol == 'https:') {
			// Prevent non-secure content warning on https pgs
			document.write("<script id=__ie_onload defer src='" + UX.myAppPath + '/lib/void.js' + "'><\/script>");
		} else {
			document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
		}
		var script = document.getElementById("__ie_onload");
		if(script) {
			script.onreadystatechange = function() {
				if (this.readyState == "complete") {
					func(); // call the onload handler
				}
			};
			handled = true;
		}
	/*@end @*/

	/* for Safari */
	if (/WebKit/i.test(navigator.userAgent)) { // sniff
		_timer = setInterval(function() {
			if (/loaded|complete/.test(document.readyState)) {
				func(); // call the onload handler
			}
		}, 10);
		handled = true;
	}
	
	/* for other browsers */
	if(!handled) UX.onWindowLoadRun(func);
}

UX.onWindowLoadRun = function(func) {
	// Run function 'func' at window.onload after other (previously set) handlers have fired. 
	if(typeof window.addEventListener != 'undefined') {
		// moz, saf1.2, ow5b6.1
		window.addEventListener('load', func, false);
	} else if (typeof document.addEventListener != 'undefined') {
		// MSN/OSX, op7.50, saf1.2, ow5b6.1
		document.addEventListener('load', func, false);
	} else if (typeof window.attachEvent != 'undefined') {
		// ie5.0w, ie5.5w, ie6w
		window.attachEvent('onload', func);
	} else {
		if (typeof window.onload == 'function') {
			// Add 'func' to existing handlers
			var oldonload = window.onload;
			window.onload = function() {
				oldonload();
				func();
			};
		} else {
			window.onload = func;
		}
	}
}
UX.trackClicks = function() {
	if(typeof window.addEventListener != 'undefined') { // moz, saf1.2, ow5b6.1
		window.addEventListener("click", UX.handleClick, false); // Event listener
	} else if (typeof document.addEventListener != 'undefined') { // MSN/OSX, op7.50, saf1.2, ow5b6.1
		document.addEventListener("click", UX.handleClick, false); // Event listener
	} else if(typeof window.attachEvent != 'undefined') { // ie5.0w, ie5.5w, ie6w
		window.document.body.attachEvent("onclick", UX.handleClick); // Event listener
	}
}

UX.handleClick = function(evt) {
	evt = (evt) ? evt : (window.event) ? window.event : "";
	if(evt) {
		// Click detected. Determine target.
		var elem = (evt.target) ? evt.target : evt.srcElement;
		if(elem.nodeName == 'A') {
			// Anchor node was clicked.			
			if(elem.href || /ppcredir\.geo/i.test(elem.getAttribute("onclick"))) UX.runLinkHandlers(elem,evt);
		} else if(elem.parentNode.nodeName == 'A') {
			// Inspect parent element to see if it is linked. (e.g. IMG or B tag)
			if(elem.parentNode.href || /ppcredir\.geo/i.test(elem.parentNode.getAttribute("onclick"))) UX.runLinkHandlers(elem.parentNode,evt);
		} else if((elem.nodeName.toLowerCase() == 'input') && (elem.type.toLowerCase() == 'submit' || elem.type.toLowerCase() == 'button')) {			
			// Form submit button was clicked
			UX.runButtonHandlers(elem,evt);
		}		
	}
}

UX.isLink = function(convertName,parentMbox,expression,anchorNode,evt,isTest) {
	var regex = new RegExp(expression);
	return UX.trackLinkClick(regex.test(unescape(anchorNode.href)) || (/ppcredir\.geo/i.test(anchorNode.getAttribute("onclick")) && regex.test(anchorNode.getAttribute("onclick"))), convertName, parentMbox, anchorNode, evt, isTest);
}

// Tracks for a button click instead of a link
// @param convertName The name of the conversion
// @param parentMbox The mbox name to use as reference
// @param expression An array of attributes and regex values to check for on the button element {a:<attribute name>,v:<regex value>}
// @param node The button node to test
// @param evt The event that caused the function call
// @param isTest Whether or not in test mode.
UX.isButton = function(convertName,parentMbox,expression,node,evt,isTest){	
	var bool = node.nodeName.toLowerCase() == "input" && (node.getAttribute("type").toLowerCase() == "button" || node.getAttribute("type").toLowerCase() == "submit");	
	for(var i = 0; i < expression.length; i++){
		if(bool){			
			var reg = new RegExp(expression[i].v);			
			bool = bool && reg.test(node.getAttribute(expression[i].a));
		}else{
			break;
		}
	}	
	return UX.trackLinkClick(bool,convertName,parentMbox,node,evt,isTest);
}

UX.isGroupLink = function(convertName,parentMbox,expression,anchorNode,evt,linkType,isTest) {
	var regex = new RegExp(expression);
	var currNode = anchorNode;
	var found = false;
	var stopped = false;
	var i = 0;
	var rgx = new RegExp(location.host);
	var linkTarget = rgx.test(currNode.href) ? 'internal' : 'external';
	if((linkType == '') || (linkTarget == linkType)) {
		// Bubble up until an ID (or stop value) is found
		while(!found && !stopped && (i < 15)) {
			if(currNode.parentNode) {
				currNode = currNode.parentNode;
				if(currNode.id && (currNode.id != "")) {
					if(regex.test(currNode.id)) {
						found = true;
					}
				}
			} else {
				stopped = true;
			}
		}
	}
	return UX.trackLinkClick(found, convertName, parentMbox, anchorNode, evt, isTest);
}

// This function returns the value from a query string
// given a requested query parameter.  If multiple parameters have the same name
// (e.g. ?gorilla=black&gorilla=blue&gorilla=fish) only the last instance of the
// value will be returned ("fish" in the aforementioned example)
// @param href The url or query string from which to extract the parameter's value
// @param param The name of the parameter to extract (Case Sensitive)
// @return The value of the parameter or the entire url or query string if the parameter was not found
UX.getQueryParameter = function(href, param){	
	return String(href).replace(/\n/g,"").replace(new RegExp(".*(^|\\?|\\&)"+param+"=([^\\&]*).*"),"$2");
}

UX.trackLinkClick = function(isConversion, convertName, parentMbox, elem, evt, isTest) {
	if(isConversion) {
		// Get the ppc rank
		var rank = UX.getQueryParameter((/ppcredir\.geo/i.test(elem.getAttribute("onclick")) ? elem.getAttribute("onclick") : elem.href), "rank");
		// Handle the link target
		if(elem.target != '_blank' && !/ppcredir\.geo/i.test(elem.getAttribute("onclick"))) {			
			// Link opens in current window. Delay the default action with a timeout.
			UX.cancelDefaultAction(evt);
			UX.transmitConversion(convertName,parentMbox,isTest,rank);
			window.setTimeout("window.location.href='" + elem.href + "'", 600);
			return true;
		} else {
			// Link opens in new window. No timeout required.
			UX.transmitConversion(convertName,parentMbox,isTest,rank);
			return true;
		}
	}
	return false;
}

UX.cancelDefaultAction = function(evt) {
	if(evt) {
		if(typeof window.addEventListener != 'undefined') { // moz, saf1.2, ow5b6.1
			evt.preventDefault();
		} else if (typeof document.addEventListener != 'undefined') { // MSN/OSX, op7.50, saf1.2, ow5b6.1
			evt.preventDefault();
		} else if (typeof window.attachEvent != 'undefined') { // ie5.0w, ie5.5w, ie6w
			evt.returnValue = false;
		}
	}
}

// This function checks that a string can be parsed as an Integer
// @param str The string to check for parsibility to an integer
// @return A boolean value indicating whether or not the string can be parsed as an integer
UX.validateInt = function(str){
	return String(str) == String(parseInt(str));
}

UX.transmitConversion = function(convertName,parentMbox,isTest,rank) {	
	var mboxConvertName = "conversionMbox";
	if(isTest || UX.showDebug) { alert(mboxConvertName); return true; }	
	var url = mboxFactoryDefault.get(parentMbox).getURL();
	url = url.replace("mbox=" + parentMbox,"mbox=" + mboxConvertName);
	url = url.replace("mboxPage=" + mboxFactoryDefault.getPageId(),"mboxPage=" + mboxGenerateId());
	url += (convertName ? "&convertType="+convertName : "") + (rank ? (UX.validateInt(rank) ? "&rank="+rank : "") : "");
	var params = new Array();
	for(var i = 4; i < arguments.length; i++)		
		params.push("&"+arguments[i]);
	setTimeout("(new Image()).src = \"" + url + params.join("") + "\"",0);	
}

UX.pathMatches = function(regx) {
	var s = new RegExp(regx);	
	return s.test(location);
}

UX.buildParameter = function(keyName,defaultVal) {
	try { return (typeof pg[keyName] == 'undefined') ? keyName+'='+defaultVal : keyName+'='+pg[keyName]; }
	catch(e) { return keyName+'='+defaultVal; }
}

UX.includeScript = function(src) {
	if(!UX.scriptOff) document.write('<sc' + 'ript src="' + src + '" type="text/javascript"></sc' + 'ript>');
}

UX.include = function(lib) {
	var o =document.getElementsByTagName('HEAD')[0];
	if(o) {
		var e = document.createElement('SCRIPT');
		e.setAttribute('type','text/javascript');
		e.setAttribute('src',UX.myAppPath + '/lib/' + lib + '.js');
		o.appendChild(e);
	}
}

UX.cloak = function() {
	if(document.getElementsByTagName) {
		document.write('<style type="text/css">body { display:none; }</style>');
	}
}

UX.uncloak = function() {
	var x = UX.t('body')[0];
	if(x) x.style.display = 'block';
}

UX.init = function() {
	// Initialize global vars
	UX.ctr = 0;
	UX.parentMboxName = '';
	UX.customMboxNames = new Array();
	
	// Get querystring arguments
	UX.args = UX.getArgs();
	UX.previewNum = parseInt(UX.args.design);
	if(isNaN(UX.previewNum)) UX.previewNum = 0;

	// Load libraries
	if(UX.libraries.length) {
		for(var i=0; i<UX.libraries.length; i++) {
			UX.includeScript(UX.myAppPath + '/lib/' + UX.libraries[i] + '.js');
		}
	}
	
	// Load site configuration file
	UX.includeScript(UX.myAppPath + '/cfg/' + UX.myCfgName + '.js');
}
UX.init();

