/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(a){var c=(a.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);a.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};a.fn.extend({caret:function(e,f){if(this.length==0){return}if(typeof e=="number"){f=(typeof f=="number")?f:e;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,f)}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",f);g.moveStart("character",e);g.select()}}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;f=this[0].selectionEnd}else{if(document.selection&&document.selection.createRange){var d=document.selection.createRange();e=0-d.duplicate().moveStart("character",-100000);f=e+d.text.length}}return{begin:e,end:f}}},unmask:function(){return this.trigger("unmask")},mask:function(j,d){if(!j&&this.length>0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y<h;y++){if(g[y]){m[y]=d.placeholder;var z=v(y);if(z<h&&g[y].test(m[z])){m[y]=m[z]}else{break}}}s();r.caret(Math.max(i,x))}function u(y){for(var A=y,z=d.placeholder;A<h;A++){if(g[A]){var B=v(A);var x=m[A];m[A]=z;if(B<h&&g[B].test(x)){z=x}else{break}}}}function l(y){var x=a(this).caret();var z=y.keyCode;n=(z<16||(z>16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(x<h){var A=String.fromCharCode(C);if(g[x].test(A)){u(x);m[x]=A;s();var y=v(x);a(this).caret(y);if(d.completed&&y==h){d.completed.call(r)}}}}}return false}function w(x,y){for(var z=x;z<y&&z<h;z++){if(g[z]){m[z]=d.placeholder}}}function s(){return r.val(m.join("")).val()}function p(y){var z=r.val();var C=-1;for(var B=0,x=0;B<h;B++){if(g[B]){m[B]=d.placeholder;while(x++<z.length){var A=z.charAt(x-1);if(g[B].test(A)){m[B]=A;C=B;break}}if(x>z.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}if(!y&&C+1<e){r.val("");w(0,h)}else{if(y||C+1>=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}p()})}})})(jQuery);

// BEGIN VALIDATE //
var FormValidate = {};
FormValidate.erros;
FormValidate.noErros;
FormValidate.control;
var flagError = 0;

// ROLE FORM //
FormValidate.go = function(form, o){	
	if(o.beforeProcess)
		o.beforeProcess.apply(this);	
	
	this.erros = Array();
	this.noErros = Array();
	this.flagError = 0;
	
	this.control =  0;
	this.form = form;
	this.inputs = this.form.elements;
	
	var start = true;
	if(o.functSubmit){
		start = o.functSubmit.apply(this);
	}	
	if(start){
		for(var i=0; i<this.inputs.length; i++){	
			if(!this.ValidateInput(this.inputs[i]))			
				this.flagError++;
		}
	}else	
		return false;	
	
	$return = true;	
	if(o.afterProcess)
			$return = o.afterProcess.apply(this);
			
	o.success.apply(this,[this.noErros]);	
	o.erro.apply(this,[this.erros]);
		
	if(this.flagError != 0)
		$return = false;		
	
	if(!o.active)
		return false;
		
	return $return;	
}
FormValidate.setErro = function(){
	this.flagError = 1;	
}
FormValidate.checkErro = function(){
	if(this.flagError)
		return true;
	return false;
}


FormValidate.ValidateInput = function(input){
	
	var datatype, required, name, type, title;	
	datatype 	= input.getAttribute('datatype');
	required 	= input.getAttribute('required') == 'true' | false;
	title 		= input.getAttribute('field')?input.getAttribute('field'):input.getAttribute('alt');
	max 		= parseInt(input.getAttribute('max'));
	min  		= parseInt(input.getAttribute('min'));
	char    	= input.getAttribute('char') == 'true' | false;
	type		= input.type;

	if(!title) 	title = input.name;
	if(type)	type = type.toLowerCase();

	if(required){		
		if(type == 'select-one' && input.options[input.selectedIndex].disabled){			
			this.PrintError(input, msgValidate.required.replace('{fieldname}',title));
			return false;
		}
		//title.toUpperCase();
		else if(!input.value){
			this.PrintError(input, msgValidate.required.replace('{fieldname}',title));
			return false;
		}
		else if (type == 'checkbox' && !input.checked){
				this.PrintError(input, msgValidate.required.replace('{fieldname}',title));
				return false;
		}
	}
	
	//validando por tipo
	var status = true;
	switch(datatype){
		case 'email': status = this.email(input,title);	break;		
		case 'date': status = this.validateDate(input,title);	break;	
		case 'cardexpiry': status = this.validateCardExpiry(input,title);	break;	
		case 'time': 
			if(!this.validateHora(input.value)){
				this.PrintError(input, msgValidate.hour.replace('{fieldname}',title));			 
				status = false;
			}
		break;
	}
	if(max){
		if(char && input.value.length > max){
			this.PrintError(input, msgValidate.maxlength.replace('{fieldname}',title).replace('{max}',max));
				status = false;
		}else if(!char && parseInt(input.value) > max){
			this.PrintError(input, msgValidate.max.replace('{fieldname}',title).replace('{max}',max));
			status = false;
		}
	}
	
	if(min){
		if(char && input.value.length < min){
			this.PrintError(input, msgValidate.minlength.replace('{fieldname}',title).replace('{min}',min));
			status = false;
		}else if(!char && parseInt(input.value) < min){
			this.PrintError(input,msgValidate.min.replace('{fieldname}',title).replace('{min}',min));
			status = false;
		}
	}	
	
	var compare = input.getAttribute('compare');
	if(compare)	{		
		//console.log(this.compare(input,title),input);
	}	
	if(!status)
		return false;	
	this.Sucess(input);
	return true;	
	
}

// Add Erro
FormValidate.PrintError = function (input,msg)
{				
	var campo = this.process(input);
	$(campo).attr('title',msg);
	
	var erro = $(campo).attr('erro');
	if(!erro || this.erros[erro])
	{
		erro = $(campo).attr('name');
	}
	
	this.erros[this.control] = campo;
	this.control++;
}

// Add Erro For Cliente
FormValidate.addErro = function (input,msg)
{				
	this.flagError = true;
	this.PrintError(input,msg);
}

FormValidate.addSucess = function (input)
{				
	this.Sucess(input);
}


// ADD Sucess
FormValidate.Sucess = function (input)
{	
	switch(input.type){
		case 'text':
		case 'select-one':
		case 'textarea':
			this.noErros[this.control] = this.process(input); 
			this.control++;
			
		break;
	}	
}
FormValidate.process = function (input){	
	//var campo = {};
	//var $input = $(input);
	//campo.id = $input.attr('id');
	//campo.name = $input.attr('name');
	//campo.alt = $input.attr('alt');
	//campo.erro = $input.attr('erro');
	//campo.datatype = $input.attr('datatype');
	return input;
}
/// END ROLE ///

// COMPARE
FormValidate.compare = function(input,title) {	
	compare = input.getAttribute('compare');
	op = input.getAttribute('op');		
	var pass = document.getElementById(compare);
	var passTitle = pass.getAttribute('field')?pass.getAttribute('field'):pass.getAttribute('alt');
	if(!op)	
		op = '==';
		
	switch(op){
		case '==': valor = msgValidate.equal ; break;
		case '>=': valor = msgValidate.greatOrEqual ; break;
		case '<=': valor = msgValidate.lessOrEqual ; break;
		case '!=': valor = msgValidate.notEqual ; break;
		case '>': valor = msgValidate.great ; break;
		case '<': valor = msgValidate.less ; break;
	}	
	if(!this.processCompare(input.value,op,pass.value))
	{
		this.PrintError(input, msgValidate.valueCompare.replace('{fieldname}',title).replace('{operator}',valor).replace('{fieldnameCompare}',passTitle));
		return false		
	}
	return true;
}

FormValidate.processCompare  = function(v1,op,v2){
	if(typeof v1=="string"){v1="'"+v1+"'"}
	if(typeof v2=="string"){v2="'"+v2+"'"}
	return eval(v1+op+v2);
}

FormValidate.compareDate  = function(v1,op,v2){	
	return eval(Date.parse(v1)+op+Date.parse(v2));
}
// Mail
FormValidate.email = function(input,title) {
	if(input.value)	
	{
		var emailPat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
		if (input.value && !emailPat.test(input.value)) {					
			this.PrintError(input, msgValidate.email.replace('{fieldname}',title));
			return false;
		}
	}	
	return true;
}

/*  Validation Roles*/
FormValidate.validateTime = function(time){ 
	hour = parseInt(time.split(":")[0], 10), minute = time.split(":")[1];
	if (hour < 0 || hour > 23) {
		return false;
	} else {
		var minute = parseInt(minute, 10);
		if (minute < 0 || minute > 59) {
			return false;
		}
	}
	return true;
}


FormValidate.validateCardExpiry = function (input,title){
	var aRet = true;
	if(!input.value)
		return aRet;
		
	var year = input.value.substring(3,8);
	var month = input.value.substring(0,2);
	
	if(month > 12 || month < 0){
		//this.PrintError(input, msgValidate.cardexpiry.replace('{fieldname}',title));	
		return false;
	}	
}


FormValidate.validateDate = function(input,title){ 
	var aRet = true;
	if(!input.value)
	{		
		return aRet
	}
	
	var expReg = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/(19|20)?\d{2}$/;
	if ((input) && (input.value.match(expReg)) && (input.value != '')) {		
		var year = input.value.substring(6,10);
		var month = input.value.substring(3,5);
		var day = input.value.substring(0,2);
			
		if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
		  aRet = false;
		}else {
			 if ((year % 4) != 0 && month == 2 && day > 28) {
					aRet = false;
					 alert('2');
			}else{
					if ((year%4) == 0 && month == 2 && day > 29){
					  aRet = false;
					   alert('3');
					}
			}
		}
		
	}  else 
		aRet = false;  
	
	if(!aRet)
		this.PrintError(input, msgValidate.date.replace('{fieldname}',title));
	return aRet;
}

/* MASKS */
jQuery.fn.extend({
	  validateDate: function() {
		  var $this = $(this);
		  $this.mask("99/99/9999");
		  $this.attr('datatype','date');
	  },  
	  validateTime: function() {
		  var $this = $(this);
		  $this.mask("99:99");
		  $this.attr('datatype','time');
	  },
	  validatePhone: function() {
		  var $this = $(this);
		  $this.mask("(999)9999-9999");
		  $this.attr('datatype','phone');
	  },
	    validateMMYY: function() {
		  var $this = $(this);
		  $this.mask("99/99");
		  $this.attr('datatype','validateMMYY');
		},
		validateCardExpiry: function() {
		  var $this = $(this);
		  $this.mask("99/9999");
		  $this.attr('datatype','cardexpiry');
	  },
	  validatePoint: function(func) {
		  var $this = $(this);
		  $this.mask("9");
		  $this.attr('datatype','point');
	  },
	  validatePercent: function(func) {
		  var $this = $(this);
		  $this.mask("99");
		  $this.attr('datatype','percent');
	  },
	  validateForm: function(options) {		  
		  defaults = {
			beforeProcess:false,
			functSubmit:false,
			afterProcess:false,
			erro:validate.erro,
			success:validate.success,
			active:true
		};
		
		var $this = $(this);
        var o = $.extend({}, defaults, options);
		$this.submit(function(){
			return FormValidate.go(this,o);
		})
	 }
});


