/**
 * @author jwhitcraft
 */
Ext.namespace("Ext.ux.TalkbackMenuManager");

Ext.ux.TalkbackMenuManager = function() {
    this.menus = new Array();

    this.active = false;

    this.activemenu = null;

    this.addEvents({
        "menuRegistered": true
    })
}

Ext.extend(Ext.ux.TalkbackMenuManager, Ext.util.Observable,{
    activate : function(active) {
        this.active = active;
    },
    register : function(controlkey) {
        //this.menus.add(controlkey,new Ext.ux.TalkbackMenu(controlkey));
        this.menus[controlkey] = new Ext.ux.TalkbackMenu(controlkey);
        this.fireEvent("menuRegistered",controlkey);
    },
    hide : function(e) {
        if(this.activemenu != null) {
            this.menus[this.activemenu].hide(e);
        }
    }
});


function talkbackMenuHide(e) {
    if(e && e.button & e.button != 1 && e.type == "click") {
        return false;
    } else {
        talkbackMenu.hide(e);
    }
}

var talkbackMenu = new Ext.ux.TalkbackMenuManager();
Ext.EventManager.onWindowResize(talkbackMenuHide),
Ext.get(document).on("click",talkbackMenuHide);
talkbackMenu.activate(true);


Ext.ux.TalkbackMenu = function(controlkey) {
    this.controlkey = controlkey;
    this.menuname =this.controlkey+"_menu";

    this.initControl();

    if(Ext.fly(this.menuname)) {
        this.initMenu();
    }
}

Ext.extend(Ext.ux.TalkbackMenu,Ext.util.Observable,{
    initControl: function() {
        this.controlobj = Ext.get(this.controlkey);

        var space = document.createTextNode(' ');
        this.controlobj.dom.appendChild(space);
        this.controlobj.createChild({tag:"img", src:"/images/talkback/menu_open.gif", height: "7", width: "11"},false,false);

        this.controlobj.on("click",this.onClick,this,{stopEvent: true});
        this.controlobj.on("mouseover",this.onHover,this,{stopEvent: true});
    },
    initMenu : function() {
        this.menuobj = Ext.get(this.menuname);

        if(this.menuobj && !this.menuobj.initialized) {
            this.menuobj.initialized = true;
        }
    },
    onHover : function(e,el) {
        if(talkbackMenu.activemenu != null) {
            if(talkbackMenu.menus[talkbackMenu.activemenu].controlkey != this.controlkey) {
                this.show(true);
            }
        }
    },
    onClick : function(e,el) {
        if(talkbackMenu.activemenu == null || talkbackMenu.menus[talkbackMenu.activemenu].controlkey != this.controlkey) {
            talkbackMenu.menus[this.controlkey].show();
        } else {
            talkbackMenu.menus[this.controlkey].hide();
        }
    },
    hide : function(e) {
        if(e && e.button && e.button != 1) {
            return false;
        }

        if(e && e.within(this.menuobj)) {
            return false;
        }

        this.menuobj.hide();

        talkbackMenu.activemenu = null;

    },
    show : function(instant) {
        if(!talkbackMenu.active) {
            return false;
        } else if(!this.menuobj) {
            this.initMenu();
        }

        if(typeof instant == "undefined") {
            instant = false;
        }

        if(!this.menuobj || talkbackMenu.activemenu == this.controlkey) {
            return false;
        }

        if(talkbackMenu.activemenu != null && talkbackMenu.activemenu != this.controlkey) {
            talkbackMenu.menus[talkbackMenu.activemenu].hide();
        }

        talkbackMenu.activemenu = this.controlkey;

        this.menuobj.clip();

        this.setMenuPosition();

        if(this.direction == "left") {
            this.menuobj.setBounds(this.leftpx, this.toppx, this.menuPos.width, this.menuPos.height, !instant);
        } else {
            this.menuobj.setBounds(this.leftpx-this.menuPos.width, this.toppx, this.menuPos.width, this.menuPos.height, !instant);
        }

        this.menuobj.unclip();
    },
    setMenuPosition : function() {
        this.pos = this.controlobj.getBox();
        this.leftpx = this.pos.x;
        this.toppx = this.pos.y + this.pos.height;

        this.menuPos = this.menuobj.getBox();

        if((this.leftpx + this.menuPos.width) >= document.body.clientWidth && (this.leftpx + this.pos.width - this.menuPos.width) > 0) {
            this.leftpx = this.leftpx + this.pos.width;
            this.direction = "right"
        } else {
            this.direction = "left";
        }

        this.menuobj.setSize(0,0);
        this.menuobj.show();
        this.menuobj.setLocation(this.leftpx,this.toppx)
    }
});