/* Author: mg12 Update: 2008/09/06 Author URI: http://www.fighton.cn/ */ var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } var GhostlyMenu = Class.create(); GhostlyMenu.prototype = { initialize: function(target, align, opacity) { this.util = new MenuUtil(); this.obj = this.util.cleanWhitespace(target); this.align = align || 'left'; this.opacity = 0; this.maxopacity = opacity || 1; this.menu = this.obj.childNodes if (this.menu.length < 2) { return; } this.title = this.menu[0]; this.body = this.menu[1]; this.util.setStyle(this.body, 'visibility', 'hidden'); this.util.setStyle(this.body, 'position', 'absolute'); this.util.setStyle(this.body, 'overflow', 'hidden'); this.util.setStyle(this.body, 'display', 'block'); this.addListener(this.obj, 'mouseover', this.util.bind(this, this.activate), false); this.addListener(this.obj, 'mouseout', this.util.bind(this, this.deactivate), false); }, activate: function() { for(i = 0; (a = document.getElementsByTagName("link")[i]); i++) { if(a.getAttribute("title") == "dbx4menu") { a.disabled = false; } } var pos = this.util.cumulativeOffset(this.title); var left = pos[0]; if (this.align == 'right') { var offset = this.util.getWidth(this.title) - this.util.getWidth(this.body); left += offset; } var top = pos[1] + this.util.getHeight(this.title); this.util.setStyle(this.body, 'left', left + 'px'); this.util.setStyle(this.body, 'top', top + 'px'); this.util.setStyle(this.body, 'visibility', 'visible'); this.util.setStyle(this.body, 'opacity', this.opacity); this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')'); if(this.tid) { clearTimeout(this.tid); } this.tid = setInterval(this.util.bind(this, this.appear), 30); }, deactivate: function(){ if(this.tid) { clearTimeout(this.tid); } this.tid = setInterval(this.util.bind(this, this.fade), 30); }, appear: function() { this.opacity += 0.1; if(this.opacity >= this.maxopacity) { this.opacity = this.maxopacity; clearTimeout(this.tid); } this.util.setStyle(this.body, 'opacity', this.opacity); this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')'); }, fade:function() { this.opacity -= 0.1; if(this.opacity <= 0) { this.opacity = 0; this.util.setStyle(this.body, 'visibility', 'hidden'); clearTimeout(this.tid); for(i = 0; (a = document.getElementsByTagName("link")[i]); i++) { if(a.getAttribute("title") == "dbx4menu") { a.disabled = true; } } } this.util.setStyle(this.body, 'opacity', this.opacity); this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')'); }, addListener: function(element, name, observer, useCapture) { if(element.addEventListener) { element.addEventListener(name, observer, useCapture); } else if(element.attachEvent) { element.attachEvent('on' + name, observer); } } } var MenuUtil = Class.create(); MenuUtil.prototype = { initialize: function() { }, $: function(id) { return document.getElementById(id); }, $A: function(iterable) { if(!iterable) { return []; } if(iterable.toArray) { return iterable.toArray(); } else { var results = []; for(var i = 0; i < iterable.length; i++) { results.push(iterable[i]); } return results; } }, bind: function() { var array = this.$A(arguments); var func = array[array.length - 1]; var _method = func, args = array, object = args.shift(); return function() { return _method.apply(object, args.concat(array)); } }, getHeight: function(element) { return element.offsetHeight; }, getWidth: function(element) { return element.offsetWidth; }, setStyle: function(element, key, value) { element.style[key] = value; }, getStyle: function(element, key) { return element.style[key]; }, cleanWhitespace: function(list) { var node = list.firstChild; while (node) { var nextNode = node.nextSibling; if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) { list.removeChild(node); } node = nextNode; } return list; }, cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [valueL, valueT]; } } function loadMenus() { var subscribe = document.getElementById('subscribe'); new GhostlyMenu(subscribe, 'right', 0.9); } if (document.addEventListener) { document.addEventListener("DOMContentLoaded", loadMenus, false); } else if (navigator.userAgent.indexOf('MSIE') > 0) { document.onreadystatechange = function() { if (document.readyState == 'loaded' || document.readyState == 'complete') { loadMenus(); } } } else { window.onload = function(e) { loadMenus(); } }