// JavaScript Document

/*
	Exweb Application Form JS
	March 2007
*/

	
	var fieldsetOld = "";
	var fieldsetOldClass = "";
	var noOfAccounts = 1;	
	
	function formInit(){
		var arr_fields = getMultipleElementsByTagName([ 'INPUT', 'SELECT', 'TEXTAREA' ], $('appForm'));	
		for (var i = 0, j = arr_fields.length; i < j; i++) {	
			addEvent(arr_fields[i], 'focus', fieldsetListener, false);				
		}
	}
	addLoadEvent(formInit);

	/*==================================================*/
	function checkMail(str){
		var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		if (filter.test(str))
			return false;
		else
			return true;
	}
	/*==================================================*/
	
	
	//====================================================================
	// Add an account functionality - Duplicates the 'newAccount' fieldset 
	
	function addAccount(){

		var accountFieldset = $('newAccount_1');
		var newAccountFieldset = accountFieldset.cloneNode(true);

		noOfAccounts += 1;

		newAccountFieldset.id = "newAccount_" + noOfAccounts;

		//clear down fields for duplicated account fieldset
		var arr_fields = getMultipleElementsByTagName([ 'INPUT', 'SELECT', 'B' ], newAccountFieldset);
		for (var i = 0, j = arr_fields.length; i < j; i++) {
			currentNode = arr_fields[i].nodeName.toLowerCase();
			if(currentNode == 'input' || currentNode == 'select') {
				arr_fields[i].value = "";
			} else if (currentNode == 'b') {
				arr_fields[i].className = ""; 
			}
		}
		
		//add a remove account link for the new account fieldset
		var arr_paras = newAccountFieldset.getElementsByTagName("P")
		for (var i = 0, j = arr_paras.length; i < j; i++) {
			var arr_anchors = arr_paras[i].getElementsByTagName("A")
			var removeAnchor = arr_anchors[i].cloneNode(true);		
			var newLink = arr_paras[i].appendChild(removeAnchor);
			newLink.setAttribute('id', "removeAccountLink_" + noOfAccounts);	
			newLink.onclick = function(){removeAccount(this); return false;};	
			newLink.innerHTML = "Remove this account";
		}
		
		var container = $('Accounts');
		container.appendChild(newAccountFieldset);

		accountFieldset.className = "";
		$('noOfAccounts').value = noOfAccounts;	
		renameAccountIDs('add');
	}
	/*==================================================*/
	
	
	//====================================================================
	// Remove an account functionality - removes a selected fieldset	
	
	function removeAccount(obj){
		var target = ascendDOM(obj, 'fieldset');
		if (target == null) {
			return;
		} else {
			noOfAccounts -= 1;
			var container = $('Accounts');
			container.removeChild(target);	
			$('noOfAccounts').value = noOfAccounts;
			renameAccountIDs('remove');
		}
	}
	/*==================================================*/
	
	
	//====================================================================
	// Rename accounts - when a user adds or deletes an account fieldset this function ensures
	// that the numbering of ids is correct so that we can loop through them when creating the email.

	function renameAccountIDs(callType) {		
		
		var currentAccount = 1;
		var arr_fieldsets = $('Accounts').getElementsByTagName("FIELDSET");
		for (var i = 0, j = arr_fieldsets.length; i < j; i++) {
			
			if (!($('newAccount_' + currentAccount))) {
				currentAccount ++;	
			}
			
			var currAccountFieldset = $('newAccount_' + (currentAccount));				
			
			var arr_legends = currAccountFieldset.getElementsByTagName("LEGEND");
			for (var k = 0, l = arr_legends.length; k < l; k++) {
				arr_legends[k].innerHTML = 'Account details ' + (i+1);
			}
			
			var arr_labels = currAccountFieldset.getElementsByTagName("LABEL");
			for (var k = 0, l = arr_labels.length; k < l; k++) {
				if (arr_labels[k].getAttribute("for")) {
					var currentFieldSplit = arr_labels[k].getAttribute("for").split("_");
					arr_labels[k].setAttribute('for', currentFieldSplit[0] + "_" + (i+1));
				} else { // IE fix
					var currentFieldSplit = arr_labels[k].getAttribute("htmlFor").split("_");
					arr_labels[k].setAttribute('htmlFor', currentFieldSplit[0] + "_" + (i+1));
				}
			}
			
			var arr_fields = getMultipleElementsByTagName([ 'INPUT', 'SELECT', 'B', 'P', 'A' ], currAccountFieldset);
			for (var k = 0, l = arr_fields.length; k < l; k++) {
				if(arr_fields[k].id) {
					var currentFieldSplit = arr_fields[k].getAttribute("id").split("_");					
					arr_fields[k].setAttribute('id', currentFieldSplit[0] + "_" + (i+1));
				}
				currentNode = arr_fields[k].nodeName.toLowerCase();
				if(currentNode == 'input' || currentNode == 'select') {
					var currentFieldSplit = arr_fields[k].getAttribute("id").split("_");					
					arr_fields[k].setAttribute('name', currentFieldSplit[0] + "_" + (i+1));
				} 
				addEvent(arr_fields[k], 'focus', fieldsetListener, false);		
			}
			currentAccount ++;
			
			if (callType == 'remove') {
				currAccountFieldset.id = "newAccount_" + (i+1);
			}
		}
		focusOnFirstFieldIn($('newAccount_' + (arr_fieldsets.length)).getAttribute('id'));
	}

	//====================================================================
	// Submit From functionality
	// - Checks for mandatory fields
	// - Checks for valid FSA numbers
	
	function submitAppForm() {	
		var doSubmit = true;
		
		var arr_fields = getMultipleElementsByTagName([ 'INPUT', 'TEXTAREA' ], $('appForm'));	
		var errorField = "";
		
		for (var i = 0, j = arr_fields.length; i < j; i++) {
			
			var cond1 = ((' ' + arr_fields[i] . className + ' ').indexOf(' mandatory ') != -1); // field is mandatory
			var cond2 = ((' ' + arr_fields[i] . className + ' ').indexOf(' collapse ') == -1); // field is NOT hidden
			var cond3 = ((' ' + arr_fields[i] . parentNode . className + ' ').indexOf(' collapse ') == -1); // parent is NOT hidden
			var condMandatory = (cond1 && cond2 && cond3);
					
			var cond4 = ((' ' + arr_fields[i] . className + ' ').indexOf(' 6digit ') != -1) //field requires a 6 digit number
			if(cond4){
				arr_fields[i].value = parseInt(arr_fields[i].value);
				//IE sets field value to "NaN" on an isNaN result...
				if(arr_fields[i].value == "NaN")
					arr_fields[i].value = "";
			}
			
			var cond5 = ( isNaN(arr_fields[i].value) )//field is not numerical
			var cond6 = ( arr_fields[i].value.length != 6 ); // field is not 6 characters long
			var cond6Digits = ( cond4 && (cond2 && cond3) && (cond5 || cond6 ) ); // field is not hidden, should be int6 is not int6

			var condEmailField = (arr_fields[i].name.toLowerCase().indexOf("email") != -1); // field is an email field
			
			// If the field is mandatory and not hidden OR is an invalid FSA Number OR is a mandatory email field
			if ( condMandatory || cond6Digits || (condMandatory && condEmailField) ){
				
				var currentField = $(arr_fields[i].id);
				
				//work out current error field
				var currentFieldSplit = arr_fields[i].id.split("_");
				if (currentFieldSplit.length == 1) {
					var currentError = $(arr_fields[i].id + 'Error');
				} else {
					var currentError = $(currentFieldSplit[0] + 'Error_' + currentFieldSplit[1]);
				}
								
				// Check for empties - switch based on input type
				var errorCond = false;
				switch (arr_fields[i].type.toLowerCase()){
					case "text":
					case "textarea":
						errorCond = (arr_fields[i].value == "");
						break;
					case "checkbox":
						errorCond = (arr_fields[i].checked != true);
						break;
				}
				
				// Check for 6 digit failures
				if(cond6Digits){
					errorCond = true;
				}
				
				// Check to see if the email field is valid
				if(condEmailField && condMandatory){
					if(checkMail(arr_fields[i].value)){
						errorCond = true;
					}
				}
				
				//Check to see if a robot has filled in the robot hidden field
				if ((arr_fields[i].id == "robotStop") && (arr_fields[i].value != "")){
					errorCond = true;
				}
				
				if(errorCond){
					doSubmit = false;
					if(currentError)
						currentError.className = "showError";
					if(errorField == "")
						errorField = currentField;
				}else{
					if(currentError)
						currentError.className = "";			
				}
			}
			

		}
		
		// Focus on the '1st' error field
		if(errorField != "")
			errorField.focus();

		return doSubmit;
	}
	
	//====================================================================	
	
	//====================================================================
	// Functions to highlight the current fieldset

	function addEvent(obj, evType, fn, useCapture) {
		if (obj.addEventListener) {
			obj.addEventListener(evType, fn, useCapture);
			return true;
		} else if (obj.attachEvent) {
			var r = obj.attachEvent('on' + evType, fn);
			return r;
		} else {
			obj['on' + evType] = fn;
		}
	}

	function ascendDOM(e, target) {
		while (e.nodeName.toLowerCase() != target && e.nodeName.toLowerCase() != 'html') {
			e = e.parentNode;
		}
		return (e.nodeName.toLowerCase() == 'html') ? null : e;
	}
	
	function fieldsetListener(e) {
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target) { return; }

		target = ascendDOM(target, 'fieldset');
		if (target == null) {	return;	}
		
		if (target != fieldsetOld) {
				var oldClass = target.className;
				if(oldClass.length == 0){
					target.className = "selected";
				}else{
					target.className += " selected";
				}
				if(fieldsetOldClass.length == 0){
					fieldsetOld.className = fieldsetOldClass;
				}
		
				fieldsetOld = target;
				fieldsetOldClass = oldClass;
		}
	
		fieldsetOld = target;
	}
	//====================================================================	
	
	//====================================================================
	function getMultipleElementsByTagName(tagNames, parentNode) {
		var out = new Array();
		for( var i = 0, j = tagNames.length; i < j; i++ ) {
			elementsFound =	parentNode.getElementsByTagName(tagNames[i]);
			for (var k = 0, l = elementsFound.length; k < l; k++)
				out.push( elementsFound.item(k) );
		}
		return out;
	}
	//====================================================================		
	
	function toggleObj(id){
		if(document.getElementById(id).className == 'collapse'){
			showMe(id);
		}else{
			hideMe(id);
		}
	}
	
	//====================================================================
	
	function blankMe(id){
		if(document.getElementById(id).value == 'Please specify...'){
			document.getElementById(id).value = '';
		}
	}
	
	//====================================================================
