// JavaScript Document
MooTools.lang.setLanguage("nl-NL");
MooTools.lang.set('nl-NL', 'Form.Validator', {
	postal:'Vul een geldige postcode in. (bijvoorbeeld 1234AB).',
	validEmail:'Het opgegeven emailadres is ongeldig.',
	emailMatch:'De opgegeven emailadressen komen niet overeen.',
	passwordMatch:'De opgegeven wachtwoorden komen niet overeen.',
	accountnumber:'Het opgegeven rekeningnummer is onjuist.',
	match:'Dit veld moet overeenkomen met {matchName}.',
	duplicate:'{fieldPrefix} opgegeven {fieldName} is reeds in gebruik.',
	greatherThen:'Deze waarde moet hoger zijn dan {greatherThen}.',
	lowerThen:'Deze waarde moet lager zijn dan {lowerThen}.',
	requiredChk:'Dit veld is verplicht'
});
MooTools.lang.set('nl-NL', 'Date', {
	shortDate: '%d-%m-%Y'
});

Form.Validator.addAllThese([
	["minLengthOrEmpty",{
		errorMsg:function(element,props){
			if($type(props.minLengthOrEmpty)){
				return Form.Validator.getMsg("minLength").substitute({minLength:props.minLengthOrEmpty,length:element.get("value").length});
			}else{
				return"";
			}
		},
		test:function(element,props){
			if($type(props.minLengthOrEmpty)){
				return(element.get("value").length>=$pick(props.minLengthOrEmpty,0) || element.get("value").length==0);
			}else{
				return true;
			}
		}
	}],
	['validate-date_nl', {
		errorMsg: function(element, props){
			if (Date.parse){
				var format = props.dateFormat || '%x';
				return Form.Validator.getMsg('dateSuchAs').substitute({date: new Date().format(format)});
			} else {
				return Form.Validator.getMsg('dateInFormatMDY');
			}
		},
		test: function(element, props){
			element.set('value', element.get('value').replace(/\//g,'-'));
			if (Form.Validator.getValidator('IsEmpty').test(element)) return true;
			var d;
			if (Date.parse){
				var format = props.dateFormat || '%x';
				d = Date.parse(element.get('value').replace(/-/g,'/'));
				var formatted = d.format(format);
				if (formatted != 'invalid date') element.set('value', formatted);
				return !isNaN(d);
			} else {
				var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				var t = element.get('value').replace(/-/g,'/');
				if (!regex.test(t)) return false;
				d = new Date(t.replace(regex, '$1-$2-$3'));
				return (parseInt(RegExp.$1, 10) == (1 + d.getMonth())) &&
					(parseInt(RegExp.$2, 10) == d.getDate()) &&
					(parseInt(RegExp.$3, 10) == d.getFullYear());
			}
		}
	}],
	['validate-postal', {
		errorMsg: Form.Validator.getMsg('postal'),
		test: function(element){
			element.set('value', element.get('value').toUpperCase().replace(/ /g,''));
			return (/^[0-9]{4}[a-zA-Z]{2}$/i).test(element.get('value'));
		}
	}],
	['validate-greather-then', {
		errorMsg:function(a,b){return Form.Validator.getMsg("greatherThen").substitute({greatherThen:($(b.greatherThen)?$(b.greatherThen).get('title'):b.greatherThen)});},
		test: function(element, b){
			var val = $(b.greatherThen) ? $(b.greatherThen).get('value').toInt() : b.greatherThen.toInt();
			return Form.Validator.getValidator("IsEmpty").test(element)||((/^(-?[1-9]\d*|0)$/).test(element.get("value")) && element.get('value').toInt()>val);
		}
	}],
	['validate-lower-then', {
		errorMsg:function(a,b){return Form.Validator.getMsg("lowerThen").substitute({lowerThen:($(b.lowerThen)?$(b.lowerThen).get('title'):b.lowerThen)});},
		test: function(element, b){
			var val = $(b.lowerThen) ? $(b.lowerThen).get('value').toInt() : b.lowerThen.toInt();
			return Form.Validator.getValidator("IsEmpty").test(element)||((/^(-?[1-9]\d*|0)$/).test(element.get("value")) && element.get('value').toInt()<val);
		}
	}],
	['validate-duplicate', {
		errorMsg:function(a,b){return Form.Validator.getMsg("duplicate").substitute({fieldPrefix:b.fieldPrefix,fieldName:b.fieldName});},
		test: function(element){
			var uri = new URI('/nl/registreren/checkduplicate/');
			var req = new Request({
				url:uri,
				method:'post',
				async: false
			}).send(element.get('name')+'='+element.get('value'));
			return req.response.text=='0';
		}
	}],
	['validate-valid-email', {
		errorMsg: Form.Validator.getMsg("validEmail"),
		test: function(element){
			var uri = new URI('/nl/registreren/checkvalidemail/');
			var req = new Request({
				url:uri,
				method:'post',
				async: false
			}).send('email='+element.get('value'));
			return req.response.text=='0';
		}
	}],
	['validate-accountnumber', {
		errorMsg: Form.Validator.getMsg.pass('accountnumber'),
		test: function(element){
			var v = element.get('value');
			var b = false;
			var t = 0;
			if((/^[0-9]{5,8}$/).test(element.get('value'))){
				b = true;
				if($('bank')){
					$('bank').set('value', 'ING');
				}
			}else if((/^[0-9]{9}$/).test(element.get('value'))){
				for (var i=1;i<10;i++){
					t += (10 - i) * v.substr(i - 1, 1).toInt();
				}
				b = t%11==0;
			}else if((/^[0-9]{10}$/).test(element.get('value'))){
				for (var i=1;i<11;i++){
					t += i * v.substr(i-1, 1).toInt();
				}
				b = t%11==0;				
			}
			return b;
		}
	}]
]);
var iFrameFormRequest = new Class({
	
	Implements: [Options, Events],
	
	options: {
		//onRequest: function(){},
		//onComplete: function(data){},
		//onFailure: function(){},
		eventName: 'submit'
	},
	
	initialize: function(form, options){
		this.setOptions(options);
		var frameId = this.frameId = 'f' + Math.floor(Math.random() * 99999);
		var loading = false;

		this.form = document.id(form);
		
		this.formEvent = function(){
			loading = true;
			this.fireEvent('request');
		}.bind(this);

		this.iframe = new IFrame({
			name: frameId,
			styles: {
				display: 'none'
			},
			src: 'about:blank',
			events: {
				load: function(){
					if (loading) {
						var doc = this.iframe.contentWindow.document;
						if (doc) {
							if (doc.location.href == 'about:blank') this.fireEvent('failure');
							else this.fireEvent('complete', doc.body.innerHTML);
						} else {
							this.fireEvent('failure');
						}
						loading = false;
					}
				}.bind(this)
			}
		}).inject(document.id(document.body));
		
		this.attach();
	},
	
	send: function(){
		this.form.submit();
	},
	
	attach: function(){
		this.form
			.store('iFrameFormRequest:formTarget', this.form.get('target'))
			.set('target', this.frameId)
			.addEvent(this.options.eventName, this.formEvent);
	},
	
	detach: function(){
		this.form
			.store('iFrameFormRequest:formTarget', this.form.get('target'))
			.set('target', this.form.retrieve('iFrameFormRequest:formTarget'))
			.removeEvent(this.options.eventName, this.formEvent);
	},

	toElement: function(){
		return this.iframe;
	}
	
});

Element.implement('iFrameFormRequest', function(options){
	this.store('iFrameFormRequest', new iFrameFormRequest(this,options));
	return this;
});

