123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /*
- Author: mg12
- Update: 2009/08/07
- Author URI: http://www.neoease.com/
- */
- (function() {
- var Class = {
- create: function() {
- return function() {
- this.initialize.apply(this, arguments);
- }
- }
- }
- var GhostlyMenu = Class.create();
- GhostlyMenu.prototype = {
- initialize: function(target, align, sub) {
- this.obj = cleanWhitespace(target);
- this.align = align || 'left';
- this.sub = sub || -1;
- this.menu = this.obj.childNodes;
- if (this.menu.length < 2) { return; }
- this.title = this.menu[0];
- this.body = this.menu[1];
- cleanWhitespace(this.body).lastChild.getElementsByTagName('a')[0].className += ' last';
- setStyle(this.body, 'visibility', 'hidden');
- setStyle(this.body, 'display', 'block');
- addListener(this.obj, 'mouseover', bind(this, this.activate), false);
- addListener(this.obj, 'mouseout', bind(this, this.deactivate), false);
- },
- activate: function() {
- if(this.sub == 1) {
- var pos = currentOffset(this.title);
- var top = pos[1] - 1;
- var left = getWidth(this.body) - 2;
- if (this.align == 'right') {
- var left = getWidth(this.body) * (-1);
- }
- } else {
- var pos = cumulativeOffset(this.title);
- var top = pos[1] + getHeight(this.title);
- var left = pos[0];
- if (this.align == 'right') {
- left += getWidth(this.title) - getWidth(this.body);
- }
- }
- if(!/current/.test(this.title.className)) {
- this.title.className += ' current';
- }
- setStyle(this.body, 'left', left + 'px');
- setStyle(this.body, 'top', top + 'px');
- setStyle(this.body, 'visibility', 'visible');
- },
- deactivate: function(){
- this.title.className = this.title.className.replace('current', '');
- var thismenu = this;
- var tid = setInterval( function() {
- clearInterval(tid);
- if (!/current/.test(thismenu.title.className)) {
- setStyle(thismenu.body, 'visibility', 'hidden');
- }
- return false;
- }, 400);
- }
- }
- $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;
- }
- 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;
- }
- currentOffset = function(element) {
- var valueT = element.offsetTop || 0;
- var valueL = element.offsetLeft || 0;
- return [valueL, valueT];
- }
- 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];
- }
- addListener = function(element, name, observer, useCapture) {
- if(element.addEventListener) {
- element.addEventListener(name, observer, useCapture);
- } else if(element.attachEvent) {
- element.attachEvent('on' + name, observer);
- }
- }
- function loadMenus() {
- var align = 'left';
- for(var i = 0; (a = document.getElementsByTagName('link')[i]); i++) {
- if((a.getAttribute('rel') == 'stylesheet') && (a.getAttribute('href').indexOf('rtl.css') != -1)) {
- align = 'right';
- }
- }
- var subscribe = document.getElementById('subscribe');
- if (subscribe) {
- new GhostlyMenu(subscribe, align);
- }
- var menubar = document.getElementById('menus');
- if (menubar) {
- var list = menubar.getElementsByTagName('ul');
- for (var i = 0; i < list.length; i++) {
- var menu = list[i].parentNode;
- if(menu.parentNode === menubar) {
- new GhostlyMenu(menu, align);
- } else {
- new GhostlyMenu(menu, align, 1);
- menu.firstChild.className += ' subtitle';
- }
- }
- }
- }
- if (document.addEventListener) {
- document.addEventListener("DOMContentLoaded", loadMenus, false);
- } else if (/MSIE/i.test(navigator.userAgent)) {
- document.write('<script id="__ie_onload_for_inove" defer src="javascript:void(0)"></script>');
- var script = document.getElementById('__ie_onload_for_inove');
- script.onreadystatechange = function() {
- if (this.readyState == 'complete') {
- loadMenus();
- }
- }
- } else if (/WebKit/i.test(navigator.userAgent)) {
- var _timer = setInterval( function() {
- if (/loaded|complete/.test(document.readyState)) {
- clearInterval(_timer);
- loadMenus();
- }
- }, 10);
- } else {
- window.onload = function(e) {
- loadMenus();
- }
- }
- })();
|