/* Validate.js, version 1.0.2
*  (c) 2006 achraf bouyakhsass <mutation[at]mutationevent.com>
*
*  This software is licensed under the CC-GNU GPL
*  http://creativecommons.org/licenses/GPL/2.0/
*
*  For more details
*  http://www.mutationevent.com/project/validate.js
*
*  == Package to validate various data :
*  isEmpty
*  isAlphaLatin
*  isNum
*  isDecimal
*  isIntegerInRange
*  isIP
*  isEMail
*  isZipCode
*  isDate
*  isMD5
*  isURL
*  isISBN
*  isNIF
*  isCCC
*  isPlatform
*  hasValidChars
*  == para validar formularios:
*  addRules({id:'id', option:'option', (extra:'extra'), error:'error msg'});
*  Apply
/*--------------------------------------------------------------------------*/
var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}

function getValue(s){return document.getElementById(s).value}

var Validate = Class.create();
Validate.prototype = {
	/*--------------------------------------------------------------------------*/
	initialize:function(){
		this.arr_error = []
		this.arr_rules = [];
		this.e = true;
	},
	isEmpty:function(s){
		return !/\S/.test(s);
	},
	isAlphaLatin:function(string){
		alphaRegExp = /^[0-9a-z]+$/i
		return alphaRegExp.test(string);
	},
	isNum:function(number){
		numRegExp = /^[0-9]+$/
		return numRegExp.test(number);
	},
	isDecimal:function(number){// positive or negative decimal
		if(!number) return false;
		decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
		return decimalRegExp.test(number);
	},
	isIntegerInRange:function(n,Nmin,Nmax){
		var num = Number(n);
		if(isNaN(num)){
			return false;
		}
		if(num != Math.round(num)){
			return false;
		}
		return (num >= Nmin && num <= Nmax);
	},
	isSimpleIP:function(ip){
		ipRegExp = /^(([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+))$/
		return ipRegExp.test(ip);
	},
	isEMail:function(string){
		emailRegExp = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
		return emailRegExp.test(string);
	},
	isZipCode:function(zipcode,country){
		if(!zipcode) return false;
		if(!country) country = 'ES';
		switch(country){ // ES = FR = MA
			case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
			case'ES': zpcRegExp = /^\d{5}$/; break;
			case'CA': zpcRegExp = /^[A-Z]\d[A-Z] \d[A-Z]\d$/; break;
			case'DU': zpcRegExp = /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/; break;
			case'Monaco':zpcRegExp = /^(MC-)\d{5}$/; break;
		}
		return zpcRegExp.test(zipcode);
	},
	isDate:function(date,format){
		if(!date) return false;
		if(!format) format = 'dd-mm-yyyy';

		switch(format){
			case'dd mm yy':RegExpformat = /^([0-2]\d|[3][0-1])\s([0]\d|[1][0-2])\s(\d{2})$/; break;
			case'dd/mm/yy':RegExpformat = /^([0-2]\d|[3][0-1])[\/]([0]\d|[1][0-2])[\/](\d{2})$/; break;
			case'dd/mm/yyyy':RegExpformat = /^([0-2]\d|[3][0-1])[\/]([0]\d|[1][0-2])[\/](([2][0]|[1][9])\d{2})$/; break;
            case'dd-mm-yyyy':RegExpformat = /^([0-2]\d|[3][0-1])[-]([0]\d|[1][0-2])[-](([2][0]|[1][9])\d{2})$/; break;
            case'dd MMM yyyy':RegExpformat = /^([0-2]\d|[3][0-1])\s(Ene(ro)?|Feb(rero)?|Mar(zo)?|Abr(il)?|May(o)?|Ju(n|l)(io)?|Ago(sto)?|Sep(tiembre)?|Oct(ubre)?|(Nov|Dic)(iembre)?)\s(([2][0]|[1][9])\d{2})$/; break;
		}

		return RegExpformat.test(date);
	},
	isMD5:function(string){
		if(!string) return false;
		md5RegExp = /^[a-f0-9]{32}$/;
		return md5RegExp.test(string);
	},
	isURL:function(string){
		if(!string) return false;
		string = string.toLowerCase();
		urlRegExp = /^(((ht|f)tp(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
		return urlRegExp.test(string);
	},
	isISBN:function(number){
		if(!number) return false;
		ISBNRegExp = /ISBN\x20(?=.{13}$)\d{1,5}([- ])\d{1,7}\1\d{1,6}\1(\d|X)$/
		return ISBNRegExp.test(number);
	},
	isNIF:function(nif){	
		if(!nif) return false;
		letraNIF = "TRWAGMYFPDXBNJZSQVHLCKE";
		if (nif.length==9) {
			if(nif.substring(0,1)=="X" || nif.substring(0,1)=="x")
			{ // NIF PARA EXTRANJEROS				
				letra = letraNIF.charAt(nif.substring(1,8) % 23);					
			}
			else if (nif.substring(0,1)=="Y" || nif.substring(0,1)=="y") {
				letra = letraNIF.charAt(('1'+nif.substring(1,8)) % 23);
			}
			else{ // NIF NACIONALES	
			letra = letraNIF.charAt(nif.substring(0,8) % 23);			
			}
			return letra==nif.charAt(8);
		}		
		if (nif.length==8){
			letra = letraNIF.charAt(nif.substring(0,7) % 23);	
			return letra==nif.charAt(7);
		}		
		if (nif.length<8)
			return false;
	},
	isNIF1:function(nif){	
		if(document.getElementById("pasaporte").checked==true){ // PASAPORTE
			return true;
		}else{
			if(!nif) return false;
			letraNIF = "TRWAGMYFPDXBNJZSQVHLCKE";
			if (nif.length==9) { // NIF 
				if(nif.substring(0,1)=="X" || nif.substring(0,1)=="x"){ // NIF PARA EXTRANJEROS					
					letra = letraNIF.charAt(nif.substring(1,8) % 23);		
				}
				else if (nif.substring(0,1)=="Y" || nif.substring(0,1)=="y") { // NIF PARA EXTRANJEROS
					letra = letraNIF.charAt(('1'+nif.substring(1,8)) % 23);
				}
				else{ // NIF NACIONALES	
				letra = letraNIF.charAt(nif.substring(0,8) % 23);			
				}
				return letra==nif.charAt(8);
			}		
			if (nif.length<8)
				return false;
		}		
	},
	isCCC:function(ccc){ //ccc format : NNNNNNNNNNNNNNNNNNNN or NNNN-NNNN-NN-NNNNNNNNNN
		if(!ccc) return false;
		cccRegExp = /^\d{4}[-]?\d{4}[-]?\d{2}[-]?\d{10}$/
		return cccRegExp.test(ccc);
	},
	isPlatform:function(platform){
		//win, mac, nix
		if(!platform) return false;
		var os;
		winRegExp = /\win/i
		if(winRegExp.test(window.navigator.platform)) os = 'win';

		macRegExp = /\mac/i
		if(macRegExp.test(window.navigator.platform)) os = 'mac';

		nixRegExp = /\unix|\linux|\sun/i
		if(nixRegExp.test(window.navigator.platform)) os = 'nix';

		if(platform == os) return true;
		else return false;
	},
	hasValidChars:function(s, characters, caseSensitive){
		function escapeSpecials(s){
			return s.replace(new RegExp("([\\\\-])", "g"), "\\$1");
		}
		return new RegExp("^[" + escapeSpecials(characters) + "]+$",(!caseSensitive ? "i" : "")).test(s);
	},
	/*-funciones auxiliares----------------------------------------------------*/
	getValue:function(id){
		document.getElementById(id).value;
	},
	setError:function(i){
        this.arr_error.push(this.arr_rules[i].error);
		this.e = false;
	},
	check:function(){
		this.e = true;
        this.arr_error = [];
		for(var i=0;i<this.arr_rules.length;i++){
			switch(this.arr_rules[i].option){
				case'required': if (this.isEmpty(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'checked': if (!document.getElementById(this.arr_rules[i].id).checked) this.setError(i); break;
				case'selected': if (document.getElementById(this.arr_rules[i].id).options[document.getElementById(this.arr_rules[i].id).selectedIndex].value == '0') this.setError(i); break;
				case'equal': if(getValue(this.arr_rules[i].id)!=getValue(this.arr_rules[i].id2)) this.setError(i); break;
                case'nodefault': if (getValue(this.arr_rules[i].id)==document.getElementById(this.arr_rules[i].id).defaultValue) this.setError(i); break;
				case'alphaLatin': if (getValue(this.arr_rules[i].id)!='' && this.isAlphaLatin(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'number': if (getValue(this.arr_rules[i].id)!='' && !this.isNum(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'decimal': if(getValue(this.arr_rules[i].id)!='' && !this.isDecimal(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'nif': if(getValue(this.arr_rules[i].id)!='' && !this.isNIF(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'nif1': if(getValue(this.arr_rules[i].id)!='' && !this.isNIF1(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'integerRange': if (getValue(this.arr_rules[i].id)!='' && !this.isIntegerInRange(getValue(this.arr_rules[i].id),this.arr_rules[i].min,this.arr_rules[i].max)) this.setError(i); break;
				case'validChars': if(getValue(this.arr_rules[i].id)!='' && !this.hasValidChars(getValue(this.arr_rules[i].id),this.arr_rules[i].chars,false)) this.setError(i); break;
				case'email': if (getValue(this.arr_rules[i].id)!='' && !this.isEMail(getValue(this.arr_rules[i].id))) this.setError(i); break;
				case'zipCode': if (getValue(this.arr_rules[i].id)!='' && !this.isZipCode(getValue(this.arr_rules[i].id),this.arr_rules[i].country)) this.setError(i); break;
				case'date': if(getValue(this.arr_rules[i].id)!='' && !this.isDate(getValue(this.arr_rules[i].id),this.arr_rules[i].format)) this.setError(i); break;
				case'url': if(getValue(this.arr_rules[i].id)!='' && !this.isURL(getValue(this.arr_rules[i].id))) this.setError(i); break;
			}
		}
	},
	/*--------------------------------------------------------------------------*/
	addRules:function(rules){
		this.arr_rules.push(rules);
	},
	Apply:function(el){
		this.check();
		if(this.e) return true;
		else{
			var endMsg = this.arr_error;
			if(!el) alert(this.arr_error.toString().replace(/\,/gi,"\n"));
			else document.getElementById(el).innerHTML = this.arr_error.toString().replace(/\,/gi,"<br/>");

			return false;
		}
	}
}
