function Menu(titleElm, descrElm){
    titleElm._dd = descrElm;
    
    function toggleItem(dt){
        if(dt._isToggling){
            return;
        }
        dt._isToggling = true;
        dt.toggleClassName('selected');
        Effect.toggle(dt._dd, 'slide', {
            duration: 0.5,
            afterFinish: function(){
                dt._isToggling = false;
            }
        });
    }
    
    titleElm.observe('click', function(e){
        toggleItem(this);
        e.stop();
    });
    
    titleElm.toggleMenu = toggleItem.bind(null, titleElm);
}

Menu.setup = function(container){
    var container = $(container);
    var dts = container.select('dt');
    var dds = container.select('dd');
    
    dts.each(function(dt, index){
        if(!dt._menuSet){
            new Menu(dt, dds[index]);
            dt._menuSet = true;
        }
    });
}

function Feedback(form){
    
    var form = $(form);
    var formId = form.identify();
    
    Feedback._instances = Feedback._instances || {};
    
    if(Feedback._instances[formId]){
        return Feedback._instances[formId];
    }
    
    var inp = $(form.message);
    var sbm = $(form).select('.fdk-sbm').first();
    var notice = $$('.fdk-msg').first();
    
    var tip = "Type your message here.\n\nPlease don't forget to leave your email to get reply back.";
    var confirmation = 'Thank you. Your feedback is appreciated. <a href="#send-another-feedback" onclick="(new Feedback(document.fdk)).reset();return false;">Send another</a>';
    
    function eq(str1, str2){
        return String(str1).strip().replace(/\r/ig, '') == String(str2).strip().replace(/\r/ig, '');
    }
    
    function check(){
        var message = inp.value.strip();
        if(eq(message, '') || eq(message, tip)){
            sbm.disabled = true;
            sbm.className = 'fdk-sbm inactive';
        }else{
            sbm.disabled = false;
            sbm.className = 'fdk-sbm';
        }
    }
    
    function notify(message, cls){
        var cls = cls || '';
        notice.className = 'fdk-msg ' + cls;
        notice.update(message);
        notice.show();
    }
    
    inp.observe('keyup', check);
    
    inp.observe('focus', function(e){
        if(eq(this.value, tip)){
            this.value = '';
        }
    });
    
    inp.observe('blur', function(e){
        if(eq(this.value, '')){
            this.value = tip;
        }
    });
    
    inp.value = tip;
    check();
    
    /*----- methods -----*/
    
    this.send = function(){
        
        var ua = navigator.userAgent;
        var message = form.message.value.strip();
        
        if(message){
            new Effect.BlindUp(form, {
                duration:0.5,
                afterFinish: notify.bind(null, confirmation)
            });
            new Ajax.Request('/feedback', {
                method: 'post',
                parameters: {
                    message: message,
                    ua: navigator.userAgent.toString()
                }
            });
        }
    }
    
    this.reset = function(){
        notice.hide();
        inp.value = tip;
        check();
        new Effect.BlindDown(form, {duration:0.5});
    }
    
    Feedback._instances[formId] = this;
}


/*------ register all events ------*/

Event.observe(document, 'dom:loaded', function(){
    Menu.setup($$('.nav')[0]);
    new Feedback(document.fdk);
});
