
function trim(s){s = (s + '');while(1){if((s.charAt(0)==' ')||(s.charAt(0)=="\t")||(s.charAt(0)=="\n")||(s.charAt(0)=="\0x0D")||(s.charAt(0)=="\0x0A")){s = s.substring(1,s.length);}else{break;};};while(1){if((s.charAt(s.length-1)==' ')||(s.charAt(s.length-1)=="\t")||(s.charAt(s.length-1)=="\n")||(s.charAt(s.length-1)=="\0x0D")||(s.charAt(s.length-1)=="\0x0A")){s = s.substring(0,s.length-1);}else{break;};};return s;};


Validation = {

	forms: {},
	last: {},

	Init: function(){
		var form, formId;

		for(formId in Validation.forms)
		{
			Validation.last[formId] = -1;

			var form = document.getElementById(formId);
			if(form)
			{
				if(form.onsubmit) {
					continue;
				}

				form.onsubmit = Validation.onSubmit;

				form.onreset = Validation.onReset;

				var fieldName, fieldNames, fields = Validation.forms[formId];

				var pos = 0;

				for(fieldName in fields)
				{
					fieldNames = fieldName.split('|');

					for(var i=0; i<fieldNames.length; i++)
					{
						var field = form.elements[fieldNames[i]];
						if(field)
						{
							if(!i)
							{
								if(!field.id)
								{
									field.id = form.id+'_'+field.name;
								}
							}

							var fn; eval('fn=function(){Validation.Check("'+formId+'",'+pos+')}');
							field.onblur = fn;

							if((field.getAttribute('type') + '').toLowerCase() == 'file')
							{
								field.onchange = fn;
							}
						}
					}
					pos++;
				}
			}
		}
	},


	getFieldValue: function(form, fieldName){

		var fieldValue = '';
		var fieldNames = fieldName.split('|');

		for(i=0; i<fieldNames.length; i++)
		{
			field = form.elements[fieldNames[i]];
			if(field)
			{
				if(!i)
				{
					if(!field.id)
					{
//						field.id = form.id+'_'+form.name;
					}
				}

				fieldValue += trim(field.value);
			}
		}

		return fieldValue;
	},



	Check: function(formId, offset){
		var i, j, a, o, pos=0, form, fieldData, fieldName, fieldTitle, fieldPrevName, fieldNames, fieldTitle, fieldValue, field, fields, error, bValid, errors = [], errorsCount = 0, bCritical;

		bValid = true;

		form = document.getElementById(formId);
		fields = Validation.forms[formId];


		Validation.last[formId] = offset;

		for(fieldName in fields)
		{
			if(pos > offset)
			{
				break;
			}


			fieldData = fields[fieldName];

			fieldTitle = fieldData.title;

			fieldNames = fieldName.split('|');

			fieldValue = Validation.getFieldValue(form, fieldName);

			field = form.elements[fieldNames[0]];

			bCritical = false;
			error = '';


			for(i=0; i<fieldData.requires.length; i++)
			{
				switch(fieldData.requires[i])
				{
					case 'not_blank':
						if(!fieldValue)
						{
							bCritical = true;
							error = 'Required Field';
							errors[errors.length] = fieldTitle + ' is a Required Field';
						}
						break;

					case 'numbers_only':
						if(fieldValue)
						{
							if(!fieldValue.match('^[0-9]+$'))
							{
								error = 'Please Use Numbers Only';
								errors[errors.length] = fieldTitle + ' must contain numbers only';
							}
						}
						break;

					case 'valid_email':
						if(fieldValue)
						{
							if(!fieldValue.match('^[0-9a-zA-Z-_\.]+@[0-9a-zA-Z-_\.]+\.[a-zA-Z]+$'))
							{
								error = 'Incorrect or incomplete email address';
								errors[errors.length] = fieldTitle + ' is incorrect or incomplete';
							}
						}
						break;

					case 'strong_password':
						if(fieldValue)
						{
							if((fieldValue.length < 8) || (fieldValue.length > 15))
							{
								error = 'Please enter a password that is 8 to 15 characters long';
								errors[errors.length] = error;
							}else if(!fieldValue.match('[0-9]+') || !fieldValue.match('[a-zA-Z]+')){
								error = 'Password must contain at least one letter and one number';
								errors[errors.length] = error;
							}
						}
						break;

					case 'letters_only':
						if(fieldValue)
						{
							if(!fieldValue.match('^[a-zA-Z ]+$'))
							{
								error = 'Letters allowed only';
								errors[errors.length] = fieldTitle + ' must contain letters only';
							}
						}
						break;

					case 'match_previous':
						var fieldPrevValue = Validation.getFieldValue(form, fieldPrevName);
						if(fieldPrevValue)
						{
							if(fieldPrevValue != fieldValue)
							{
								error = 'Value does not match';
								errors[errors.length] = fieldTitle + ' must match previous field';
							}
						}
						break;

					case 'valid_mask':
						if(!fieldValue.match(fieldData.mask))
						{
							error = fieldData.error ? fieldData.error : 'Incorrectly typed. Please use valid format';
						}
						break;

					case 'valid_phone_number':
						var number = '';
						for(var j=0; j<fieldValue.length; j++)
						{
							if(fieldValue[j].match('[0-9]+'))
							{
								number += fieldValue[j];
							}
							
						}
						if(number.length < 11 || number.length > 12)
						{
							error = 'Phone number is not valid';
							errors[errors.length] = fieldTitle + ' is not valid';
						}else{
							field.value = '+'
								+ number.substr(0, number.length - 10)
								+ ' ('
								+ number.substr(number.length - 10, 3)
								+ ') '
								+ number.substr(number.length - 7, 3)
								+ '-'
								+ number.substr(number.length - 4);
						}
						break;

					case 'doc_ext':
						if(fieldValue.length > 0)
						{
							var ext = '';
							try { ext = fieldValue.substr(fieldValue.lastIndexOf('.') + 1).toLowerCase() } catch(e){}
							switch(ext)
							{
								case 'doc':
								case 'docx':
								case 'pdf':
								case 'rtf':
									break;

								default:
									error = 'Document format is not valid';
									errors[errors.length] = fieldTitle + ' document format is not valid';
							}
						}
						break;
				}

				if(error)
				{
					bValid = false;
					break;
				}
			}


			var errorBox = document.getElementById(field.id + '_req');
			if(!errorBox)
			{
				errorBox = field.parentNode.insertBefore(document.createElement('DIV'), field.parentNode.firstChild);
				errorBox.id = field.id + '_req';

				var w = 0;
				for (i=0; i<field.parentNode.childNodes.length; i++) {
					var tag = field.parentNode.childNodes[i].tagName;
					if (tag == 'LABEL' || tag == 'INPUT' || tag == 'TEXTAREA') {
						w += field.parentNode.childNodes[i].offsetWidth;
					}
				}

				errorBox.style.left = (w + 20) + 'px';
			}

			errorBox.className = 'field-required required-'+field.tagName.toLowerCase();

			if(error){
				
				errorBox.className += bCritical ? ' required-critical' : '';
				errorBox.innerHTML = error;
				errorBox.style.display = 'block';

				if(fieldData.hide)
				{
					for(i=0; i<fieldData.hide.length; i++)
					{
						o = document.getElementById(fieldData.hide[i]);
						if(o)
						{
							o.style.visibility = 'hidden';
						}
					}
				}

				a = document.getElementsByTagName('LABEL');
				for(i=0; i<a.length; i++)
				{
					if(a[i].getAttribute('for') == field.id)
					{
						a[i].className += ' required';
					}
				}

				for(i=0; i<fieldNames.length; i++)
				{
					field = form.elements[fieldNames[i]];
					if(field)
					{
						field.className += ' required';
					}
				}
			}else{

				var bAccept = false;

				errorBox.className += ' required-accept';
				errorBox.innerHTML = '';


				for(i=0; i<fieldData.requires.length; i++)
				{
					switch(fieldData.requires[i])
					{
						case 'not_blank':
							bAccept = true;
							break;
					}
				}


				if(fieldData.hide)
				{
					for(i=0; i<fieldData.hide.length; i++)
					{
						o = document.getElementById(fieldData.hide[i]);
						if(o)
						{
							o.style.visibility = '';
						}
					}

					// re-enable text so accept not needed
					bAccept = false;
				}


				errorBox.style.display = bAccept ? 'block' : 'none';


				a = document.getElementsByTagName('LABEL');
				for(i=0; i<a.length; i++)
				{
					if(a[i].getAttribute('for') == field.id)
					{
						a[i].className = a[i].className.replace(/\s*required/ig, '');
					}
				}


				for(i=0; i<fieldNames.length; i++)
				{
					field = form.elements[fieldNames[i]];
					if(field)
					{
						field.className = field.className.replace(/\s*required/ig, '');
					}
				}
			}

			fieldPrevName = fieldName;
			pos++;
		}

		var total = document.getElementById('form-errors-total');
		if(total)
		{
			if(errors.length > 0)
			{
				total.style.display = '';
				total.innerHTML = '<p>' + errors.join("<br/>") + '</p>';
			}else{
				total.style.display = 'none';
			}
		}

		return bValid;
	},


	lockSubmit: function(formId) {
		var form = document.getElementById(formId);
		if(form)
		{
			for(var i=0;i<form.elements.length; i++)
			{
				if((form.elements[i].getAttribute('type')+'').toLowerCase() == 'submit')
				{
					form.elements[i].disabled = true;
				}
			}
		}
	},

	unlockSubmit: function(formId) {
		var form = document.getElementById(formId);
		if(form)
		{
			for(var i=0;i<form.elements.length; i++)
			{
				if((form.elements[i].getAttribute('type')+'').toLowerCase() == 'submit')
				{
					form.elements[i].disabled = false;
				}
			}
		}
	},

	onReset: function() {
		var formId = this.id;

		var form = document.getElementById(formId);
		var fields = Validation.forms[formId];

		for (var fieldName in fields) {

			var fieldData  = fields[fieldName];
			var fieldNames = fieldName.split('|');
			var fieldValue = Validation.getFieldValue(this, fieldName);

			var field = this.elements[fieldNames[0]];

			for (var i=0; i<fieldNames.length; i++) {
				field = form.elements[fieldNames[i]];
				if (field) {
					field.className = field.className.replace(/\s*required/ig, '');
				}
			}

			var errorBox = document.getElementById(field.id + '_req');
			if (errorBox) {
				errorBox.style.display = 'none';
			}
		}

		var total = document.getElementById('form-errors-total');
		if (total) {
			total.style.display = 'none';
		}		
		return true;
	},

	onSubmit: function() {
		return Validation.Check(this.id, 999);
	}
}









Validation.forms = {
	'proposals': {
		firm: {title: 'Firm',    requires: ['not_blank']},
		contact: {title: 'Contact', requires: ['not_blank']},
		phone: {title: 'Phone Number', requires: ['not_blank']},
		email: {title: 'Email Address', requires: ['not_blank', 'valid_email']},
		firm_strategy: {title: 'Firm Strategy', requires: ['not_blank']},
		fund_raising_target: {title: 'Fund Raising  Target', requires: ['not_blank']},
		key_members: {title: 'Key management team members', requires: ['not_blank']},
		current_partners: {title:'Current limited partners', requires: ['not_blank']},
		file_1: {title: 'Attach marketing presentation and/or offering memorandum', requires: ['doc_ext']}
	}
};



