var isIE = (document.all ? true : false);
var isDOM = (document.getElementById ? true : false);

var FIELD_DELIMITER = '|';
var CONTEST_FORM_NAME = 'contestForm';

// Function to trimming spaces on the right and left of the string
String.prototype.trim = function()
{
	var regEx = "(^\\s*)|(\\s*$)";
	var re = new RegExp(regEx,"ig");
    return this.replace(re, "");
}

// Function for validating whether a value represents a valid date
function validateDate (strDate) 
{
	var parsedDate = strDate.split ("/");
	if (parsedDate.length != 3) return false;
	var day, month, year;
	month = parsedDate[0]-1;
	day = parsedDate[1];
	year = parsedDate[2];
	
	var objDate = new Date (strDate);
	if (month != objDate.getMonth()) return false;
	if (day != objDate.getDate()) return false;
	if (year != objDate.getFullYear()) return false;

	return true;
} 

//************************************************************
//***      MAIN FUNCTION FOR PROCESSING CONTEST DATA       ***
//************************************************************
function validateAndSubmitForm()
{
	var errMsg = '';
	// 1. validate entry in all required fields.
	errMsg += validateRequiredFields();
	
	// 2. validate that E-mail address is in correct format
	errMsg += validateEmailAddress();

	// 3. validate that contest entry meets minimum age requirements
	errMsg += validateMinimumAge();
			
	// display error message	
	var errDiv = document.getElementById('validation');
	if (errDiv != null)
	{
		errDiv.innerHTML = errMsg;
	}

// alert ( 'Inside validateAndSubmitForm() \nError Message: ' + errMsg );
	
	// if Contest entry has passed all validation then submit it.
	if (errMsg.length == 0)
	{
		// create hidden fields that will store essential information
		createFields();
		// post form for server-side processing
		var frmRef = document.forms[CONTEST_FORM_NAME];
		frmRef.action = 'SendForm.aspx';
		frmRef.submit();
	}
}


// Function creates strings that contain delimited field names within each context area 
// (i.e. 'contest', 'vendor', 'newsletter', etc.).  Each delimited string is stored in a 
// dynamically constructed <INPUT/> element.
function createFields()
{
	var contestFields = '';
	var vendorFields = '';
	var newsletterFields = '';
	var newsletterFormatFields = '';
	var prospectFields = '';
	var invalidFields = '';
	var elemRef;
	var attrRef;
	var frmRef = document.forms[CONTEST_FORM_NAME];

	for (var i=0; i<frmRef.elements.length; i++)
	{
		elemRef = frmRef.elements[i];
		attrRef = elemRef.getAttribute('elementtype');
		if (attrRef != null)
		{
			// append field names within context area
			switch (attrRef.toLowerCase())
			{
				case 'contest':
					contestFields += appendFieldId(contestFields, elemRef);
					break;
				case 'vendor':
					vendorFields += appendFieldId(vendorFields, elemRef);
					break;
				case 'newsletter':
					newsletterFields += appendFieldId(newsletterFields, elemRef);
					break;
				case 'newsletterformat':
					newsletterFormatFields += appendFieldId(newsletterFormatFields, elemRef);
					break;
				case 'prospect':
					prospectFields += appendFieldId(prospectFields, elemRef);
					break;
				default:
					invalidFields += (invalidFields.length == 0 ? '' : ' ') + attrRef + ' in element' + elemRef.id + '\n';
			}
		}
	}

	// Add hidden fields that contain the list of category specific fields	
	addHiddenField('contest_fields', contestFields);	
	addHiddenField('vendor_fields', vendorFields);	
	addHiddenField('newsletter_fields', newsletterFields);	
	addHiddenField('newsletterformat_fields', newsletterFormatFields);	
	addHiddenField('prospect_fields', prospectFields);	

// if (invalidFields.length > 0)
// {
// 	alert('INVALID FIELDS: ' + invalidFields);
// }

}

// Implement generic routine for adding a hidden field to the form
function addHiddenField(fldId, fldVal)
{
		var input = document.createElement("input");
		var frmRef = document.forms[CONTEST_FORM_NAME];

		input.setAttribute("type", "hidden");
		input.setAttribute("id", fldId);
		input.setAttribute("name", fldId);
		frmRef.appendChild(input);
		input.value = fldVal;
}

// Implement generic concatenation of element IDs within particular category/context
function appendFieldId(str, ctrl)
{
	var idValue;
	var inputType = ctrl.getAttribute('type');
	// For radio group use NAME as control identifier. For other controls use ID
	if (inputType != null && inputType == 'radio')
	{
		idValue = ctrl.name;
	}
	else
	{
		idValue = ctrl.id;
	}
		
	// Do not control identifier twice to the same string
	if (str.indexOf(idValue) == -1)
	{
		return (str.length == 0 ? '' : FIELD_DELIMITER) + idValue;
	}
	else
	{
		return '';
	}
}


// Validate that e-mail addres is in correct format
function validateEmailAddress()
{
	var msg = '';
	var emailCtrl;
	var emailVal;
	
	emailCtrl = document.getElementById('Email');
	if (emailCtrl != null)
	{
		// Trim e-mail address
		emailVal = emailCtrl.value.trim();
		if (emailVal.length > 0)
		{
			// check format
			var re = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/ig;
			var emailValid = emailVal.search(re);
			// e-mail address is invalid if emailValid is less than zero.
			if(emailValid < 0)
			{
				msg = 'E-mail address is invalid <BR>';
			}	
		}
	}
	else
	{
		msg = 'Can not locate e-mail address field <BR>';
	}	
	return msg;	
}

// Validate that contest minimum age requirement is met
function validateMinimumAge()
{
	var msg = '';
	var dobCtrl;
	var dobVal;
	
	// Enforce contest age requirement if Minimum Contest Age has been provided
	var ageReq = document.getElementById('Contest_Age');
	if (ageReq != null)
	{	
		if (!isNaN(ageReq.value.trim()))
		{
			var age = parseInt(ageReq.value.trim());			
			dobCtrl = document.getElementById('Date_of_Birth');
			if (dobCtrl != null)
			{
				if (dobCtrl.value.trim() != '')
				{
					// verify that a valid Date of Birth has been entered
					if (validateDate(dobCtrl.value.trim()))
					{
						dobVal = new Date(dobCtrl.value.trim());
						var minDob = new Date();
						minDob.setFullYear(minDob.getFullYear() - age);
						if (dobVal > minDob)
						{
							msg = 'You have to be ' + age + ' years old to participate in this contest <BR>';
						}
					}
					else
					{
						msg = 'Date of Birth is invalid <BR>';		
					}
				}
			}
			else
			{
				msg = 'Can not locate Date of Birth field <BR>';
			}
		}
	}
	return msg;
}


// Validate entry in the Required Fields
function validateRequiredFields()
{
	var msg = '';
	var ctrl;
	var attr;
	var valExists;
	var ctrlId;
	var processedRadio = '';
	var frmRef = document.forms[CONTEST_FORM_NAME];
	
	for (var i=0; i<frmRef.elements.length; i++)
	{
		valExists = true;
		ctrl = frmRef.elements[i];
		// get a reference to a control on the form
		if (ctrl != null)
		{
			// check if control is marked as required, (i.e. required="true")
			if (ctrl.getAttribute('required') != null && ctrl.getAttribute('required').toString().toUpperCase() == 'TRUE')
			{
				var tagName = ctrl.tagName.toUpperCase();
				// depending on the value of the control check if it contains value
				switch (ctrl.tagName.toUpperCase())
				{
					case 'INPUT':
						// Determine what type of element that is
						var inputType = ctrl.getAttribute('type');
						if (inputType != null)
						{
							switch(inputType)
							{							
								case 'text':
								case 'password':
									if (ctrl.value.trim() == '')
									{
										ctrlId = ctrl.id;
										valExists = false;							
									}
									break;
								case 'radio':
									if (processedRadio.indexOf(ctrl.name) == -1)
									{
										// this radio button group has not been processed yet
										var tmpCtrl;
										var bChecked = false;
										for (var j=0; j<frmRef.elements.length; j++)
										{
											tmpCtrl = frmRef.elements[j];
											if ((tmpCtrl.name.toUpperCase() == ctrl.name.toUpperCase()) && (tmpCtrl.checked))
											{
												bChecked = true;
												break;												
											}
										}
										// none of the elements in the radio group is selected
										if (!bChecked)
										{
											ctrlId = ctrl.name;
											valExists = false;
											processedRadio += ctrl.name + ' ';
										}
									}
									break;
							}
						}
						break;
					case 'SELECT':
						// assuming that <SELECT /> elements will have "-- Select One --" or something similar as the first element.
						if (ctrl.selectedIndex <= 0)
						{
							ctrlId = ctrl.id;
							valExists = false;
						}
						break;
				}
				if (!valExists)
				{
					// Replace underscores with spaces for readability purposes
					while (ctrlId.indexOf('_') >= 0)
					{
						ctrlId = ctrlId.replace('_', ' ');
					}			
					// Update error message (should be in HTML format).
					msg += ctrlId + ' is required <BR>';
				}
			}
		}
	}
	return msg;
}
