var TreeSelect = new Class({
    main_container: null,
    url: null,
    childs: [],
    value: 0,
    value_element: null,
    select_template: null,
    containers:[],
    selects: [],

    initialize: function(main_container, url, after_select){
        this.main_container = main_container;
        this.url = url;
        this.after_select = after_select;
        this.value_element = main_container.getElement('input[type=hidden]');
        this.select_template = main_container.getElement('.template').clone();
        this.select_template.removeClass('template')
        this.select_template.setStyle('display','block');
        this.init_tree();
    },
    set_value: function(item){
        this.value_element.store('item',item)
        this.value_element.value = item.value;
    },
    get_value: function(){
        return this.value_element.value;
    },
    create_item: function(value, text, parent){
        return $H({
                    "value": value,
                    "text": text,
                    "parent": parent,
                    "childs": false
                });
    },
    init_tree: function(){
        //строим дерево значений по уже существующим элементам
        var parent = this;
        this.main_container.getElements('.select_container').each(function(container){
            if(container.hasClass('template')) return;
            this.containers.push(container);
            var select = container.getElement('select');
            this.selects.push(select);
            var selected = null;
            parent.childs = [];
            select.getElements('option').each(function(option){
                var item = this.create_item(
                             option.value, option.get('html'), parent);
                parent.childs.push(item);
                if(option.selected){
                    selected = item;  
                }
            }.bind(this));
            this.add_events(container, select, parent);
            parent = selected;
        }.bind(this));
    },
    add_events: function(container, select, item){
        select.addEvent('change', function(ev){
           var new_value = ev.target.value;
           //уничтожаем все контейнеры ниже выбранного
           var last_index = this.containers.indexOf(container);
           for(x=this.containers.length-1;x>last_index;x--){
                  this.containers[x].destroy();
                  this.containers.pop();
                  this.selects.pop();
           }
           if(new_value=="0"){
               this.set_value(item);
               if(this.after_select)
                   this.after_select(this)
               return;
           }
           // получаем выбранного ребенка
           var child = item.childs.filter(function(child){
                  return child.value==new_value;
           })[0];
           this.set_value(child);
           if(child.childs){
               // дети загружены 
               this.create_select(child)
               if(this.after_select)
                   this.after_select(this)
           }else{
               // дети не загружены
               this.load_childs(child)
           }
        }.bind(this));
    },
    disable: function(){
        $$(this.selects).set('disabled', true);
    },
    enable: function(){
        $$(this.selects).set('disabled', false);
    },
    create_select: function(item){
        if(!(item.childs&&item.childs.length)) return;
        var container = this.select_template.clone();
        var select = container.getElement('select');
        item.childs.each(function(child, index){
            Element('option', {'value': child.value, 
                                 'html': child.text}).inject(select);
        });
        container.inject(this.containers.getLast(), 'after'); 
        this.containers.push(container);
        this.selects.push(select);
        this.add_events(container, select, item);
    },
    load_childs: function(parent){
        this.disable();
        var jsonRequest = new Request.JSON({
                url: this.url+parent.value+"/",
                onSuccess: function(response){
                    parent.childs = [];
                    response.childs.each(function(child){
                        var item = this.create_item(
                                                  child[0], child[1], parent);
                        parent.childs.push(item);
                    }.bind(this));
                    this.create_select(parent);
                    if(this.after_select)
                        this.after_select(this)
                    this.enable();
                }.bind(this),
                onFailure: function(err){alert(err.status);}
        }).get({"ajax":1}); //ajax=1 only for cashing    
    }
})


var Verifyer = new Class({
    ok_message: "",
    initialize: function(el, message, tests){
        this.el = el;
        this.message = message;
        this.tests = tests;
    },
    verify: function(){
        var ok=1;
        for(var x=0; x<this.tests.length;x++){
            var err_message = this.tests[x](this.el);
            if(err_message){
                this.set_error_message(err_message);
                ok=0;
                break;
            }
        }
        if(ok){
            this.set_ok_message(this.ok_message);
        }
        return ok;
    },
    set_ok_message: function(message){
        this.message.removeClass('err_message');
        this.message.addClass('ok_message');
        this.message.innerHTML = message;        
    },
    set_error_message: function(message){
        this.message.removeClass('ok_message');
        this.message.addClass('err_message');
        this.message.innerHTML = message;
    }
});
 

function set_verifyers(ids, events, tests){
    ids.each(function(id){
        var el = $(id);
        var message = $(id+'-message');
        el.verifyer = new Verifyer(el, message, tests);
        events.each(function(event){
            el.addEvent(event, function(e){
                el.verifyer.verify();
            });
        }.bind(this));
    }.bind(this));
}

function set_verifyers_by_name(names, events, tests){
    names.each(function(name){
        $$("[name="+name+"]").each(function(el){
            var message = $(el.id+'-message');
            el.verifyer = new Verifyer(el, message, tests);
            events.each(function(event){
                el.addEvent(event, function(e){
                    el.verifyer.verify();
                });
            }.bind(this));
        }.bind(this));
    }.bind(this));
}



function test_length(min, max){
    return function(el){
        var value = el.value;
        if(value.length>max||value.length<min){
            return "Текст должен содержать от "+min+" до "+max+" символов";
        }
        return 0;
    }
}

function test_selected(el){
    var value = el.value;
    if(value=="0"){
        return "Поле обязательно для заполнения";
    }
    return 0;
}

function test_section(el){
    var value = el.value;
    var item = el.retrieve('item', item);
    if(item.childs.length){
       if(item.parent)
           return "Выберите подтему"
       else
           return "Выберите тему";
    }
    return 0;
}

function test_region(el){
   var value = el.value;
    if(value=="0"){
        return "Выберите регион";
    }
    return 0;
}
function test_post_office(el){
    var value = el.value;
    var pattern = /[0-9]$/;
    if(value && (value.length!=6 || !pattern.test(value)))
        return "Введите правильный индекс";
    return 0;
}

function test_checked(el){
    var els = $$("[name="+el.name+"]");
    for(var x=0;x<els.length;x++){
        if(els[x].checked)
            return 0;
    }
    return "Поле обязательно для заполнения";
}

function test_email(el){
    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}$/; 
    if(emailPattern.test(el.value))
        return 0;
    else
        return "Введите правильный email";
}

window.addEvent('domready', function(){
    if($('maincontainer-section')){
      new TreeSelect($('maincontainer-section'), prefix + '/mail/themes/',
          function(field){
             field.value_element.verifyer.verify();
          }
      );
    }
    if($('maincontainer-region')){
      new TreeSelect($('maincontainer-region'), prefix + '/mail/regions/',
           function(field){
             if(field.value_element.verifyer)
                 field.value_element.verifyer.verify();
          }   
      );
    }
});

window.addEvent('domready', function(){
    if(!$('maincontainer-section'))
        return; 
    $$('.letters-alert-a').addEvent('click', function(e){
        e.stop()
        $('field-' + e.target.href.substr(e.target.href.lastIndexOf("#")+1)).focus();
    });
    set_verifyers(
        ['field-surname', 'field-firstname','field-middlename',
                                          'field-address', 'field-question'],
        ["keyup","click",'change'],[test_length(3, 255)]
    );
    set_verifyers(
        ['field-question'],["keyup","click","change"],[test_length(3, 5000)]
    ); 
    set_verifyers(['field-citizenship', 'field-social'],
            ["click","keyup","change"],[test_selected]
    );
    set_verifyers(['input-section'],[],[test_section]); 
    set_verifyers_by_name(['sex','rep'], ["click"],[test_checked]) ;
    set_verifyers(['field-email'],["keyup","click"],
             [test_length(3, 255), test_email]);
    set_verifyers(['input-region'],[],[test_region]);
    set_verifyers(['field-post_office'],["keyup","click"],[test_post_office]);

    var add_file_link = $('form_add_file');
    if(add_file_link){
        add_file_link.addEvent('click', function(ev){
            ev.stop()
            var tr = new Element('tr');
            var td = new Element('td');
            td.inject(tr);
            var file_field = new Element('input',
                            {"type":"file",
                            "class":"w90 FieldInitial status255 filefield"});
            var del_link = new Element('a', {"href":"#","html":"Удалить"});
            del_link.addEvent('click', function(e){
                e.stop();
                tr.destroy();
                file_fields_set_names();
            });
            file_field.inject(td);
            del_link.inject(td);
            tr.inject(add_file_link, "before");
            file_fields_set_names();
        });
    }
});

function file_fields_set_names(){
    var add_file_link = $('form_add_file');
    $$('.filefield').each(function(el, index){
        el.set('name','file'+(index+1)+'-body');
    });
    if($$('.filefield').length<5){
        add_file_link.setStyle('display','inline');
    }else{
        add_file_link.setStyle('display','none');
    }
}

