/* ############################################# */
/* #  Calliope Studios                         # */
/* #  P.Gold - 11/07                           # */
/* ############################################# */



// COMPONENT:  signupPanel  *****************************

var signupPanel = {
	init: function() {
		signupPanel.installListeners();
	},

	installListeners: function() {
		var panel = document.getElementById('componentSignup');
		if (panel == undefined) return;
		var hdr = panel.getElementsByTagName('h3');
		for (var i=0; i<hdr.length; i++) {
			signupPanel.addEvent(hdr[i], 'click', signupPanel.eventClick, false);
		}
		
		var signupForm = panel.getElementsByTagName('form')[0];
		signupForm.preSubmissionEvent = signupPanel.eventSubmission;
	},
	
	eventClick: function(e) {
		var target = signupPanel.getEventTarget(e);
		if (target.isDown == true) {
			target.isDown = false;
			Effect.BlindUp('signupDrop', {duration:0.5});
		} else {
			target.isDown = true;
			Effect.BlindDown('signupDrop', {duration:0.5});
		}
	},
	
	eventSubmission: function(e) {
		// PROCESS SUBMISSION: Either send via AJAX, or process to separate page.
		var formRef = this;		
		if (!Sarissa) return;
		
		var xmlhttp = new XMLHttpRequest();
		var parameters = 'email='+formRef.email.value+'&first_name='+formRef.first_name.value+'&last_name='+formRef.last_name.value;
		var procUrl = '/signup.php';
		
		xmlhttp.open('POST', procUrl, true);
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", parameters.length);
		xmlhttp.setRequestHeader("Connection", "close");

		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4) {
				var x = (xmlhttp.responseText);
				/*alert(x);*/

				signupPanel.eventSubmitConclusion(e);

				function delayReset() { formRef.reset(); }
				setTimeout(delayReset, 2500);
			}
		}
		xmlhttp.send(parameters);

		signupPanel.cancelLink(e);
		signupPanel.cancelClickSafari();
	},
	
	eventSubmitConclusion: function(e) {
		var signupDrop = document.getElementById('signupDrop');
		var signupConfirm = document.getElementById('signupConfirm');
		if (signupDrop && signupConfirm ) {
			if (Effect) {
				Effect.BlindUp('signupDrop', {duration:0.5}); Effect.BlindDown('signupConfirm', {duration:0.5});
				setTimeout(function(){Effect.BlindUp('signupConfirm', {duration: 0.4});}, 2500);
			}
		}
	},
	
	addEvent: function(elm, evType, fn, useCapture) {
		// cross-browser event handling for IE5+, NS6+ and Mozzila/Gecko
		// By Scott Andrew
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}	
	},

	getEventTarget: function(e) {
		return window.event ? window.event.srcElement : e ? e.target : null;
	},
	
	cancelClickSafari: function() {
		return false;
	},
	
	cancelLink: function(e) {
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			window.event.srcElement.blur();
		}
		if (e && e.stopPropagation && e. preventDefault) {
			e.stopPropagation();
			e.preventDefault();
			e.target.blur();
		}
	}
};
signupPanel.addEvent(window, 'load', signupPanel.init, false);

// ********************************






// EXTERNAL LINKS *****************

var externalLauncher = {
	init: function() {
		externalLauncher.installListeners();
	},

	installListeners: function() {
		var anchors = document.getElementsByTagName('a');
		for (var i=0; i<anchors.length; i++) {
			if (anchors[i].className.match('external'))
				externalLauncher.addEvent(anchors[i], 'click', externalLauncher.eventLaunch, false);
		}
	},
	
	eventLaunch: function(e) {
		var target = externalLauncher.getEventTarget(e);
		window.open(target.href);
		externalLauncher.cancelLink(e);
		externalLauncher.cancelClickSafari();
	},

	addEvent: function(elm, evType, fn, useCapture) {
		// cross-browser event handling for IE5+, NS6+ and Mozzila/Gecko
		// By Scott Andrew
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}	
	},

	getEventTarget: function(e) {
		return window.event ? window.event.srcElement : e ? e.target : null;
	},
	
	cancelClickSafari: function() {
		return false;
	},
	
	cancelLink: function(e) {
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			window.event.srcElement.blur();
		}
		if (e && e.stopPropagation && e. preventDefault) {
			e.stopPropagation();
			e.preventDefault();
			e.target.blur();
		}
	}
};
externalLauncher.addEvent(window, 'load', externalLauncher.init, false);
// ********************************




// FORM VALIDATION ***************

var validationSet = {
	'email': {
		'regexp': /^.+?@.+?\..+?$/,
		'error': 'Please enter a valid email address.'
	},

	'first_name': {
		'regexp': /^(([A-Z]|[a-z]){3,16}\s*)+$/,
		'error': 'Please enter a valid name.'
	},

	'last_name': {
		'regexp': /^(([A-Z]|[a-z]){3,16}\s*)+$/,
		'error': 'Please enter a valid name.'
	},

	'zipcode': {
		'regexp': /^[0-9]{5,5}$/,
		'error': 'Please enter a valid zip code.'
	}
};


var validate = {
	init: function() {
		validate.installListeners();
	},

	installListeners: function() {
		for (var i in validationSet) {
			if (document.getElementsByName(i)) {
				var formField = document.getElementsByName(i)[0];
				if (formField == undefined) continue;
				validate.addEvent(formField, 'blur', validate.checkValid, false);
				if (!formField.form.validateSubmit) {
					validate.addEvent(formField.form, 'submit', validate.checkValidSubmit, false);
					formField.form.onsubmit = validate.checkSubmit; // Safari
					formField.form.validateSubmit = true;
				}
			}
		}
	},


	checkValidSubmit: function(e) {
		var frm = validate.getEventTarget(e);
		if (!frm) return;
		var errList = [];
		
		for (var i=0; i<frm.elements.length; i++) {		
			if (frm.elements[i].name && validationSet[frm.elements[i].name]) {
				var failedE = validate.handleValidity(frm.elements[i]);
				if (failedE) {
					frm.elements[i].className += ' fieldErr';
					var labels = document.getElementsByTagName('label');
					errList[errList.length] = validationSet[failedE.name]['error'];
					for (x in labels) {
						if (labels[x].htmlFor == frm.elements[i].name) {
							//errList[errList.length-1] += ' (field \''+labels[x].firstChild.nodeValue+'\')';
							if (!labels[x].className) { labels[x].className = ''; }
							labels[x].className += ' labelErr';
						}
					}
				} else {
					frm.elements[i].className = frm.elements[i].className.replace(' fieldErr', '');
					var labels = document.getElementsByTagName('label');
					for (x in labels) {
						if (labels[x].htmlFor == frm.elements[i].name)
							labels[x].className = labels[x].className.replace('labelErr', '');
					}			
				}
			} /* ENDIF */
		} /* ENDFOR */
		
		if (errList.length > 0) {
			var errContainer = document.getElementById('formErrors');
			if (errContainer != undefined) { frm.removeChild(errContainer); }

			errContainer = document.createElement('div');
			errContainer.id = 'formErrors';
			
			var errMsgContainer = document.createElement('div')
			errMsgContainer.className = 'formErrMsg';
			var errMsg = document.createTextNode('Errors on the form:');
			errMsgContainer.appendChild(errMsg);
			errContainer.appendChild(errMsgContainer);
			
			var errListNode = document.createElement('ul');
			errListNode.className = 'standardList errList';
			for (var errNum=0; errNum<errList.length; errNum++) {
				var errListStr = document.createTextNode(errList[errNum]);
				var errListItem = document.createElement('li');
				errListItem.appendChild(errListStr);
				errListNode.appendChild(errListItem);
			}
			errContainer.appendChild(errListNode);

			frm.insertBefore(errContainer,frm.firstChild);
			
			frm.submitAllowed = false;
			validate.cancelLink(e);
		} else if (frm.preSubmissionEvent) {
			frm.preSubmissionEvent(e);
		} else {
			frm.submitAllowed = true;
		}
	},
	
	checkSubmit: function() {
		if (this.attachEvent) return true;
		return this.submitAllowed;
	},
	
	checkValid: function(e) {
		var target = validate.getEventTarget(e);
		if (!target) return;
		
		var failedE = validate.handleValidity(target);
		if (failedE) {
			target.className += ' fieldErr';
			var labels = document.getElementsByTagName('label');
			for (x in labels) {
				if (labels[x].htmlFor == target.name) {
					if (!labels[x].className) { labels[x].className = ''; }
					labels[x].className += ' labelErr';
				}
			}
		} else {
			target.className = target.className.replace(' fieldErr', '');
			var labels = document.getElementsByTagName('label');
			for (x in labels) {
				if (labels[x].htmlFor == target.name)
					labels[x].className = labels[x].className.replace('labelErr', '');
			}			
		}
	},
	
	handleValidity: function(field) {
		// if (!field.value) return null; /* ignore if note required */
		var re = validationSet[field.name]['regexp'];
		return (!field.value.match(re)) ? field : null;
	},

	addEvent: function(elm, evType, fn, useCapture) {
		// cross-browser event handling for IE5+, NS6+ and Mozzila/Gecko
		// By Scott Andrew
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}	
	},

	getEventTarget: function(e) {
		return window.event ? window.event.srcElement : e ? e.target : null;
	},

	cancelClickSafari: function() {
		return false;
	},

	cancelLink: function(e) {
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			window.event.srcElement.blur();
		}
		if (e && e.stopPropagation && e. preventDefault) {
			e.stopPropagation();
			e.preventDefault();
			e.target.blur();
		}
	}
};
validate.addEvent(window, 'load', validate.init, false);






// COMPONENT:  storeLocator  *****************************

var storeLocator = {
	init: function() {
		var locationForm = document.getElementById('storeLocator');
		if (locationForm) {
			var args = getArgs();
			var sku =  args['sku'];
			if (sku!=undefined) {
				var inputs = locationForm.elements;
				for (var i=0; i<inputs.length; i++) {
					if (inputs[i].name.match('sku')) {
						var skuInput = inputs[i];
						if (skuInput && sku) {
							skuInput.value = sku;
						}
					}
				}
			}
		}		
	},

	addEvent: function(elm, evType, fn, useCapture) {
		// cross-browser event handling for IE5+, NS6+ and Mozzila/Gecko
		// By Scott Andrew
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}	
	}
};
storeLocator.addEvent(window, 'load', storeLocator.init, false);

// ********************************






/*
 * This function parses comma-separated name=value 
 * argument pairs from the query string of the URL. 
 * It stores the name=value pairs in 
 * properties of an object and returns that object.
 */
function getArgs() {
    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;     // Return the object
}