web/wp-content/themes/inove/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: 2009/08/07
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).lastChild.getElementsByTagName('a')[0].className += ' last';
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] - 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    43
			var left = getWidth(this.body) - 2;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    44
			if (this.align == 'right') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    45
			var left = getWidth(this.body) * (-1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    46
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    47
		} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    48
			var pos = cumulativeOffset(this.title);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    49
			var top = pos[1] + getHeight(this.title);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    50
			var left = pos[0];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    51
			if (this.align == 'right') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    52
				left += getWidth(this.title) - getWidth(this.body);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    53
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    54
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    55
0d28b7c10758 First commit
ymh
parents:
diff changeset
    56
		if(!/current/.test(this.title.className)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    57
			this.title.className += ' current';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    58
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    59
0d28b7c10758 First commit
ymh
parents:
diff changeset
    60
		setStyle(this.body, 'left', left + 'px');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    61
		setStyle(this.body, 'top', top + 'px');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    62
		setStyle(this.body, 'visibility', 'visible');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    63
	},
0d28b7c10758 First commit
ymh
parents:
diff changeset
    64
0d28b7c10758 First commit
ymh
parents:
diff changeset
    65
	deactivate: function(){
0d28b7c10758 First commit
ymh
parents:
diff changeset
    66
		this.title.className = this.title.className.replace('current', '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    67
		var thismenu = this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    68
		var tid = setInterval( function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    69
			clearInterval(tid);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    70
			if (!/current/.test(thismenu.title.className)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    71
				setStyle(thismenu.body, 'visibility', 'hidden');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    72
			}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    73
			return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    74
		}, 400);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    75
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    76
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    77
0d28b7c10758 First commit
ymh
parents:
diff changeset
    78
$A = function(iterable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    79
	if(!iterable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    80
		return [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    81
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    82
	if(iterable.toArray) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    83
		return iterable.toArray();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    84
	} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    85
		var results = [];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    86
		for(var i = 0; i < iterable.length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    87
			results.push(iterable[i]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    88
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    89
		return results;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    90
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    91
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    92
0d28b7c10758 First commit
ymh
parents:
diff changeset
    93
bind = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    94
	var array = this.$A(arguments);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    95
	var func = array[array.length - 1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
    96
	var method = func, args = array, object = args.shift();
0d28b7c10758 First commit
ymh
parents:
diff changeset
    97
	return function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    98
		return method.apply(object, args.concat(array));
0d28b7c10758 First commit
ymh
parents:
diff changeset
    99
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   100
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   101
0d28b7c10758 First commit
ymh
parents:
diff changeset
   102
getHeight = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   103
	return element.offsetHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   104
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   105
0d28b7c10758 First commit
ymh
parents:
diff changeset
   106
getWidth = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   107
	return element.offsetWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   108
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   109
0d28b7c10758 First commit
ymh
parents:
diff changeset
   110
setStyle = function(element, key, value) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   111
	element.style[key] = value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   112
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   113
0d28b7c10758 First commit
ymh
parents:
diff changeset
   114
cleanWhitespace = function(list) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   115
	var node = list.firstChild;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   116
	while (node) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   117
		var nextNode = node.nextSibling;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   118
		if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   119
			list.removeChild(node);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   120
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   121
		node = nextNode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   122
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   123
	return list;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   124
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   125
0d28b7c10758 First commit
ymh
parents:
diff changeset
   126
currentOffset = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   127
	var valueT = element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   128
	var valueL = element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   129
	return [valueL, valueT];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   130
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   131
0d28b7c10758 First commit
ymh
parents:
diff changeset
   132
cumulativeOffset = function(element) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   133
	var valueT = 0, valueL = 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   134
	do {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   135
		valueT += element.offsetTop  || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   136
		valueL += element.offsetLeft || 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   137
		element = element.offsetParent;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   138
	} while (element);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   139
	return [valueL, valueT];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   140
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   141
0d28b7c10758 First commit
ymh
parents:
diff changeset
   142
addListener = function(element, name, observer, useCapture) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   143
	if(element.addEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   144
		element.addEventListener(name, observer, useCapture);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   145
	} else if(element.attachEvent) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   146
		element.attachEvent('on' + name, observer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   147
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   148
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   149
0d28b7c10758 First commit
ymh
parents:
diff changeset
   150
function loadMenus() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   151
	var align = 'left';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   152
	for(var i = 0; (a = document.getElementsByTagName('link')[i]); i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   153
		if((a.getAttribute('rel') == 'stylesheet') && (a.getAttribute('href').indexOf('rtl.css') != -1)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   154
			align = 'right';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   155
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   156
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   157
0d28b7c10758 First commit
ymh
parents:
diff changeset
   158
	var subscribe = document.getElementById('subscribe');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   159
	if (subscribe) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   160
		new GhostlyMenu(subscribe, align);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   161
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   162
0d28b7c10758 First commit
ymh
parents:
diff changeset
   163
	var menubar = document.getElementById('menus');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   164
	if (menubar) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   165
		var list = menubar.getElementsByTagName('ul');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   166
		for (var i = 0; i < list.length; i++) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   167
			var menu = list[i].parentNode;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   168
			if(menu.parentNode === menubar) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   169
				new GhostlyMenu(menu, align);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   170
			} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   171
				new GhostlyMenu(menu, align, 1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   172
				menu.firstChild.className += ' subtitle';
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
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   177
0d28b7c10758 First commit
ymh
parents:
diff changeset
   178
if (document.addEventListener) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   179
	document.addEventListener("DOMContentLoaded", loadMenus, false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   180
0d28b7c10758 First commit
ymh
parents:
diff changeset
   181
} else if (/MSIE/i.test(navigator.userAgent)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   182
	document.write('<script id="__ie_onload_for_inove" defer src="javascript:void(0)"></script>');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   183
	var script = document.getElementById('__ie_onload_for_inove');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   184
	script.onreadystatechange = function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   185
		if (this.readyState == 'complete') {
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
} else if (/WebKit/i.test(navigator.userAgent)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   191
	var _timer = setInterval( function() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   192
		if (/loaded|complete/.test(document.readyState)) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   193
			clearInterval(_timer);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   194
			loadMenus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   195
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   196
	}, 10);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   197
0d28b7c10758 First commit
ymh
parents:
diff changeset
   198
} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   199
	window.onload = function(e) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   200
		loadMenus();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   201
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   202
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   203
0d28b7c10758 First commit
ymh
parents:
diff changeset
   204
})();