// JavaScript Document
ValidatorOptions = Object.extend({
    fileLoadingImage:    	'/validator/Images/loading.gif',     
    fileRequiredImage: 		'/validator/Images/Icons/required.png',
    fileOkImage: 			'/validator/Images/Icons/ok.png',
    fileNotOkImage: 		'/validator/Images/Icons/nok.png',
	
	fileBalloonBackground:	'/validator/Images/balloon.png',
	
	alertRequired_nl:		'Niet alle benodigde velden zijn ingevoerd!',
	alertRequired_be:		'Niet alle benodigde velden zijn ingevoerd!',
	alertRequired_uk:		'Not all required fields are filled!',
	alertRequired_com:		'Not all required fields are filled!'
}, window.ValidatorOptions || {});


var Validator = Class.create();

Validator.prototype = {
	initTime:	null,
	lang:	 	'nl',

	initialize: function() {
		var m_start = new Date().getTime() / 1000;
		//
		this.lang = Element.select(document, 'meta[name="language"]').first().content;
		Element.select(document, 'form').each(this.presetForms.bind(this));
		//
		var m_end = new Date().getTime() / 1000;
		this.initTime = (m_end - m_start);
	},
	/************************************************************/
	getIcon: function(node){
		try{
			var val_parent	= node.parentNode;
			var val_img		= node.next();
			if(!val_img || val_img==null || val_img.tagName!='IMG'){
				val_img = new Element('IMG');
				if(val_parent && (val_parent.tagName=='TD' || val_parent.tagName=='TH')){
					$(val_parent).writeAttribute('nowrap', 'nowrap');
				}
				$(node).insert({ after:val_img });
			}
			return val_img;
		}catch(e){
			throw('Validator::getIcon: ' + e);
		}
	},
	updateIcon: function(node, src){
		this.getIcon(node).src = src;
	},

	presetInputs: function(node){
		try{
			if(r = $(node).readAttribute('required')){
				this.inputnode_setRequiredSettings(node, r);
			}
			if(r = $(node).readAttribute('validate')){
				this.inputnode_setValidateSettings(node, r);
			}
			if(r = $(node).readAttribute('lookup')){
				this.inputnode_setLookupSettings(node, r);
			}
			if(r = $(node).readAttribute('identical')){
				this.inputnode_setIdenticalSettings(node, r);
			}
			if(r = $(node).readAttribute('default')){
				this.inputnode_setDefaultSettings(node, r);
			}
		}catch(e){
			throw('Validator::presetInputs: ' + e);
		}
	},
	handle_nodeEvents: function(node){
		try{
			if($(node).onchange){
				eval($(node).onchange());
			}
			if($(node).onblur){
				eval($(node).onblur());
			}
		}catch(e){
			throw('Validator::handle_nodeEvents: ' + e);
		}
	},
	presetForms: function(node){
		try{
			$(node).getElements().each(this.presetInputs.bind(this));
			if(r = $(node).readAttribute('validate')){
				this.formnode_setValidateSettings(node, r);
			}else{
				this.formnode_setSubmitSettings(node);
			}
		}catch(e){
			throw('Validator::presetForms: ' + e);
		}
	},
	/***********************************************/
	inputnode_updateValidate: function(transport, node){
		try{
			var xmldoc		= transport.responseXML;
			if(xmldoc){
				var xmlroot 	= xmldoc.getElementsByTagName('data').item(0);
				if(xmlroot){
					for(var iNode=0; iNode<xmlroot.childNodes.length; iNode++){
						var xmlnode = xmlroot.childNodes.item(iNode);
						var xmlsibl = xmlnode.childNodes.item(0);
						if(xmlsibl){
							if(xmlnode.nodeName == 'valid'){
								this.updateIcon(node, xmlsibl.nodeValue.match('true') ? (ValidatorOptions.fileOkImage) : (ValidatorOptions.fileNotOkImage));
							}else if(xmlnode.nodeName == 'value'){
								$(node).setValue(xmlsibl.nodeValue);
							}else if(xmlnode.nodeName == 'level'){
								$(node).setStyle({'borderColor': 'rgb('+Math.floor((255*parseInt(xmlsibl.nodeValue))/100)+', '+Math.floor((255*(100-parseInt(xmlsibl.nodeValue)))/100)+', '+Math.floor(0)+')'});
							}else if(xmlnode.nodeName == 'alert'){
								alert(xmlsibl.nodeValue);
							}
							this.handle_nodeEvents(node);
						}
					}
				}
			}
		}catch(e){
			throw('Validator::inputnode_updateValidate: ' + e);
		}
	},
	inputnode_updateLookup: function(transport, node, tofill){
		try{
			var arrfill		= tofill.split(';');
			var xmldoc		= transport.responseXML;
			if(xmldoc){
				var xmlroot 	= xmldoc.getElementsByTagName('data').item(0);
				if(xmlroot){
					var nodeLength = xmlroot.childNodes.length;
					for(var iNode=0; iNode < nodeLength; iNode++){
						var xmlnode = xmlroot.childNodes.item(iNode);
						var xmlsibl = xmlnode.childNodes.item(0);
						var xnode	= $(arrfill[iNode]);
						if(xmlsibl && xnode){
							$(xnode).setValue(xmlsibl.nodeValue);
							$(xnode).focus();
							this.handle_nodeEvents(xnode);
							$(xnode).readOnly=true;
							this.updateIcon(xnode, ValidatorOptions.fileOkImage);
						}
					}
				}
			}
		}catch(e){
			throw('Validator::inputnode_updateLookup: ' + e);
		}
	},
	/***********************************************/
	formnode_setSubmitSettings: function(node){
		$(node).observe('submit',
			(function(event){
				var element = event.element();
				if(element.readOnly) return;
				try{
					element.select('INPUT[type="submit"]', 'BUTTON[type="submit"]').each(function(snode){
																		if(r = $(snode).readAttribute('block')){
																			$(snode).writeAttribute('disabled', 'disabled');
																		}
																});
				}catch(e){
					throw('Validator::formnode_setSubmitSettings: ' + e);
				}
			}).bind(this)
		);
	},
	formnode_setValidateSettings: function(node, type){
		$(node).observe('submit',
			(function(event){
				var element = event.element();
				if(element.readOnly) return;
				element.focus();
				try{
					var inputs = $(element).getElements();
					var all_required = true;
					if($(node).onsubmit){
						all_required=eval($(node).onsubmit());
					}		
					var _msg = '';
					$A(inputs).each((function(inputnode){
						try{
							if(snode = $(inputnode).readAttribute('required')){
								var disabledElement = $(inputnode).readAttribute('disabled');
								var skip 			= $(inputnode).readAttribute('skiprequired');
								var image 			= $(inputnode).readAttribute('image');
								if(disabledElement){
									if(image){
										$(image).setStyle({color:''});
									}else{
										$(inputnode).setStyle({borderColor:''});
									}
								}else if(skip!='yes' && this.inputnode_checkRequiredData(inputnode, false)){
									all_required=false;
									if(image){
										$(image).setStyle({color:'#FF0000'});
										_msg+= '-'+$(image).innerHTML+'\r\n';
									}else{
										$(inputnode).setStyle({border:'#FF0000 1px solid'});
									}
								}else if(skip!='yes'){
									if(image){
										$(image).setStyle({color:''});
									}else{
										$(inputnode).setStyle({borderColor:''});
									}
								}
							}
						}catch(e){
							throw('Validator::formnode_setValidateSettings::inputs:: ' + e);
						}
					}).bind(this));
					if(!all_required){
						Event.stop(event);
						if(ValidatorOptions['alertRequired_'+this.lang]){
							alert(ValidatorOptions['alertRequired_'+this.lang]+'\r\n\r\n'+_msg);
						}
					}else{
						element.select('INPUT[type="submit"]', 'BUTTON[type="submit"]').each(function(snode){$(snode).writeAttribute('disabled', 'disabled');});
					}
				}catch(e){
					throw('Validator::formnode_setValidateSettings: ' + e);
				}
			}).bind(this)
		);
	},
	inputnode_checkRequiredData: function(node, prev){
		var state = (false || prev);
		try{
			if($(node)){
				var snode = $(node).readAttribute('required');
				if(( ($(node).getValue()=='') /*|| ($(node).getValue()==0) */|| ($(node).getValue()==$(node).readAttribute('default')))){
					if(snode && snode!='required' && snode!='noimages'){
						if($(snode) && !$(snode).readAttribute('skiprequired')){
							$(snode).writeAttribute('skiprequired', 'yes');
						}
						state = this.inputnode_checkRequiredData(snode, state);
					}else{
						state = true;
					}
				}else{
					if(snode){
						if($(snode) && !$(snode).readAttribute('skiprequired')){
							$(snode).writeAttribute('skiprequired', 'yes');
						}
						this.inputnode_checkRequiredData(snode, state);
					}
				}
			}
		}catch(e){
			throw('Validator::inputnode_checkRequiredData: ' + e);
		}
		return state;
	},
	inputnode_setRequiredSettings: function(node, type){
		try{
			var noimages = $(node.form).readAttribute('validate')
			if(type && type!='noimages' && noimages!='noimages'){
				var image 			= $(node).readAttribute('image');
				if(image){
					this.getIcon($(image)).src = ValidatorOptions.fileRequiredImage;
				}else{
					this.getIcon(node).src = ValidatorOptions.fileRequiredImage;
				}
			}
		}catch(e){
			throw('Validator::inputnode_setRequiredSettings: ' + e);
		}
	},
	inputnode_setLookupSettings:function(node, type){
		try{
			$(node).observe('blur',
			(function(event){
				var element = event.element();
				if(element.readOnly) return;
				try{
					var ajaxOptions = {
					  method:		'get',
					  encoding:     this.encoding,
					  parameters:   '',
					  evalJSON:     false,
					  evalJS:       false
					};
					var depending	= element.readAttribute('depend');
					var tofill		= element.readAttribute('fill');
					if(depending){
						ajaxOptions.parameters = {data: $F($(depending)), value: $F(element)};
					}else{
						ajaxOptions.parameters = {value: $F(element)};
					}
					ajaxOptions.onSuccess	= (function(transport){this.inputnode_updateLookup(transport, node, tofill)}).bind(this);
					//
					if(ajaxOptions.parameters.value!=''){
						var myAjax = new Ajax.Request('validator/lookupInput/' + type, ajaxOptions);
					}
				}catch(e){
					throw('Validator::inputnode_setLookupSettings2: ' + e);
				}
			}).bind(this));
		}catch(e){
			throw('Validator::inputnode_setLookupSettings: ' + e);
		}
	},
	inputnode_setValidateSettings: function(node, type){
		$(node).observe('blur',
			(function(event){
				var element = event.element();
				if(element.readOnly) return;
				try{
					var ajaxOptions = {
					  method:		'get',
					  encoding:     this.encoding,
					  parameters:   '',
					  evalJSON:     false,
					  evalJS:       false
					};
					ajaxOptions.parameters	= { value:$F(element) };
					ajaxOptions.onSuccess	= (function(transport){this.inputnode_updateValidate(transport, node)}).bind(this);
					//
					if(ajaxOptions.parameters.value!=''){
						var myAjax = new Ajax.Request('validator/validateInput/' + type, ajaxOptions);
					}
				}catch(e){
					throw('Validator::inputnode_setValidateSettings: ' + e);
				}
			}).bind(this)
		);
	},
	inputnode_setIdenticalSettings: function(node, value){
		$(node).observe('blur',
			(function(event){
				var element = event.element();
				try{
					if($F(value)===$F(element)){
						this.updateIcon(element, ValidatorOptions.fileOkImage);
					}else{
						this.updateIcon(element, ValidatorOptions.fileNotOkImage);
					}
				}catch(e){
					throw('Validator::inputnode_setIdenticalSettings: ' + e);
				}
			}).bind(this)
		);
	},
	inputnode_setDefaultSettings: function(node, value){
		if($(node).getValue()==''){
			$(node).setValue(value);
		}
		$(node).observe('focus',
			(function(event){
				var element = event.element();
				try{
					if((element.nodeName=="INPUT") && ($(element).readAttribute('type')=="text") && ($(element).readAttribute('changetype')=="password")){
						if(Prototype.Browser.IE){
							var newobj = new Element("INPUT");
							var nameobj = $(element).readAttribute('name');
							var classobj = $(element).readAttribute('class');
							var requiredobj = $(element).readAttribute('required');
							$(newobj).writeAttribute({'type': 'password'});
							if(requiredobj)	$(newobj).writeAttribute({'required': 'required'});
							if(nameobj)		$(newobj).writeAttribute({'name': nameobj});
							if(classobj)	$(newobj).writeAttribute({'class': classobj});
							$(element.parentNode).insert({top:newobj});
							$(element).remove();
							newobj.focus();
							element = newobj;
						}else{
							$(element).writeAttribute({'type': 'password'});
						}
					}
					$(element).setValue('');
				}catch(e){
					throw('Validator::inputnode_setDefaultSettings::observe_focus: ' + e);
				}
			}).bind(this)
		);
	}

};

document.observe('dom:loaded', function () {Validator =  new Validator(); });
