diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2007-08-13 18:41:27 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2007-08-13 18:41:27 +0000 |
| commit | a4a9148f3fb207934bcfc45223b5abec78e5ed6b (patch) | |
| tree | 15f6528fb61089629c27ef0cf5052a327c03bb7c /skins/xstyle/javascript/xmenu.js | |
| download | xxv-a4a9148f3fb207934bcfc45223b5abec78e5ed6b.tar.gz xxv-a4a9148f3fb207934bcfc45223b5abec78e5ed6b.tar.bz2 | |
* Move files to trunk
Diffstat (limited to 'skins/xstyle/javascript/xmenu.js')
| -rw-r--r-- | skins/xstyle/javascript/xmenu.js | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/skins/xstyle/javascript/xmenu.js b/skins/xstyle/javascript/xmenu.js new file mode 100644 index 0000000..58f6e83 --- /dev/null +++ b/skins/xstyle/javascript/xmenu.js @@ -0,0 +1,371 @@ +//<script>
/* + * This script was created by Erik Arvidsson (erik@eae.net) + * for WebFX (http://webfx.eae.net) + * Copyright 2001 + * + * For usage see license at http://webfx.eae.net/license.html + * + * Created: 2001-01-12 + * Updates: 2001-11-20 Added hover mode support and removed Opera focus hacks
* 2001-12-20 Added auto positioning and some properties to support this + * 2002-08-13 toString used ' for attributes. Changed to " to allow in args + */
+// check browsers +var ua = navigator.userAgent; +var opera = /opera [56789]|opera\/[56789]/i.test(ua);
var ie = !opera && /MSIE/.test(ua); +var ie50 = ie && /MSIE 5\.[01234]/.test(ua);
var ie6 = ie && /MSIE [6789]/.test(ua); +var ieBox = ie && (document.compatMode == null || document.compatMode != "CSS1Compat"); +var moz = !opera && /gecko/i.test(ua);
var nn6 = !opera && /netscape.*6\./i.test(ua);
// define the default values +webfxMenuDefaultWidth = 100; + +webfxMenuDefaultBorderLeft = 1;
webfxMenuDefaultBorderRight = 1;
webfxMenuDefaultBorderTop = 1;
webfxMenuDefaultBorderBottom = 1;
+webfxMenuDefaultPaddingLeft = 1;
webfxMenuDefaultPaddingRight = 1; +webfxMenuDefaultPaddingTop = 1;
webfxMenuDefaultPaddingBottom = 1; +
webfxMenuDefaultShadowLeft = 0; +webfxMenuDefaultShadowRight = ie && !ie50 && /win32/i.test(navigator.platform) ? 4 :0; +webfxMenuDefaultShadowTop = 0; +webfxMenuDefaultShadowBottom = ie && !ie50 && /win32/i.test(navigator.platform) ? 4 : 0;
+
webfxMenuItemDefaultHeight = 18; +webfxMenuItemDefaultText = "Untitled"; +webfxMenuItemDefaultHref = "javascript:void(0)"; + +webfxMenuSeparatorDefaultHeight = 6; + +webfxMenuDefaultEmptyText = "Empty"; +
webfxMenuDefaultUseAutoPosition = nn6 ? false : true;
+
+// other global constants
+webfxMenuImagePath = ""; + +webfxMenuUseHover = opera ? true : false;
webfxMenuHideTime = 500; +webfxMenuShowTime = 200;
+
+var webFXMenuHandler = { + idCounter : 0, + idPrefix : "webfx-menu-object-",
all : {},
getId : function () { return this.idPrefix + this.idCounter++; }, + overMenuItem : function (oItem) {
if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout); + var jsItem = this.all[oItem.id]; + if (webfxMenuShowTime <= 0) + this._over(jsItem); + else
//this.showTimeout = window.setTimeout(function () { webFXMenuHandler._over(jsItem) ; }, webfxMenuShowTime); + // I hate IE5.0 because the piece of shit crashes when using setTimeout with a function object
this.showTimeout = window.setTimeout("webFXMenuHandler._over(webFXMenuHandler.all['" + jsItem.id + "'])", webfxMenuShowTime); + }, + outMenuItem : function (oItem) { + if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout); + var jsItem = this.all[oItem.id]; + if (webfxMenuHideTime <= 0) + this._out(jsItem); + else
//this.hideTimeout = window.setTimeout(function () { webFXMenuHandler._out(jsItem) ; }, webfxMenuHideTime); + this.hideTimeout = window.setTimeout("webFXMenuHandler._out(webFXMenuHandler.all['" + jsItem.id + "'])", webfxMenuHideTime);
},
blurMenu : function (oMenuItem) { + window.setTimeout("webFXMenuHandler.all[\"" + oMenuItem.id + "\"].subMenu.hide();", webfxMenuHideTime); + }, + _over : function (jsItem) {
if (jsItem.subMenu) { + jsItem.parentMenu.hideAllSubs();
jsItem.subMenu.show(); + } + else + jsItem.parentMenu.hideAllSubs();
},
_out : function (jsItem) { + // find top most menu + var root = jsItem; + var m;
if (root instanceof WebFXMenuButton)
m = root.subMenu;
else { + m = jsItem.parentMenu; + while (m.parentMenu != null && !(m.parentMenu instanceof WebFXMenuBar))
m = m.parentMenu;
}
if (m != null) + m.hide();
},
hideMenu : function (menu) { + if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout); +
this.hideTimeout = window.setTimeout("webFXMenuHandler.all['" + menu.id + "'].hide()", webfxMenuHideTime);
},
showMenu : function (menu, src, dir) {
if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout);
+ if (arguments.length < 3)
dir = "vertical"; +
menu.show(src, dir); + } +}; + +function WebFXMenu() { + this._menuItems = []; + this._subMenus = []; + this.id = webFXMenuHandler.getId(); + this.top = 0; + this.left = 0; + this.shown = false;
this.parentMenu = null; + webFXMenuHandler.all[this.id] = this; +} +
WebFXMenu.prototype.width = webfxMenuDefaultWidth; +WebFXMenu.prototype.emptyText = webfxMenuDefaultEmptyText;
WebFXMenu.prototype.useAutoPosition = webfxMenuDefaultUseAutoPosition; +
WebFXMenu.prototype.borderLeft = webfxMenuDefaultBorderLeft; +WebFXMenu.prototype.borderRight = webfxMenuDefaultBorderRight; +WebFXMenu.prototype.borderTop = webfxMenuDefaultBorderTop; +WebFXMenu.prototype.borderBottom = webfxMenuDefaultBorderBottom; +
WebFXMenu.prototype.paddingLeft = webfxMenuDefaultPaddingLeft; +WebFXMenu.prototype.paddingRight = webfxMenuDefaultPaddingRight;
WebFXMenu.prototype.paddingTop = webfxMenuDefaultPaddingTop;
WebFXMenu.prototype.paddingBottom = webfxMenuDefaultPaddingBottom; + +WebFXMenu.prototype.shadowLeft = webfxMenuDefaultShadowLeft; +WebFXMenu.prototype.shadowRight = webfxMenuDefaultShadowRight; +WebFXMenu.prototype.shadowTop = webfxMenuDefaultShadowTop; +WebFXMenu.prototype.shadowBottom = webfxMenuDefaultShadowBottom;
+
+WebFXMenu.prototype.add = function (menuItem) { + this._menuItems[this._menuItems.length] = menuItem; + if (menuItem.subMenu) { + this._subMenus[this._subMenus.length] = menuItem.subMenu; + menuItem.subMenu.parentMenu = this;
} + + menuItem.parentMenu = this; +}; +
WebFXMenu.prototype.show = function (relObj, sDir) { + if (this.useAutoPosition)
this.position(relObj, sDir);
+ var divElement = document.getElementById(this.id); + divElement.style.left = opera ? this.left : this.left + "px"; + divElement.style.top = opera ? this.top : this.top + "px"; + divElement.style.visibility = "visible";
this.shown = true; + if (this.parentMenu) + this.parentMenu.show();
}; +
WebFXMenu.prototype.hide = function () { + this.hideAllSubs(); + var divElement = document.getElementById(this.id); + divElement.style.visibility = "hidden";
this.shown = false; +}; +
WebFXMenu.prototype.hideAllSubs = function () { + for (var i = 0; i < this._subMenus.length; i++) { + if (this._subMenus[i].shown) + this._subMenus[i].hide(); + } +};
+WebFXMenu.prototype.toString = function () { + var top = this.top + this.borderTop + this.paddingTop; + var str = "<div id='" + this.id + "' class='webfx-menu' style='" + + "width:" + (!ieBox ?
this.width - this.borderLeft - this.paddingLeft - this.borderRight - this.paddingRight :
this.width) + "px;" + + (this.useAutoPosition ?
"left:" + this.left + "px;" + "top:" + this.top + "px;" :
"") + + (ie50 ? "filter: none;" : "") + + "'>"; + + if (this._menuItems.length == 0) { + str += "<span class='webfx-menu-empty'>" + this.emptyText + "</span>"; + } + else { + // loop through all menuItems + for (var i = 0; i < this._menuItems.length; i++) { + var mi = this._menuItems[i]; + str += mi;
if (!this.useAutoPosition) { + if (mi.subMenu && !mi.subMenu.useAutoPosition) + mi.subMenu.top = top - mi.subMenu.borderTop - mi.subMenu.paddingTop; + top += mi.height;
} + } + + } + + str += "</div>"; + + for (var i = 0; i < this._subMenus.length; i++) { + this._subMenus[i].left = this.left + this.width - this._subMenus[i].borderLeft; + str += this._subMenus[i]; + } + + return str; +};
// WebFXMenu.prototype.position defined later
+function WebFXMenuItem(sText, sHref, sToolTip, oSubMenu) { + this.text = sText || webfxMenuItemDefaultText; + this.href = (sHref == null || sHref == "") ? webfxMenuItemDefaultHref : sHref; + this.subMenu = oSubMenu; + if (oSubMenu) + oSubMenu.parentMenuItem = this; + this.toolTip = sToolTip; + this.id = webFXMenuHandler.getId(); + webFXMenuHandler.all[this.id] = this; +}; +WebFXMenuItem.prototype.height = webfxMenuItemDefaultHeight; +WebFXMenuItem.prototype.toString = function () { + return "<a" + + " id='" + this.id + "'" + + " href=\"" + this.href + "\"" + + (this.toolTip ? " title=\"" + this.toolTip + "\"" : "") + + " onmouseover='webFXMenuHandler.overMenuItem(this)'" +
(webfxMenuUseHover ? " onmouseout='webFXMenuHandler.outMenuItem(this)'" : "") +
(this.subMenu ? " unselectable='on' tabindex='-1'" : "") + + ">" + + (this.subMenu ? "<img class='arrow' src=\"" + webfxMenuImagePath + "arrow.right.png\">" : "") + + this.text + + "</a>"; +}; + + +function WebFXMenuSeparator() { + this.id = webFXMenuHandler.getId(); + webFXMenuHandler.all[this.id] = this; +}; +WebFXMenuSeparator.prototype.height = webfxMenuSeparatorDefaultHeight; +WebFXMenuSeparator.prototype.toString = function () { + return "<div" + + " id='" + this.id + "'" +
(webfxMenuUseHover ? + " onmouseover='webFXMenuHandler.overMenuItem(this)'" +
" onmouseout='webFXMenuHandler.outMenuItem(this)'" + : + "") +
"></div>" +}; + +function WebFXMenuBar() { + this._parentConstructor = WebFXMenu; + this._parentConstructor(); +} +WebFXMenuBar.prototype = new WebFXMenu; +WebFXMenuBar.prototype.toString = function () { + var str = "<div id='" + this.id + "' class='webfx-menu-bar'>"; + + // loop through all menuButtons + for (var i = 0; i < this._menuItems.length; i++) + str += this._menuItems[i]; + + str += "</div>"; + + for (var i = 0; i < this._subMenus.length; i++) + str += this._subMenus[i]; + + return str; +}; + +function WebFXMenuButton(sText, sHref, sToolTip, oSubMenu) { + this._parentConstructor = WebFXMenuItem; + this._parentConstructor(sText, sHref, sToolTip, oSubMenu); +} +WebFXMenuButton.prototype = new WebFXMenuItem; +WebFXMenuButton.prototype.toString = function () { + return "<a" + + " id='" + this.id + "'" + + " href='" + this.href + "'" + + (this.toolTip ? " title='" + this.toolTip + "'" : "") +
(webfxMenuUseHover ?
(" onmouseover='webFXMenuHandler.overMenuItem(this)'" +
" onmouseout='webFXMenuHandler.outMenuItem(this)'") : + ( + " onfocus='webFXMenuHandler.overMenuItem(this)'" + + (this.subMenu ?
" onblur='webFXMenuHandler.blurMenu(this)'" :
""
) + )) + + ">" + + this.text + + (this.subMenu ? " <img class='arrow' src='" + webfxMenuImagePath + "arrow.down.png' align='absmiddle'>" : "") + + "</a>"; +};
+
+
+/* Position functions */ +
+function getInnerLeft(el) {
+ if (el == null) return 0;
+ if (ieBox && el == document.body || !ieBox && el == document.documentElement) return 0;
+ return getLeft(el) + getBorderLeft(el);
+}
+
+function getLeft(el) {
+ if (el == null) return 0;
+ return el.offsetLeft + getInnerLeft(el.offsetParent);
+}
+
+function getInnerTop(el) {
+ if (el == null) return 0;
+ if (ieBox && el == document.body || !ieBox && el == document.documentElement) return 0;
+ return getTop(el) + getBorderTop(el);
+}
+
+function getTop(el) {
+ if (el == null) return 0;
+ return el.offsetTop + getInnerTop(el.offsetParent);
+}
+
+function getBorderLeft(el) {
+ return ie ?
+ el.clientLeft :
+ parseInt(window.getComputedStyle(el, null).getPropertyValue("border-left-width"));
+}
+
+function getBorderTop(el) {
+ return ie ?
+ el.clientTop :
+ parseInt(window.getComputedStyle(el, null).getPropertyValue("border-top-width"));
+}
+
+function opera_getLeft(el) {
+ if (el == null) return 0;
+ return el.offsetLeft + opera_getLeft(el.offsetParent);
+}
+
+function opera_getTop(el) {
+ if (el == null) return 0;
+ return el.offsetTop + opera_getTop(el.offsetParent);
+}
+
+function getOuterRect(el) {
+ return {
+ left: (opera ? opera_getLeft(el) : getLeft(el)),
+ top: (opera ? opera_getTop(el) : getTop(el)),
+ width: el.offsetWidth,
+ height: el.offsetHeight
+ };
+}
+
+// mozilla bug! scrollbars not included in innerWidth/height
+function getDocumentRect(el) {
+ return {
+ left: 0,
+ top: 0,
+ width: (ie ?
+ (ieBox ? document.body.clientWidth : document.documentElement.clientWidth) :
+ window.innerWidth
+ ),
+ height: (ie ?
+ (ieBox ? document.body.clientHeight : document.documentElement.clientHeight) :
+ window.innerHeight
+ )
+ };
+}
+
+function getScrollPos(el) {
+ return {
+ left: (ie ?
+ (ieBox ? document.body.scrollLeft : document.documentElement.scrollLeft) :
+ window.pageXOffset
+ ),
+ top: (ie ?
+ (ieBox ? document.body.scrollTop : document.documentElement.scrollTop) :
+ window.pageYOffset
+ )
+ };
+}
+
/* end position functions */ +
WebFXMenu.prototype.position = function (relEl, sDir) { + var dir = sDir;
// find parent item rectangle, piRect + var piRect;
if (!relEl) { + var pi = this.parentMenuItem;
if (!this.parentMenuItem)
return; + + relEl = document.getElementById(pi.id);
if (dir == null)
dir = pi instanceof WebFXMenuButton ? "vertical" : "horizontal";
piRect = getOuterRect(relEl); + }
else if (relEl.left != null && relEl.top != null && relEl.width != null && relEl.height != null) { // got a rect
piRect = relEl;
}
else
piRect = getOuterRect(relEl); +
var menuEl = document.getElementById(this.id); + var menuRect = getOuterRect(menuEl); + var docRect = getDocumentRect(); + var scrollPos = getScrollPos();
var pMenu = this.parentMenu; +
if (dir == "vertical") { + if (piRect.left + menuRect.width - scrollPos.left <= docRect.width)
this.left = piRect.left;
else if (docRect.width >= menuRect.width)
this.left = docRect.width + scrollPos.left - menuRect.width;
else
this.left = scrollPos.left;
if (piRect.top + piRect.height + menuRect.height <= docRect.height + scrollPos.top)
+ this.top = piRect.top + piRect.height;
+ else if (piRect.top - menuRect.height >= scrollPos.top)
+ this.top = piRect.top - menuRect.height;
+ else if (docRect.height >= menuRect.height)
+ this.top = docRect.height + scrollPos.top - menuRect.height;
+ else
+ this.top = scrollPos.top;
} + else {
if (piRect.top + menuRect.height - this.borderTop - this.paddingTop <= docRect.height + scrollPos.top)
+ this.top = piRect.top - this.borderTop - this.paddingTop;
+ else if (piRect.top + piRect.height - menuRect.height + this.borderTop + this.paddingTop >= 0)
+ this.top = piRect.top + piRect.height - menuRect.height + this.borderBottom + this.paddingBottom + this.shadowBottom;
+ else if (docRect.height >= menuRect.height)
+ this.top = docRect.height + scrollPos.top - menuRect.height;
+ else
+ this.top = scrollPos.top;
+
+ var pMenuPaddingLeft = pMenu ? pMenu.paddingLeft : 0;
+ var pMenuBorderLeft = pMenu ? pMenu.borderLeft : 0;
+ var pMenuPaddingRight = pMenu ? pMenu.paddingRight : 0;
+ var pMenuBorderRight = pMenu ? pMenu.borderRight : 0;
+
+ if (piRect.left + piRect.width + menuRect.width + pMenuPaddingRight +
+ pMenuBorderRight - this.borderLeft + this.shadowRight <= docRect.width + scrollPos.left)
+ this.left = piRect.left + piRect.width + pMenuPaddingRight + pMenuBorderRight - this.borderLeft;
+ else if (piRect.left - menuRect.width - pMenuPaddingLeft - pMenuBorderLeft + this.borderRight + this.shadowRight >= 0)
+ this.left = piRect.left - menuRect.width - pMenuPaddingLeft - pMenuBorderLeft + this.borderRight + this.shadowRight;
+ else if (docRect.width >= menuRect.width)
+ this.left = docRect.width + scrollPos.left - menuRect.width;
+ else
+ this.left = scrollPos.left; + } +};
\ No newline at end of file |
