/*                                          
»»»»»»»»»»»»»»»»»»»»»»»»  ««««««««««««««««« About «
»   Form Validation_v0.1                          «
»   Bruno Torrinha @ http://www.torrinha.com/     «
»   15 Nov 2008                                   «
»»»»»»»»»»»»»»»»»»»»»»»»  «««««««««««« Change Log «
»   First version 15 Nov 2008                     «
»   First version 15 Nov 2008                     «
»   First version 15 Nov 2008                     «
»»»»»»»»»»»»»»»»»»»»»»»»  «««««««««««««« Requires «
»   Mootools 1.12                                 «
»                                                 «
»»»»»»»»»»»»»»»»»»»»»»»»  ««««««««««««««« License «
»   DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE   «
»   http://en.wikipedia.org/wiki/WTFPL            «
»»»»»»»»»»»»»»»»»»»»»»»»  «««««««««««««««««««««««««
*/

var zorgsForm = new Class({

	Implements: [Events, Options],

	options: {
		morphOptions: 	{duration:300, link:'chain'}, 								//	Morph options (speed, transition, etc...)
		labelStyle: 	{def:'.lblDef', hov:'.lblHov', err:'.lblErr'},
		inputStyle: 	{def:'.inpDef', hov:'.inpHov', err:'.inpErr'},
		sysMessages: 	{
			ongoing: 		{msg:'A processar informação...', style:'.msgProcess'},
			ok: 			{msg:'Processado com sucesso!', style:'.msgSucceed'},
			err: 			{msg:'Campos requerem revisão.', style:'.msgErr'},
			errServer:		{msg:'Ocorreu um erro, tente novamente.', style:'.msgErr'}
		}
	},

	initialize: function(frmEl, options) {
		this.setOptions(options);
		this.frm = $(frmEl);
		this.frmMsg = this.frm.getPrevious('div').fade('hide').set('morph', this.options.morphOptions).setStyle('display', 'block');		
		this.inpEls = [];
		this.frm.getElements('input, textarea').each(function(el, i){
			this.inpEls.push(el);
			this.inpEls[i].required = el.hasClass('_req');
			if (el.match('textarea')) this.setup_textarea(el);
		}, this);

		this.build();
	},

	build: function(){
		this.inpEls.each(function(el){
			el.bErr = false;
			el.inpLabel = el.getPrevious('label').set('morph', this.options.morphOptions);
			el.set('morph', this.options.morphOptions);
			el.addEvents({
				'focus': this._onFocus.bind(this, el),
				'blur': this._onBlur.bind(this, el)
			}, this, el);
		}, this);

		this.frm.addEvents({
			'reset': this.frmReset.bind(this), 
			'submit': this.frmSubmit.bindWithEvent(this)
		});
	},

	_onFocus: function(el){
		if (! el.bErr) el.morph(this.options.inputStyle.hov).inpLabel.morph(this.options.labelStyle.hov);
	},

	_onBlur: function(el){
		if (! el.bErr) el.morph(this.options.inputStyle.def).inpLabel.morph(this.options.labelStyle.def);
	},

	setup_textarea: function(el) {			//	Textarea  auto resize
		el.addEvent('keypress', function(){
			var hgt = el.getStyle('height').toInt() + 100;
			if (hgt < 600 && el.getScroll().y > 0) el.tween('height', hgt);
		}, el);
	},

	validate: function(el){
		var x = true;			//	valid or not
		var str = el.value.trim();
		if(str == ''){
			x = false;
		}else{
			if(el.hasClass('email')) {
				(str.contains('@') && str.length > 3) ? x=true : x=false;
			} else if(el.hasClass('number')) {
				($type(str.toInt()) == 'number') ? x=true : x=false;
			} else {
				($type(str) == 'string' && str.length > 3) ? x=true : x=false;
			}
		}
		return(x);
	},

	frmReset: function(){
		this.inpEls.each(function(el){
			el.set('value', '').morph(this.options.inputStyle.def).bErr = false;
			el.inpLabel.morph(this.options.labelStyle.def);
			if (el.match('textarea')) el.tween('height', '100');
			this.frmMsg.fade('hide');
		}, this);
	},

	frmSubmit: function(e){
		e.stop();
		var xErr = false;
		this.inpEls.each(function(el){
			if (el.required) {
				if (!this.validate(el)) {
					el.morph(this.options.inputStyle.err).bErr = true;
					el.inpLabel.morph(this.options.labelStyle.err);
					xErr = true;
				} else {
					el.morph(this.options.inputStyle.def).bErr = false;
					el.inpLabel.morph(this.options.labelStyle.def);
				}
			}
		}, this);

		if (xErr) {
			var s = this.options.sysMessages.err;			this.frmMsg.set('html', s.msg).morph(s.style).fade('in');
		}else{
			var request = new Request.JSON({
				url: '/postdata.asp?x=ajax',
				method: 'post',
				onFailure: function(){
					var s = this.options.sysMessages.err;	this.frmMsg.set('html', s.msg).morph(s.style).fade('in');
				}.bind(this),
				onRequest: function(){
					var s = this.options.sysMessages.ongoing;	this.frmMsg.set('html', s.msg).morph(s.style).fade('in');
				}.bind(this),
				onSuccess: function(jsonObj){
					if (jsonObj.result=='errEnvio') {		//	Error at e-mail server component
						var s = this.options.sysMessages.errServer;	this.frmMsg.set('html', s.msg).morph(s.style).fade('in');
					} else if (jsonObj.result=='err') {
						var s = this.options.sysMessages.err;	this.frmMsg.set('html', s.msg).morph(s.style).fade('in');
						$splat(jsonObj.desc).each(function(el){
							this.inpEls[el].morph(this.options.inputStyle.err).bErr = true;
							this.inpEls[el].inpLabel.morph(this.options.labelStyle.err);
						}, this);
					} else {
						var s = this.options.sysMessages.ok;		this.frmMsg.set('html', s.msg).morph(s.style).fade('in');
						this.frmReset();
					}
				}.bind(this)
			}).send(this.frm.toQueryString());
		}
	}
});