web/wp-content/themes/elegant-box/js/menu.js
author ymh
Fri, 12 Mar 2010 13:29:04 +0000
changeset 1 0d28b7c10758
permissions -rw-r--r--
First commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
0d28b7c10758 First commit
ymh
parents:
diff changeset
     1
/*
0d28b7c10758 First commit
ymh
parents:
diff changeset
     2
Author: mg12
0d28b7c10758 First commit
ymh
parents:
diff changeset
     3
Update: 2008/08/11
0d28b7c10758 First commit
ymh
parents:
diff changeset
     4
Author URI: http://www.neoease.com/
0d28b7c10758 First commit
ymh
parents:
diff changeset
     5
*/
0d28b7c10758 First commit
ymh
parents:
diff changeset
     6
(function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
     7
0d28b7c10758 First commit
ymh
parents:
diff changeset
     8
var Class = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
     9
	create: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    10
		return function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    11
			this.initialize.apply(this, arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    12
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    13
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    14
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    15
0d28b7c10758 First commit
ymh
parents:
diff changeset
    16
var GhostlyMenu = Class.create();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    17
GhostlyMenu.prototype = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    18
0d28b7c10758 First commit
ymh
parents:
diff changeset
    19
	initialize: function(target, align, sub) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    20
		this.obj = cleanWhitespace(target);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    21
		this.align = align || 'left';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    22
		this.sub = sub || -1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    23
0d28b7c10758 First commit
ymh
parents:
diff changeset
    24
		this.menu = this.obj.childNodes;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    25
		if (this.menu.length < 2) { return; }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    26
0d28b7c10758 First commit
ymh
parents:
diff changeset
    27
		this.title = this.menu[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    28
		this.body = this.menu[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    29
0d28b7c10758 First commit
ymh
parents:
diff changeset
    30
		cleanWhitespace(this.body).firstChild.getElementsByTagName('a')[0].className += 'first';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    31
0d28b7c10758 First commit
ymh
parents:
diff changeset
    32
		setStyle(this.body, 'visibility', 'hidden');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    33
		setStyle(this.body, 'display', 'block');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    34
0d28b7c10758 First commit
ymh
parents:
diff changeset
    35
		addListener(this.obj, 'mouseover', bind(this, this.activate), false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    36
		addListener(this.obj, 'mouseout', bind(this, this.deactivate), false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    37
	},
0d28b7c10758 First commit
ymh
parents:
diff changeset
    38
0d28b7c10758 First commit
ymh
parents:
diff changeset
    39
	activate: function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    40
		if(this.sub == 1) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    41
			var pos = currentOffset(this.title);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    42
			var top = pos[1] + 3;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    43
			var left = getWidth(this.body) - 6;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    44
		} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    45
			var pos = cumulativeOffset(this.title);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    46
			var top = pos[1] + getHeight(this.title);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    47
			var left = pos[0] - 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    48
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    49
0d28b7c10758 First commit
ymh
parents:
diff changeset
    50
		if(!/current/.test(this.title.className)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    51
			this.title.className += ' current';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    52
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    53
0d28b7c10758 First commit
ymh
parents:
diff changeset
    54
		setStyle(this.body, 'left', left + 'px');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    55
		setStyle(this.body, 'top', top + 'px');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    56
		setStyle(this.body, 'visibility', 'visible');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    57
	},
0d28b7c10758 First commit
ymh
parents:
diff changeset
    58
0d28b7c10758 First commit
ymh
parents:
diff changeset
    59
	deactivate: function(){
0d28b7c10758 First commit
ymh
parents:
diff changeset
    60
		this.title.className = this.title.className.replace('current', '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    61
		var thismenu = this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    62
		var tid = setInterval( function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    63
			clearInterval(tid);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    64
			if (!/current/.test(thismenu.title.className)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    65
				setStyle(thismenu.body, 'visibility', 'hidden');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    66
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    67
			return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    68
		}, 400);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    69
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    70
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    71
0d28b7c10758 First commit
ymh
parents:
diff changeset
    72
$A = function(iterable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    73
	if(!iterable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    74
		return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    75
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    76
	if(iterable.toArray) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    77
		return iterable.toArray();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    78
	} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    79
		var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    80
		for(var i = 0; i < iterable.length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    81
			results.push(iterable[i]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    82
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    83
		return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    84
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    85
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    86
0d28b7c10758 First commit
ymh
parents:
diff changeset
    87
bind = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    88
	var array = this.$A(arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    89
	var func = array[array.length - 1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    90
	var _method = func, args = array, object = args.shift();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    91
	return function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    92
		return _method.apply(object, args.concat(array));
0d28b7c10758 First commit
ymh
parents:
diff changeset
    93
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    94
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    95
0d28b7c10758 First commit
ymh
parents:
diff changeset
    96
getHeight = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    97
	return element.offsetHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    98
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    99
0d28b7c10758 First commit
ymh
parents:
diff changeset
   100
getWidth = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   101
	return element.offsetWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   102
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   103
0d28b7c10758 First commit
ymh
parents:
diff changeset
   104
setStyle = function(element, key, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   105
	element.style[key] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   106
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   107
0d28b7c10758 First commit
ymh
parents:
diff changeset
   108
getStyle = function(element, key) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   109
	return element.style[key];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   110
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   111
0d28b7c10758 First commit
ymh
parents:
diff changeset
   112
cleanWhitespace = function(list) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   113
	var node = list.firstChild;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   114
	while (node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   115
		var nextNode = node.nextSibling;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   116
		if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   117
			list.removeChild(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   118
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   119
		node = nextNode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   120
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   121
	return list;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   122
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   123
0d28b7c10758 First commit
ymh
parents:
diff changeset
   124
currentOffset = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   125
	var valueT = element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   126
	var valueL = element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   127
	return [valueL, valueT];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   128
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   129
0d28b7c10758 First commit
ymh
parents:
diff changeset
   130
cumulativeOffset = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   131
	var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   132
	do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   133
		valueT += element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   134
		valueL += element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   135
		element = element.offsetParent;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   136
	} while (element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   137
	return [valueL, valueT];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   138
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   139
0d28b7c10758 First commit
ymh
parents:
diff changeset
   140
addListener = function(element, name, observer, useCapture) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   141
	if(element.addEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   142
		element.addEventListener(name, observer, useCapture);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   143
	} else if(element.attachEvent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   144
		element.attachEvent('on' + name, observer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   145
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   146
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   147
0d28b7c10758 First commit
ymh
parents:
diff changeset
   148
function loadMenus() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   149
	var menubar = document.getElementById('navigation');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   150
	if (menubar) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   151
		var list = menubar.getElementsByTagName('ul');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   152
		for (var i = 0; i < list.length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   153
			var menu = list[i].parentNode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   154
			if(menu.parentNode === menubar) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   155
				new GhostlyMenu(menu, 'left');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   156
			} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   157
				new GhostlyMenu(menu, 'left', 1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   158
				menu.firstChild.className += ' subtitle';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   159
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   160
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   161
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   162
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   163
0d28b7c10758 First commit
ymh
parents:
diff changeset
   164
if (document.addEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   165
	document.addEventListener("DOMContentLoaded", loadMenus, false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   166
0d28b7c10758 First commit
ymh
parents:
diff changeset
   167
} else if (/MSIE/i.test(navigator.userAgent)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   168
	document.write('<script id="__ie_onload_for_elegantbox" defer src="javascript:void(0);"></script>');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   169
	var script = document.getElementById("__ie_onload_for_elegantbox");
0d28b7c10758 First commit
ymh
parents:
diff changeset
   170
	script.onreadystatechange = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   171
		if (this.readyState == 'complete') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   172
			loadMenus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   173
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   174
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   175
0d28b7c10758 First commit
ymh
parents:
diff changeset
   176
} else if (/WebKit/i.test(navigator.userAgent)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   177
	var _timer = setInterval( function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   178
		if (/loaded|complete/.test(document.readyState)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   179
			clearInterval(_timer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   180
			loadMenus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   181
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   182
	}, 10);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   183
0d28b7c10758 First commit
ymh
parents:
diff changeset
   184
} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   185
	window.onload = function(e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   186
		loadMenus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   187
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   188
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   189
0d28b7c10758 First commit
ymh
parents:
diff changeset
   190
})();