/* 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 :
*  hasValidChars
*  isSimpleIP
*  isAlphaLatin
*  isNotEmpty
*  isIntegerInRange
*  isNum
*  isEMailAddr
*  isZipCode
*  isDate
*  isMD5
*  isURL
*  isGuid
*  isISBN
*  isSSN
*  isDecimal
*  isplatform
*  addRules
*  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.error_array = []
                this.rules_array = [];
                this.e = true;
        },
        /*--------------------------------------------------------------------------*/
        hasValidChars:function(s, characters, caseSensitive){
                function escapeSpecials(s){
                        return s.replace(new RegExp("([\\\\-])", "g"), "\\$1");
                }
                return new RegExp("^[" + escapeSpecials(characters) + "]+$",(!caseSensitive ? "i" : "")).test(s);
        },
        /*--------------------------------------------------------------------------*/
        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);
        },
        /*--------------------------------------------------------------------------*/
        isAlphaLatin:function(string){
                alphaRegExp = /^[0-9a-z]+$/i
                return alphaRegExp.test(string);
        },
        /*--------------------------------------------------------------------------*/
        isNotEmpty:function (string){
                return /\S/.test(string);
        },
        /*--------------------------------------------------------------------------*/
        isEmpty:function(s){
                return !/\S/.test(s);
        },
        /*--------------------------------------------------------------------------*/
        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);
        },
        /*--------------------------------------------------------------------------*/
        isNum:function(number){
                numRegExp = /^[0-9]+$/
                return numRegExp.test(number);
        },
        /*--------------------------------------------------------------------------*/
        isEMailAddr:function(string){
                emailRegExp = /^[_a-z0-9-]+(\.[_a-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) format = 'US';
                switch(country){
                        case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
                        case'MA': 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'FR': zpcRegExp = /^\d{5}$/; break;
                        case'Monaco':zpcRegExp = /^(MC-)\d{5}$/; break;
                }
                return zpcRegExp.test(zipcode);
        },
        /*--------------------------------------------------------------------------*/
        isDate:function(date,format){
                if(!date) return false;
                if(!format) format = 'FR';
                
                switch(format){
                        case'FR': RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
                        case'US': RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
                        case'SHORTFR': RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
                        case'SHORTUS': RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
                        case'dd MMM yyyy':RegExpformat = /^([0-2]\d|[3][0-1])\s(Jan(vier)?|Fév(rier)?|Mars|Avr(il)?|Mai|Juin|Juil(let)?|Aout|Sep(tembre)?|Oct(obre)?|Nov(ember)?|Dec(embre)?)\s([2][0]|[1][19])\d{2}$/; break;
                        case'MMM dd, yyyy':RegExpformat = /^(J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)\s([0-2]\d|[3][0-1])\,\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);
        },
        /*--------------------------------------------------------------------------*/
        isGuid:function(guid){//guid format : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx or xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                if(!guid) return false;
                GuidRegExp = /^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$/
                return GuidRegExp.test(guid);
        },
        /*--------------------------------------------------------------------------*/
        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);
        },
        /*--------------------------------------------------------------------------*/
        isSSN:function(number){//Social Security Number format : NNN-NN-NNNN
                if(!number) return false;
                ssnRegExp = /^\d{3}-\d{2}-\d{4}$/
                return ssnRegExp.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);
        },
        /*--------------------------------------------------------------------------*/
        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;
        },
        /*--------------------------------------------------------------------------*/
        getValue:function(id){
                document.getElementById(id).value;
        },
        /*--------------------------------------------------------------------------*/
        addRules:function(rules){
                this.rules_array.push(rules);
        },
        /*--------------------------------------------------------------------------*/
        check:function(){
                this.error_array = [];
                for(var i=0;i<this.rules_array.length;i++){
                        switch(this.rules_array[i].option){
                                /*--------------------------------------------------------------------------*/
                                case'ValidChars':
                                        if(!this.hasValidChars(getValue(this.rules_array[i].id),this.rules_array[i].chars,false)){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'AlphaLatin':
                                        if (this.isAlphaLatin(getValue(this.rules_array[i].id))){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'required':
                                        if (this.isEmpty(getValue(this.rules_array[i].id))){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'integerRange':
                                        if (!this.isIntegerInRange(getValue(this.rules_array[i].id),this.rules_array[i].Min,this.rules_array[i].Max)){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'Number':
                                        if (!this.isNum(getValue(this.rules_array[i].id))){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'email':
                                        if (!this.isEMailAddr(getValue(this.rules_array[i].id))){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'zipCode':
                                        if (!this.isZipCode(getValue(this.rules_array[i].id),this.rules_array[i].country)){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'date':
                                        if(!this.isDate(getValue(this.rules_array[i].id),this.rules_array[i].format)){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'url':
                                        if(!this.isURL(getValue(this.rules_array[i].id))){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                                case'Decimal':
                                        if(!this.isDecimal(getValue(this.rules_array[i].id))){
                                                this.error_array.push(this.rules_array[i].error);
                                                this.e = false;
                                        }
                                break;
                                /*--------------------------------------------------------------------------*/
                        }
                }
        },
        /*--------------------------------------------------------------------------*/
        Apply:function(el){
                this.check();
                if(this.e){
                        return true;
                }else{
                        var endMsg = this.error_array;
                        if(!el){
                                alert(this.error_array.toString().replace(/\,/gi,"\n"));
                        }else{
                                document.getElementById(el).innerHTML = this.error_array.toString().replace(/\,/gi,"<br/>");
                        }
                        return false;
                }
        }
        /*--------------------------------------------------------------------------*/
}