var Validation = new Class({
    //Implements: [Chain, Events, Options],
    options: {
        result: "Nejsou vyplněny následujicí údaje:\n\n",
        require_items : [],
        regexp_fnc : false,
        errors: [] // errors 
    },
    initialize: function (ri_array) {
        this.init_require(ri_array);   
    },
    init_require: function(ri_array){
        //console.log(ri_array);
        if(ri_array){ 
         //  ri_array = JSON.decode(ri_array);
                 
           if(ri_array.length > 1){ 
              this.options.require_items.empty(); 
              this.options.require_items = this.options.require_items.concat(ri_array);
           } 
       }
    },
    makeResultMsg: function (name){
        if(!name)
            return this.options.result + this.options.errors.join("\n");
        else
            return name + "\n" + this.options.result + this.options.errors.join("\n");
    },
    set_validation: function (val_array){
        this.options.regexp_fnc = true;
        this.validation_setting = val_array;//JSON.decode(val_array);
    },
    result_condition: function (condition){
        switch(condition.type){
             case 'checked':
                if($(condition.id).checked){ return true;}
            break;
        } 
        return false;                    
    },
    set_stars: function (id_box){
    //add red star to labels of required elements
        var el = $(id_box);
        Array.each(el.getElements('input[type=text],input[type=password],input[type=checkbox],select,textarea'),function(item){
            key = item.id.replace(/(Client|Address|ReferatyUser|ReferatyZakazky|CmsUser|Zprava)|/g,"").underScore2();
            var label = '';
            if(item.getPrevious('label'))
                label = item.getPrevious('label').get('html').replace(":","");
            if(this.options.require_items.contains(key)){
                if(label != ''){
                    item.getPrevious('label').setProperty('html', item.getPrevious('label').getProperty('html') + ' <span class="require">*</span>');
                }
            }
        }, this);
    },
    validate: function(id_box,name){
        var el = $(id_box);
        var validate_next = true;
        this.options.errors.empty();
        
        Array.each(el.getElements('input[type=text],input[type=password],input[type=checkbox],select,textarea'),function(item){
            key = item.id.replace(/(Client|Address|ReferatyUser|ReferatyZakazky|CmsUser|Zprava)|/g,"").underScore2();
            var label = '';
            //nastaveni label pro alert
            if(item.getPrevious('label')){
                  label = item.getPrevious('label').get('html').replace(":","");
                  label = label.stripTags() ;
            }
            if(this.options.require_items.contains(key) && (item.value == '' || item.value == 0)){
                if(label != ''){this.options.errors.push(' - '+label);}
            }
            else if(this.options.regexp_fnc === true && Object.keys(this.validation_setting).contains(key)){
               
                validate_data = this.validation_setting[key];
                if(typeOf(validate_data) == 'object'){validate_data = Array(validate_data);}

                Object.each(validate_data,function(obj){
                    /**
                     * Zapracovani condition, tzn validujeme pouze za nejake podminky
                     */
                    if(obj.condition){
                        if(this.result_condition(obj.condition) == false){ validate_next = false;}
                    }
                    
                    if(validate_next == true){
                        switch(obj.type){
                           case 'require':
                                if(item.value == ''){
                                    this.options.errors.push(' - '+label);
                                    validate_next = false;
                                }
                            break;
                            case 'equals':
                                if(item.value != $(obj.value).value){
                                     label2 = $(obj.value).getPrevious('label').get('html').replace(":","");
                                     label2 = label2.stripTags();
                                     this.options.errors.push(' - '+label+' se neshoduje s '+label2);
                                     validate_next = false;
                                }
                            break;
                            case 'validate':
                                if(item.value.test(obj.value) == false){
                                    this.options.errors.push(' - '+label+' je špatně vyplněno');
                                    validate_next = false;
                                }
                            break;
                        }
                    }
                },this)
                validate_next = true;
            }
        },this)
        
        
        if(this.options.errors.length < 1){
            return true;
        }
        else
            return this.makeResultMsg(name);
    }
});
