/**
* @class Menu
* @package Menu
* @desc Context-aware JS menu for all zim screens - static methods
*/
Zim.Menu.submenu = $A(['Zim','File','Shortcuts','View','Account']);
Zim.Menu.Locations = {'Zim':50,'File':97,'View':187,'Shortcuts':141,'Account':228,'export':97};
Zim.Menu.Width = {'Zim':140,'File':100,'View':140,'Shortcuts':165,'Account':140,'export':140};
Zim.Menu.selectedLists = $A([]);
Zim.Menu.selected = false;
Zim.Menu.focused = false;

Zim.Menu.show=function(selectedMenu) {
    Zim.Menu.active = true;
    if($('friendlynotice')) {
        //$('friendlynotice').style.display = 'none';
    }
    if(selectedMenu == undefined) var selectedMenu = Zim.Menu.selected;
    //console.log(selectedMenu);
    if($(selectedMenu + '_sub').style.display=='none') {
        Zim.Menu.getUnselected(selectedMenu).each(function(unselectedMenuDiv) {
            Zim.Menu.deselect(unselectedMenuDiv);
        });
        Zim.Menu.select(selectedMenu);
    } else {
        //$('submenuContainer').style.height='';
        Zim.Menu.deselect(selectedMenu,true);
    }
};

Zim.Menu.getUnselected=function(selectedMenu){
    if(!selectedMenu) selectedMenu = Zim.Menu.selected;
    return (Zim.Menu.submenu.select(function(menuDiv) {
            return menuDiv != selectedMenu;
        }));
};

Zim.Menu.select=function(div) {
    Zim.Menu.selected = div;
    Zim.Menu.focused = true;
    var title = div;
    $(div + '_sub').style.left = Zim.Menu.Locations[title] + 'px';
    $(div + '_sub').style.width = Zim.Menu.Width[title] + 'px';
    Zim.Menu.onFocus(title);
    $(div + '_sub').style.display = 'inline';
    try { $(div + '_sub').collapse(); } catch(o) {};
    //console.log(title);
    $(title).addClassName('selected');
    $(title).blur();
    $(title).onmouseover=function(){ Zim.Menu.active=true;};
    $(title).onclick=function(){Zim.Menu.show(div); };
    $(title).onmouseout=function(){ Zim.Menu.active=false;$(title).style.cursor='pointer'; };
};

Zim.Menu.onFocus=function(selectedMenu){
    Zim.Menu.getUnselected(selectedMenu).each(function(menu){
        $(menu).onmouseover=function(){Zim.Menu.active=true;Zim.Menu.show(menu); };
        $(menu).onmouseout=function(){ Zim.Menu.active=false;};
        $(menu).onclick = function(){};
        $(menu).style.cursor='default';
    });
}

Zim.Menu.onBlur=function(deselected){
    Zim.Menu.submenu.each(function(div) {
        $(div).onmouseover=function(){ Zim.Menu.active=true;};
        $(div).onclick=function(){Zim.Menu.show(div); };
        $(div).onmouseout=function(){ Zim.Menu.active=false; };
        $(div).style.cursor='pointer';
    });
}

Zim.Menu.onSelectComplete = function() {
    //var div = Zim.Menu.selected;
    //$('title_'+div).onclick = function() { Zim.Menu.show(div); };
}

Zim.Menu.onDeselectComplete=function(div) {
    //$('title_'+div).onclick = function() { Zim.Menu.show(div); };
}

Zim.Menu.deselect=function(div,fade) {
    try {
        if(fade) {
            Effect.Fade(div + '_sub',{duration:.1,from:1.0,to:0.0});
            Zim.Menu.focused = false;
            Zim.Menu.onBlur();
        } else {
            $(div + '_sub').style.display = 'none';       
        }
        $(div).removeClassName('selected');
        $(div).blur();
    } catch(ex){};
};

Zim.Menu.getOption=function(opt) {
    return $(opt);
}

Zim.Menu.setStatus=function(status,level) {
    if(!$('status').hasClassName(level)) $('status').toggleClassName(level);
    $('status').innerHTML = status;
}

Zim.Menu.onSelectList=function(id) {
    if($('check_'+id).checked) {
    Zim.Menu.getOption('delete').enable();
    Zim.Menu.selectedLists.push(id);
    $('list'+id).addClassName('selected');
    } else {
        Zim.Menu.selectedLists = Zim.Menu.selectedLists.reject(function(listID) { return listID == id});
        $('list'+id).removeClassName('selected');
        if(Zim.Menu.selectedLists.size() == 0) {
            Zim.Menu.getOption('delete').disable();
        }
    }
}

/**
* @class MenuItem
* @package Menu
*/
Zim.Menu.MenuItem = function() {};
Zim.Menu.MenuItem.prototype = {
    id:null,
    title:null,
    aOption:[],
    container:'submenuContainer',
    
    hasChildMenu:function(){
        return this.aOption.length;
    },
    
    addOption:function(opt) {
      var oOpt = new Zim.Menu.Option(opt);
      oOpt.submenu = this;
      this.aOption.push(oOpt); 
      return oOpt;
    },
    
    _renderChildMenu:function() {
        var section = document.createElement('div');
        Object.extend(section,this);
        section.title = '';
        section.id = this.id + '_sub';
        section.addClassName('submenu');
        var subContainer = document.createElement('div');
        var contextContainer = document.createElement('ul');
        $A(this.aOption).each(function(oOption,i) {
            contextContainer.appendChild(oOption.render());
        });
        subContainer.appendChild(contextContainer);
        section.appendChild(subContainer);
        var sectionDiv = $(this.container).appendChild(section);
        sectionDiv.style.display='none';
        return section;
    },

};

/**
* @class Submenu
* @package Menu
*/
Zim.Menu.Submenu = function(id,title) { this.id=id;this.title=title;this.aOption=[];};

Zim.Menu.Submenu.prototype = {
    
    onmouseover:function(){
      Zim.Menu.active = true;  
    },
    onmouseout:function(){
      Zim.Menu.active = false;  
    },
    
    render:function() {
            return this._renderChildMenu();
    },
        
    collapse:function(){
        //console.log('collapsing...');
        $A(this.aOption).each(function(oOption,i) {
           $(oOption.id).collapse(); 
        });
    }
};

Object.extend(Zim.Menu.Submenu.prototype,Zim.Menu.MenuItem.prototype);

/**
* @class Option
* @package Menu
*/
Zim.Menu.Option = function(oOptions) { this.id=oOptions.id;this.label=oOptions.title;this.command = oOptions.command,this.aOption = [];};

Zim.Menu.Option.prototype = {
    label:null,
    enabled:false,
    command:null,
    expanded:false,
    submenu:null,
    
    enable:function() {
        this.enabled = true;
        this.style.cursor='pointer';
        this.addClassName('command');
        this.removeClassName('disabled');
        if(this.hasChildMenu()) {
            $A(this.aOption).each(function(oOption) {
                $(oOption.id).enable();
            });
        }
    },
    disable:function() {
        this.enabled = false;
        this.addClassName('disabled');
        this.removeClassName('command');
        this.style.cursor='';
        if(this.hasChildMenu()) {
            /*$A(this.aOption).each(function(oOption) {
                $(oOption.id).disable();
            });*/
        }
    },
    onclick:function() {
        if(this.enabled) {
            Zim.Menu.deselect(Zim.Menu.selected,true);
            this.command.execute();
        }
    },
    setCommand:function(oCommand) {
            this.command = oCommand;
        },
    onmouseover:function(){
      $A(this.submenu.aOption).each(function(oMenuItem){
        if(oMenuItem.hasChildMenu()) oMenuItem.collapse();          
      });
      
      if(this.enabled && this.hasChildMenu()) {
        this.expand();
      }
    },
    onmouseout:function(){
      //if(this.isExpanded()) this.collapse();
    },
    expand:function() {
        this.expanded = true;
        $(this.id + '_sub').style.left =Element.viewportOffset(this)[0] + this.getWidth() + 1 + 'px';
        $(this.id + '_sub').style.top = Element.viewportOffset(this)[1] + 'px';
        $(this.id + '_sub').style.width = Zim.Menu.Width[this.id] + 'px';
        $(this.id + '_sub').style.display = 'inline';
    },
    collapse:function(){
        this.expanded = false;
        if(this.hasChildMenu()) {
            $(this.id + '_sub').style.display = 'none';
        }
    },
    isExpanded:function(){
      return this.expanded;  
    },
    render:function(){
        var oDiv = document.createElement('li');
        Object.extend(oDiv,this);
        oDiv.title = '';
        oDiv.innerHTML = this.label;
        if(!this.enabled) oDiv.disable();
        if(this.hasChildMenu()) {
            oDiv.appendChild(this._renderChildMenu());
            oDiv.addClassName('parent');
        }
        return oDiv;
    }
};

Object.extend(Zim.Menu.Option.prototype,Zim.Menu.MenuItem.prototype);

