var WMOFORM_INVALID=new Array();
var WMOFORM_VALID_EXT=new Array("nl","be","de","com","net","org","nu","biz","info","eu","cc","at","gg","bz","es","fm","gs","in","jp","pl","tk","ws","tc","vg","ms","am","name");
WMOFORM_INVALID[0]="";
WMOFORM_INVALID[1]="Dit is een verplicht invoerveld";
WMOFORM_INVALID[2]="U moet een correcte waarde invoeren";
WMOFORM_INVALID[10]="U moet een correct e-mail adres invoeren";
WMOFORM_INVALID[20]="U moet de datum correct invoeren: dd-mm-jjjj";
WMOFORM_INVALID[21]="U moet de tijd correct invoeren: uu:mm";
WMOFORM_INVALID[100]="De extensie van het bestand moet zijn: ";
WMOFORM_INVALID[30]="U moet een correct bankrekeningnummer invoeren.";
WMOFORM_INVALID[40]="De ingevoerde wachtwoorden zijn niet hetzelfde.";
WMOFORM_INVALID[999]="Een of meerdere velden zijn niet (correct) ingevuld";

var wmoForm = new Class({
	
	initialize: function (options) {
		this.options = Object.extend({
			selectBy: '.wmoform',
			firstFieldId: null,
			formatDate: 'dd-mm-yyyy',
			formatTime: 'hh:mm',
			inGrid: false,
			onComplete: Class.empty
		}, options || {});
		var i=0;
		this.formId=null;
		this.form=[];
		var forms=$$(this.options.selectBy);
		for (i=0;i<forms.length;i++)
			{
			el=forms[i];
			el.onmousedown = this.onClick.bindWithEvent(this);
			el.onsubmit = this.onSubmit.bindWithEvent(this);
			this.form[el.id]=el;
			if (this.formId==null)
				{this.formId=el.id;}
			}
		this.input=null;
		this.type='';
		this.mask='';
		this.maxLength=0;
		this.required=0;
		this._check=null;
		this._isTextBox=false;
		this._toolTipId=0;
		this._toolTipExtra='';
		var firstField=(this.options.firstFieldId==null ? this._nextInput() : $(this.options.firstFieldId));
		this._addEvents(firstField);
	},
	
	onSubmit: function(e) {
		if (!this.checkForm(true))
			{
			e.stop();
			var obj=$($$('#'+this.formId+' .invalid')[0]);
			this._addEvents(obj);
			obj.focus();
			}
		return true;
	},
	
	onClick: function(e) {
		var obj=$(e.target);
		var formId=obj.getParentByTag('FORM').id;
		if (this.formId!=formId)
			{this.formId=formId;}
		if (this.input!=obj)
			{this._addEvents(obj);}
	},
	
	_addEvents: function(obj) {
		var setFocus=false;
		if (obj.tagName=='INPUT' || obj.tagName=='TEXTAREA' || obj.tagName=='SELECT')
			{
			if (this.input==null)
				{setFocus=true;}
			else
				{
				this.input.fireEvent('blur');
				this.input.removeEvents();
				}
			this._setInput(obj);
			this.input.addEvent('focus',this.onFocus.bind(this));
			this.input.addEvent('keydown',this.onKeyDown.bindWithEvent(this));
			this.input.addEvent('blur',this.onBlur.bind(this));
			if (setFocus)
				{this.input.focus();}
			}	
	},
	
	_setInput: function(obj) {
		
		this.type='';
		this._isTextBox=false;
		if (obj.tagName=='INPUT')
			{
			this.type=obj.type;
			this._isTextBox=(obj.type=='text' || obj.type=='password');
			}
		this.input=obj;
		if (this._isTextBox)
			{
			//this.input.options=this.input.alt.evaluate();
			this.mask=this.input.getProperty('Mask');
			var mask=(this.mask==null ? '' : this.mask);
			if (mask=='N')
				{this._check=this._checkNumber.bind(this);}
			else if (mask=='D')
				{
				this._check=this._checkDateTime.bind(this);
				mask=this.options.formatDate;
				}
			else if (mask=='T')
				{
				this._check=this._checkDateTime.bind(this);
				mask=this.options.formatTime;
				}
			else if (mask=='B')
				{
				this._check=this._checkBankAccount.bind(this);
				mask='##.##.##.###';
				}
			else if (mask=='@')
				{
				this._check=this._checkEMail.bind(this);
				mask='';
				}
			else
				{
				this._check=this._checkRequired.bind(this);
				mask='';
				}
			this.input.options={mask: mask};
			this.maxLength=this.input.getProperty('MaxLength');
			}
		this.required=this.input.getProperty('Required');
	},
	
	onFocus: function() {
		if (this._isTextBox)
			{
			this._fillMask();
			this._setSelection(0,this.input.value.length);
			}
	},
		
	onBlur: function() {
		this._finalize();
	},
	
	onKeyDown: function(e) {
	  var code=e.code;
		if ((code==16 && e.shift) || (code==17 && e.control) || (code==18 && e.alt))
			{e.stop();}
		else if (code==13 && (this.type=='submit' || this.type=='reset' || this.type=='file'))
			{return true;}
		else if (code==9 && e.shift)
			{
			e.stop();
			var prevInput=this._prevInput(this.input);
			this._addEvents(prevInput);
			prevInput.focus();
			return false;
			}
		else if (code==13 || code==9)	//Enter
			{
			e.stop();
			var nextInput=this._nextInput(this.input);
			this._addEvents(nextInput);
			nextInput.focus();
			return false;
			}
		else if (this.input.options.mask=='')
			{return true;}			
		var start=this._getSelectionStart();
		var end=this._getSelectionEnd();
		var c=this._getCharacter(e);
		if (c=='left')
			{start=this._previousPosition(start-1);}
		else if (c=='right')
			{start=this._nextPosition(start+1);}
		else
			{
			if (c=='backspace' && start!=0)
				{start=this._previousPosition(start-1);}
			if (start!=end)
				{this._fillSelection(start,end);}
			start=this._nextPosition(start);
			}
		if (c.length>1)	
			{
			e.stop();
			this._setSelection(start,start);
			}
		else
			{
			var newc=this._validInput(c,start);
			if (newc==null)
				{e.stop();}
			else if (newc!=c)
				{
				this._updateInput(newc,start);
				this._setSelection(start+1,start+1);
				e.stop();
				}
			else
				{this._setSelection(start,start+1);}
			}
	},

	checkForm: function(showMessage) {
		var isValid=true;
		var isVisible=false;
		var mask='';
		var required;
		var i=0;
		var j=0;
		var tags=new Array('input','textarea');
		for (j=0;j<tags.length;j++)
			{
			var inputs=this.form[this.formId].getElementsByTagName(tags[j]);
			for (i=0;i<inputs.length;i++)
				{
				if (inputs[i].type != 'hidden' && inputs[i].type != 'submit')
				  {
				  mask=inputs[i].getAttribute("Mask");
		  		required=inputs[i].getAttribute("Required"); 		
		  		if (mask!=null || required==-1)
		  			{
		  			this._setInput($(inputs[i]));
		  			if(!this._finalize())
		  				{isValid=false;}
		  			}
				  }
				}
			}
		if (!isValid && showMessage)
			{alert(WMOFORM_INVALID[999]);}
		else if (isValid)
		  {
	  	for (i=0;i<inputs.length;i++)
	  	  {
	  	  if (inputs[i].disabled)
	  	    {inputs[i].disabled=false;}  
	  	  }    
		  }
		return isValid;
	},
	
	_nextInput: function() {
		var field=arguments[0] ? arguments[0] : null;
		var found = false;
		var firstActive=-1;
		var vLength=this.form[this.formId].elements.length;
		var i=0;
	  for (i=0;i< vLength;i++) 
			{
		  el=this.form[this.formId].elements[i];
	    if (el.type != 'hidden' && el.disabled==false)
				{
				if (firstActive==-1)
					{firstActive=i;}
				if (found)
					{break;}
				}
	    if (field == el)
	      {found = true;}
			}
		i=(i==vLength ? firstActive : i);
	  return $(this.form[this.formId].elements[i]);
	},

	_prevInput: function(field) {
		var found = false;
		var lastActive = 0;
		var vLength=this.form[this.formId].elements.length;
		var i=0;
	  for (i=(vLength-1);i>=0;i--) 
			{
			el=this.form[this.formId].elements[i];
	    if (el.type != 'hidden' && el.disabled==false)
	      {
				if (lastActive==0)
					{lastActive=i;}
				if (found)
					{break;}
				}
	    if (field == el)
	      {found = true;}
			}
		i=(i<0 ? lastActive : i);
	  return $(this.form[this.formId].elements[i]);
	},
	
	_finalize: function()	{
		var isValid=false;
		this._toolTipIdD=0;
		this._toolTipExtra='';
		var message='';
		if (this.type=='checkbox')
			{this.input.value=(this.input.checked ? '-1' : '0');}
		else if (this._isTextBox)
			{isValid=this._check();}
		else
			{isValid=true;}
		if (isValid)
		  {
		  var checkPW=this.input.getProperty('CheckID');
		  if (checkPW!=null)
		    {
		    var PW=$(checkPW);
		    isValid=(this.input.value==PW.value);
		    if (!isValid)
		      {this._toolTipId=40;}
		    }
		  }
		if (this.type=='checkbox')
		  {this.input.style.border=(isValid ? '0px' : '1px solid rgb(255,100,100)');}
		else if (isValid==true)
			{this.input.removeClass('invalid');}
		else
			{
			message=WMOFORM_INVALID[this._toolTipId]+this._toolTipExtra;
			this.input.addClass('invalid');
			}
		this.input.setProperty('title',message);
		return isValid;	
	},

	_maskNumber: function (mask,code) {
		var maxDecimals=mask.charAt(1);
		var maxLength=this.maxLength;
		var maxBefore=maxLength;
		var isValid=false;
		var pref=0;
		var suff=0;
		var seperator=0;
		var currentValue=this.input.value;
		seperator=currentValue.indexOf(",");
		var start=this._getSelectionStart();
		var end=this._getSelectionEnd();
		if (currentValue.length==maxLength && start==maxLength)
			{return false;}
		if (seperator==-1)
			{seperator=currentValue.indexOf(".");}
		if (seperator==-1)
			{pref=currentValue;}
		else
			{
			pref=parseFloat(currentValue.substr(0,seperator));
			suff=parseInt(currentValue.substr(seperator+1));
			if (isNaN(suff))
				{suff=0;}
			}	
		if (maxDecimals>0)
			{maxBefore=maxBefore-maxDecimals-1;}
		if (((code==110) || (code==190)) && (maxBefore!=maxLength))
			{isValid=(currentValue.indexOf(",")==-1) && (currentValue.indexOf(".")==-1);}
		else if ((code>47 && code<58) || (code>95 && code<106))
			{
			if (code>57)
				{code=code-48;}
			if (start>seperator && seperator>-1)
				{isValid=(suff<Math.pow(10,maxDecimals-1+(end-start)));}
			else
				{isValid=(pref<Math.pow(10,maxBefore-1+(end-start)));}
			}
		else 
			{isValid=false;}
		return isValid;
	},
	
	_checkRequired: function() {
		var isValid=((this.required==-1 && this.input.value.length!=0) || this.required!=-1);
		this._toolTipId=Math.abs(!isValid);
		return isValid;
	},
	
	_checkNumber: function() {
		this.input.value=this.input.value.numberFormat(this.mask.charAt(1));
		return true;
	},
	
	_checkDateTime: function(isTime) {
		var value=this.input.value;
		var isValid;
		if (isTime)
			{
			isValid=value.timeValid();
			if (isValid)
				{this.input.value=value.timeFormat();}
			else
				{this._toolTipId=21;}
			}
		else
			{
			isValid=value.dateValid();
			if (isValid)
				{this.input.value=value.dateFormat();}
			else
				{this._toolTipId=20;}
			}
		return isValid;
	},

	_checkUpload: function() {
		var isValid=true;
		var value=this.input.value.toLowerCase();
		mask=this.mask.substr(1);
		if (value.length>0)
			{
			var aExtension=mask.split(",");
			isValid=(aExtensions.indexOf(value.substr(value.indexOfR('.')))!=-1);
			if (!isValid)
				{
				this._toolTipId=100;
				this._toolTipExtra=mask;
				}		
			}
		else if (this.required==-1)
			{
			this._toolTipId=1;
			isValid=false;
			}
		return isValid;
	},

	_checkEMail: function() {
		var isValid=false;
		var value=this.input.value;
		if (value.length==0)
			{
			if (this.required==-1)
				{this._toolTipId=1;}
			else
				{isValid=true;}
			}
		else
			{
			isValid=WMOFORM_VALID_EXT.indexOf(value.substr(value.indexOfR('.')))!=-1;
			if (!isValid)
				{this._toolTipId=10;}
			}
		return isValid;
	},
	
	_checkBankAccount: function() {
		var value=this.input.value;
		value=value.replace(/[.]/g,"");
		var cValue=0;
		var vLength=0;
		if (value.length<9)
			{return false;}
		else
			{
			value=value.fill(10,0);
			vLength=value.length;
			for (var i=1;i<vLength+1;i++)
				{cValue=cValue+(parseInt(value.charAt(i-1))*(vLength-i+1));}
			var v1=parseInt(cValue/11);
			var v2=cValue/11;
			return (v1==v2);
			}
	},
		
	_getEmptyMask: function() { 
	  return this.input.options.mask.replace(/[dmyhmU#><]/g,'_');
	},
	
	_fillMask: function() {
		if (this.input.options.mask!='')
			{
		  var value=this.input.value;
			var mask=this._getEmptyMask();
			var masked='';
			for (var i=0;i<mask.length;i++)
				{masked+=(i<value.length?value.charAt(i):mask.charAt(i));}
			this.input.value=masked;
			}
	},
	
	_getCharacter: function(e) {
		if (e.code>=48 && e.code<=57)
			{return (e.code-48);}
		else if (e.code>=96 && e.code<=105)
			{return (e.code-96);}
		else
			{return e.key;}
	},

	_validInput: function(c,p) {
		var myRegxp=null;
		var mask=this.input.options.mask.charAt(p);
		var valid=false;
		if ('dmyhm#'.indexOf(mask)>=0) //number
			{myRegxp = /[0-9]/;}
		else if (mask=='U')
			{
			c=(c+'').toUpperCase();
			myRegxp = /[a-zA-Z]/;
			}
		else if (mask=='>')
			{
			c=(c+'').toUpperCase();
			myRegxp = /([0-9a-zA-Z])|([^0-9])/;
			}
		return (myRegxp.test(c) ? c : null);
	},
	
	_fillSelection: function(start,end) {
	  var value=this.input.value;
		this.input.value=value.substr(0,start)+this._getEmptyMask().substr(start,end-start)+value.substr(end);
	},	

	_updateInput: function (c,start) {
		var value=this.input.value;
		this.input.value=value.substr(0,start)+c+value.substr(start+1);
	},
	
	_nextPosition: function(p) {
		if (!this._isInputPosition(p))
			{p=this._nextPosition(p+1);}	
		return p;
	},
	
	_previousPosition: function(p) {
		if (!this._isInputPosition(p))
			{p=this._previousPosition(p-1);}
		return p;
	},
	
	_isInputPosition: function(p) {
		var chr = this.input.options.mask.charAt(p);
		return ("dmyhmU#><".indexOf(chr) >= 0);
	},
	
	_setSelection: function(start,end) {
		if(this.input.setSelectionRange) 
			{
			this.input.focus();
			this.input.setSelectionRange(start, end);
			} 
		else if(this.input.createTextRange) 
			{
			var r = this.input.createTextRange();
			r.collapse();
			r.moveStart("character", start);
			r.moveEnd("character", (end - start));
			r.select();
			}
	},

	_getSelectionStart: function() {
		var p = 0;
		if (this.input.selectionStart)
			{p=this.input.selectionStart;} 
		else if(document.selection) 
			{
			var r = document.selection.createRange().duplicate();
			r.moveEnd('character', this.input.value.length);
			p = this.input.value.lastIndexOf(r.text);
			if(r.text == '') 
				{p = this.input.value.length;}
			}
		return p;
	},

	_getSelectionEnd: function() {
		var p = 0;
		if(this.input.selectionEnd) 
			{p=this.input.selectionEnd;} 
		else if(document.selection) 
			{
			var r = document.selection.createRange().duplicate();
			r.moveStart('character', -this.input.value.length);
			p = r.text.length;
			}
		return p;
	}
	
});
