// Initialize globals
var page_init = function() {
	signupPanel.init();
	validate.init();
	externalLauncher.init();               // External links
	twitterMenu();
}
$(document).ready(page_init);



// EXTERNAL LINKS *****************
var externalLauncher = {
	init: function() {
		externalLauncher.installListeners();
	},

	installListeners: function() {
		$('a').each(function(){
			if($(this).hasClass('external'))
				$(this).click(externalLauncher.eventLaunch);
		});
	},
	
	eventLaunch: function(event) {
		window.open(this.href);
		event.preventDefault();
	}
};
// ********************************


function twitterMenu() {
	$('#twitter ul').hide();
	$('#twitter').hover(
		function(){
			$(this).find('ul').stop(true, true).show(250,clear);
		},
		function(){
			$(this).find('ul').stop(true,true).hide(250,clear);
		}	
	);
	
	function clear() {
		$(this).css({
			'width' : 'auto',
			'height': 'auto',
			'padding' : '',
			'overflow' : 'visible'
		});	
	}
}

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

	installListeners: function() {
		var panel = document.getElementById('signupPanel');
		if (panel == undefined) return;
		var signupForm = panel.getElementsByTagName('form')[0];
		signupForm.preSubmissionEvent = signupPanel.eventSubmission;
		
		var emailField = $('#signupPanel #email')[0];
		if (emailField != undefined) {
			if (emailField.value == "") {
				emailField.value = emailField.title;
			}
			signupPanel.addEvent(emailField,'focus',signupPanel.focusField,false);
			signupPanel.addEvent(emailField,'blur',signupPanel.blurField,false);
		}
	},
	
	focusField: function(e) {
		var target = signupPanel.getEventTarget(e);
		if (target.id == "email") {
			if (target.value != "" && target.value == target.title ) {
				target.value = "";
			}
		}
	},

	blurField: function(e) {
		var target = signupPanel.getEventTarget(e);
		if (target.id == "email") {
			if (target.value == "") {
				target.value = target.title;
			}
		}
	},

	eventSubmission: function(e) {
		// PROCESS SUBMISSION: Either send via AJAX, or process to separate page.
		var formRef = this;
		var procUrl = '/modules/ConstantContact/signup.php';

		jQuery.post(procUrl, {'email': formRef.email.value}, function(data) {
     		$($('#signupPanel form')[0]).html(data);
		});

		signupPanel.cancelLink(e);
		signupPanel.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();}}
};
// ********************************


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

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


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);

         $(errContainer).hide();
			frm.insertBefore(errContainer,frm.firstChild);
         $(errContainer).fadeIn(200);
			
			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();}}
};







// ********************************
// rubix common utility functions
// ................................
var rbx_cmn = {
   create_elm: function(tag,className,id) {
      var elm = document.createElement(tag);
      if (className) { $(elm).addClass(className); }
      if (id) { elm.id = id; }
      return elm;
   },
	get_ancestor_by_tag: function(obj, tag) {
		if (obj == document) return null;
		return (obj.tagName == tag) ? obj : rbx_cmn.get_ancestor_by_tag(obj.parentNode, tag);
	},
	get_ancestor_by_class: function(obj, target_class) {
		if (obj == document) return null;
		return (obj.className.match(target_class)) ? obj : rbx_cmn.get_ancestor_by_class(obj.parentNode, target_class);
	},
	get_inherited_font_size: function(obj) {
		if (obj == document) return -1;
		return ((obj.style.fontSize).length > 0) ? obj.style.fontSize : rbx_cmn.get_inherited_font_size(obj.parentNode);
	},
	kill_event: 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();}
	},
	is_hidden: function(obj) {
		if ((obj.style.display == "none"||obj.style.visibility=="hidden")) return true;
		return false;
	},
	rand: function(lower,upper) { return (Math.floor((upper-(lower-1))*Math.random()) + lower); },
	e_target: function(e){return window.event?window.event.srcElement:e?e.target:null;}
};
// ********************************


// ********************************
// rubix ajax methods
// ................................
var rbxAjax = {
	xmlHttp: null,
	getXmlHttpObject: function() {
		try {  // Firefox, Opera 8.0+, Safari
			return xmlHttp=new XMLHttpRequest();
		} catch (e) {  // Internet Explorer
			try {
				return xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				return xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
	},
	getXML: function(xmlPath,callback) {
		if (xmlPath.length==0) return;
		rbxAjax.xmlHttp=rbxAjax.getXmlHttpObject();
		if (!rbxAjax.xmlHttp){ alert ("Your browser does not support AJAX!"); return; }
		if (rbxAjax.xmlHttp.overrideMimeType) rbxAjax.xmlHttp.overrideMimeType('text/xml');
		if (callback) rbxAjax.stateChanged.callback = callback;
		rbxAjax.xmlHttp.onreadystatechange=rbxAjax.stateChanged;
		rbxAjax.xmlHttp.open("GET", xmlPath, true);
		rbxAjax.xmlHttp.send(null);
	},
	stateChanged: function() {
		if (rbxAjax.xmlHttp.readyState==4) {
			if (rbxAjax.xmlHttp.status==200) {
				if (rbxAjax.stateChanged.callback) { // if we have defined a callback
					var parseSuccess = rbxAjax.stateChanged.callback(rbxAjax.xmlHttp.responseXML); //retrieve result as an XML object and pass to callback 
					if (parseSuccess == false) alert("Cannot understand data returned by the server!");
				}
			}
		}
	}
};
// ********************************
