//$Id: formLib.js 5720 2009-09-11 08:01:03Z ayala $
//Copyright ©2002-2003 BaseNet Internet Projects B.V., the Netherlands. All Rights Reserved.

if(!String.prototype.leftTrim) {
	alert('xString.js needed from jsLib');
}


function checkForm(fObject,scrollToWhenInvalid,disableHighLighting, invalidClassName){
	var tldList = "eu|ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jobs|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mobi|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|travel|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw";

	var validation 	= new RegExp();
	/* http://data.iana.org/TLD/tlds-alpha-by-domain.txt */
	var fElement;
	var input;
	var message;
	
	if(invalidClassName == null) {
		invalidClassName = 'Invalid';
	}

	for(i=0;i<fObject.elements.length;i++) {

		fElement 	= fObject.elements[i];
		fElement.highlight = function() {
			if(scrollToWhenInvalid) {
				window.scrollTo(0,this.offsetTop);
			}
			this.onfocus 	= null;
			fElement.highlightoff();
			this.className 	= this.className + invalidClassName;
		}
		fElement.highlightoff = function() {
			this.className 	= this.className.replace(invalidClassName,'');
		}
		input 		= fElement.value;
		message		= fElement.getAttribute('message');

		fElement.highlightoff();
		if((fElement.getAttribute('required') && input=='')) {
			window.alert(fElement.getAttribute('required'));
			fElement.focus();
			if(!disableHighLighting) {
				fElement.highlight();
			}
			return false;

		} else if(input!='') {
			if(fElement.getAttribute('validate') && fElement.getAttribute('validate') !== 'bankaccount') {
				switch (fElement.getAttribute('validate')) {
					case 'email':
						/* 	email must begin with a letter
						   	email may not contain more that one '@'
							name may contain - , _ or .
							domain may contain - or _
							doomain can contain more than one .
							space is not alowed */
						validation =  /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
						break;
					case 'alpha':
						validation = new RegExp('^[a-zA-Z\.]+$');
						break;
					case 'numeric':
						validation = new RegExp('^[0-9\\-\\s]+$');
						break;
						
					case 'decimal':
						validation = new RegExp('^[0-9](\.[0-9]+)?$');
						break;
					case 'greater_than_zero':
						validation = new RegExp('^[1-9]([0-9]+)?$');
						break;
					case 'alphanumeric':
						validation = new RegExp('^[a-zA-Z0-9]+$');
						break;
					case 'initials':
						validation = new RegExp('^[a-zA-Z\.]+$');
						break;
					case 'zipcode':
						validation = new RegExp('^[0-9]{4}[ ]?[A-Za-z]*$');
						/*
						 * Als een postcode valideerd op willekeurig postcode format.
						 * Zorg dan dat postcode ook nog mooi
						 * tiara 1.2 geformateerd wordt. bijv. 0000 AA
						 */
						if(validation.test(fElement.value )) 
						{
							fElement.value = fElement.value.toUpperCase();
							if(fElement.value.length === 6)
							{
								var tmp = fElement.value.substring(0,4) + " " + fElement.value.substring(4)
								fElement.value = tmp;
							}
						}
						break;
					case 'telephone':
						var t  = fElement.value.replace(/\s|\-|\+/g , "", "all");
						
						if(!t.isNumeric() || t.length < 10) {
							window.alert(message);
							fElement.focus();
							if(!disableHighLighting) {
								fElement.highlight();
							}
							return false;
						}
						break;
						
				}
				if( !validation.test(input) && fElement.getAttribute('validate') !== 'telephone' ){
					window.alert(message);
					fElement.focus();
					if(!disableHighLighting) {
						fElement.highlight();
					}
					return false;
				} else {
					if ( input.indexOf(">") != -1 || input.indexOf("/") !=-1){
						window.alert(message);
						fElement.focus();
						if(!disableHighLighting) {
							fElement.highlight();
						}
						return false;
					}
				}

			} else if(fElement.getAttribute('validate') && fElement.getAttribute('validate') == 'bankaccount'){
				
				var total = 0;
				var b = input.removeDots();
				var j = b.length;
				var succes = false;
				// Als string zonder dots niet geheel numeriek is.
				// Dan error
				if(!b.isNumeric())
				{
					window.alert(message);
					fElement.focus();
					if(!disableHighLighting) {
						fElement.highlight();
					}
					return false;
				}
				// Doe de elf proef berekening
				for (var y = 0; y < b.length; y++){
					total += (9 - y) * parseInt(b.substr(y, 1))
				}
				// als total 0 is altijd fout ...
				if(total ===  0 || j > 9) {
					window.alert(message);
					fElement.focus();
					if(!disableHighLighting) {
						fElement.highlight();
					}
					return false;
					
				}

				// elf proef als lengte 9 is
				if( j == 9 && ( total % 11 ) == 0) {
					succes = true;
				}
			
				// Als geen elfproef en de lengte groter dan 7 of kleiner dan 3
				// geen rekeningnummer
				if( !succes && (j > 7 || j < 3 )) {
					
					window.alert(message);
					fElement.focus();
					if(!disableHighLighting) {
						fElement.highlight();
					}
					return false;
				} 
			}
		}
	}
	return true;
}

function mask(fElement,type) {
	if(fElement && fElement.value!='' && type) {
		var value = fElement.value.trim();
		var transform = new RegExp();
		switch (type) {
			case 'capitalize':
				value = value.capitalize();
				break;
			case 'capitalizeAll':
				value = value.capitalizeAll();
				break;
			case 'lowercase':
				value = value.toLowerCase();
				break;
			case 'uppercase':
				value = value.toUpperCase();
				break;
			case 'telephone':
				if(fElement.value.length < 10) {
					autoFill('telephone',document.getElementsByName('city')[0].value,fElement.name);
				} else {
					value = fElement.value.removeWhiteSpace();
				}
				break;
			case 'zipcode':
				value = value.toUpperCase().removeWhiteSpace().substr(0,6);
				break;
			case 'zip2':
				value = value.toUpperCase().removeWhiteSpace().substr(0,6);
				break;
		}
		fElement.value = value;
	}
}




function autoFill(type,value,fElement) {
	var done = 0;
	document.body.style.cursor = 'wait';
	//document.body.disabled = true;
	if(!document.getElementById('autoFillFrame')) {
		autoFiller 							= document.createElement('iframe');
		autoFiller.id 					= 'autoFillFrame';
		autoFiller.frameBorder	= 0;
		document.body.appendChild(autoFiller);
		document.body.setAttribute('autoFillFrameLoaded','true');
	}
	 autoFiller = document.getElementById('autoFillFrame');
	switch(type) {
		case 'city':
			autoFiller.src='/public/js/autoFill.cfm?type='+type+'&value='+value.substr(0,4);
			break;
		case 'telephone':
			value = value;
			autoFiller.src='/public/js/autoFill.cfm?type='+type+'&value='+value+'&element='+fElement;
			break;
		case 'title':
			if(document.getElementsByName('title')) {
				titleValue = document.getElementsByName('title')[0].value;
				if(titleValue== '' || titleValue == 'Mevr.' || titleValue == 'Dhr.') {
					document.getElementsByName('title')[0].value = value=='M'?'Dhr.':'Mevr.';
				}
			}
			done = 1;
			break;
		default:
			done = 1;
	}
	if(done) {
		document.body.style.cursor = 'default';
		document.body.disabled = false;
	}
}

function enhanceFormElements(sForm,sEvents) {
	if(sForm && sEvents && document.getElementById(sForm)) {
		fObject = document.getElementById(sForm);
		aEvents = sEvents.split(',');

		for(i=0;i<fObject.elements.length;i++) {
			fElement 	= fObject.elements[i];
			if(fElement.className == 'formElement') {
				for(j=0;j<aEvents.length;j++) {
					switch (aEvents[j]) {
						case 'click':
							fElement.setAttribute('oldOnclick',fElement.onclick);
							fElement.onclick = function() {
								if(this.oldOnclick) {
									this.oldOnclick();
								}
								this.className = 'formElementClick'
							}
							break;
						case 'blur':
							fElement.oldOnblur = fElement.onblur;
							fElement.onblur = function() {
								if(this.oldOnblur) {
									this.oldOnblur();
								}
								this.className = 'formElementBlur';
							}
							break;
						case 'focus':
							fElement.oldOnfocus = fElement.onfocus;
							fElement.onfocus = function() {
								if(this.oldOnfocus) {
									this.oldOnfocus();
								}
								this.className = 'formElementFocus'
							}
							break;
						case 'over':
							fElement.oldOnmouseover = fElement.onmouseover;
							fElement.onmouseover = function() {
								if(this.oldOnmouseover) {
									this.oldOnmouseover();
								}
								this.className = 'formElementOver'
							}
							break;
						case 'out':
							fElement.oldOnmouseout = fElement.onmouseout;
							fElement.onmouseout = function() {
								if(this.oldOnmouseout) {
									this.oldOnmouseout();
								}
								this.className = 'formElementOut'
							}
							break;
						case 'down':
							fElement.oldOnmousedown = fElement.onmousedown;
							fElement.onmousedown = function() {
								if(this.oldOnmousedown) {
									this.oldOnmousedown();
								}
								this.className = 'formElementDown'
							}
							break;
						case 'up':
							fElement.oldOnmouseup = fElement.onmouseup;
							fElement.onmouseup = function() {
								if(this.oldOnmouseup) {
									this.oldOnmouseup();
								}
								this.className = 'formElementUp'
							}
							break;
						case 'dblclick':
							fElement.oldOndblclick = fElement.ondblclick;
							fElement.ondblclick = function() {
								if(this.oldOndblclick) {
									this.oldOndblclick();
								}
								this.className = 'formElementDblClick'
							}
							break;
					}
				}
			}
		}
	}
}

