//Global Variables
var interlockedWith = "";


//utility function that returns true if a string contains only whitespace characters or is a null string
function isBlank(s) {
  var i, c;
  
  if ((s == null) || (s == "")) {
    return true;
  }   
 
  for (i = 0; i < s.length; i++) {
    c = s.charAt(i);
    if ((c != ' ') && (c != '\t') && (c != '\n') && (c != '\r') && (c != '')) {
      return false;
    }
  }
  return true;
}

//utility function that returns true if a string is one or more numeric characters
function isNumeric(s) {
  var numericCheck = /[^\d\.\,]/
  if (numericCheck.test(s)) {
    return false;
  }
  return true;
}

//utility function that returns true if a string is one or more alphabetic characters or -
function isAlphabetic(s) {
  var alphabeticCheck = /[^a-zA-Z\- ]/
  if (alphabeticCheck.test(s)) {
    return false;
  }
  return true;
}

//utility function that returns true if a string is one or more alphabetic or numeric or _ - for eg: Zip/Post Codes
function isAlphaMeric(s) {
  var alphaMericCheck = /[^\w\-\, ]/
  if (alphaMericCheck.test(s)) {
    return false;
  }
  return true;
}

//utility function that returns true if a string is one or more alphanumerics or punctuation marks or whitespace
function isAlphaNumeric(s) {
  var alphanumericCheck = /[^\w\.\,\:\;\\\/\-\(\) \t\n\r\O\'\"\u2013\&\@\_]/
  if (alphanumericCheck.test(s)) {
    return false;
  }
  return true;
}

//utility function that returns true if a string is six or more alphabetic or numeric characters but no special characters except _ for eg: passwords
function isPassword(s) {
  var passwordCheck = /^[\w\-\!\"\#\$\%\&\'\(\)\*\,\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~]{6,}$/
  if (!passwordCheck.test(s)) {
    return false;
  }
  return true;
}

/*
 * utility function that returns true if a name begins with a letter, ends with a letter,
 * no less than two letters long and are allowed hyphens
 */
function isName(s) {
  var nameCheck = /^[a-zA-Z][a-zA-Z\-\' ]*[a-zA-Z]$/;
  if (!nameCheck.test(s)) {
    return false;
  }
  return true;
}

/* utility function for testing phone and fax numbers which can have a '+', '(' or 0-9 at 
 * the beginning,followed by zero or more numbers or ')', followed by one or more numbers,
 * followed by a '-' or not, followed by zero or more numbers, followed by a '-' or not, 
 * and ending with at least three numbers to make no less than five in total
*/
function isPhoneNumber(s) {    
  var phoneCheck = /^[\+\(0-9][0-9]*\)?[ ]?[0-9]+[- ]?[0-9]*[- ]?[0-9]{3,}$/;
  if (!phoneCheck.test(s)) {
    return false;
  }
  return true;
}

/* utility function for testing email which must be at least one letter '.' or '-', 
 * followed by '@', followed by least one letter '.' or '-', followed by '.' followed by 
 * 2-4 letters
 */
function isEmail(s) {
  var emailCheck = /^[0-9a-zA-Z_\.-]+@[0-9a-zA-Z_\.-]+\.[a-zA-Z]{2,4}$/;
  if (!emailCheck.test(s)) {
    return false;
  }
  return true;
}

/* utility function for testing URLs
 */
function isURL(s) {
//	var urlCheck = /^((http|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+\.[^#?\s]+)(#[\w\-]+)?$/i;
	var urlCheck = /^http(s)?:\/\/[a-z0-9-]+(\.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i;
	if (urlCheck.test(s)) {
		return true;
	}
	else {
		var pathCheck = /(.*)[\/\\]([^\/\\]+\.\w+)$/i;
		if (pathCheck.test(s)) {
			return true;
		}		
	}
    return false;
}

function isCkeditor(s) {
	return true;
}

//Table of error and information messages for display
var messageTable = new Array();
messageTable[0] 	= "";
messageTable[1] 	= "Field required for this function.";
messageTable[2] 	= "Field may not be edited - value reset.";
messageTable[3] 	= "Fields are interlocked - both required.";
messageTable[4] 	= "Field must be numeric.";
messageTable[5] 	= "Field must be alphameric.";
messageTable[6] 	= "Field must be alphanumeric.";
messageTable[7] 	= "Field must be alphabetic.";
messageTable[8] 	= "Field must be at least 5 digits begin with 2 digits end with 3 digits contain only 0-9 + ( ) space or -.";
messageTable[9] 	= "Field must be a valid name. Only a-z A-Z ' space and - allowed.";
messageTable[10] 	= "Password and Re-typed password did not match.";
messageTable[11] 	= "Selection required for this function.";
messageTable[12] 	= "Field is not a valid URL or filepath.";
messageTable[13] 	= "File not found at the specified location.";
messageTable[14] 	= "Short description required.";
messageTable[15] 	= "Short description was too long.  Truncated to 5000 characters, which is the maximum";
messageTable[16] 	= "Long description required.";
messageTable[17] 	= "Does not appear to be a valid phone number.";
messageTable[18] 	= "Email and Re-typed Email did not match.";
messageTable[19] 	= "Must be 6 or more letters, numbers or punctuation characters";
messageTable[20] 	= "Invalid Selection";

/*
 * Arrays of forms and their fields.  The subArrays contain:
 * required(true/false), error message id, editable(true/false), error message id, field format(format name/false), error message id, interlocked(field name/false), error message id
 */

//											required/add	required/edit	editable	format					interlocked		extra validation
var checkoutReview = new Array();
checkoutReview['notes']			= new Array(false,	1,		false,	1,		true,	2, 	'isAlphaNumeric',	6, 	false,		3, 	false, 0);
checkoutReview['checkTerms']	= new Array(true,	1,		true,	1,		true,	2, 	'isAlphaNumeric',	6,	false,		3, 	false, 0);

/*
 * item fields
 */
var itemInputForm = new Array();
itemInputForm['title']					= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['subtitle']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['short_description']		= new Array(true,	1,		true, 	1, 		true, 	2,	'isCkeditor',		6, 	false,						3, 	false,			  0);
itemInputForm['long_description']		= new Array(true,	1,		true, 	1, 		true, 	2,	'isCkeditor',		6, 	false,						3, 	false,			  0);
itemInputForm['acronym']				= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['document_url']			= new Array(false,	1,		false, 	1, 		true, 	2,	'isURL',			12,	'document_url_alt_text',	3, 	'document_size', 13);
itemInputForm['document_url_alt_text']	= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	'document_url',				3, 	false,			  0);
itemInputForm['image_url']				= new Array(false,	1,		false, 	1, 		true, 	2,	'isURL',			12,	'image_url_alt_text',		3, 	'image_size',	 13);
itemInputForm['image_url_alt_text']		= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	'image_url',				3, 	false,			  0);	
itemInputForm['internal']				= new Array(true,	11,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['sticky']					= new Array(true,	11,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['item_start']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['item_end']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['highlight_start']		= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['highlight_end']			= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['validated']				= new Array(false,	11,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['hardcopy_available']		= new Array(true,	11,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
itemInputForm['e_copy_available']		= new Array(true,	11,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);

var JoinFormStep1 = new Array();
JoinFormStep1['username']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaNumeric',	7, 	false,						3, 	false,			  0);
JoinFormStep1['password']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isPassword',		19, 'confirm_password',			3, 	'password',		  10);
JoinFormStep1['confirm_password']		= new Array(true,	1,		true, 	1, 		true, 	2,	'isPassword',		19, 'password',					3, 	false,			  0);
JoinFormStep1['email']					= new Array(true,	1,		true, 	1, 		true, 	2,	'isEmail',			7, 	'confirm_email',			3, 	'email',		  18);
JoinFormStep1['confirm_email']			= new Array(true,	1,		true, 	1, 		true, 	2,	'isEmail',			7, 	'email',					3, 	false,			  0);

var JoinFormStep4 = new Array();
JoinFormStep4['first_name']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isName',			7, 	false,						3, 	false,			  0);
JoinFormStep4['last_name']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isName',			7, 	false,						3, 	false,			  0);
JoinFormStep4['addressline1']			= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
JoinFormStep4['addressline2']			= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
JoinFormStep4['addressline3']			= new Array(false,	1,		false, 	1, 		true, 	2,	'isAlphaNumeric',	6, 	false,						3, 	false,			  0);
JoinFormStep4['postcode']				= new Array(true,	1,		true, 	1, 		true, 	2,	'isAlphaMeric',		5, 	false,						3, 	false,			  0);
JoinFormStep4['home_number']			= new Array(true,	1,		true, 	1, 		true, 	2,	'isPhoneNumber',	17,	false,						3, 	false,			  0);
JoinFormStep4['home_mobile']			= new Array(false,	1,		false, 	1, 		true, 	2,	'isPhoneNumber',	17,	false,						3, 	false,			  0);
JoinFormStep4['work_number']			= new Array(false,	1,		false, 	1, 		true, 	2,	'isPhoneNumber',	17,	false,						3, 	false,			  0);


function validateForm(formElement) {
	if (document.forms[formElement.name]) {
		var form = document.forms[formElement.name];
		for (var i = 0; i < form.elements.length; i++) {
			if (eval(form.name)[form.elements[i].name]) {
				if (validateFormCycle(form, form.elements[i]) == false) {
					return false;
				}
			}
		}
	}
	else {
		var form = formElement.form;
		validateFormCycle(form, formElement);
	}
}	
/*
 * 
 *cycle through all the input fields for this form and check if they are required, editable, of the correct format and if they are interlocked.
 *if they pass all checks the form is submitted, if not the fields(s) in question are highlighted one by one and an eror message is provided.
 *Generic function goes through the form.elements array and selects elements with the name tag (as they are the ones which will be POSTed)
 *first create the values for any composite fields
 */
function validateFormCycle(form, formElement) {
	if (formElement.name) {
		if (formElement.type == "file") {
			return true;
		}			
		else if (formElement.type == "text") {
			formElementName = formElement.name;
			formElementValue = formElement.value;
			if (!validateFormElement(form, formElementName, formElementValue)) {
				return false;
			}
		}
		else if (formElement.type == "textarea") {
			formElementName = formElement.name;
			if (formElementName == 'short_description') {
				var iframeArray = document.getElementsByTagName('iframe');
				var ckeditorIframeContent = iframeArray[0].contentDocument;
				var ckeditorContent = ckeditorIframeContent.getElementById("ckeditorTextArea").innerHTML;
				ckeditorContent = ckeditorContent.replace(/<br>/g, '');
				ckeditorContent = ckeditorContent.replace(/<br \/>/g, '');					
				ckeditorContent = ckeditorContent.replace(/<p>/g, '');
				ckeditorContent = ckeditorContent.replace(/<\/p>/g, '');
				ckeditorContent = ckeditorContent.replace(/\s/g, '');	
				ckeditorContent = ckeditorContent.replace(/&nbsp;/g, '');
				if (ckeditorContent.length == 0) {
					indicateFormElementInError(iframeArray[0], 14);
					return false;
				}
				else {
					if (ckeditorIframeContent.getElementById("ckeditorTextArea").innerHTML.length > 5000) {
						ckeditorIframeContent.getElementById("ckeditorTextArea").innerHTML = ckeditorIframeContent.getElementById("ckeditorTextArea").innerHTML.substr(0, 5000);
						indicateFormElementInError(iframeArray[0], 15);
						return false;
					}
				}
			}
			else if (formElementName == 'long_description') {
				var iframeArray = document.getElementsByTagName('iframe');
				var ckeditorIframeContent = iframeArray[1].contentDocument;
				var ckeditorContent  = ckeditorIframeContent.getElementById("ckeditorTextArea").innerHTML;
				ckeditorContent = ckeditorContent.replace(/<br>/g, '');
				ckeditorContent = ckeditorContent.replace(/<br \/>/g, '');					
				ckeditorContent = ckeditorContent.replace(/<p>/g, '');
				ckeditorContent = ckeditorContent.replace(/<\/p>/g, '');
				ckeditorContent = ckeditorContent.replace(/\s/g, '');	
				ckeditorContent = ckeditorContent.replace(/&nbsp;/g, '');
				if (ckeditorContent.length == 0) {
					indicateFormElementInError(iframeArray[1], 16);
					return false;
				}
			}			
			else {
				formElementValue = formElement.value;
				if (!validateFormElement(form, formElementName, formElementValue)) {
					return false;
				}
			}
		}
		else if (formElement.type == "password") {
			formElementName = formElement.name;
			formElementValue = formElement.value;
			if (!validateFormElement(form, formElementName, formElementValue)) {
				return false;
			}
		}  				
		else if (formElement.type.indexOf("select") != -1) {
			formElementName = formElement.name;
			if (formElement.selectedIndex == -1) {
				formElementValue = "";
			}
			else {
				formElementValue = formElement.options[formElement.selectedIndex].value;
			}
			if (!validateFormElement(form, formElementName, formElementValue)) {
				return false;
			}	
		} 
		else if (formElement.type == "radio") {
			formElementName = formElement.name;
			for (k = 0; k < form.elements[formElement.name].length; k++) {
				if (form.elements[formElement.name][k].checked) {
					formElementValue = form.elements[formElement.name][k].value;
					break;
				}
				else {
					formElementValue = "";
				}
			}
			if (!validateFormElement(form, formElementName, formElementValue)) {
				return false;
			}
		} 
		else if (formElement.type == "checkbox") {
			formElementName = formElement.name;
			if (formElement.checked) {
				formElementValue = formElement.value;
			}
			else {
				formElementValue = "";
			}					
			if (!validateFormElement(form, formElementName, formElementValue)) {
				return false;
			}
		}
	}
}

//perform the actual validation for the current element as per the array for this form
function validateFormElement(form, formElementName, formElementValue) {
	if (eval(form.name)[formElementName]) {
		for (j = 0; j < eval(form.name)[formElementName].length; j+=2) {
//required for add
			switch (j) {
				case 0:
					if (eval(form.name)[formElementName][j] && isBlank(formElementValue)) {
						indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
						return false;
					}
					break;
//required for edit					
				case 2:
					if (eval(form.name)[formElementName][j] && isBlank(formElementValue)) {
						indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
						return false;
					}
					break;
//editable
				case 4:
					if (!eval(form.name)[formElementName][j] && document.getElementById(formElementName + '_ORIGINAL') && formElementValue != document.getElementById(formElementName + '_ORIGINAL').value) {
						document.getElementById(formElementName).value = document.getElementById(formElementName + '_ORIGINAL').value;
						indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
						return false;
					}
					break;
//format check
				case 6:
					if (!isBlank(formElementValue) && eval(form.name)[formElementName][j] && !(eval(eval(form.name)[formElementName][j])(formElementValue))) {
						indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
						return false;
					}
					break;
//interlocked
				case 8:
					if (eval(form.name)[formElementName][j] !== false) {
						if (document.getElementsByName(formElementName).length > 1) {
							primaryInterlock = !isBlank(document.getElementById(eval(form.name)[formElementName][j]).value);
							possibleInterlocksArray = document.getElementsByName(formElementName);
						}
						else {
							primaryInterlock = !isBlank(document.getElementById(formElementName).value);
							possibleInterlocksArray = document.getElementsByName(eval(form.name)[formElementName][j]);
						}
						var blankFieldCount = 0;
						for (k = 0; k < possibleInterlocksArray.length; k++) {
							possibleInterlock = !isBlank(possibleInterlocksArray[k].value);
							if (primaryInterlock == true && possibleInterlock == true) {
								blankFieldCount = possibleInterlocksArray.length
								break;
							}
							if (primaryInterlock == false && possibleInterlock == false) {
								blankFieldCount++
							}
						}
						if (blankFieldCount < possibleInterlocksArray.length) {
							interlockedWith = formElementName;
							indicateFormElementInError(form[eval(form.name)[formElementName][j]], eval(form.name)[formElementName][j+1]);
							return false;
						}
					}
					break;
//extra validation
				case 10:
					if (eval(form.name)[formElementName][j] !== false) {
						switch (eval(form.name)[formElementName][j]) {
							case 'password':
								if (document.getElementById('password').value != document.getElementById('confirm_password').value) {
									indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
									document.getElementById('password').value = "";
									document.getElementById('confirm_password').value = "";
									return false;
								}
								break;
							case 'email':
								if (document.getElementById('email').value != document.getElementById('confirm_email').value) {
									indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
									document.getElementById('email').value = "";
									document.getElementById('confirm_email').value = "";
									return false;
								}
								break;
							case 'document_size':
								if (isBlank(document.getElementById('document_size').value) && !isBlank(document.getElementById('document_format').value)) {
									indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
									return false;
								}
								break;
							case 'image_size':
								if (isBlank(document.getElementById('image_size').value) && !isBlank(document.getElementById('image_format').value)) {
									indicateFormElementInError(form[formElementName], eval(form.name)[formElementName][j+1]);
									return false;
								}
								break;								
						}
					}
					break
				default:
			}
		}
	}
	if (form[formElementName].style) {
		form[formElementName].style.backgroundColor="rgb(255,255,255)";
	}
	if (eval(form.name)[formElementName][8] !== false && form[eval(form.name)[formElementName][8]].style) {
		form[eval(form.name)[formElementName][8]].style.backgroundColor="rgb(255,255,255)";
	}
	return true;
}

//put out an alert message to the user with what is wrong with the input, highlight and put focus back on the field in question
function indicateFormElementInError(formElement, MessageId) {
	if (formElement[0]) {
		formElement = formElement[0];
	}
	
	formElementXcoord = getElementXCoord(formElement);
	formElementYcoord = getElementYCoord(formElement);

	document.getElementById('messageBox').innerHTML = messageTable[MessageId];	
	document.getElementById('messageBox').style.left = formElementXcoord + 50 + 'px';
	document.getElementById('messageBox').style.top = formElementYcoord + 15 + 'px';
	if (formElement.style) {
		formElement.style.backgroundColor="rgb(255,255,0)";
		
	}
	if (formElement.focus) {
		formElement.focus();
	}
	if (formElement.select) {
		formElement.select();
	}
	
	window.scrollTo(formElementXcoord, formElementYcoord);
	
	if (interlockedWith != "") {
		interlockedWithArray = document.getElementsByName(interlockedWith);
		for (i = 0; i < interlockedWithArray.length; i++) {
			if (interlockedWithArray[i]) {
				interlockedWithArray[i].style.backgroundColor="rgb(255,255,0)";
			}
		}
		interlockedWith = "";
	}
}

function clearAll(currentForm) {
// Generic function goes through the form.elements array and selects elements with the name tag (as they are the ones which will be POSTed) and deletes their values
	var form = currentForm;
// Harvest values for each type of form element
	for (var i = 0; i < form.elements.length; i++) {
		if (formElement.name) {
			if (formElement.type.indexOf("select") != -1) {
				formElement.selectedIndex = -1;
			} 
			else if (formElement.type == "radio" || formElement.type == "checkbox") {
				formElement.checked = false;
			} 
			else if (formElement.name != 'Form_Name' && formElement.name != 'add' && formElement.name != 'edit' && formElement.name != 'delete' && formElement.name != 'clear') {
				formElement.value = '';
			}
		}
	}
}

function hideMessageBox() {
	document.getElementById('messageBox').style.left = -5000 + 'px';
	document.getElementById('messageBox').style.top = -5000 + 'px';
}
