// JavaScript Document

//unhides or creates objects based on tagname and counter
function unhide(tagname,counter)
{
         var identifier="";

         //cycle through objects that need to be hidden
         for (j=0;j<tagname.length;j++)
         {
           //for each object, found
           for (i=1;i<=counter;i++)
           {
             identifier=new String(tagname[j] + i);
             //show obj
             document.getElementById(identifier).style.visibility="visible";
           }
         }
}

//changes colour as you rollover mouse
function swapBGColor(object,color)
{
	if (object)
	{
		object.style.backgroundColor=color;
	}
}
//checks form for errors before submitting
function updateForm(formName)
{
	//check all information in form has been entered
	for (i=0;i<document.forms[formName].length;i++)
	{
		field=document.forms[formName][i].value;
		if ((field == " ") || (field == ""))
		{
			//set focus on field which is empty
			//document.forms[formName][i].focus();
			//exit function as form is not complete
			document.submitForm=false;
			return document.submitForm;
		}
	}
	//process form as information has been entered
	document.forms[formName].submit();
}

//checks names entered in forms
function validateName(getObj,strForm)
{
	//get value entered by user
	var strValue = getObj.value;
	//get name of object in form
	var strName = getObj.name;
	//check that value entered by user adheres to validation checks
	strValue = strValue.toUpperCase();
	for (i=0;i<strValue.length;i++)
	{
		//check characters in string against valid text
		if ((strValue.charCodeAt(i) > 65) && (strValue.charCodeAt(i) < 90))	{}
		else if ((strValue.charCodeAt(i) == 32) || (strValue.charCodeAt(i) == 39)) {}
		else if ((strValue.charCodeAt(i) > 45) && (strValue.charCodeAt(i) < 46)) {}
		//display error if validation not met
		else
		{
			document.forms[strForm][strName].focus();
			alert("Please input a valid name!");
			return false;
		}
	}
}
//checks email address entered in forms
function validateEmail(getObj,strForm)
{
	//get value entered by user
	var strValue = getObj.value;
	//get name of object in form
	var strName = getObj.name;
	//check that value entered by user adheres to validation checks
	if ((strValue.indexOf("@")==-1) || (strValue.indexOf(".") == -1))
	{
		//notify user that information entered has not been accepted
		alert("Please input a valid email address!");
		document.forms[strForm][strName].focus();
	}
}
//checks numbers entered in forms
function validateNumber(getObj,strForm)
{
	//get value entered by user
	var strValue = getObj.value;
	//get name of object in form
	var strName = getObj.name;
	//check that value entered by user adheres to validation checks
	if (isNaN(strValue))
	{
			document.forms[strForm][strName].focus();
			alert("Please input a valid number!");
			return false;
	}
	
	//if (strName == "yourCARDNO") { validateCreditCard(document.forms[strForm]['cardType'].value, strForm, strName);}
}
//checks basic credit card details
function validateCreditCard(strForm,strName)
{
	//get number of digits in card number
	if  ((document.forms[strForm]["cardType"]) && (document.forms[strForm][strName]))
	{
		cardType=document.forms[strForm]["cardType"];
		getCard=document.forms[strForm][strName].value;
		checkLength=getCard.length;
	}
	else
	{
		alert("Please enter a valid Card Number Or Payment Method");
		return document.submitForm = false;
	}
	
	//check if card number valid - lengthwise
	switch( cardType ) 
	{
    	case 'amex':
			//check card length & luhn check
			if((checkLength != 15 ) || (!LuhnCheck(getCard)))
			{
            	alert("Please enter a valid American Express Card number.");
				document.forms[strForm][strName].focus();
				return document.submitForm = false;
            }
        case 'mastercard':
			//check card length & luhn algorithm check
			if ((checkLength != 16 )  || (!LuhnCheck(getCard)))
			{
            	alert("Please enter a valid MasterCard number.");
				document.forms[strForm][strName].focus();
				return document.submitForm = false;
            }
		case 'visa':
			//check card length & luhn algorithm check
			if((checkLength != 16 && checkLength != 13 ) || (!LuhnCheck(getCard)))
			{
            	alert("Please enter a valid Visa Card number.");
				document.forms[strForm][strName].focus();
				return document.submitForm = false;
            }
		case 'solo':
			//check card length & luhn algorithm check
			if((checkLength != 16 ) || (!LuhnCheck(getCard)))
			{
            	alert("Please enter a valid SOLO number.");
				document.forms[strForm][strName].focus();
				return document.submitForm = false;
            }
		case 'switch':
			//check card length & luhn algorithm check
			if((checkLength != 16 ) || (!LuhnCheck(getCard)))
			{
            	alert("Please enter a valid Switch number.");
				document.forms[strForm][strName].focus();
				return document.submitForm = false;
            }
		default:
			//if no card type found, then user fucked up form
			return document.submitForm = false;
	}

	//process form if card has been accepted
	return document.submitForm = true;
}
//LuhnCheck is a JavaBean which checks for validity of a credit card number using the Luhn algorithm (MOD10)
function LuhnCheck(str) 
{
	//set starting result to true before card is checked using luhn mod method
	var result = true;
	
	//declare variables used in checking card
	var sum = 0; 
	var mul = 1; 
	var strLen = str.length;
	  
	//checks in digit in card number using luhn mod check
	for (i = 0; i < strLen; i++) 
	{
		//extracts digit from right hand side of card no
		var digit = str.substring(strLen-i-1,strLen-i);
		//makes digit multiple of 10
		var tproduct = parseInt(digit ,10)*mul;
		
		//add all digits to sum variable, which is mod after loop
		if (tproduct >= 10)	{ sum += (tproduct % 10) + 1;} else { sum += tproduct;}
		
		//sets the multipler to 1 or 0
		if (mul == 1) { mul++; } else {mul--;}
	}
	//if sum does not modulus to 0, then card is not real
	if ((sum % 10) != 0) { result = false; }
	
	return result;

}

//sends form using ajax
function ajaxForms(formname, target, url, type, parameters)
{
	//declare vars used in function
	var buildstr="";
	var form;
	var field;
	var j;
	var i;
	var myAjax;
	
	if (!parameters) {var parameters="";}
	
	//set number of items to add in queue for making ajax request
	if (target.length)
	{
		//AjaxQueue.setBatchSize(target.length);
		//cycle through each section to update
		for (j=0;j<target.length;j++)
		{
			//reset vars used in loop
			var buildstr="";
			var form="";
			var field="";
			
			//reads id of every input box in form
			form=document.forms[formname[j]];
			//checks whether form exists in page
			if (form)
			{
				for (i=0;i<form.length;i++)
				{
					field=form.elements[i];
					switch(field.type)
					{
						case "select-one" :
							buildstr+=field.name + "=" + escape(field.options[field.selectedIndex].value) + "&";
							break;
						case "checkbox":
						case "radio":
							buildstr+=field.name + "=" + escape(field.checked) + "&";
							break;
						default:
							buildstr+=field.name + "=" + escape(field.value) + "&";
							break;
					}
				}
				buildstr=buildstr.substr(buildstr,(buildstr.length-1))+parameters;
				//sends form using ajax handler
				myAjax= new Ajax.Updater(target[j], url[j], {method: 'post', parameters: buildstr});
				//AjaxQueue.push(url[j], {method: type, parameters: buildstr}, target[j]);
				//stops form sending data twice
				//form.onSubmit=false;
			}
			else
			{
				//submit ajax request
				myAjax= new Ajax.Updater(target[j],url[j],{evalScripts:true, asynchronous:true});
				//AjaxQueue.push(url[j], {evalScripts:true, asynchronous:true}, target[j]);
			}
			//debugger
			//alert("index:"+j+"\n"+"url:"+url[j]+"\n"+"elementID:"+target[j]);
		}
	}
	return false;
}
//updates section(s) on page
function updateSections(target, url, type, parameters)
{
	//cycle through each section to update
	for (i=0;i<target.length;i++)
	{
		var myAjax= new Ajax.Updater(target[i],url[i],{evalScripts:true, asynchronous:true});
	}
}
//obtain serialised list containing order of list items
function getSortableList(formname,target,url,type,parameters)
{
	document.getElementById('sortableList').value=Sortable.serialize(formname);
	alert(document.getElementById('sortableList').value);
	return false;
	//sendForm=ajaxForms(formname, target, url, type, parameters);
	//return sendForm;
}
//resizes elements in a form to fit actual content
function formResizer()
{
	highest_width=0;
	
	
	for (i=0;i<form.length;i++)
	{
		field=form.elements[i];
		switch(field.type)
		{
			case "textarea":
				field.style.height=field.scrollHeight;
				break;
			case "checkbox":
			case "radio":
				break;
			case "select-one":
			case "text":
			default:
				field.style.width=field.scrollWidth;
				break;	
		}
	}
	return true;
}
