

var VN_Validator = Class.create();



VN_Validator.prototype = {



    initialize : function(formId, onSubmitCallback) {



        if ($(formId))

        {

            this._formName            = formId;

            this._form                 = $(formId);

            this._onSubmitCallback  = true;//onSubmitCallback;



            this.refresh();



            this._errorTexts = new Array();

            this._validRules = new Array();



            this._ajaxEmailUniqCheckerUrl = '';



            this.addErrorText('', 'form-email', 'Nieprawidłowy format!(E-mail)');

            this.addErrorText('', 'form-unique', 'Ten email jest już używany w systemie');

            this.addErrorText('', 'form-zip-code', 'Nieprawidłowy format');

            this.addErrorText('', 'form-required', 'Proszę wypełnić pole');

            this.addErrorText('', 'form-textonly', 'Niepoprawny format!');

            this.addErrorText('', 'form-phone', 'Niepoprawny format!(Telefon)');

            this.addErrorText('', 'form-postal-code', 'Niepoprawny format! Przykład XX-XXX');

            this.addErrorText('', 'form-check-string', 'Niepoprawny format!');

            this.addErrorText('', 'form-pass-check', 'Hasło musi mieć min. 6 znaków, w tym cyfrę, małą i wielką literę.');

            this.addErrorText('', 'form-pass-confirm', 'Niezgodne hasło!');

            this.addErrorText('', 'form-zip-code', 'Nieprawidłowy kod pocztowy! Kod pocztowy powinien być w formacie XX-XXX');

            this.addErrorText('', 'form-url', 'Nieprawidłowy adres www!');

            //fax uzywa tego co form-phone, zmieniany tylko komunikat

            this.addErrorText('', 'form-fax', 'Nieprawidłowy fax!');

            this.addErrorText('', 'form-nip', 'Nieprawidłowy NIP! Prawidłowy format to XXX-XX-XX-XXX');

            this.addErrorText('', 'form-checkbox-required', 'Wymagane zaznaczenie!');

            this.addErrorText('', 'form-select-required', 'Proszę wybrać pole z listy!');

         //   this.addErrorText('', 'form-nip', 'Nieprawidłowy format. Format poprawny: (XXX-XX-XX-XXX) np. 676-01-05-127');

            this.addErrorText('', 'form-check-int', 'Nieprawidłowy format.');

            this.addErrorText('', 'form-one-contact', 'Proszę wypełnić pole e-mail lub telefon');

            this.addErrorText('', 'form-check-deal-number', 'Nieprawidłowy numer umowy!');



        }

    },



    refresh : function() {

 //   console.log(this._form.getElements());

        this._elements             = this._form.getElements();

        this._elementsCount        = this._elements.length;



        if (typeof beforeValid == 'undefined') {

            this._beforeValid          = function() {return true;};

        } else {

            this._beforeValid          = beforeValid;

        }

        this._form.onsubmit     = this._validateForm.bind(this);



        this._setValidation();

    },



    addErrorText : function(elmName, validOption, errorText) {



        this._errorTexts[elmName + '_' + validOption] = errorText;

    },



    addValidRule : function(elmName, validOption, rule) {



        this._validRules[elmName + '_' + validOption] = rule;

    },



    _getValidRule : function(elmName, validOption, notFound) {



        var result = notFound;



        if (this._validRules[elmName + '_' + validOption]) {



            result = this._validRules[elmName + '_' + validOption];

        }



        return result;

    },



    _getErrorText : function(elmName, validOption) {



        var result = 'Error!';

        if (this._errorTexts[elmName + '_' + validOption]) {

            result = this._errorTexts[elmName + '_' + validOption];

        } else if (this._errorTexts['_' + validOption]) {

            if(validOption == 'form-required' && $(elmName) && $(elmName).readAttribute('title')) {

                result = $(elmName).readAttribute('title');

            } else {

                result = this._errorTexts['_' + validOption];

            }

        } else if ($(elmName) && $(elmName).readAttribute('title')){

            result = $(elmName).readAttribute('title');

        }





        return result;

    },



    _showCustomError : function(customErrorId, errorValue) {



        $(customErrorId).update(errorValue);

        new Effect.Appear(customErrorId);

    },



    _hideCustomError : function(customErrorId) {



        $(customErrorId).update(errorValue);

        new Effect.Fade(customErrorId);

    },



    _validateForm : function() {



        if (this._beforeValid() == false) {



            return false;

        }



        var result     = true;

        var tmp     = true;



        var selectId = -1;



        for (var i = 0 ; i < this._elementsCount ; i++) {



            if (this._elements[i]) {



                if (this._elements[i].id != 'cancel_button' && this._elements[i].id != 'submit_button') {



                    if (this._validateElement(this._elements[i]) == false) {



                        if (selectId == -1) { selectId = i; }



                        tmp = false;

                    }

                }

            }

        }



        if (tmp) {



            if (Element.hasClassName(this._form, 'email-to-friend')) {

              this._SendEmailForm();

          }

          else

              if (Element.hasClassName(this._form, 'arange_viewing')) {

                    this._SendEmailArangeForm();

              }

                else {

                    //return this._onSubmitCallback();

                    return this._onSubmitCallback;

                }



//                if (this._formName == 'email-to-friend') this._SendEmailForm();

//                else

//                    return this._onSubmitCallback();



        } else {



            if (selectId >= 0) {

                //pp ponizsza linika

        //pp        if (this._elements[selectId].id == 'VALID_PHONE'){this._elements[selectId -3].activate();} else

            this._elements[selectId].activate();



            }

        }



        return false;

    },



    _setValidation : function() {



        this._elements.each( function(el) {



                if (el.id != 'cancel_button' && el.id != 'submit_button') {



                    var extObj = Object.extend({



                            element  : el,

                            validObj : this



                        }, {});



                    el.onblur  = function (e) {



                        if (typeof e == 'undefined' || typeof e.explicitOriginalTarget == 'undefined') {



                            var checkButton = document.activeElement;



                        } else {



                            var checkButton = e.explicitOriginalTarget;

                        }





                        if (checkButton && checkButton.id != 'cancel_button' && checkButton.id != 'submit_button') {



                            this.validObj._validateElement(this.element);

                        }



                        return true;



                    }.bind(extObj);

                }

            }.bind(this)



        );

    },



    _validateElement : function(el) {



        var errors             = '';



        if (el.className != '') {



            var classes         = $w(el.className);

            var classesCount     = classes.length;

            var test             = true;



            for (i = 0 ; i < classesCount ; i++) {



                switch (classes[i]) {

                    case 'form-nip':

                        if (!this._valideNip(el.value)) { test = false; };

                        break;

                    case 'form-timestart':

                        if (!this._valideTimeArticle(el.value)) { test = false; };

                        break;

                    case 'form-url':

                        if (!this._valideUrl(el.value)) { test = false; };

                        break;

                    case 'form-datastart':

                        if (!this._valideDataArticle(el.value)) { test = false; };

                        break;

                    case 'form-postal-code':

                        if (!this._validePostalCode(el.value)) { test = false; };

                        break;

                    case 'form-pass-check':

                        if (!this._validePassCheck(el.value)) { test = false; };

                        break;

                    case 'form-textonly':

                        if (!this._valideText(el.value)) { test = false; };

                        break;

                    case 'form-required':

                        if (el.value == '') { test = false; };

                        break;

                    case 'form-checkbox-required':

                        if (!el.checked) { test = false; };

                        break;

                    case 'form-select-required':

                        if (el.value == '') { test = false; };

                        break;

                    case 'form-pass-confirm':

                        if (!this._validPassConfirm(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };

                        break;



                    case 'form-email':

                        if (!this._validEmail(el.value)) { test = false; };

                        break;



                    case 'form-nip':

                        if (!this._validNip(el.value)) { test = false; };

                        break;



                    case 'form-code-check':

                        if (!this._validCode(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };

                        break;



                    case 'form-unique':

                        if (!this._validUnique(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };

                        break;



                    case 'form-check-correct':

                        if (!this._validCheckCorrect(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };

                        break;



                    case 'form-length-min':

                        if (!this._validStringLenMin(el.value, this._getValidRule(el.name, classes[i], 0))) { test = false; };

                        break;



                    case 'form-length-max':

                        if (!this._validStringLenMax(el.value, this._getValidRule(el.name, classes[i], 10))) { test = false; };

                        break;



                    case 'form-length':

                        if (!this._validStringLen(el.value, this._getValidRule(el.name, classes[i], 1))) { test = false; };

                        break;



                    case 'form-min':

                        if (!this._validFloatMin(el.value, this._getValidRule(el.name, classes[i], 1))) { test = false; };

                        break;



                    case 'form-max':

                        if (!this._validFloatMax(el.value, this._getValidRule(el.name, classes[i], 1))) { test = false; };

                        break;



                    case 'form-phone':

                        if (!this._validePhone(el.value)) { test = false; };

                        break;



                    case 'form-fax':

                        if (!this._validePhone(el.value)) { test = false; };

                        break;



                    case 'form-zip-code':

                        if (!this._valideZipCode(el.value)) { test = false; };

                        break;



                    case 'form-check-year':

                        if (!this._valideYear(el.value)) { test = false; };

                        break;



                    case 'form-check-month':

                        if (!this._valideMonth(el.value)) { test = false; };

                        break;



                    case 'form-check-day':

                        if (!this._valideDay(el.value)) { test = false; };

                        break;



                    case 'form-check-int':

                        if (!this._valideInt(el.value)) { test = false; };

                        break;



                    case 'form-check-string':

                        if (!this._valideString(el.value)) { test = false; };

                        break;

                   case 'form-one-contact':

                         if (!this._valideOneContact(el.value)) { test = false; };

                        break;

                   case 'form-check-deal-number':      

                        if (!this._valideDealNumber(el.value)) { test = false; };

                        break;   



                }



                if (test === false) {



                    errors = this._getErrorText(el.name, classes[i]);





                    test = true;

                    break;

                }

            }



if ((Element.hasClassName(this._form, 'email-to-friend') || Element.hasClassName(this._form, 'arange_viewing')) && errors !='') alert (errors);

        else

            this._showError(el, errors);

        }



        return (errors == '') ? true : false;

    },



    _getElementId : function(el) {



        return el.id ? el.id : el.name;

    },



    _showError : function(el, errors) {



        var errorId = this._getElementId(el);



        var oldErrors = $('validator-error-' + errorId) ? $('validator-error-' + errorId).innerHTML : '';



        if (errors != '' && oldErrors.capitalize() != errors.capitalize()) {



            if ($('validator-error-' + errorId)) {



                $('validator-error-' + errorId).update(errors);

            } else {



                var advice = '<span class="error" style="display: block;" id="validator-error-' + errorId + '">' + errors + '</span>';



                if(el.type == 'checkbox') {

                    //new Insertion.After(el.nextSiblings()[0], advice);

                    new Insertion.After(el, advice);

                } else {

                    new Insertion.After(el, advice);

                }

            }



        } else if (errors == '') {



            this._removeError(el);

        }

    },



    _removeError : function(el) {



        var errorId = this._getElementId(el);

        var error     = $('validator-error-' + errorId);



        if (error) {



            error.remove();

        }

    },



    _validPassConfirm : function(pass, passConfirm) {



        var result = false;



        if (pass == $(passConfirm).value) {



            result = true;

        }



        return result;

    },



    _validCheckCorrect : function(checkFild, url) {



        this._validCorrectResult = false;



        if (url != false) {



            var query = '?checkFild=' + checkFild;



            new Ajax.Request(

                url,

                {

                    asynchronous     : false,

                    method            : 'POST',

                      parameters        : query,

                    onComplete        : function (req) {



                        if (req.responseText == '1') {



                            this._validCorrectResult = true;

                        } else {



                            this._validCorrectResult = false;

                        }



                    }.bind(this)

                }

            )

        }

        return this._validCorrectResult;

    },



    _validUnique : function(checkFild, url) {



        this._validUniqueResult = false;



        if (url != false) {



            var query = '?checkFild=' + checkFild;



            new Ajax.Request(

                url,

                {

                    asynchronous     : false,

                    method            : 'POST',

                      parameters        : query,

                    onComplete        : function (req) {



                        if (req.responseText == '1') {



                            this._validUniqueResult = true;

                        } else {



                            this._validUniqueResult = false;

                        }



                    }.bind(this)

                }

            )

        }

        return this._validUniqueResult;

     },



    _validCode    : function(code, url) {



        this._validCodeResult = false;



        if (url != false) {



            var query = '?codeDec=' + code;



            new Ajax.Request(

                url,

                {

                    asynchronous     : false,

                    method            : 'POST',

                      parameters        : query,

                    onComplete        : function (req) {



                        if (req.responseText.substr(0,1) == '1') {



                            this._validCodeResult = true;

                        } else {



                            this._validCodeResult = false;

                        }

                    }.bind(this)

                }

            );

        }

        return this._validCodeResult;

    },



    _valideUrl: function(valUrl) {

        var result = false;

        //validation url

        var filtr = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;

        if (filtr.test(valUrl)) {

            result = true;

        }

        return result;

    },



    _validEmail    : function(email) {

        if (email == '') return true;



        var result = false;



        if (email.match(/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/) != null) {



            result = true;

        }



        return result;

    },





    _validNip          : function(nip) {



        var result = false;



        if (nip.match(/^[0-9]{3}-[0-9]{2}-[0-9]{2}-[0-9]{3}$/) != null) {



            result = true;

        }



        return result;

    },





    _validStringLen : function(string, len) {



        return (string.length == len) ? true : false;

    },



    _validStringLenMin : function(string, minLen) {



        return (string.length >= minLen) ? true : false;

    },



    _validStringLenMax : function(string, maxLen) {



        return (string.length <= maxLen) ? true : false;

    },



    _validFloatMin : function(floatVar, min) {



        return (floatVar >= min) ? true : false;

    },



    _validFloatMax : function(floatVar, max) {



        return (floatVar <= max) ? true : false;

    },



    _validePhone : function(number) {



        if (number == '' ) return true;

        var result = false;

        var filtr = /^\+?([0-9\- \ ]{7,})+$/;

        if (filtr.test(number)) {result = true; if ($('validator-error-VALID_PHONE'))$('validator-error-VALID_PHONE').remove()};

        return result;



    },





    _valideZipCode : function(zipCode) {



        var result = false;



        if (zipCode == '' || zipCode.match(/\d\d\-?\d\d\d$/) != null) {

    //    if (zipCode == '' || zipCode.match(/^([0-9\-\ ]{1,})+$/) != null) {

            result = true;

        }

        return result;

    },







        _valideYear : function(number) {

            if (number == '' ) return true;

            var result = false;

            var filtr = /^([0-9\.]{4,4})+$/;

            var filtr1= /^([\.]{1,4})+$/;

            if (filtr.test(number)  || filtr1.test(number)) {

                if (parseInt(number) > 1900 || filtr1.test(number)) result = true;

            }

            return result;

        },



        _valideMonth : function(number) {

            if (number == '' ) return true;

            var result = false;

            var filtr = /^([0-9\.]{1,2})+$/;

            if (filtr.test(number)) {

                if (parseInt(number) > 0 && parseInt(number)< 13)    result = true;

            }

            return result;

        },





        _valideDay : function(number) {

        if (number == '') return true;

            var result = false;

            var filtr = /^([0-9]{1,2})+$/;

            if ( filtr.test(number)) {

                if (parseInt(number) > 0 && parseInt(number)< 32) result = true;

            }

            return result;

        },





        _valideInt : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^([0-9]{1,})+$/;

            if (filtr.test(number)) {

                result = true;

            }

            return result;

        },





            _valideString : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^([^0-9]{2,})+$/;

            if (number == '' || filtr.test(number)) {

                result = true;

            }

            return result;

        },





        _SendEmailForm: function(){

            var url = '/forms/sendmailtofriend/';



            var div = Element.up(this._form , 'div');

            Element.hide(div);

            var preload = Element.previous(div , 'div.preload');

            Element.show(preload);



            new Ajax.Request(

                url,

                {

                    asynchronous     : false,

                    method              : 'POST',

              parameters        : Form.serialize(this._form),

                    onComplete        : function (req) {



                    Element.hide(preload);



                    if (req.responseText.substr(0,1) == '1') {

                            Form.reset(this._form);

                            //Element.hide(Element.down(this._form , 'p.send_error'));

                            //Element.show(Element.down(this._form , 'p.send_status'));

                            $('info_send').show();

                            $('send_error').hide();

                            $('send_status').show();

                            $('show_info').hide();

                        } else {

                            $('info_send').show();

                            $('send_error').show();

                            $('send_status').hide();

                            $('show_info').hide();

                            //Element.hide(Element.down(this._form , 'p.send_status'));

                            //Element.show(Element.down(this._form , 'p.send_error'));

                        }



                        setTimeout( function() {

                            Element.show(div);

                        }.bind(this), 2000);

                        return false;

                }.bind(this)

                });

                return false;

        },



        _valideNip: function(nip) {

            var result = false;

            var filtr = /^[0-9]{3}-[0-9]{2}-[0-9]{2}-[0-9]{3}$/;

            if (filtr.test(nip)) result = true;



            return result;

        },



        _SendEmailArangeForm: function(){



            var url = '/forms/sendmailarange/';



            var div = Element.up(this._form , 'div');

            Element.hide(div);

            var preload = Element.previous(div , 'div.preload');

            Element.show(preload);



            new Ajax.Request(

                url,

                {

                    asynchronous     : false,

                    method              : 'POST',

              parameters        : Form.serialize(this._form),

                    onComplete        : function (req) {



                    Element.hide(preload);



                    if (req.responseText.substr(0,1) == '1') {

                        $('info_send').show();

                        $('send_error').hide();

                        $('send_status').show();

                        Form.reset(this._form);

                    //    Element.hide(Element.down(this._form , 'div.show_info'));

                        $('show_info_a').hide();



                        //Element.hide(Element.down(this._form , 'p.send_error_a'));

                        //Element.show(Element.down(this._form , 'p.send_status_a'));



                    } else {

                        //Element.hide(Element.down(this._form , 'p.send_status_a'));

                        //Element.show(Element.down(this._form , 'p.send_error_a'));

                        $('info_send').show();

                        $('show_info_a').hide();

                        $('send_error').show();

                        $('send_status').hide();

                    }

                    setTimeout( function() {

                        Element.show(div);

                    }.bind(this), 2000);

                    return false;

                }.bind(this)

                });

                return false;

        },



            _valideStringNr : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^[a-zA-Z0-9\s]+$/;

            if (number == '' || filtr.test(number)) {

                result = true;

               }

            return result;

            },



            _valideText : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^[^0-9]{2,}$/;

            if (filtr.test(number)) {

                result = true;

               }

            return result;

            },



            _validePassCheck : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr1 = /^(\w*(?=\w*\d)(?=\w*[a-z])\w*)$/;

            var filtr2 = /.{6,}/;

            if (filtr1.test(number) && filtr2.test(number)) {

                result = true;

               }

            return result;

            },



            _validePostalCode : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^[0-9\-]{5,6}$/;

            if (filtr.test(number)) {

                result = true;

               }

            return result;

            },



            _valideDataArticle : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/;

            if (filtr.test(number)) {

                result = true;

               }

            return result;

            },



            _valideTimeArticle : function(number) {

            if (number == '') return true;

            var result = false;

            var filtr = /^[0-9]{2}:[0-9]{2}$/;

            if (filtr.test(number)) {

                result = true;

               }

            return result;

            },

            

            _valideOneContact : function(number){         

            var result = false;	

            if ($F('email') != '' || $F('phone') !=''){										

            	result = true;

            }	

            return result;

            },

             

            _valideDealNumber : function (number){

              if (number == '') return true;

              var result = false;

              var filtr = /^\s{0,}[a-zA-Z]{1}[0-9]{4}\s{0,}\/\s{0,}[a-zA-Z]{1}[0-9]{3}\s{0,}$/;

              if (filtr.test(number)) result = true;

            return result;

            

            }

             

            

            

}

