/**
*
*  Simple Context Menu
*  http://www.webtoolkit.info/
*
**/

var SimpleContextMenu = {

    // private attributes
    _menus: new Array,
    _attachedElement: null,
    _menuElement: null,
    _preventDefault: true,
    _preventForms: true,

    coords: { x: null, y: null },

    obj: null,


    // public method. Sets up whole context menu stuff..
    setup: function(conf) {

        if (document.all && document.getElementById && !window.opera) {
            SimpleContextMenu.IE = true;
        }

        if (!document.all && document.getElementById && !window.opera) {
            SimpleContextMenu.FF = true;
        }

        if (document.all && document.getElementById && window.opera) {
            SimpleContextMenu.OP = true;
        }

        if (SimpleContextMenu.IE || SimpleContextMenu.FF) {

            //		document.oncontextmenu = SimpleContextMenu._show;

            if (conf && typeof (conf.preventDefault) != "undefined") {
                SimpleContextMenu._preventDefault = conf.preventDefault;
            }

            if (conf && typeof (conf.preventForms) != "undefined") {
                SimpleContextMenu._preventForms = conf.preventForms;
            }

        }

    },


    // public method. Attaches context menus to specific class names
    attach: function(classNames, menuId) {

        if (typeof (classNames) == "string") {
            SimpleContextMenu._menus[classNames] = menuId;
        }

        if (typeof (classNames) == "object") {
            for (x = 0; x < classNames.length; x++) {
                SimpleContextMenu._menus[classNames[x]] = menuId;
            }
        }

    },


    // private method. Get which context menu to show
    _getMenuElementId: function(e) {

        if (SimpleContextMenu.IE) {
            SimpleContextMenu._attachedElement = event.srcElement;
        } else {
            SimpleContextMenu._attachedElement = e.target;
        }

        while (SimpleContextMenu._attachedElement != null) {
            var className = SimpleContextMenu._attachedElement.className;

            if (typeof (className) != "undefined") {
                className = className.replace(/^\s+/g, "").replace(/\s+$/g, "")
                var classArray = className.split(/[ ]+/g);

                for (i = 0; i < classArray.length; i++) {
                    if (SimpleContextMenu._menus[classArray[i]]) {
                        return SimpleContextMenu._menus[classArray[i]];
                    }
                }
            }

            if (SimpleContextMenu.IE) {
                SimpleContextMenu._attachedElement = SimpleContextMenu._attachedElement.parentElement;
            } else {
                SimpleContextMenu._attachedElement = SimpleContextMenu._attachedElement.parentNode;
            }
        }

        return null;

    },


    // private method. Shows context menu
    _getReturnValue: function(e) {

        var returnValue = true;
        var evt = SimpleContextMenu.IE ? window.event : e;

        if (evt.button != 1) {
            if (evt.target) {
                var el = evt.target;
            } else if (evt.srcElement) {
                var el = evt.srcElement;
            }

            var tname = el.tagName.toLowerCase();

            if ((tname == "input" || tname == "textarea")) {
                if (!SimpleContextMenu._preventForms) {
                    returnValue = true;
                } else {
                    returnValue = false;
                }
            } else {
                if (!SimpleContextMenu._preventDefault) {
                    returnValue = true;
                } else {
                    returnValue = false;
                }
            }
        }

        return returnValue;

    },


    // private method. Shows context menu
    _show: function(e, o) {

        SimpleContextMenu._hide(e);
        if (browser.isIE) {
            document.onclick = SimpleContextMenu._hide;
        }
        SimpleContextMenu.obj = o;
        var menuElementId = SimpleContextMenu._getMenuElementId(e);

        //log.write("simplecontextMenu.show(" + SimpleContextMenu._attachedElement.id + ")");

        if (menuElementId) {
            //var m = SimpleContextMenu._getMousePosition(e);
            var m = browser.coords(e);
            m = { x: parseInt(m.x - p.canvas.x), y: parseInt(m.y - (p.canvas.y / 1.8)) };
            //var s = SimpleContextMenu._getScrollPosition(e);
            var s = browser.scroll(e);

            SimpleContextMenu._menuElement = document.getElementById(menuElementId);

            //log.write("coords{x:" + m.x + ",y:" + m.y + "}");
            //log.write(SimpleContextMenu._menuElement.innerHTML);

            try {

                var linkNode = document.getElementById("menuLink");
                if (linkNode) {
                    linkNode.style.color = "#b0b0b0";
                    linkNode.style.backgroundColor = "#E0E0E0";
                    linkNode.onclick = "return(false);";
                    linkNode.onmouseover = "return(false);";
                }

                var nodeCmd = document.getElementById("menuCommand");
                if (nodeCmd) {
                    nodeCmd.style.color = "#b0b0b0";
                    nodeCmd.style.backgroundColor = "#E0E0E0";
                    nodeCmd.onclick = "return(false);";
                    nodeCmd.onmouseover = "return(false);";
                }

                if (o) {
                    if (o.has.link) {
                        if (linkNode) {
                            linkNode.style.color = "";
                            linkNode.style.backgroundColor = "";
                            linkNode.onclick = SimpleContextMenu.runCommand;
                            linkNode.onmouseover = browser.cursor.hand;
                        }
                    }

                    if (o.has.command) {
                        var node = document.getElementById("menuCommand");
                        if (nodeCmd) {
                            nodeCmd.style.color = "";
                            nodeCmd.style.backgroundColor = "";
                            nodeCmd.onclick = SimpleContextMenu.runCommand;
                            nodeCmd.onmouseover = browser.cursor.hand;
                        }
                    }
                }
            }
            catch (Err) {
                //log.write(Err);
            }


            SimpleContextMenu._menuElement.style.left = m.x + s.x + 5 + 'px';
            SimpleContextMenu._menuElement.style.top = m.y + s.y + SimpleContextMenu._menuElement.offsetHeight + 'px';
            SimpleContextMenu._menuElement.style.display = 'block';

            SimpleContextMenu.coords.x = m.x; // + s.x;
            SimpleContextMenu.coords.y = m.y; // + s.y;
            if (!browser.isIE) {
                setTimeout(SimpleContextMenu._setHide, 250);
            }
            return (browser.block(event));
        }

        return SimpleContextMenu._getReturnValue(e);

    },

    _setHide: function(e) {

        document.onclick = SimpleContextMenu._hide;
        return;
    },


    // private method. Hides context menu
    _hide: function(e) {

        obj = null;

        try {
            if (SimpleContextMenu.IE) {
                var element = event.srcElement;
            } else {
                element = e.target;
            }
            if (element.getAttribute("id") == "addItem") { return; }

            if (SimpleContextMenu._menuElement) {
                SimpleContextMenu._menuElement.style.display = 'none';
            }
            if (document.onclick) {
                document.onclick = null;
            }
        }
        catch (err) {
            return;
        }
        return (true);
    },


    // private method. Returns mouse position
    _getMousePosition: function(e) {

        e = e ? e : window.event;
        var position = {
            'x': e.clientX + 5,
            'y': e.clientY + 5
        }

        return position;

    },


    // private method. Get document scroll position
    _getScrollPosition: function() {

        var x = 0;
        var y = 0;

        if (typeof (window.pageYOffset) == 'number') {
            x = window.pageXOffset;
            y = window.pageYOffset;
        } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
            x = document.documentElement.scrollLeft;
            y = document.documentElement.scrollTop;
        } else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
            x = document.body.scrollLeft;
            y = document.body.scrollTop;
        }

        var position = {
            'x': x,
            'y': y
        }

        return position;

    },

    runCommand: function(e) {

        if (SimpleContextMenu.obj) {
            SimpleContextMenu.obj.runCommand(e);
        }
    }

}
