/**********************************************************

XWebMenu Class v2.1



Browsers Supported:

MSIE 6+

Mozilla 1.5+

FireFox .9+



Online Documentation: http://www.wdonline.com/dhtml/xwebmenu/

(c) 2004   Jeremy McPeak  jwmcpeak@gmail.com

**********************************************************/

var XWebMenu = {

    Handlers    : {

	    System		: {

		    Count : 0, All : {}, GetId : function () { return "XWeb_MenuBar_" + this.Count++; }

	    },

	    MenuBarItem	: {

		    Count : 0, All : {}, GetId : function () { return "XWeb_MenuBarItem_" + this.Count++; }

	    },

	    Menu: {

		    Count : 0, All : {}, GetId : function () { return "XWeb_MenuMenu_" + this.Count++; }

	    },

	    MenuItem	: {

		    Count : 0, All : {}, GetId : function () { return "XWeb_MenuMenuItem_" + this.Count++; }

	    },

	    All : {}

	},

	//Classes

	XWebMenu : function (name) {

	    this.Id			= XWebMenu.Handlers.System.GetId();

	    this.Name		= (name)?name:this.Id;

	    this.Items		= [];

	    this.Behavior   = "standard";

	    this.ShownMenu	= null;

	    this.Type		= "XWebMenu_Class";

	    this.Layer = document.createElement("DIV");

	    this.Layer.id = this.Id;

	    this.Layer.className = "cls-xweb-menu-bar";

	    document.body.appendChild(this.Layer);

	

    	XWebMenu.Handlers.System.All[this.Name] = this;

    	XWebMenu.Handlers.All[this.Name] = this;

	

    	if (!XWebMenu.Settings[this.Name])

	        XWebMenu.Settings[this.Name] = XWebMenu.Settings["Global"];

	

    	if (this.Id != this.Name) {

		    XWebMenu.Handlers.System.All[this.Id] = this;

		    XWebMenu.Handlers.All[this.Id] = this;

    	}

    	//Methods

    	this.Add = function (text,click,subMenu) {

	        var num = this.Items.length;

	        this.Items[num] = new XWebMenu.MenuBarItem(this,text,click,subMenu);

	        this.Items[this.Items[num].Id] = this.Items[num];

	        return this.Items[num].Menu;

        };

        

        this.Delete = function () {

            if (this.Items.length > 0) {

                for ( var i = 0; i < this.Items.length; i++ ) {

                    this.Items[i].Delete();

                    delete this.Items[i];

                }

            }

            document.body.removeChild(this.Layer);

        };



        this.MoveTo = function (x,y) {

            this.Layer.style.left = x + "px";
            this.Layer.style.top = y + "px";
        };

		

    	if (name) {

            XWebMenu.AutoSetup(this);

	    }

    },

    MenuBarItem : function (parent,text,click,subMenu) {

        this.Parent	= parent;

	    this.Name	= this.Parent.Name;

	    this.Id		= XWebMenu.Handlers.MenuBarItem.GetId();

	    this.Menu	= null;

	    this.Type	= "XWebMenu_BarItem";

	    this.IsJs	= false;

	    this.Click	= click;

	    this.Target = null;

	        

    	this.Layer = document.createElement("SPAN");

    	this.Layer.id = this.Id

    	this.Layer.className = "cls-xweb-menu-baritem";

    	

    	if (XWebMenu.User.Ie) {

    	    this.Dummy = document.createElement("SPAN");

    	    this.Dummy.appendChild(document.createTextNode(" "));

    	    this.Dummy.className = "cls-xweb-menu-ie-dummy";

    	    this.Layer.appendChild(this.Dummy);

    	    this.Dummy.style.left = "0px";

    	    this.Dummy.style.visibility = "hidden";

    	    this.Dummy.style.position = "absolute";

    	    this.Dummy.style.width = "1px";

    	    this.Dummy.style.height = "1px";

    	    this.Dummy.style.fontSize = "0px";

    	}

    	

    	XWebMenu.Handlers.MenuBarItem.All[this.Id] = this;

    	XWebMenu.Handlers.All[this.Id] = this;

    	

    	var arg = XWebMenu.MenuBarItem.arguments[3];

    	if ((typeof arg == "boolean") || (typeof arg == "undefined") || (typeof arg == "number")) {

		    if (arg || (typeof arg == "undefined")) {}

		    else this.IsJs = true;

	    } else if  (typeof arg == "string") this.Menu = this.Parent[subMenu] = new XWebMenu.Menu(this.Parent,this);

    	

    	this.Layer.appendChild(document.createTextNode(text));

    	this.Parent.Layer.appendChild(this.Layer);

    	//Methods

    	this.MouseOver = function () {

	        var clsName = this.Layer.className;

	        if (this.Parent.Behavior == "mouse") {

        	    this.Layer.className = "cls-xweb-menu-baritem-click";

	            if (this.Parent.ShownMenu && this.Parent.ShownMenu != this.Menu) 

            	    this.Parent.ShownMenu.Item.MouseOut();

    	        if (this.Menu) this.MouseClick();

            } else {

                if (this.Parent.ShownMenu && this.Parent.ShownMenu != this.Menu) {

    	            this.Parent.ShownMenu.Item.MouseOut();

    	            if (this.Menu) this.MouseClick();

    	            else this.Layer.className = "cls-xweb-menu-baritem-over";

    	        } else

                    if (clsName != "cls-xweb-menu-baritem-click") this.Layer.className = "cls-xweb-menu-baritem-over";

            }

            if (!this.IsJs && !this.Menu) self.status = this.Click;

        };

    

        this.MouseOut = function (override) {

    	    if (override) {

    	        if (!this.Menu) this.Layer.className = "cls-xweb-menu-baritem";

	            if (!this.Parent.ShownMenu) this.Layer.className = "cls-xweb-menu-baritem";

	        }

	        if (this.Menu && !override) {

        	    this.Menu.Hide();

	            this.Layer.className = "cls-xweb-menu-baritem";

    	    }

	        self.status = "";

        };



        this.MouseClick = function () {

            var behavior = this.Parent.Behavior;

    	    if (this.Menu) {

    	        if (!this.Menu.Shown) {

    	            XWebMenu.CloseMenus(true);

	                this.Menu.Show();

	                this.Layer.className = "cls-xweb-menu-baritem-click";

	                if (this.Dummy) {

	                    this.Dummy.style.visibility = "visible";

	                    this.Dummy.style.top = this.Layer.offsetHeight - 1 + "px";

	                    this.Dummy.style.backgroundColor = this.Layer.currentStyle["borderLeftColor"];

	                }

	            } else {

        	        if (this.Parent.Behavior != "mouse") {

	                    this.Menu.Hide();

	                    this.Layer.className = "cls-xweb-menu-baritem-over";

	                }

	            }

	        } else {

                if (this.IsJs) eval(this.Click);

	            else window.location = this.Click;

		        XWebMenu.CloseMenus(true);

            }

        };



        this.Delete = function () {

            if (this.Menu) {

                this.Menu.Delete();

                delete this.Menu;

            }

            this.Parent.Layer.removeChild(this.Layer);

        };    

    },

    Menu : function (parent,menuItem) {

        if (!parent) return;

	    this.Item           = menuItem;

	    this.Parent			= parent;

	    this.Name			= this.Parent.Name;

	    this.Items			= [];

	    this.Shown			= false;

	    this.Id				= XWebMenu.Handlers.Menu.GetId();

	    this.Type			= "XWebMenu_Menu";

	    this.ShownMenu	    = null;

	    

	    this.Layer = document.createElement("DIV");

	    this.Layer.className = "cls-xweb-menu-outer-div";

	    

	    this.ShadowLayer = document.createElement("DIV");

	    this.ShadowLayer.className = "cls-xweb-menu-shadow-div";

	    

    	this.MenuLayer = document.createElement("DIV");	

    	this.MenuLayer.className = "cls-xweb-menu-menu-div";

    	this.MenuLayer.id = this.Id;

    	this.Container = document.createElement("DIV");

    	this.Container.className = "cls-xweb-menu-menu-tablecontainer";

    	this.Table = document.createElement("TABLE");

    	this.Table.className = "cls-xweb-menu-menu-table";

    	this.Table.border = 0;

    	this.Table.cellSpacing = 0;

    	this.Table.cellPadding = 0;

    	this.TBody = document.createElement("TBODY");

    	this.Table.appendChild(this.TBody);

    	this.Container.appendChild(this.Table);

	    this.MenuLayer.appendChild(this.Container);

	    this.Layer.appendChild(this.ShadowLayer);

	    this.Layer.appendChild(this.MenuLayer);

	    

	    var system = XWebMenu.Handlers.System.All[this.Name];

	    var _parent = (system)?system.Layer:document.body;

	    _parent.appendChild(this.Layer);

	

	    XWebMenu.Handlers.Menu.All[this.Id] = this;

	    XWebMenu.Handlers.All[this.Id] = this;

    },

    Context : function (el,name) {

        this.Base = XWebMenu.Menu;

        this.Base(true,null);

    

        this.Behavior = "mouse";

        this.Name = (name)?name:this.Id;

        this.Type = "XWebMenu_Context";

    

        if (!XWebMenu.Settings[this.Name])

    	    XWebMenu.Settings[this.Name] = XWebMenu.Settings["Global"];

    	    

        if (name) {

            XWebMenu.AutoSetup(this);

	    }

	    if (el) {

	        el.XWebContextMenu = this;

	        el.oncontextmenu = this.Show;

	    }

    },

    MenuItem : function (parent,text,url,icon,subMenu) {

        var args = XWebMenu.MenuItem.arguments;

        var isSeparator = (args.length > 1)?false:true;

	

	    this.Parent		= parent;

	    this.Name		= this.Parent.Name;

	    this.Id			= XWebMenu.Handlers.MenuItem.GetId();

	    this.Icon		= null;

	    this.Menu	    = null;

	    this.Type		= (!isSeparator)?"XWebMenu_MenuItem":"XWebMenu_MenuItem_Separator";

	    this.IsJs		= false;

	    this.Click		= url;

	    this.Target     = null;

	

	    this.TableRow = document.createElement("TR");

	    this.TableRow.id = this.Id;

	    this.TableRow.className = "cls-xweb-menuitem-parent";

	

	    if (!isSeparator) {

    	    this.LeftCell = document.createElement("TD");

	        this.LeftCell.className = "cls-xweb-menu-left";

	        this.LeftCell.id = this.Id + "_left";

    	

	        this.MiddleCell = document.createElement("TD");

	        this.MiddleCell.className = "cls-xweb-menu-middle";

	        this.MiddleCell.appendChild(document.createTextNode(text));

	        this.MiddleCell.id = this.Id + "_middle";

    	

    	    this.RightCell = document.createElement("TD");

    	    this.RightCell.className = "cls-xweb-menu-right";

    	    this.RightCell.appendChild(document.createTextNode(" "));

    	    this.RightCell.id = this.Id + "_right";

    	

	        if (icon) {

        		this.Icon = document.createElement("IMG");

		        this.Icon.src = icon;

		        this.LeftCell.appendChild(this.Icon);

		        this.LeftCell.align = "left";

		        this.LeftCell.vAlign = "middle";

	        } else {

        		this.LeftCell.appendChild(document.createTextNode(" "));

    	    }

    	

	        this.TableRow.appendChild(this.LeftCell);

	        this.TableRow.appendChild(this.MiddleCell);

	        this.TableRow.appendChild(this.RightCell);

    	    

	        XWebMenu.Handlers.All[this.LeftCell.id] = this;

	        XWebMenu.Handlers.All[this.MiddleCell.id] = this;

	        XWebMenu.Handlers.All[this.RightCell.id] = this;

    	    

	        var arg = args[4];

	        if ((typeof arg == "boolean") || (typeof arg == "undefined") || (typeof arg == "number")) {

    		    if (arg || typeof arg == "undefined") {}

		        else this.IsJs = true;

	        } else if  (typeof arg == "string") {

		        this.RightCell.className = "cls-xweb-menu-right-arrow";

		        this.Menu = this.Parent[subMenu] = new XWebMenu.Menu(this.Parent,this);

	        }

	    } else {

    	    var sepCell = document.createElement("TD");

            sepCell.id = this.Id + "_sepCell";

	        sepCell.className = "cls-xweb-menu-td-separator";

	        sepCell.colSpan = 3;

	        var sepDiv = document.createElement("DIV");

	        sepDiv.id = this.Id + "_sepDiv";

	        sepDiv.className = "cls-xweb-menu-div-separator";

    

	        sepCell.appendChild(sepDiv);

	        this.TableRow.appendChild(sepCell);

	        XWebMenu.Handlers.All[sepCell.id] = this;

	        XWebMenu.Handlers.All[sepDiv.id] = this;

	    }

    

        this.Parent.TBody.appendChild(this.TableRow);

	

    	XWebMenu.Handlers.MenuItem.All[this.Id] = this;

    	XWebMenu.Handlers.All[this.Id] = this;

    	this.MouseOver = function () {

	        var rightClass = (this.RightCell.className.indexOf("arrow") > -1)?"cls-xweb-menu-right-arrow-highlight":"cls-xweb-menu-right-highlight";



	        this.LeftCell.className = "cls-xweb-menu-left-highlight"

	        this.MiddleCell.className = "cls-xweb-menu-middle-highlight";

	        this.RightCell.className = rightClass;

	        

	        if (this.Parent.ShownMenu && this.Parent.ShownMenu != this.Menu)

	            this.Parent.ShownMenu.Item.MouseOut();

    	

	        if (this.Menu) this.Menu.Show();

	        if (!this.IsJs && !this.Menu) self.status = this.Click;

        };



        this.MouseOut = function () {

            var rightClass = (this.RightCell.className.indexOf("arrow") > -1)?"cls-xweb-menu-right-arrow":"cls-xweb-menu-right";

	        this.LeftCell.className = "cls-xweb-menu-left"

	        this.MiddleCell.className = "cls-xweb-menu-middle";

	        this.RightCell.className = rightClass;

	        if (this.Menu) this.Menu.Hide();

	        self.status = "";

        };



        this.MouseClick = function () {

	        if (!this.Menu) {

	            if (this.IsJs) eval(this.Click);

	            else {

	                if (this.Target) window.open(this.Click);

	                else window.location = this.Click;

	            }

		        XWebMenu.CloseMenus(true);

            }

        };



        this.Delete = function () {

	        if (this.Menu) {

	            this.Menu.Delete();

	            delete this.Menu;

	        }

	        this.Parent.TBody.removeChild(this.TableRow);

        };

    },

    //Necessary Members

    AutoSetup : function (thisObject,thisNode) {

        if (!thisNode) {

            var doc = XWebMenu.Xml.Document;

            if (doc) {

                var systems = (thisObject.Type == "XWebMenu_Class")?doc.getElementsByTagName("system"):doc.getElementsByTagName("context");

                for ( var i = 0; i < systems.length; i++ ) {

                    if ( systems[i].getAttribute("name") == thisObject.Name ) {

                        thisNode = systems[i];

                        if (systems[i].getAttribute("behavior")) thisObject.Behavior = systems[i].getAttribute("behavior").toLowerCase();

                        break;

                    }

                    thisNode = null;

                }

                if (!thisNode) thisObject.Delete();

            } else {

                thisObject.Delete();

            }

        }

        if (thisNode != null) {

            switch (thisObject.Type) {

                case "XWebMenu_Class":

                    var menuBarItems = thisNode.getElementsByTagName("menuBarItem");

                    for ( var i = 0; i < menuBarItems.length; i++ ) {

                        var menuBarItem = menuBarItems[i];

                        var menu = menuBarItem.getElementsByTagName("menu")[0];

                        if (menu && menu.getAttribute("src")) {

                            var fragSrc = menu.getAttribute("src");

                            var frag;

                            try {

                                frag = new XWebMenu.XmlReader(fragSrc);

                                menu = frag.Document.cloneNode(true);

                                delete frag.Document;

                                frag = null;

                            } catch (e) {}

                        }

                        

                        var text = menuBarItem.getElementsByTagName("text")[0].text;

                        var clickNode = (!menu)?menuBarItem.getElementsByTagName("click")[0]:0;

                        

                        var click = (clickNode)?clickNode.text:0;

                        var clickJs = (menu)?XWebMenu.RandomName():(clickNode.getAttribute("type") == "script")?false:true;

                        var newWindow = false;

                        if ( clickJs && typeof clickJs == "boolean" ) {

                            if ( clickNode.getAttribute("target") && clickNode.getAttribute("target") == "_blank" ) newWindow = true;

                        }

                        var newMenu = thisObject.Add(text,click,clickJs);

                        thisObject.Items[thisObject.Items.length - 1].Target = newWindow;

                        if (newMenu) XWebMenu.AutoSetup(newMenu,menu);

                    }

                break;

                case "XWebMenu_Context":

                case "XWebMenu_Menu":

                    var menuItems = thisNode.getElementsByTagName("menuItem");

                    for ( var i = 0; i < menuItems.length; i++ ) {

                        var menuItem = menuItems[i];

                        if (menuItem.parentNode == thisNode) {

                            var attType = menuItem.getAttribute("type");

                            if (attType == "separator") {

                                thisObject.Add();

                            }

                            else if (!attType || attType == "normal") {

                                var subMenu = menuItem.getElementsByTagName("subMenu")[0];

                                if (subMenu && subMenu.getAttribute("src")) {

                                    var fragSrc = subMenu.getAttribute("src");

                                    var frag;

                                    try {

                                        frag = new XWebMenu.XmlReader(fragSrc);

                                        subMenu = frag.Document.cloneNode(true);

                                        delete frag.Document;

                                        frag = null;

                                    } catch (e) {}

                                }

                                var text = menuItem.getElementsByTagName("text")[0].text;

                                var clickNode = (!subMenu)?menuItem.getElementsByTagName("click")[0]:0;

                        

                                var icon = 0;

                                if (menuItem.getElementsByTagName("icon")[0] && menuItem.getElementsByTagName("icon")[0].parentNode == menuItem)

                                    icon = menuItem.getElementsByTagName("icon")[0].text

                                var click = (clickNode)?clickNode.text:0;

                                var clickJs = (subMenu)?XWebMenu.RandomName():(clickNode.getAttribute("type") == "script")?false:true;

                                

                                var newWindow = false;

                                

                                if ( clickJs && typeof clickJs == "boolean" ) {

                                    if ( clickNode.getAttribute("target") && clickNode.getAttribute("target") == "_blank" ) newWindow = true;

                                }

                                

                                var newSubMenu = thisObject.Add(text,click,icon,clickJs);

                                thisObject.Items[thisObject.Items.length - 1].Target = newWindow;

                        

                                if (newSubMenu) XWebMenu.AutoSetup(newSubMenu,subMenu);

                           }

                        }

                    }

                break;

            }

        }

    },

	CloseMenus : function (override) {

		clearTimeout(XWebMenu.Timer);

		for ( var i = 0; i < this.Handlers.System.Count; i++ ) {

			var menuSystem = this.Handlers.System.All["XWeb_MenuBar_" + i];

			if (menuSystem) {

		        if ((menuSystem.ShownMenu && this.Timer && menuSystem.Behavior == "mouse") || (menuSystem.ShownMenu && override)) 

				    menuSystem.ShownMenu.Item.MouseOut();

			}

		}

		

		for ( var i = 0; i < this.Handlers.Menu.Count; i++ ) {

		    var menu = this.Handlers.Menu.All["XWeb_MenuMenu_" + i];

		    if (menu) {

		        if ((menu.Shown && this.Timer && menu.Behavior == "mouse") || (menu.Shown && override)) {

		            menu.Hide();

		        }		    

		    }		

		}

		this.Timer = null;

		this.ShownObject = false;

	},

	RandomName : function () {

	    var str = "";

        for ( var randNum = 0; randNum < 10; randNum++ ) {

            str += ""+ Math.floor(Math.random() * 9) + "";

        }

	    return str;

	},

	GetSettingsFromXml : function (settingsNode) {

        this.MenuOffsetX = this.MenuOffsetY = this.SubMenuOffsetX = this.SubMenuOffsetY = 0;

        if (settingsNode) {

            for (var i = 0; i < settingsNode.childNodes.length; i++) {

    	        var thisNode = settingsNode.childNodes[i];

	            if (thisNode.nodeType == 1) {

        	        switch (thisNode.tagName.toLowerCase()) {

    	                case "menuoffset":

    	                    this.MenuOffsetX = thisNode.getAttribute("x");

    	                    this.MenuOffsetY = thisNode.getAttribute("y");

	                    break;

	                    case "submenuoffset":

	                        this.SubMenuOffsetX = thisNode.getAttribute("x");

    	                    this.SubMenuOffsetY = thisNode.getAttribute("y");

	                    break;

	                }

                }

	        }

	    }

    },

	Init : function () {

        XWebMenu.HasXml = (XWebMenu.Xml.Document)?true:false;

        var globalSettingsNode = (XWebMenu.HasXml)?XWebMenu.Xml.Document.getElementsByTagName("globalSettings")[0]:0;

        XWebMenu.Settings["Global"] = new this.GetSettingsFromXml(globalSettingsNode);

    

        if (XWebMenu.HasXml) {

            var systems = XWebMenu.Xml.Document.getElementsByTagName("system");

            for ( var i = 0; i < systems.length; i++ ) {

                if ( systems[i].getAttribute("name") ) {

                    XWebMenu.Settings[systems[i].getAttribute("name")] = (systems[i].getElementsByTagName("settings")[0])?new this.GetSettingsFromXml(systems[i].getElementsByTagName("settings")[0]):XWebMenu.Settings["Global"];

                }    

            }

        }

    

        this.Event.SetEvent(document,"mouseover",XWebMenu.Event.MouseHandler);

        this.Event.SetEvent(document,"mouseout",XWebMenu.Event.MouseHandler);

        this.Event.SetEvent(document,"click",XWebMenu.Event.MouseHandler);

        this.Event.SetEvent(window,"load",XWebMenu.Event.PageLoadInit);

    },

	//Xml Members

	XmlReader : function (fileName) {
	    var xmlObj;



	    if ( document.implementation && document.implementation.createDocument )

		    xmlObj = document.implementation.createDocument( "", "", null );

	    else if ( window.ActiveXObject )

		    xmlObj = new ActiveXObject( "MSXML.DomDocument" );

	

	    xmlObj.async = false;

	    xmlObj.load( "xml/" + fileName );

		

	    this.Document = xmlObj.documentElement;
    },

	Settings : {},

	Xml : null,

	HasXml : false,

	//Necessary Members

	ShownObject : false,

    Timer : null,

	//More Necessary Members

	UserAgent : function () {

	    this.v = navigator.userAgent.toLowerCase();

	    this.Dom = document.getElementById?1:0;
	    this.Ie = (function(ua){
	        if (ua.indexOf("msie") > -1) {

                var regex = new RegExp("msie ([0-9]{1,}[\.0-9]{0,})");

                if (regex.exec(ua) != null)

                var version = parseInt( RegExp.$1 );

                

                return (version >= 6);

            } else

                return false;
        })(this.v);

	    this.cssCompat = (this.Ie && document.compatMode == "CSS1Compat")?1:0;
	    this.Gecko = (this.v.indexOf("gecko") > -1 && this.Dom)?1:0;
	    this.Safari = (this.v.indexOf("safari") > -1 && this.Dom)?1:0;
	    var geckoVersion = (this.Gecko)?parseInt(navigator.productSub):0;
	    this.Moz = (geckoVersion > 20020512)?1:0;
	    this.Dhtml = (this.Ie || this.Moz)?1:0;

	},

	PageObj : function () {
    	this.X = (XWebMenu.User.Moz)?innerWidth:(XWebMenu.User.cssCompat)?document.documentElement.clientWidth:document.body.clientWidth;
    	this.Y = (XWebMenu.User.Moz)?innerHeight:(XWebMenu.User.cssCompat)?document.documentElement.clientHeight:document.body.clientHeight;
    	this.X2 = this.x / 2; this.Y2 = this.y / 2;
    },

	Page    : null,

	User    : null,

	Event   : {

	    SetEvent : function (oName,sEvent,fn) {
        	if (XWebMenu.User.Ie) {
		        sEvent = "on" + sEvent;
		        oName.attachEvent(sEvent,fn);
            }
	        if (XWebMenu.User.Moz || XWebMenu.User.Safari) {
        		if (sEvent == "mouseenter") sEvent = "mouseover";
		        if (sEvent == "mouseleave") sEvent = "mouseout";
		        oName.addEventListener(sEvent,fn,false);
	        }
        },
        ReleaseEvent : function (oName,sEvent,fn) {
        	if (XWebMenu.User.Ie) {
		        var sEvent = "on" + sEvent;
		        oName.detachEvent(sEvent,fn);
	        }
	        if (XWebMenu.User.Moz || XWebMenu.User.Safari) {
        		if (sEvent == "mouseenter") sEvent = "mouseover";
		        if (sEvent == "mouseleave") sEvent = "mouseout";
		        oName.removeEventListener(sEvent,fn,false);
	        }
        },

        PageLoadInit : function () {

            XWebMenu.Page = new XWebMenu.PageObj();

        },

        MouseHandler : function (event) {

	        var eSrc = (XWebMenu.User.Moz)?event.target:window.event.srcElement;

	        eSrc = (eSrc.className)?eSrc:eSrc.parentNode;

	        eSrc = (!eSrc.tagName || eSrc.tagName == "HTML" || eSrc.tagName == "BODY")?0:eSrc;

	        var item;

    

	        if (XWebMenu.Handlers.All[eSrc.id]) item = XWebMenu.Handlers.All[eSrc.id];

	        switch (event.type) {

		        case "mouseover":

			        if (item) {

				        XWebMenu.ShownObject = true;

				        clearTimeout(XWebMenu.Timer);

				        XWebMenu.Timer = null;

				        if (item.Type == "XWebMenu_BarItem" || item.Type == "XWebMenu_MenuItem") item.MouseOver();

			        } else {

				        if (XWebMenu.ShownObject) XWebMenu.Timer = setTimeout("XWebMenu.CloseMenus()",1000);

			        }

		        break;

		        case"mouseout":

			        if (item) {

				        if (item.Type == "XWebMenu_BarItem") item.MouseOut(true);					

				        if (item.Type == "XWebMenu_MenuItem") if (!item.Menu) item.MouseOut();

        				

			        }

		        break;

		        case "click":

			        if (item) {

				        if (item.Type == "XWebMenu_BarItem" || item.Type == "XWebMenu_MenuItem") item.MouseClick();			

			        } else 

			            XWebMenu.CloseMenus(true);

	            break;

	        }

        }

    }

};



XWebMenu.User = new XWebMenu.UserAgent();
XWebMenu.Xml = new XWebMenu.XmlReader("xwebmenu.xml");

/* Menu Methods (For Inheritance) */

XWebMenu.Menu.prototype.Add = function (text,url,icon,subMenu) {

    var isSeparator = (XWebMenu.Menu.prototype.Add.arguments.length > 0)?false:true;

	var num = this.Items.length;

	this.Items[num] = (!isSeparator)?new XWebMenu.MenuItem(this,text,url,icon,subMenu):new XWebMenu.MenuItem(this);

	return this.Items[num].Menu;

};



XWebMenu.Menu.prototype.Delete = function () {

    if (this.Items.length > 0) {

        for ( var i = 0; i < this.Items.length; i++ ) {

            this.Items[i].Delete();

            delete this.Items[i];

        }

    }

    var system = XWebMenu.Handlers.System.All[this.Name];

	var _parent = (system)?system.Layer:document.body;

	_parent.removeChild(this.Layer);

};



XWebMenu.Menu.prototype.Show = function () {

    var isSubMenu = (this.Parent.Type == "XWebMenu_Class")?false:true;

    var x, y;

    var offsetX = (isSubMenu)?parseInt(XWebMenu.Settings[this.Name].SubMenuOffsetX):parseInt(XWebMenu.Settings[this.Name].MenuOffsetX);

    var offsetY = (isSubMenu)?parseInt(XWebMenu.Settings[this.Name].SubMenuOffsetY):parseInt(XWebMenu.Settings[this.Name].MenuOffsetY);

	this.ShadowLayer.style.width = this.MenuLayer.offsetWidth + "px";

	this.ShadowLayer.style.height = this.MenuLayer.offsetHeight + "px";

	if (!isSubMenu) {

	    y = this.Parent.Layer.offsetHeight + offsetY;

	    x = this.Item.Layer.offsetLeft;	    

	    x = ((x + this.MenuLayer.offsetWidth) > XWebMenu.Page.X)?XWebMenu.Page.X - this.MenuLayer.offsetWidth:x + offsetX;

    } else {

        var parentLength = this.Parent.Layer.offsetLeft + this.Parent.MenuLayer.offsetWidth;

	    y = this.Item.TableRow.offsetTop + this.Parent.Layer.offsetTop + offsetY;

	    y = (XWebMenu.User.Moz)?y-1:y;   

	    x = ((parentLength + this.MenuLayer.offsetWidth) > XWebMenu.Page.X)?this.Parent.Layer.offsetLeft - this.MenuLayer.offsetWidth + 2:parentLength - 3 + offsetX;

    }

    this.MoveTo(x,y);

    this.Layer.style.visibility = "visible";	    

	this.Shown = true;

	this.Parent.ShownMenu = this;

};



XWebMenu.Menu.prototype.Hide = function() {

    if (this.ShownMenu) this.ShownMenu.Item.MouseOut();

    if (this.Item.Dummy) this.Item.Dummy.style.visibility = "hidden";

	this.Layer.style.visibility = "hidden";

	this.Shown = false;

	this.Parent.ShownMenu = null;

};



XWebMenu.Menu.prototype.MoveTo = function (x,y) {

    this.Layer.style.left = x + "px";
    this.Layer.style.top = y + "px";
};



/* Context Methods */

XWebMenu.Context.prototype = new XWebMenu.Menu();

XWebMenu.Context.prototype.Show = function (e) {

    var e = (XWebMenu.User.Moz)?e:event;

    var x, y;

    var mouseX = x = e.clientX;

    var mouseY = y = e.clientY;



    var menu = this.XWebContextMenu;

    

    if (mouseX + menu.Layer.offsetWidth > XWebMenu.Page.X)

        x = mouseX - menu.Layer.offsetWidth;

    if (mouseY + menu.Layer.offsetHeight > XWebMenu.Page.Y)

        y = mouseY - menu.Layer.offsetHeight;

    

    y += document.documentElement.scrollTop;

    e.cancelBubble = true;

    menu.MoveTo(x,y);

    XWebMenu.CloseMenus(true);

    menu.ShadowLayer.style.width = menu.MenuLayer.offsetWidth + "px";

	menu.ShadowLayer.style.height = menu.MenuLayer.offsetHeight + "px";



    menu.Layer.style.visibility = "visible";

    menu.Shown = true;

    return false;

};



XWebMenu.Context.prototype.Hide = function () {

    if (this.ShownMenu) this.ShownMenu.Item.MouseOut();

	this.Layer.style.visibility = "hidden";

	this.Shown = false;

	this.Parent.ShownMenu = null;

};



XWebMenu.Context.prototype.Attach = function (el) {

    el.XWebContextMenu = this;

	el.oncontextmenu = this.Show;

};



XWebMenu.Context.prototype.Detach = function (el) {

    el.XWebContextMenu = null;

	el.oncontextmenu = null;

};

        

/* Extending Mozilla*/ if (XWebMenu.User.Moz) {    //Thanks to Erik for the text property   
Text.prototype.__defineGetter__( "text", function () {
    //return this.nodeValue; //Temp fix for Firecrap 1.0.3
    }
);

	

    Node.prototype.__defineGetter__( "text", function () {

	    var cs = this.childNodes;

	    var l = cs.length;

	    var sb = new Array( l );

	    for ( var i = 0; i < l; i++ )

	        sb[i] = cs[i].nodeValue;

	    return sb.join("");

	    }

    );

}



XWebMenu.Init();