// Javascript Rules

var moorules = {
	'div#cp-bottom' : function(element) {
		// See if Control Panel is rendered or die
		cpb = $('cp-bottom');
		cpt = $('cp-top');
		if (!cpb || !cpt) { return; };
		cpt.innerHTML = cpb.innerHTML;
		cpt.style.display = 'block';
		cpb.style.display = 'none';
	},
	'div#control-panel' : function(element) {
		element.anim = new Fx.Slide(element, {duration: 800, transition: Fx.Transitions.quintOut});
		element.anim.hide();
	},
	'div#masthead-cp' : function(element) {
		var xcControlPanel = $('control-panel');
		element.onclick = function()
		{
			xcControlPanel.anim.toggle(); 
			return false;
		}
	},
	'div#masthead-login' : function(element) {
		// See if Login is rendered or die
		if (!element) { return; };
		element.style.display = 'block';
		element.anim = new Fx.Style(element, 'opacity', {duration: 800});
		element.anim.hide();
	},
	'a#toggleLogin' : function(element) {
		var xcLogin = $('masthead-login');
		if (element.innerHTML != 'logout')
		{
			element.onclick = function()
			{
				if (xcLogin.style.opacity == 0)
					xcLogin.anim.start(0,1);
				else
					xcLogin.anim.start(1,0);
				return false;
			}
		}
	},
	'input#search' : function(element){
		var defaultValue = 'xc:Search';
		element.value = defaultValue;
		element.onblur = function() {
			 if (this.value == '')
			{
				this.value = defaultValue;
			}
		}
		element.onfocus = function() {
			if (this.value == defaultValue)
			{
				this.value = '';
			}
		}
	},
	'fieldset#fs03a' : function(element) {
		element.anim = new Fx.Slide(element, {duration: 800, transition: Fx.Transitions.quintOut});
	},
	'fieldset#fs04' : function(element) {
		element.anim = new Fx.Slide(element, {duration: 800, mode: 'horizontal', transition: Fx.Transitions.quintOut});
	},
	'p#accountInfo' : function(element) {
		element.anim = new Fx.Slide(element, {duration: 800, transition: Fx.Transitions.quintOut});
	},
	'form#signup' : function(element) {
		element.anim = new Fx.Style(element, 'width', {duration: 800, transition: Fx.Transitions.quintOut});
		var fs04 = $('fs04');
		var fs03a = $('fs03a');
		var myForm = $('signup');
		var accountInfo = $('accountInfo');
		var finalStep = $('finalStep');
		var Account_Type = $('Account_Type');
		var signupOverlay = $('signupOverlay');
		isError = new Object();
		paymentInfo = false;
		// Test if innerHTML contains a dollarsign, if so show payment form
		var optionText = Account_Type.options[Account_Type.selectedIndex].innerHTML;
		//alert(optionText);
		if ( optionText.match(/\$/) ) 
		{
			if ( element.style.width == '708px' ) element.anim.start(708,944);
			accountInfo.anim.hide();
			finalStep.className = 'step5';
			paymentInfo = true;
		}
		else
		{
			if ( element.style.width != '708px' ) element.anim.start(944,708);
			fs04.anim.hide();
			fs03a.anim.hide(); 
			finalStep.className = 'step4';
			paymentInfo = false;
		}
		element.onsubmit = function() {
			var outArr = '';
			var formError = false;
			for ( keyVal in isError ) 
			{
				var validateThis = true;
				if ( ($(keyVal).parentNode.id == 'fs03a' || $(keyVal).parentNode.id == 'fs04') && !paymentInfo ) validateThis = false;
				if ( validateThis && isError[keyVal] ) formError = true;
				outArr += keyVal+' = '+isError[keyVal]+' ['+validateThis+']\n';
			}
			if ( formError )
			{
				//alert(outArr+'/n'+paymentInfo);
				alert('There are errors or you have not completely filled out the signup form, please correct and resubmit.');
				return false;
			}
			return true;
		}
	},
	'select#Account_Type' : function(element) {
		var fs04 = $('fs04');
		var fs03a = $('fs03a');
		var myForm = $('signup');
		var accountInfo = $('accountInfo');
		var finalStep = $('finalStep');
		element.onchange = function()
		{
			// Test if innerHTML contains a dollarsign, if so show payment form
			var optionText = element.options[element.selectedIndex].innerHTML;
			//alert(optionText);
			if ( optionText.match(/\$/) ) 
			{
				if ( myForm.style.width == '708px' ) myForm.anim.start(708,944);
				fs04.anim.slideIn(); 
				accountInfo.anim.slideOut();
				fs03a.anim.slideIn();
				finalStep.className = 'step5';
				paymentInfo = true;
			}
			else
			{
				if ( myForm.style.width != '708px' ) myForm.anim.start(944,708);
				fs04.anim.slideOut();
				accountInfo.anim.slideIn(); 
				fs03a.anim.slideOut(); 
				finalStep.className = 'step4';
				paymentInfo = false;
			}
		}
	},
	'select#Card_Expy_Month' : function(element) {
		isError['Card_Expy_Month'] = false;
		var selectYear = $('Card_Expy_Year');
		element.onchange = function()
		{
			var monthVal 	= element.options[element.selectedIndex].value;
			var yearVal 	= selectYear.options[selectYear.selectedIndex].value;
			var today 		= new Date();
			var expiry 		= new Date(yearVal, monthVal);
			var error 		= (today.getTime() > expiry.getTime()) ? true : false;
			if ( !error )
			{
				var elParent	= element.parentNode;
				var elError 	= element.previousSibling;
				if ( elError.className == 'formError' ) elParent.removeChild(elError);
				isError['Card_Expy_Month'] = false;
				isError['Card_Expy_Year'] = false;
			}
			else
			{
				var elError 	= element.previousSibling;
				if ( elError.className != 'formError' ) 
				{
					var myError = document.createElement('strong');
					myError.className = 'formError';
					myError.innerHTML = 'Credit Card has Expired';
					element.parentNode.insertBefore(myError,element); 
				}
				else
				{
					elError.innerHTML = 'Credit Card has Expired';
				}
				isError['Card_Expy_Month'] = true;
			}
		}
	},
	'select#Card_Expy_Year' : function(element) {
		isError['Card_Expy_Year'] = false;
		var selectMonth = $('Card_Expy_Month');
		element.onchange = function()
		{
			var yearVal 	= element.options[element.selectedIndex].value;
			var monthVal 	= selectMonth.options[selectMonth.selectedIndex].value;
			var today 		= new Date();
			var expiry 		= new Date(yearVal, monthVal);
			var error 		= (today.getTime() > expiry.getTime()) ? true : false;
			if ( !error )
			{
				var elParent	= selectMonth.parentNode;
				var elError 	= selectMonth.previousSibling;
				if ( elError.className == 'formError' ) elParent.removeChild(elError);
				isError['Card_Expy_Year'] = false;
				isError['Card_Expy_Month'] = false;
			}
			else
			{
				var elError 	= selectMonth.previousSibling;
				if ( elError.className != 'formError' ) 
				{
					var myError = document.createElement('strong');
					myError.className = 'formError';
					myError.innerHTML = 'Credit Card has Expired';
					selectMonth.parentNode.insertBefore(myError,selectMonth); 
				}
				else
				{
					elError.innerHTML = 'Credit Card has Expired';
				}
				isError['Card_Expy_Year'] = true;
			}
		}
	},
	'input.jsValidate' : function(element) {
		isError[element.id] = true;
		if ( ( $('signupOverlay').className == 'signupError' || $('signupOverlay').className == 'signupErrorDB' || $('signupOverlay').className == 'signupErrorCC' ) 
			 && element.previousSibling.className != 'formError' ) isError[element.id] = false;
		element.onblur = function()
		{
			var inputType 	= validateFormatType(element.className);
			var error 		= validateInput(element.value,inputType);
			if ( !error )
			{
				var elParent	= element.parentNode;
				var elError 	= element.previousSibling;
				if ( elError.className == 'formError' ) elParent.removeChild(elError);
				isError[element.id] = false;
			}
			else
			{
				var elError 	= element.previousSibling;
				if ( elError.className != 'formError' ) 
				{
					var myError = document.createElement('strong');
					myError.className = 'formError';
					myError.innerHTML = error;
					element.parentNode.insertBefore(myError,element); 
				}
				else
				{
					elError.innerHTML = error;
				}
				isError[element.id] = true;
			}
		}
	},
	'input#Pass' : function(element) {
		element.onkeyup = function()
		{
			var testPass = testPassword(element.value);
			switch (testPass)
			{
				case 'Very Weak':
					element.style.backgroundColor = '#ffa0a0';
					break;
				case 'Weak':
					element.style.backgroundColor = '#f7f47f';
					break;
				case 'Mediocre':
					element.style.backgroundColor = '#f7f47f';
					break;
				case 'Strong':
					element.style.backgroundColor = '#96f77f';
					break;
				case 'Stronger':
					element.style.backgroundColor = '#96f77f';
					break;
				default:
					element.style.backgroundColor = '#ffffff';
			}
			if ( element.value == '' ) element.style.backgroundColor = '#ffffff';
		}
	},
	'input#PasswordConfirm' : function(element) {
		isError[element.id] = true;
		element.onblur = function()
		{
			var pass  = $('Pass');
			var error = ( element.value != pass.value ) ? 'Passwords do not match' : false;
			if ( !error )
			{
				var elParent	= element.parentNode;
				var elError 	= element.previousSibling;
				if ( elError.className == 'formError' ) elParent.removeChild(elError);
				isError[element.id] = false;
			}
			else
			{
				var elError 	= element.previousSibling;
				if ( elError.className != 'formError' ) 
				{
					var myError = document.createElement('strong');
					myError.className = 'formError';
					myError.innerHTML = error;
					element.parentNode.insertBefore(myError,element);
				}
				else
				{
					elError.innerHTML = error;
				}
				isError[element.id] = true;
			}
		}
	}
};
	
Behaviour.register(moorules);

function validateFormatType(clnm) {
	if ( clnm.match(/validateEmail/i) != null ) 	return 'email';
	if ( clnm.match(/validateUsername/i) != null ) 	return 'username';
	if ( clnm.match(/validatePassword/i) != null ) 	return 'password';
	if ( clnm.match(/validateBlank/i) != null ) 	return 'blank';
	if ( clnm.match(/validateZip/i) != null ) 		return 'zip';
	if ( clnm.match(/validateCCNumber/i) != null ) 	return 'creditcard';
	if ( clnm.match(/validateCVVNumber/i) != null ) return 'cvv';
	return false;
}

function validateInput(val,type) {
	// Check if left blank first
	var trimVal = val.replace(/^\s+|\s+$/g,"");
	if ( val == null || val.length == 0 || trimVal == '' ) return 'Required Field';
	// Check specific type
	switch (type)
	{
		case 'blank':
			if ( val == null || val.length == 0 || trimVal == '' ) return 'Required Field';
			break;
		case 'email':
			if ( !/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(val) ) return 'Email Address Invalid';
			break;
		case 'username':
			if ( /\W/.test(val) || val.length > 14 ) return 'Invalid Username';
			var url = '/inc/Ajax/Signup.ajax.php';
			var pars = 'action=checkUsername&value='+val;
			var myAjax = new Ajax(url+'?'+pars, 
							{
								method: 'get', 
								onComplete: function(responseText) {
									if ( !responseText )
									{
										var elParent	= $('User').parentNode;
										var elError 	= $('User').previousSibling;
										if ( elError.className == 'formError' ) elParent.removeChild(elError);
									}
									else
									{
										var elError 	= $('User').previousSibling;
										if ( elError.className != 'formError' ) 
										{
											var myError = document.createElement('strong');
											myError.className = 'formError';
											myError.innerHTML = responseText;
											$('User').parentNode.insertBefore(myError,$('User'));
										}
										else
										{
											elError.innerHTML = responseText;
										}
									}
								}
						 	}).request();
			break;
		case 'password':
			if ( /\s/.test(val) || val.length < 6 ) return 'Invalid Password';
			break;
		case 'zip':
			if ( !/^\d+$/.test(val) ) return 'Numbers Only';
			break;
		case 'creditcard':
			var type = cardType();
			if ( !/^\d+$/.test(val) ) return 'Numbers Only';
			switch (type)
			{
				case 'AMEX':
					if ( !/([34|37]{2})(\d{13})$/.test(val) ) return 'Invalid '+type+' Number';
					break;
				case 'VISA':
					if ( !/([4]{1})(\d{12,15})$/.test(val) ) return 'Invalid '+type+' Number';
					break;
				case 'MC':
					if ( !/([5]{1})(\d{15})$/.test(val) ) return 'Invalid '+type+' Number';
					break;
				case 'DISCOVER':
					if ( !/([6011]{4})(\d{12})$/.test(val) ) return 'Invalid '+type+' Number';
					break;
				default:
					return type+' is an invalid card';
					break;
			}

			if ( !/^\d+$/.test(val) ) return 'Numbers Only';
			break;
		case 'cvv':
			var type = cardType();
			if ( !/^\d+$/.test(val) ) return 'Numbers Only';
			switch (type)
			{
				case 'AMEX':
					if ( !/^\d{4}$/.test(val) ) return 'AMEX CVV is 4 digits';
					break;
				default:
					if ( !/^\d{3}$/.test(val) ) return type+' CVV is 3 digits';
					break;
			}
			break;

	}
	return false;
}

function cardType() {
	var radioLen = $('signup').Card.length;
	var radioVal = false;
	for (i=0;i<radioLen;i++)
	{
		var thisRadio = $('signup').Card[i];
		if ( thisRadio.checked ) radioVal = thisRadio.value;
	}
	return radioVal;
}

function processTimer(sec) {
	// if process running normally
	if (theTime != -1) {
		// loop if process time still under 3 seconds
		if (theTime < sec) {
			theTime++;
			$('Name_First').value = theTime;
			var timerTimeout = window.setTimeout('processTimer('+sec+')', 1000);
		} else {
			// timed out, process taken 3 seconds already
			theTime = 0;
			return false;
		}
	} else {
		theTime = -1;
		return true;
	}
}