// JavaScript Document


function Forms() {}


Forms.prototype.Clean = function (oField, sType,l1,l2) {
	
	var regexp;

	switch (sType) {
		
		case 'currency':
		
			regexp = new RegExp(/[^0-9\.]/g);
			oField.value = oField.value.replace(regexp, '');
			
			regexp = new RegExp(/\.[0-9]$/);
			
			if (regexp.test(oField.value)) {
			
				oField.value = oField.value + '0';
			
			}
			
			regexp = new RegExp(/\.$/);
			
			if (regexp.test(oField.value)) {
			
				oField.value = oField.value + '00';
			
			}
			

			var iDecimalIndex = oField.value.indexOf('.');

			if (iDecimalIndex > -1) {
				
				if (iDecimalIndex+3 < oField.value.length) {
			
					oField.value = oField.value.substr(0,iDecimalIndex+3);
				
				} else if (iDecimalIndex == oField.value.length) {
				
					oField.value += '00';
				
				}
			
			}
			
				
			
			//  regexp = new RegExp(/^[0-9]+(\.[0-9]{2})?$/);
			
		break;
	
		case 'decimal':
		case 'float':
		
			regexp = new RegExp(/[^0-9\.]/g);
			oField.value = oField.value.replace(regexp, '');
		
			oField.value = parseInt(oField.value);
			
			if (oField.value < l1) oField.value = l1;
			if (oField.value > l2) oField.value = l2;		
			
		break;
	
		case 'int':
		
			if (oField.value == '') {
				return;
			}
			
			//  Regexp to remove non-number and two numbers at the end, such as ".00" or ",00"
			regexp = new RegExp(/[^\d]\d{2}$/);
			
			//  Do removal
			oField.value = oField.value.replace(regexp, '');
			
		
			//  Set regexp to anything that isn't a number or decimal point
			regexp = new RegExp(/[^0-9\.]/g);
			
			//  Remove them
			oField.value = oField.value.replace(regexp, '');
			
			
			//  If there's a proper decimal point, round it
			if (oField.value.indexOf('.') > -1) {
				
				oField.value = Math.round(parseFloat(oField.value));

			} else {
			
				oField.value = parseInt(oField.value);
			
			}			
			
		break;
	
	}
	
	if (oField.value < l1) oField.value = l1;
	if (oField.value > l2) oField.value = l2;	

	//fncValidateForm ("appform");
}


Forms.prototype.Validate = function (f, aFields) {
	
	/*
		aFields:
		0 = Display name
		1 = Required
		2 = Format type
	*/

	var l = f.length;		//  form length (number of fields)
	var r = new Array();		//  array to store names of radio buttons already done
	var c, g, i, e, regexp, v;
	
	this.error_msg = '';
	this.num_errors = 0;
	
	for (sFieldId in aFields) {
		
		e = document.getElementById(sFieldId);		//  reference form element		
		
		if (!e) {
			continue;
		}
		
		v = true;					//	field is valid - assume it is
		
		// remove any previously created error messages

  	e.className= e.className.replace("onerror", "");   // set the CSS class to adjust appearance of message

		nodeRef = e.parentNode;
		if (nodeRef.hasChildNodes()) {
			for (var i = 0; i < nodeRef.childNodes.length; i++) {
			    if (nodeRef.childNodes[i].nodeName == "P") {
//			        // operate on an element						
//								alert(nodeRef.childNodes[i].nodeName+":"+nodeRef.childNodes[i].data);
								nodeRef.removeChild(nodeRef.childNodes[i]);
		    	}
			}
		}
		
		//  Split into type to make it easier to manage
		switch (e.type) {
			
			case 'checkbox':
				
				//  If required and not checked...
				if ((aFields[sFieldId][1] == 1) && (!e.checked)) {
					this.ValidationError(e, aFields[sFieldId], 'not checked');
				}
				
			break;
			
			case 'radio':
				
				if (aFields[sFieldId][1] == 1) {
				
					//  If we've not already done it
					if (r[e.name] == 'undefined' || r[e.name] == null) {
						
						r[e.name] = 1;			//  Record we've done it
						g = eval('f.' + e.name);	//  Group of radio buttons
						v = false;			//  Whether anything's been checked
						
						//  Loop group
						for (i = 0; i < g.length; i++) {
							if (g[i].checked) {
								v = true;
								break;
							}
						}
						
						if (!v) {
							this.ValidationError(e, aFields[sFieldId], 'not selected');
						}
							
					}
					
				}
				
			break;
		
			case 'select':
			case 'select-one':
				
				if (aFields[sFieldId][2] == 'notzero') {

					if (e.options[e.selectedIndex].value == '0') {
						this.ValidationError(e, aFields[sFieldId], 'not selected');
					}		
				
				} else {
				
					if ((aFields[sFieldId][1] == 1) && (e.options[e.selectedIndex].value == '')) {
						this.ValidationError(e, aFields[sFieldId], 'not selected');
					}
					
				}
				
			break;
		
			default:
				
				if (e.value == '' && aFields[sFieldId][1] == 1) {
					this.ValidationError(e, aFields[sFieldId], 'not entered');
				} else {

					v = true;

					switch (aFields[sFieldId][2]) {

						case 'email':

							if (e.value != '') {
								//  Make lowercase
								e.value = e.value.toLowerCase();

								//  Test format
								regexp = new RegExp(/^([a-z0-9_\.\-])+\@(([a-z0-9\-])+\.)+([a-z0-9]{2,4})+$/);
								v = regexp.test(e.value);
							}

						break;

						case 'houseprice':
						case 'house_price':
						case 'propertyvalue':
						case 'property_value':

							if (e.value != '') {
								//  Remove non-numbers and keep decimal point(s)
								regexp = new RegExp(/[^\d\.]/g);
								e.value = e.value.replace(regexp, '');

								//  Check format
								regexp = new RegExp(/^\d{5,8}(\.\d{2})?$/);
								v = regexp.test(e.value);
							}

						break;

						case 'postcode':
						
							if (e.value != '') {
								//  Test postcode
								regexp = new RegExp("^(([EW]C[1-9]|(E|S?W)1)[A-Z]|(A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|[JZ]E|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGK-PRSTWY]?|T[ADFNQRSW]|UB|W[ADFNRSV]?|YO)[0-9]{1,2}) ?[0-9][ABD-HJLNP-UW-Z]{2}|BFPO ?[1-9][0-9]{0,3}$","i");
								v = regexp.test(e.value);
							}

						break;

						case 'telephone':

							if (e.value != '') {
								//  Remove non-numbers
								regexp = new RegExp(/[^\d]/g);
								e.value = e.value.replace(regexp, '');

								//  Test number
								regexp = new RegExp(/^0(1|2|3|5|7|8)\d{8,9}$/);
								v = regexp.test(e.value);
							}

						break;

						default:
							//  Assume valid
					}

					if (!v) {
						this.ValidationError(e, aFields[sFieldId], 'not valid');
					}

				}

		
		}
		
	}
	
	
	if (this.num_errors > 0) {
		alert('We are sorry, but please could you correct the following\nerrors in order to help us provide a more efficient service?\n' + this.error_msg);
	}
	
	
	return (this.num_errors == 0) ? true : false;

}



Forms.prototype.ValidationError = function (oField, aConfig, sError) {
	
	this.num_errors++;
	
	switch (oField.type) {
		case 'checkbox':
			this.error_msg += '\n - ' + aConfig[0] + ' ' + sError;
		break;
		
		case 'radio':		
		case 'select':
		case 'select-one':
			this.error_msg += '\n - ' + aConfig[0] + ' ' + sError;
		break;
		
		default:
			this.error_msg += '\n - ' + aConfig[0] + ' ' + sError;
	}
	
//	alert(aFields[sFieldId]);
//	var elem = document.getElementById(aFields[sFieldId]);
  	oField.className = oField.className +" onerror";   // set the CSS class to adjust appearance of message
//		oField.removeChild();
		var theNewParagraph = document.createElement('p');
		var theTextOfTheParagraph = document.createTextNode(aConfig[0] + ' ' + sError);
				theNewParagraph.appendChild(theTextOfTheParagraph);
		p = oField.parentNode.insertBefore(theNewParagraph,oField.parentNode.lastChild);
		p.setAttribute('class','Error');
//		oField.firstChild.nodeValue = "<p>ERROR</p>";    

}

function fncValidateField (f,fieldname,assignment,type) {

		var i; 
		var form_validation = new Array();  
		form_validation[fieldname] = new Array(assignment, 1,type); 

		var form_valid = F.Validate(f, form_validation); 
		if (!form_valid) { 
			//e = document.getElementById(fieldname);
	//		e.focus();
			return false; 
		} else { 
			return true; 
		} 
	}

var F = new Forms();
