/*
Script: Core.js
MooTools - My Object Oriented JavaScript Tools.
License:
MIT-style license.
Copyright:
Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/).
Code & Documentation:
[The MooTools production team](http://mootools.net/developers/).
Inspiration:
- Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
*/
var MooTools = {
'version': '1.2.1',
'build': '0d4845aab3d9a4fdee2f0d4a6dd59210e4b697cf'
};
var Native = function(options){
options = options || {};
var name = options.name;
var legacy = options.legacy;
var protect = options.protect;
var methods = options.implement;
var generics = options.generics;
var initialize = options.initialize;
var afterImplement = options.afterImplement || function(){};
var object = initialize || legacy;
generics = generics !== false;
object.constructor = Native;
object.$family = {name: 'native'};
if (legacy && initialize) object.prototype = legacy.prototype;
object.prototype.constructor = object;
if (name){
var family = name.toLowerCase();
object.prototype.$family = {name: family};
Native.typize(object, family);
}
var add = function(obj, name, method, force){
if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method;
if (generics) Native.genericize(obj, name, protect);
afterImplement.call(obj, name, method);
return obj;
};
object.alias = function(a1, a2, a3){
if (typeof a1 == 'string'){
if ((a1 = this.prototype[a1])) return add(this, a2, a1, a3);
}
for (var a in a1) this.alias(a, a1[a], a2);
return this;
};
object.implement = function(a1, a2, a3){
if (typeof a1 == 'string') return add(this, a1, a2, a3);
for (var p in a1) add(this, p, a1[p], a2);
return this;
};
if (methods) object.implement(methods);
return object;
};
Native.genericize = function(object, property, check){
if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){
var args = Array.prototype.slice.call(arguments);
return object.prototype[property].apply(args.shift(), args);
};
};
Native.implement = function(objects, properties){
for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties);
};
Native.typize = function(object, family){
if (!object.type) object.type = function(item){
return ($type(item) === family);
};
};
(function(){
var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String};
for (var n in natives) new Native({name: n, initialize: natives[n], protect: true});
var types = {'boolean': Boolean, 'native': Native, 'object': Object};
for (var t in types) Native.typize(types[t], t);
var generics = {
'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"],
'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]
};
for (var g in generics){
for (var i = generics[g].length; i--;) Native.genericize(window[g], generics[g][i], true);
};
})();
var Hash = new Native({
name: 'Hash',
initialize: function(object){
if ($type(object) == 'hash') object = $unlink(object.getClean());
for (var key in object) this[key] = object[key];
return this;
}
});
Hash.implement({
forEach: function(fn, bind){
for (var key in this){
if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this);
}
},
getClean: function(){
var clean = {};
for (var key in this){
if (this.hasOwnProperty(key)) clean[key] = this[key];
}
return clean;
},
getLength: function(){
var length = 0;
for (var key in this){
if (this.hasOwnProperty(key)) length++;
}
return length;
}
});
Hash.alias('forEach', 'each');
Array.implement({
forEach: function(fn, bind){
for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this);
}
});
Array.alias('forEach', 'each');
function $A(iterable){
if (iterable.item){
var array = [];
for (var i = 0, l = iterable.length; i < l; i++) array[i] = iterable[i];
return array;
}
return Array.prototype.slice.call(iterable);
};
function $arguments(i){
return function(){
return arguments[i];
};
};
function $chk(obj){
return !!(obj || obj === 0);
};
function $clear(timer){
clearTimeout(timer);
clearInterval(timer);
return null;
};
function $defined(obj){
return (obj != undefined);
};
function $each(iterable, fn, bind){
var type = $type(iterable);
((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind);
};
function $empty(){};
function $extend(original, extended){
for (var key in (extended || {})) original[key] = extended[key];
return original;
};
function $H(object){
return new Hash(object);
};
function $lambda(value){
return (typeof value == 'function') ? value : function(){
return value;
};
};
function $merge(){
var mix = {};
for (var i = 0, l = arguments.length; i < l; i++){
var object = arguments[i];
if ($type(object) != 'object') continue;
for (var key in object){
var op = object[key], mp = mix[key];
mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $merge(mp, op) : $unlink(op);
}
}
return mix;
};
function $pick(){
for (var i = 0, l = arguments.length; i < l; i++){
if (arguments[i] != undefined) return arguments[i];
}
return null;
};
function $random(min, max){
return Math.floor(Math.random() * (max - min + 1) + min);
};
function $splat(obj){
var type = $type(obj);
return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : [];
};
var $time = Date.now || function(){
return +new Date;
};
function $try(){
for (var i = 0, l = arguments.length; i < l; i++){
try {
return arguments[i]();
} catch(e){}
}
return null;
};
function $type(obj){
if (obj == undefined) return false;
if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name;
if (obj.nodeName){
switch (obj.nodeType){
case 1: return 'element';
case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
}
} else if (typeof obj.length == 'number'){
if (obj.callee) return 'arguments';
else if (obj.item) return 'collection';
}
return typeof obj;
};
function $unlink(object){
var unlinked;
switch ($type(object)){
case 'object':
unlinked = {};
for (var p in object) unlinked[p] = $unlink(object[p]);
break;
case 'hash':
unlinked = new Hash(object);
break;
case 'array':
unlinked = [];
for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
break;
default: return object;
}
return unlinked;
};
/*
Script: Browser.js
The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash.
License:
MIT-style license.
*/
var Browser = $merge({
Engine: {name: 'unknown', version: 0},
Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},
Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},
Plugins: {},
Engines: {
presto: function(){
return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
},
trident: function(){
return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? 5 : 4);
},
webkit: function(){
return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
},
gecko: function(){
return (document.getBoxObjectFor == undefined) ? false : ((document.getElementsByClassName) ? 19 : 18);
}
}
}, Browser || {});
Browser.Platform[Browser.Platform.name] = true;
Browser.detect = function(){
for (var engine in this.Engines){
var version = this.Engines[engine]();
if (version){
this.Engine = {name: engine, version: version};
this.Engine[engine] = this.Engine[engine + version] = true;
break;
}
}
return {name: engine, version: version};
};
Browser.detect();
Browser.Request = function(){
return $try(function(){
return new XMLHttpRequest();
}, function(){
return new ActiveXObject('MSXML2.XMLHTTP');
});
};
Browser.Features.xhr = !!(Browser.Request());
Browser.Plugins.Flash = (function(){
var version = ($try(function(){
return navigator.plugins['Shockwave Flash'].description;
}, function(){
return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
}) || '0 r0').match(/\d+/g);
return {version: parseInt(version[0] || 0 + '.' + version[1] || 0), build: parseInt(version[2] || 0)};
})();
function $exec(text){
if (!text) return text;
if (window.execScript){
window.execScript(text);
} else {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
document.head.appendChild(script);
document.head.removeChild(script);
}
return text;
};
Native.UID = 1;
var $uid = (Browser.Engine.trident) ? function(item){
return (item.uid || (item.uid = [Native.UID++]))[0];
} : function(item){
return item.uid || (item.uid = Native.UID++);
};
var Window = new Native({
name: 'Window',
legacy: (Browser.Engine.trident) ? null: window.Window,
initialize: function(win){
$uid(win);
if (!win.Element){
win.Element = $empty;
if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2
win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {};
}
win.document.window = win;
return $extend(win, Window.Prototype);
},
afterImplement: function(property, value){
window[property] = Window.Prototype[property] = value;
}
});
Window.Prototype = {$family: {name: 'window'}};
new Window(window);
var Document = new Native({
name: 'Document',
legacy: (Browser.Engine.trident) ? null: window.Document,
initialize: function(doc){
$uid(doc);
doc.head = doc.getElementsByTagName('head')[0];
doc.html = doc.getElementsByTagName('html')[0];
if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){
doc.execCommand("BackgroundImageCache", false, true);
});
if (Browser.Engine.trident) doc.window.attachEvent('onunload', function() {
doc.window.detachEvent('onunload', arguments.callee);
doc.head = doc.html = doc.window = null;
});
return $extend(doc, Document.Prototype);
},
afterImplement: function(property, value){
document[property] = Document.Prototype[property] = value;
}
});
Document.Prototype = {$family: {name: 'document'}};
new Document(document);
/*
Script: Array.js
Contains Array Prototypes like each, contains, and erase.
License:
MIT-style license.
*/
Array.implement({
every: function(fn, bind){
for (var i = 0, l = this.length; i < l; i++){
if (!fn.call(bind, this[i], i, this)) return false;
}
return true;
},
filter: function(fn, bind){
var results = [];
for (var i = 0, l = this.length; i < l; i++){
if (fn.call(bind, this[i], i, this)) results.push(this[i]);
}
return results;
},
clean: function() {
return this.filter($defined);
},
indexOf: function(item, from){
var len = this.length;
for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
if (this[i] === item) return i;
}
return -1;
},
map: function(fn, bind){
var results = [];
for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this);
return results;
},
some: function(fn, bind){
for (var i = 0, l = this.length; i < l; i++){
if (fn.call(bind, this[i], i, this)) return true;
}
return false;
},
associate: function(keys){
var obj = {}, length = Math.min(this.length, keys.length);
for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
return obj;
},
link: function(object){
var result = {};
for (var i = 0, l = this.length; i < l; i++){
for (var key in object){
if (object[key](this[i])){
result[key] = this[i];
delete object[key];
break;
}
}
}
return result;
},
contains: function(item, from){
return this.indexOf(item, from) != -1;
},
extend: function(array){
for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
return this;
},
getLast: function(){
return (this.length) ? this[this.length - 1] : null;
},
getRandom: function(){
return (this.length) ? this[$random(0, this.length - 1)] : null;
},
include: function(item){
if (!this.contains(item)) this.push(item);
return this;
},
combine: function(array){
for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
return this;
},
erase: function(item){
for (var i = this.length; i--; i){
if (this[i] === item) this.splice(i, 1);
}
return this;
},
empty: function(){
this.length = 0;
return this;
},
flatten: function(){
var array = [];
for (var i = 0, l = this.length; i < l; i++){
var type = $type(this[i]);
if (!type) continue;
array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]);
}
return array;
},
hexToRgb: function(array){
if (this.length != 3) return null;
var rgb = this.map(function(value){
if (value.length == 1) value += value;
return value.toInt(16);
});
return (array) ? rgb : 'rgb(' + rgb + ')';
},
rgbToHex: function(array){
if (this.length < 3) return null;
if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
var hex = [];
for (var i = 0; i < 3; i++){
var bit = (this[i] - 0).toString(16);
hex.push((bit.length == 1) ? '0' + bit : bit);
}
return (array) ? hex : '#' + hex.join('');
}
});
/*
Script: Function.js
Contains Function Prototypes like create, bind, pass, and delay.
License:
MIT-style license.
*/
Function.implement({
extend: function(properties){
for (var property in properties) this[property] = properties[property];
return this;
},
create: function(options){
var self = this;
options = options || {};
return function(event){
var args = options.arguments;
args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
if (options.event) args = [event || window.event].extend(args);
var returns = function(){
return self.apply(options.bind || null, args);
};
if (options.delay) return setTimeout(returns, options.delay);
if (options.periodical) return setInterval(returns, options.periodical);
if (options.attempt) return $try(returns);
return returns();
};
},
run: function(args, bind){
return this.apply(bind, $splat(args));
},
pass: function(args, bind){
return this.create({bind: bind, arguments: args});
},
bind: function(bind, args){
return this.create({bind: bind, arguments: args});
},
bindWithEvent: function(bind, args){
return this.create({bind: bind, arguments: args, event: true});
},
attempt: function(args, bind){
return this.create({bind: bind, arguments: args, attempt: true})();
},
delay: function(delay, bind, args){
return this.create({bind: bind, arguments: args, delay: delay})();
},
periodical: function(periodical, bind, args){
return this.create({bind: bind, arguments: args, periodical: periodical})();
}
});
/*
Script: Number.js
Contains Number Prototypes like limit, round, times, and ceil.
License:
MIT-style license.
*/
Number.implement({
limit: function(min, max){
return Math.min(max, Math.max(min, this));
},
round: function(precision){
precision = Math.pow(10, precision || 0);
return Math.round(this * precision) / precision;
},
times: function(fn, bind){
for (var i = 0; i < this; i++) fn.call(bind, i, this);
},
toFloat: function(){
return parseFloat(this);
},
toInt: function(base){
return parseInt(this, base || 10);
}
});
Number.alias('times', 'each');
(function(math){
var methods = {};
math.each(function(name){
if (!Number[name]) methods[name] = function(){
return Math[name].apply(null, [this].concat($A(arguments)));
};
});
Number.implement(methods);
})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
/*
Script: String.js
Contains String Prototypes like camelCase, capitalize, test, and toInt.
License:
MIT-style license.
*/
String.implement({
test: function(regex, params){
return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this);
},
contains: function(string, separator){
return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
},
trim: function(){
return this.replace(/^\s+|\s+$/g, '');
},
clean: function(){
return this.replace(/\s+/g, ' ').trim();
},
camelCase: function(){
return this.replace(/-\D/g, function(match){
return match.charAt(1).toUpperCase();
});
},
hyphenate: function(){
return this.replace(/[A-Z]/g, function(match){
return ('-' + match.charAt(0).toLowerCase());
});
},
capitalize: function(){
return this.replace(/\b[a-z]/g, function(match){
return match.toUpperCase();
});
},
escapeRegExp: function(){
return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
},
toInt: function(base){
return parseInt(this, base || 10);
},
toFloat: function(){
return parseFloat(this);
},
hexToRgb: function(array){
var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
return (hex) ? hex.slice(1).hexToRgb(array) : null;
},
rgbToHex: function(array){
var rgb = this.match(/\d{1,3}/g);
return (rgb) ? rgb.rgbToHex(array) : null;
},
stripScripts: function(option){
var scripts = '';
var text = this.replace(/
(end)
Note:
The title of the element will always be used as the tooltip body. If you put :: on your title, the text before :: will become the tooltip title.
If you put DOM:someElementID in your title, $('someElementID').innerHTML will be used as your tooltip contents (same syntax as above).
If you put AJAX:http://www.example.com/path/to/ajax_file.php in your title, the response text will be used as tooltip contents (same syntax as above). Either absolute or relative paths are ok.
*/
var Garbage = {
elements: [],
collect: function(el){
if (!el.$tmp){
Garbage.elements.push(el);
el.$tmp = {'opacity': 1};
}
return el;
},
trash: function(elements){
for (var i = 0, j = elements.length, el; i < j; i++){
if (!(el = elements[i]) || !el.$tmp) continue;
if (el.$events) el.fireEvent('trash').removeEvents();
for (var p in el.$tmp) el.$tmp[p] = null;
for (var p in Element.prototype) el[p] = null;
el.htmlElement = el.$tmp = el = null;
Garbage.elements.remove(el);
}
},
empty: function(){
Garbage.collect(window);
Garbage.collect(document);
Garbage.trash(Garbage.elements);
}
};
var TipsX3 = new Class({
options: { // modded for X3
onShow: function(tip){
//tip.fade('in');
tip.setStyle('visibility', 'visible');
},
onHide: function(tip){
//tip.fade('out');
tip.setStyle('visibility', 'hidden');
},
maxTitleChars: 8,
showDelay: 100,
hideDelay: 100,
className: 'armory-tooltip',
offsets: {'x': 8, 'y': 8},
fixed: false,
loadingText: 'Please wait...',
errTitle: 'Error',
errText: 'There was a problem retrieving the item from the WoW Armory',
maxWidth: 250,
idName: ''
},
initialize: function(elements, options){
this.setOptions(options);
this.toolTip = new Element('div', {
'class': this.options.className + '-tip',
'styles': {
'position': 'absolute',
'top': '0',
'left': '0',
'visibility': 'hidden',
'max-width' : this.options.maxWidth,
'z-index' : 5000
}
}).inject(document.body);
this.wrapper = new Element('div').inject(this.toolTip);
$$(elements).each(this.build, this);
if (this.options.initialize) this.options.initialize.call(this);
},
build: function(el){
if (!el)
return false;
if (el)
Garbage.collect( el );
if( !el.$tmp || el.$tmp == undefined )
return;
el.$tmp.myTitle = (el.href && el.getTag() == 'a') ? el.href.replace('http://', '') : (el.rel || false);
if (el.title){
// check if we need to extract contents from a DOM element
if (el.title.test('^DOM:', 'i')) {
el.title = $(el.title.split(':')[1].trim()).innerHTML;
}
// check for an URL to retrieve content from
if (el.title.test('^AJAX:', 'i')) {
el.title = this.options.loadingText + '::' + el.title;
}
// check for an URL to retrieve content from
if (el.title.test('^Item:', 'i')) {
el.title = this.options.loadingText + '::' + el.title;
}
// check for an URL to retrieve content from
if (el.title.test('^WoWArmory:', 'i')) {
el.title = this.options.loadingText + '::' + el.title;
}
// check for an URL to retrieve content from
if (el.title.test('^Character:', 'i')) {
el.title = this.options.loadingText + '::' + el.title;
}
var dual = el.title.split('::');
if (dual.length > 1) {
el.$tmp.myTitle = dual[0].trim();
el.$tmp.myText = dual[1].trim();
} else {
el.$tmp.myText = el.title;
}
el.removeAttribute('title');
} else {
el.$tmp.myText = false;
}
if (el.$tmp.myTitle && el.$tmp.myTitle.length > this.options.maxTitleChars) el.$tmp.myTitle = el.$tmp.myTitle.substr(0, this.options.maxTitleChars - 1) + "…";
el.addEvent('mouseenter', function(event){
this.start(el);
if (!this.options.fixed) this.locate(event);
else this.position(el);
}.bind(this));
if (!this.options.fixed) el.addEvent('mousemove', this.locate.bindWithEvent(this));
var end = this.end.bind(this);
el.addEvent('mouseleave', end);
el.addEvent('trash', end);
},
modify: function( element, newTitle, newText ){
element.$tmp.myTitle = newTitle;
element.$tmp.myText = newText;
this.startFinal( element, false );
},
modifyItem: function( element, newTitle, newText, itemIcon ){
element.$tmp.myTitle = newTitle;
element.$tmp.myText = newText;
element.$tmp.itemIcon = itemIcon;
this.startFinal( element, false );
},
modifyNotActive: function( element, newTitle, newText ){
element.$tmp.myTitle = newTitle;
element.$tmp.myText = newText;
},
start: function( el ) {
this.startFinal( el, true );
},
startFinal: function( el, show ) {
this.wrapper.empty();
// check if we have an AJAX Item request - if so, show a loading animation and launch the request
if (el.$tmp.myText && el.$tmp.myText.test('^Item:', 'i')) {
var linkObj = this;
this.ajax = new Request.JSON( { link: 'cancel', evalScripts: false, url: el.$tmp.myText.replace(/Item:/i,'/powered/items/'), onComplete: function( item ){
linkObj.modifyItem( el, '', item.html, item.icon )
}}).get();
el.$tmp.myText = '
';
}
// check if we have an AJAX Char request - if so, show a loading animation and launch the request
if (el.$tmp.myText && el.$tmp.myText.test('^Character:', 'i')) {
var linkObj = this;
this.ajax = new Request.HTML( { link: 'cancel', evalScripts: false, url: el.$tmp.myText.replace(/Character:/i,'/powered/characters/'), onSuccess: function( var1, var2, response, var3 ) {
linkObj.modify( el, '', response )
}}).get();
el.$tmp.myText = '';
}
// check if we have an AJAX wow armory item request - if so, show a loading animation and launch the request
if (el.$tmp.myText && el.$tmp.myText.test('^WoWArmory:', 'i')) {
var linkObj = this;
var myArmoryUrl = el.$tmp.myText.replace(/WoWArmory:/i,'');
myArmoryUrl = '/wowArmoryProxy.php?url=' + escape( myArmoryUrl );
this.ajax = new Request.HTML( { link: 'cancel', evalScripts: false, url: myArmoryUrl, onSuccess: function( var1, var2, response, var3 ) {
linkObj.modify( el, '', response )
}}).get();
el.$tmp.myText = '';
}
if( el.$tmp.itemIcon ) {
this.wrapper.set( 'html', '
' );
} else {
this.wrapper.set( 'html', '' );
}
this.theTip = $( this.options.idName );
if (el.$tmp.myTitle){
this.title = new Element('span').inject(
new Element('div', {'class': this.options.className + '-title'}).inject( this.theTip )
).set( 'html', el.$tmp.myTitle );
}
if (el.$tmp.myText){
this.text = new Element('span').inject(
new Element('div', {'class': this.options.className + '-text'}).inject( this.theTip )
).set( 'html', el.$tmp.myText );
}
if( show == true ) {
$clear(this.timer);
this.timer = this.show.delay( this.options.showDelay, this);
}
},
end: function(event){
$clear(this.timer);
this.timer = this.hide.delay( this.options.hideDelay, this);
},
position: function(element){
var pos = element.getPosition();
this.toolTip.setStyles({
'left': pos.x + this.options.offsets.x,
'top': pos.y + this.options.offsets.y
});
},
locate: function(event){
var win = {'x': window.getWidth(), 'y': window.getHeight()};
var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
var tip = {'x': this.toolTip.offsetWidth, 'y': this.toolTip.offsetHeight};
var prop = {'x': 'left', 'y': 'top'};
for (var z in prop){
var pos = event.page[z] + this.options.offsets[z];
if ((pos + tip[z] - scroll[z]) > win[z])
pos =event.page[z] - this.options.offsets[z] - tip[z];
if( z == 'y' && pos - scroll.y < 10 ) {
pos = scroll.y + 10;
}
this.toolTip.setStyle(prop[z], pos);
};
},
show: function(){
if (this.options.timeout) this.timer = this.hide.delay( this.options.timeout, this );
this.fireEvent( 'onShow', [this.toolTip] );
},
hide: function(){
this.fireEvent( 'onHide', [this.toolTip] );
}
});
TipsX3.implement( new Events, new Options );var MorphList = new Class({
Implements: [Events, Options],
options: {/*
onClick: $empty,
onMorph: $empty,*/
morph: { 'link': 'cancel' }
},
initialize: function(menu, options) {
var that = this;
this.setOptions(options);
this.menu = $(menu);
this.menuitems = this.menu.getChildren();
this.menuitems.addEvents({
mouseenter: function(){ that.morphTo(this); },
mouseleave: function(){ that.morphTo(that.current); },
click: function(ev){ that.click(ev, this); }
});
this.bg = new Element('li', {'class': 'background'}).adopt(new Element('div', {'class': 'left'}));
this.bg.inject(this.menu).set('morph', this.options.morph);
this.setCurrent(this.menu.getElement('.current'));
},
click: function(ev, item) {
this.setCurrent(item, true);
this.fireEvent('onClick', [ev, item]);
},
setCurrent: function(el, effect){
if(el && ! this.current) {
this.bg.set('styles', { left: el.offsetLeft, width: el.offsetWidth, height: el.offsetHeight, top: el.offsetTop });
(effect) ? this.bg.fade('hide').fade('in') : this.bg.fade('show');
}
if(this.current) this.current.removeClass('current');
if(el) this.current = el.addClass('current');
},
morphTo: function(to) {
if(! this.current) return;
this.bg.morph({
left: to.offsetLeft, top: to.offsetTop,
width: to.offsetWidth, height: to.offsetHeight
});
this.fireEvent('onMorph', to);
}
});
window.addEvent('domready', function() {
// attach fancy menu for browsers other than ie6
if( !Browser.Engine.trident4 ) {
new MorphList(
$('nav'), {
transition: Fx.Transitions.backOut,
duration: 700
}
);
}
// Check all links for item links or character links
var allLinks = $$( 'a' );
for (var i = allLinks.length - 1; i >= 0; i--){
var currentLink = allLinks[i];
if( !currentLink.href || currentLink.href == '' )
continue;
if( currentLink.rel && currentLink.rel == 'notooltip' )
continue;
if( currentLink.id && currentLink.id == 'fdbk_tab' )
continue;
var regExp1 = new RegExp( "^http://" + window.location.hostname + "\/items\/", "mi" );
var regExp2 = new RegExp( "^\/items\/", "mi" );
var regExp3 = new RegExp( "^http://" + window.location.hostname + "\/eu\/", "mi" );
var regExp4 = new RegExp( "^\/eu\/", "mi" );
var regExp5 = new RegExp( "^http://" + window.location.hostname + "\/us\/", "mi" );
var regExp6 = new RegExp( "^\/us\/", "mi" );
var regExp7 = new RegExp( "^http://" + window.location.hostname + "\/cn\/", "mi" );
var regExp8 = new RegExp( "^\/cn\/", "mi" );
var regExp9 = new RegExp( "^http://" + window.location.hostname + "\/kr\/", "mi" );
var regExp10 = new RegExp( "^\/kr\/", "mi" );
var regExp11 = new RegExp( "^http://" + window.location.hostname + "\/tw\/", "mi" );
var regExp12 = new RegExp( "^\/tw\/", "mi" );
// Check whether it starts with Armory Light
if( regExp1.test( currentLink.href ) == false &&
regExp2.test( currentLink.href ) == false &&
regExp3.test( currentLink.href ) == false &&
regExp4.test( currentLink.href ) == false &&
regExp5.test( currentLink.href ) == false &&
regExp6.test( currentLink.href ) == false &&
regExp7.test( currentLink.href ) == false &&
regExp8.test( currentLink.href ) == false &&
regExp9.test( currentLink.href ) == false &&
regExp10.test( currentLink.href ) == false &&
regExp11.test( currentLink.href ) == false &&
regExp12.test( currentLink.href ) == false )
continue;
var linkElements = currentLink.href.split( '/' );
var linkRel = currentLink.rel;
for (var j=linkElements.length; j <= 6; j++) {
linkElements[j] = '';
};
var LinkType = linkElements[3].toLowerCase();
var ItemId = linkElements[4].toLowerCase();
var ServerName = linkElements[4];
var CharacterName = linkElements[5];
var JSONRequestUrl = false;
if( LinkType == 'items' && ItemId != '' && ItemId > 0 && linkRel != 'notip' && linkRel.match('wowarmory') == null ) {
// Ok it's an item Link, create a span wrapper
var mySpan = new Element('span', {
'title': 'Item:' + ItemId,
'class': 'armoryitemtip' }
);
mySpan.wraps( currentLink );
} else if( LinkType == 'items' && ItemId != '' && ItemId > 0 && linkRel.match('wowarmory') == 'wowarmory' ) {
// Ok it's an item Link for the wow armory, create a span wrapper
var linkRelElements = currentLink.rel.split( ':' );
var armoryRegion = linkRelElements[1];
if( armoryRegion == 'us' )
armoryRegion = 'www';
var mySpan = new Element('span', {
'title': 'WoWArmory:http://' + armoryRegion + '.wowarmory.com/item-tooltip.xml?i=' + ItemId + '&s=' + linkRelElements[4] + '&r=' + linkRelElements[2] + '&n=' + linkRelElements[3],
'class': 'armoryitemtip' }
);
mySpan.wraps( currentLink );
} else if( ( LinkType == 'eu' || LinkType == 'us' || LinkType == 'kr' || LinkType == 'cn' || LinkType == 'tw' )&& ServerName != '' && CharacterName != '' ) {
// Ok it's an item Link, create a span wrapper
var mySpan = new Element('span', {
'title': 'Character:' + LinkType + '/' + ServerName + '/' + CharacterName,
'class': 'armoryitemtip' }
);
mySpan.wraps( currentLink );
} else {
continue;
}
};
// Preload tooltip background
new Element('img',{ src: 'http://static.armory-light.com/images/tooltip-trans.png' });
// Attach tooltips to all armorytip elements
var ArmoryLightTips = new TipsX3(
$$('.armorytip'), {
maxTitleChars: 100,
showDelay: 0,
maxWidth: 265,
idName: 'armoryGenericTipContent'
}
);
// Attach item tooltips to all armoryitemtip elements
var ArmoryLightTips = new TipsX3(
$$('.armoryitemtip'), {
maxTitleChars: 100,
maxWidth: 335,
showDelay: 0,
idName: 'armoryItemTipContent',
loadingText: 'Loading...'
}
);
// Set highslide options
if( undefined !== window.hs ) {
hs.graphicsDir = 'http://static.armory-light.com/images/highslide/';
hs.outlineType = 'rounded-black';
hs.wrapperClassName = 'draggable-header no-footer wide-border';
hs.allowSizeReduction = false;
hs.preserveContent = false;
hs.align = 'center';
hs.dimmingOpacity = 0.35;
hs.dragByHeading = false;
hs.fadeInOut = true;
hs.dimmingGeckoFix = true;
hs.dimmingDuration = 20;
hs.showCredits = false;
hs.objectLoadTime = 'after';
hs.transitions = ["expand"];
hs.Expander.prototype.onDrag = function (sender, e) {
return false;
};
hs.Expander.prototype.onBeforeClose = function (sender, e) {
window.location.hash = '#';
return true;
};
}
});
Array.prototype.inArray = function( value ) {
var i;
for (i=0; i < this.length; i++) {
// Matches identical (===), not just similar (==).
if (this[i] === value) {
return true;
}
}
return false;
};
/*
TableSort revisited v4.9 by frequency-decoder.com
Released under a creative commons Attribution-ShareAlike 2.5 license (http://creativecommons.org/licenses/by-sa/2.5/)
Please credit frequency decoder in any derivative work - thanks
You are free:
* to copy, distribute, display, and perform the work
* to make derivative works
* to make commercial use of the work
Under the following conditions:
by Attribution.
--------------
You must attribute the work in the manner specified by the author or licensor.
sa
--
Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one.
* For any reuse or distribution, you must make clear to others the license terms of this work.
* Any of these conditions can be waived if you get permission from the copyright holder.
*/
(function() {
fdTableSort = {
regExp_Currency: /^[£$€¥¤]/,
regExp_Number: /^(\-)?[0-9]+(\.[0-9]*)?$/,
pos: -1,
uniqueHash: 1,
thNode: null,
tableId: null,
tableCache: {},
tmpCache: {},
sortActiveClass: "sort-active",
/*@cc_on
/*@if (@_win32)
colspan: "colSpan",
rowspan: "rowSpan",
@else @*/
colspan: "colspan",
rowspan: "rowspan",
/*@end
@*/
addEvent: function(obj, type, fn, tmp) {
tmp || (tmp = true);
if( obj.attachEvent ) {
obj["e"+type+fn] = fn;
obj[type+fn] = function(){obj["e"+type+fn]( window.event );};
obj.attachEvent( "on"+type, obj[type+fn] );
} else {
obj.addEventListener( type, fn, true );
};
},
removeEvent: function(obj, type, fn, tmp) {
tmp || (tmp = true);
try {
if( obj.detachEvent ) {
obj.detachEvent( "on"+type, obj[type+fn] );
obj[type+fn] = null;
} else {
obj.removeEventListener( type, fn, true );
};
} catch(err) {};
},
stopEvent: function(e) {
e = e || window.event;
if(e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
};
/*@cc_on@*/
/*@if(@_win32)
e.cancelBubble = true;
e.returnValue = false;
/*@end@*/
return false;
},
parseClassName: function(head, tbl) {
var colMatch = tbl.className.match(new RegExp(head + "((-[\\d]+([r]){0,1})+)"));
return colMatch && colMatch.length ? colMatch[0].replace(head, "").split("-") : [];
},
disableSelection: function(element) {
element.onselectstart = function() {
return false;
};
element.unselectable = "on";
element.style.MozUserSelect = "none";
},
removeTableCache: function(tableId) {
if(!(tableId in fdTableSort.tableCache)) return;
fdTableSort.tableCache[tableId] = null;
delete fdTableSort.tableCache[tableId];
var tbl = document.getElementById(tableId);
if(!tbl) return;
var ths = tbl.getElementsByTagName("th");
var a;
for(var i = 0, th; th = ths[i]; i++) {
a = th.getElementsByTagName("a");
if(a.length) a[0].onkeydown = a[0].onclick = null;
th.onclick = th.onselectstart = th = a = null;
};
},
removeTmpCache: function(tableId) {
if(!(tableId in fdTableSort.tmpCache)) return;
var headers = fdTableSort.tmpCache[tableId].headers;
var a;
for(var i = 0, row; row = headers[i]; i++) {
for(var j = 0, th; th = row[j]; j++) {
a = th.getElementsByTagName("a");
if(a.length) a[0].onkeydown = a[0].onclick = null;
th.onclick = th.onselectstart = th = a = null;
};
};
fdTableSort.tmpCache[tableId] = null;
delete fdTableSort.tmpCache[tableId];
},
initEvt: function(e) {
fdTableSort.init(false);
},
init: function(tableId) {
if (!document.getElementsByTagName || !document.createElement || !document.getElementById) return;
var tables = tableId && document.getElementById(tableId) ? [document.getElementById(tableId)] : document.getElementsByTagName("table");
var c, ii, len, colMatch, showOnly, match, showArrow, columnNumSortObj, obj, workArr, headers, thtext, aclone, multi, colCnt, cel, allRowArr, rowArr, sortableTable, celCount, colspan, rowspan, rowLength;
var a = document.createElement("a");
a.href = "#";
a.className = "fdTableSortTrigger";
var span = document.createElement("span");
for(var k = 0, tbl; tbl = tables[k]; k++) {
if(tbl.id) {
fdTableSort.removeTableCache(tbl.id);
fdTableSort.removeTmpCache(tbl.id);
};
allRowArr = tbl.getElementsByTagName('thead').length ? tbl.getElementsByTagName('thead')[0].getElementsByTagName('tr') : tbl.getElementsByTagName('tr');
rowArr = [];
sortableTable = false;
for(var i = 0, tr; tr = allRowArr[i]; i++) {
if(tr.getElementsByTagName('td').length || !tr.getElementsByTagName('th').length) { continue; };
rowArr[rowArr.length] = tr.getElementsByTagName('th');
for(var j = 0, th; th = rowArr[rowArr.length - 1][j]; j++) {
if(th.className.search(/sortable/) != -1) { sortableTable = true; };
};
};
if(!sortableTable) continue;
if(!tbl.id) { tbl.id = "fd-table-" + fdTableSort.uniqueHash++; };
showArrow = tbl.className.search("no-arrow") == -1;
showOnly = tbl.className.search("sortable-onload-show") != -1;
columnNumSortObj = {};
colMatch = fdTableSort.parseClassName(showOnly ? "sortable-onload-show" : "sortable-onload", tbl);
for(match = 1; match < colMatch.length; match++) {
columnNumSortObj[parseInt(colMatch[match], 10)] = { "reverse":colMatch[match].search("r") != -1 };
};
rowLength = rowArr[0].length;
for(c = 0;c < rowArr[0].length;c++){
if(rowArr[0][c].getAttribute(fdTableSort.colspan) && rowArr[0][c].getAttribute(fdTableSort.colspan) > 1){
rowLength = rowLength + (rowArr[0][c].getAttribute(fdTableSort.colspan) - 1);
};
};
workArr = new Array(rowArr.length);
for(c = rowArr.length;c--;){ workArr[c]= new Array(rowLength); };
for(c = 0;c < workArr.length;c++){
celCount = 0;
for(i = 0;i < rowLength;i++){
if(!workArr[c][i]){
cel = rowArr[c][celCount];
colspan = (cel.getAttribute(fdTableSort.colspan) > 1) ? cel.getAttribute(fdTableSort.colspan):1;
rowspan = (cel.getAttribute(fdTableSort.rowspan) > 1) ? cel.getAttribute(fdTableSort.rowspan):1;
for(var t = 0;((t < colspan)&&((i+t) < rowLength));t++){
for(var n = 0;((n < rowspan)&&((c+n) < workArr.length));n++) {
workArr[(c+n)][(i+t)] = cel;
};
};
if(++celCount == rowArr[c].length) break;
};
};
};
for(c = 0;c < workArr.length;c++) {
for(i = 0;i < workArr[c].length;i++){
if(workArr[c][i].className.search("fd-column-") == -1 && workArr[c][i].className.search("sortable") != -1) workArr[c][i].className = workArr[c][i].className + " fd-column-" + i;
if(workArr[c][i].className.match('sortable')) {
workArr[c][i].className = workArr[c][i].className.replace(/forwardSort|reverseSort/, "");
if(i in columnNumSortObj) {
columnNumSortObj[i]["thNode"] = workArr[c][i];
columnNumSortObj["active"] = true;
};
thtext = fdTableSort.getInnerText(workArr[c][i]);
for(var cn = workArr[c][i].childNodes.length; cn--;) {
// Skip image nodes and links created by the filter script.
if(workArr[c][i].childNodes[cn].nodeType == 1 && (workArr[c][i].childNodes[cn].className == "fdFilterTrigger" || /img/i.test(workArr[c][i].childNodes[cn].nodeName))) {
continue;
};
if(workArr[c][i].childNodes[cn].nodeType == 1 && /^a$/i.test(workArr[c][i].childNodes[cn].nodeName)) {
workArr[c][i].childNodes[cn].onclick = workArr[c][i].childNodes[cn].onkeydown = null;
};
workArr[c][i].removeChild(workArr[c][i].childNodes[cn]);
};
aclone = a.cloneNode(true);
aclone.appendChild(document.createTextNode(thtext));
aclone.title = "Sort on \u201c" + thtext + "\u201d";
aclone.onclick = aclone.onkeydown = workArr[c][i].onclick = fdTableSort.initWrapper;
workArr[c][i].appendChild(aclone);
if(showArrow) workArr[c][i].appendChild(span.cloneNode(false));
workArr[c][i].className = workArr[c][i].className.replace(/fd-identical|fd-not-identical/, "");
fdTableSort.disableSelection(workArr[c][i]);
aclone = null;
};
};
};
fdTableSort.tmpCache[tbl.id] = {cols:rowLength, headers:workArr};
workArr = null;
multi = 0;
if("active" in columnNumSortObj) {
fdTableSort.tableId = tbl.id;
fdTableSort.prepareTableData(document.getElementById(fdTableSort.tableId));
delete columnNumSortObj["active"];
for(col in columnNumSortObj) {
obj = columnNumSortObj[col];
if(!("thNode" in obj)) { continue; };
fdTableSort.multi = true;
len = obj.reverse ? 2 : 1;
for(ii = 0; ii < len; ii++) {
fdTableSort.thNode = obj.thNode;
if(!showOnly) {
fdTableSort.initSort(false, true);
} else {
fdTableSort.addThNode();
};
};
if(showOnly) {
fdTableSort.removeClass(obj.thNode, "(forwardSort|reverseSort)");
fdTableSort.addClass(obj.thNode, obj.reverse ? "reverseSort" : "forwardSort");
if(showArrow) {
span = fdTableSort.thNode.getElementsByTagName('span')[0];
if(span.firstChild) { span.removeChild(span.firstChild); };
span.appendChild(document.createTextNode(len == 1 ? " \u2193" : " \u2191"));
};
};
};
if(showOnly && (fdTableSort.tableCache[tbl.id].colStyle || fdTableSort.tableCache[tbl.id].rowStyle)) {
fdTableSort.redraw(tbl.id, false);
};
} else if(tbl.className.search(/onload-zebra/) != -1) {
fdTableSort.tableId = tbl.id;
fdTableSort.prepareTableData(tbl);
if(fdTableSort.tableCache[tbl.id].rowStyle) { fdTableSort.redraw(tbl.id, false); };
};
};
fdTableSort.thNode = aclone = a = span = columnNumSortObj = thNode = tbl = allRowArr = rowArr = null;
},
initWrapper: function(e) {
e = e || window.event;
var kc = e.type == "keydown" ? e.keyCode != null ? e.keyCode : e.charCode : -1;
if(fdTableSort.thNode == null && (e.type == "click" || kc == 13)) {
var targ = this;
while(targ.tagName.toLowerCase() != "th") { targ = targ.parentNode; };
fdTableSort.thNode = targ;
while(targ.tagName.toLowerCase() != "table") { targ = targ.parentNode; };
fdTableSort.tableId = targ.id;
fdTableSort.multi = e.shiftKey;
fdTableSort.addSortActiveClass();
setTimeout(fdTableSort.initSort,5,false);
return fdTableSort.stopEvent(e);
};
return kc != -1 ? true : fdTableSort.stopEvent(e);
},
jsWrapper: function(tableid, colNums) {
if(!(tableid in fdTableSort.tmpCache)) { return false; };
if(!(tableid in fdTableSort.tableCache)) { fdTableSort.prepareTableData(document.getElementById(tableid)); };
if(!(colNums instanceof Array)) { colNums = [colNums]; };
fdTableSort.tableId = tableid;
var len = colNums.length, colNum;
if(fdTableSort.tableCache[tableid].thList.length == colNums.length) {
var identical = true;
var th;
for(var i = 0; i < len; i++) {
colNum = colNums[i];
th = fdTableSort.tmpCache[tableid].headers[0][colNum];
if(th != fdTableSort.tableCache[tableid].thList[i]) {
identical = false;
break;
};
};
if(identical) {
fdTableSort.thNode = th;
fdTableSort.initSort(true);
return;
};
};
fdTableSort.addSortActiveClass();
for(var i = 0; i < len; i++) {
fdTableSort.multi = i;
colNum = colNums[i];
fdTableSort.thNode = fdTableSort.tmpCache[tableid].headers[0][colNum];
fdTableSort.initSort(true);
};
},
addSortActiveClass: function() {
if(fdTableSort.thNode == null) { return; };
fdTableSort.addClass(fdTableSort.thNode, fdTableSort.sortActiveClass);
fdTableSort.addClass(document.getElementsByTagName('body')[0], fdTableSort.sortActiveClass);
},
removeSortActiveClass: function() {
if(fdTableSort.thNode == null) return;
fdTableSort.removeClass(fdTableSort.thNode, fdTableSort.sortActiveClass);
fdTableSort.removeClass(document.getElementsByTagName('body')[0], fdTableSort.sortActiveClass);
},
doCallback: function(init) {
if(!fdTableSort.tableId || !(fdTableSort.tableId in fdTableSort.tableCache)) { return; };
fdTableSort.callback(fdTableSort.tableId, init ? fdTableSort.tableCache[fdTableSort.tableId].initiatedCallback : fdTableSort.tableCache[fdTableSort.tableId].completeCallback);
},
addClass: function(e,c) {
if(new RegExp("(^|\\s)" + c + "(\\s|$)").test(e.className)) { return; };
e.className += ( e.className ? " " : "" ) + c;
},
/*@cc_on
/*@if (@_win32)
removeClass: function(e,c) {
e.className = !c ? "" : e.className.replace(new RegExp("(^|\\s)" + c + "(\\s|$)"), " ").replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
},
@else @*/
removeClass: function(e,c) {
e.className = !c ? "" : e.className.replace(new RegExp("(^|\\s)" + c + "(\\s|$)"), " ").replace(/^\s\s*/, '').replace(/\s\s*$/, '');
},
/*@end
@*/
callback: function(tblId, cb) {
var func;
if(cb.indexOf(".") != -1) {
var split = cb.split(".");
func = window;
for(var i = 0, f; f = split[i]; i++) {
if(f in func) {
func = func[f];
} else {
func = "";
break;
};
};
} else if(cb + tblId in window) {
func = window[cb + tblId];
} else if(cb in window) {
func = window[cb];
};
if(typeof func == "function") { func(tblId, fdTableSort.tableCache[tblId].thList); };
func = null;
},
prepareTableData: function(table) {
var data = [];
var start = table.getElementsByTagName('tbody');
start = start.length ? start[0] : table;
var trs = start.rows;
var ths = table.getElementsByTagName('th');
var numberOfRows = trs.length;
var numberOfCols = fdTableSort.tmpCache[table.id].cols;
var data = [];
var identical = new Array(numberOfCols);
var identVal = new Array(numberOfCols);
for(var tmp = 0; tmp < numberOfCols; tmp++) identical[tmp] = true;
var tr, td, th, txt, tds, col, row;
var re = new RegExp(/fd-column-([0-9]+)/);
var rowCnt = 0;
var sortableColumnNumbers = [];
for(var tmp = 0, th; th = ths[tmp]; tmp++) {
if(th.className.search(re) == -1) continue;
sortableColumnNumbers[sortableColumnNumbers.length] = th;
};
for(row = 0; row < numberOfRows; row++) {
tr = trs[row];
if(tr.parentNode != start || tr.getElementsByTagName("th").length || (tr.parentNode && tr.parentNode.tagName.toLowerCase().search(/thead|tfoot/) != -1)) continue;
data[rowCnt] = [];
tds = tr.cells;
for(var tmp = 0, th; th = sortableColumnNumbers[tmp]; tmp++) {
col = th.className.match(re)[1];
td = tds[col];
txt = fdTableSort.getInnerText(td) + " ";
txt = txt.replace(/^\s+/,'').replace(/\s+$/,'');
if(th.className.search(/sortable-date/) != -1) {
txt = fdTableSort.dateFormat(txt, th.className.search(/sortable-date-dmy/) != -1);
} else if(th.className.search(/sortable-numeric|sortable-currency/) != -1) {
txt = parseFloat(txt.replace(/[^0-9\.\-]/g,''));
if(isNaN(txt)) txt = "";
} else if(th.className.search(/sortable-text/) != -1) {
txt = txt.toLowerCase();
} else if (th.className.search(/sortable-keep/) != -1) {
txt = rowCnt;
} else if(th.className.search(/sortable-([a-zA-Z\_]+)/) != -1) {
if((th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "PrepareData") in window) {
txt = window[th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "PrepareData"](td, txt);
};
} else if(txt != "") {
fdTableSort.removeClass(th, "sortable");
if(fdTableSort.dateFormat(txt) != 0) {
fdTableSort.addClass(th, "sortable-date");
txt = fdTableSort.dateFormat(txt);
} else if(txt.search(fdTableSort.regExp_Number) != -1 || txt.search(fdTableSort.regExp_Currency) != -1) {
fdTableSort.addClass(th, "sortable-numeric");
txt = parseFloat(txt.replace(/[^0-9\.\-]/g,''));
if(isNaN(txt)) txt = "";
} else {
fdTableSort.addClass(th, "sortable-text");
txt = txt.toLowerCase();
};
};
if(rowCnt > 0 && identical[col] && identVal[col] != txt) { identical[col] = false; };
identVal[col] = txt;
data[rowCnt][col] = txt;
};
data[rowCnt][numberOfCols] = tr;
rowCnt++;
};
var colStyle = table.className.search(/colstyle-([\S]+)/) != -1 ? table.className.match(/colstyle-([\S]+)/)[1] : false;
var rowStyle = table.className.search(/rowstyle-([\S]+)/) != -1 ? table.className.match(/rowstyle-([\S]+)/)[1] : false;
var iCBack = table.className.search(/sortinitiatedcallback-([\S-]+)/) == -1 ? "sortInitiatedCallback" : table.className.match(/sortinitiatedcallback-([\S]+)/)[1];
var cCBack = table.className.search(/sortcompletecallback-([\S-]+)/) == -1 ? "sortCompleteCallback" : table.className.match(/sortcompletecallback-([\S]+)/)[1];
iCBack = iCBack.replace("-", ".");
cCBack = cCBack.replace("-", ".");
fdTableSort.tableCache[table.id] = { hook:start, initiatedCallback:iCBack, completeCallback:cCBack, thList:[], colOrder:{}, data:data, identical:identical, colStyle:colStyle, rowStyle:rowStyle, noArrow:table.className.search(/no-arrow/) != -1 };
sortableColumnNumbers = data = tr = td = th = trs = identical = identVal = null;
},
onUnload: function() {
for(tbl in fdTableSort.tableCache) { fdTableSort.removeTableCache(tbl); };
for(tbl in fdTableSort.tmpCache) { fdTableSort.removeTmpCache(tbl); };
fdTableSort.removeEvent(window, "load", fdTableSort.initEvt);
fdTableSort.removeEvent(window, "unload", fdTableSort.onUnload);
fdTableSort.tmpCache = fdTableSort.tableCache = null;
},
addThNode: function() {
var dataObj = fdTableSort.tableCache[fdTableSort.tableId];
var pos = fdTableSort.thNode.className.match(/fd-column-([0-9]+)/)[1];
var alt = false;
if(!fdTableSort.multi) {
if(dataObj.colStyle) {
var len = dataObj.thList.length;
for(var i = 0; i < len; i++) {
dataObj.colOrder[dataObj.thList[i].className.match(/fd-column-([0-9]+)/)[1]] = false;
};
};
if(dataObj.thList.length && dataObj.thList[0] == fdTableSort.thNode) alt = true;
dataObj.thList = [];
};
var found = false;
var l = dataObj.thList.length;
for(var i = 0, n; n = dataObj.thList[i]; i++) {
if(n == fdTableSort.thNode) {
found = true;
break;
};
};
if(!found) {
dataObj.thList.push(fdTableSort.thNode);
if(dataObj.colStyle) { dataObj.colOrder[pos] = true; };
};
var ths = document.getElementById(fdTableSort.tableId).getElementsByTagName("th");
for(var i = 0, th; th = ths[i]; i++) {
found = false;
for(var z = 0, n; n = dataObj.thList[z]; z++) {
if(n == th) {
found = true;
break;
};
};
if(!found) {
fdTableSort.removeClass(th, "(forwardSort|reverseSort)");
if(!dataObj.noArrow) {
span = th.getElementsByTagName('span');
if(span.length) {
span = span[0];
while(span.firstChild) span.removeChild(span.firstChild);
};
};
};
};
if(dataObj.thList.length > 1) {
classToAdd = fdTableSort.thNode.className.search(/forwardSort/) != -1 ? "reverseSort" : "forwardSort";
fdTableSort.removeClass(fdTableSort.thNode, "(forwardSort|reverseSort)");
fdTableSort.addClass(fdTableSort.thNode, classToAdd);
dataObj.pos = -1
} else if(alt) { dataObj.pos = fdTableSort.thNode };
},
initSort: function(noCallback, ident) {
var thNode = fdTableSort.thNode;
var tableElem = document.getElementById(fdTableSort.tableId);
if(!(fdTableSort.tableId in fdTableSort.tableCache)) { fdTableSort.prepareTableData(document.getElementById(fdTableSort.tableId)); };
fdTableSort.addThNode();
if(!noCallback) { fdTableSort.doCallback(true); };
fdTableSort.pos = thNode.className.match(/fd-column-([0-9]+)/)[1];
var dataObj = fdTableSort.tableCache[tableElem.id];
var lastPos = dataObj.pos && dataObj.pos.className ? dataObj.pos.className.match(/fd-column-([0-9]+)/)[1] : -1;
var len1 = dataObj.data.length;
var len2 = dataObj.data.length > 0 ? dataObj.data[0].length - 1 : 0;
var identical = dataObj.identical[fdTableSort.pos];
var classToAdd = "forwardSort";
if(dataObj.thList.length > 1) {
var js = "var sortWrapper = function(a,b) {\n";
var l = dataObj.thList.length;
var cnt = 0;
var e,d,th,p,f;
for(var i=0; i < l; i++) {
th = dataObj.thList[i];
p = th.className.match(/fd-column-([0-9]+)/)[1];
if(dataObj.identical[p]) { continue; };
cnt++;
if(th.className.match(/sortable-(numeric|currency|date|keep)/)) {
f = "fdTableSort.sortNumeric";
} else if(th.className.match('sortable-text')) {
f = "fdTableSort.sortText";
} else if(th.className.search(/sortable-([a-zA-Z\_]+)/) != -1 && th.className.match(/sortable-([a-zA-Z\_]+)/)[1] in window) {
f = "window['" + th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "']";
} else f = "fdTableSort.sortText";
e = "e" + i;
d = th.className.search('forwardSort') != -1 ? "a,b" : "b,a";
js += "fdTableSort.pos = " + p + ";\n";
js += "var " + e + " = "+f+"(" + d +");\n";
js += "if(" + e + ") return " + e + ";\n";
js += "else { \n";
};
js += "return 0;\n";
for(var i=0; i < cnt; i++) {
js += "};\n";
};
if(cnt) js += "return 0;\n";
js += "};\n";
eval(js);
dataObj.data.sort(sortWrapper);
identical = false;
} else if((lastPos == fdTableSort.pos && !identical) || (thNode.className.search(/sortable-keep/) != -1 && lastPos == -1)) {
dataObj.data.reverse();
classToAdd = thNode.className.search(/reverseSort/) != -1 ? "forwardSort" : "reverseSort";
if(thNode.className.search(/sortable-keep/) != -1 && lastPos == -1) fdTableSort.tableCache[tableElem.id].pos = thNode;
} else {
fdTableSort.tableCache[tableElem.id].pos = thNode;
classToAdd = thNode.className.search(/forwardSort/) != -1 ? "reverseSort" : "forwardSort";
if(!identical) {
if(thNode.className.match(/sortable-(numeric|currency|date|keep)/)) {
dataObj.data.sort(fdTableSort.sortNumeric);
} else if(thNode.className.match('sortable-text')) {
dataObj.data.sort(fdTableSort.sortText);
} else if(thNode.className.search(/sortable-([a-zA-Z\_]+)/) != -1 && thNode.className.match(/sortable-([a-zA-Z\_]+)/)[1] in window) {
dataObj.data.sort(window[thNode.className.match(/sortable-([a-zA-Z\_]+)/)[1]]);
};
if(thNode.className.search(/(^|\s)favour-reverse($|\s)/) != -1) {
classToAdd = classToAdd == "forwardSort" ? "reverseSort" : "forwardSort";
dataObj.data.reverse();
};
};
};
if(ident) { identical = false; };
if(dataObj.thList.length == 1) {
fdTableSort.removeClass(thNode, "(forwardSort|reverseSort)");
fdTableSort.addClass(thNode, classToAdd);
};
if(!dataObj.noArrow) {
var span = fdTableSort.thNode.getElementsByTagName('span')[0];
if(span.firstChild) span.removeChild(span.firstChild);
span.appendChild(document.createTextNode(fdTableSort.thNode.className.search(/forwardSort/) != -1 ? " \u2193" : " \u2191"));
};
if(!dataObj.rowStyle && !dataObj.colStyle && identical) {
fdTableSort.removeSortActiveClass();
if(!noCallback) { fdTableSort.doCallback(false); };
fdTableSort.thNode = null;
return;
};
if("tablePaginater" in window && "tableInfo" in tablePaginater && fdTableSort.tableId in tablePaginater.tableInfo) {
tablePaginater.redraw(fdTableSort.tableId, identical);
} else {
fdTableSort.redraw(fdTableSort.tableId, identical);
};
fdTableSort.removeSortActiveClass();
if(!noCallback) { fdTableSort.doCallback(false); };
fdTableSort.thNode = null;
},
redraw: function(tableid, identical) {
if(!tableid || !(tableid in fdTableSort.tableCache)) { return; };
var dataObj = fdTableSort.tableCache[tableid];
var data = dataObj.data;
var len1 = data.length;
var len2 = len1 ? data[0].length - 1 : 0;
var hook = dataObj.hook;
var colStyle = dataObj.colStyle;
var rowStyle = dataObj.rowStyle;
var colOrder = dataObj.colOrder;
var highLight = 0;
var reg = /(^|\s)invisibleRow(\s|$)/;
var tr, tds;
for(var i = 0; i < len1; i++) {
tr = data[i][len2];
if(colStyle) {
tds = tr.cells;
for(thPos in colOrder) {
if(!colOrder[thPos]) fdTableSort.removeClass(tds[thPos], colStyle);
else fdTableSort.addClass(tds[thPos], colStyle);
};
};
if(!identical) {
if(rowStyle && tr.className.search(reg) == -1) {
if(highLight++ & 1) fdTableSort.addClass(tr, rowStyle);
else fdTableSort.removeClass(tr, rowStyle);
};
// Netscape 8.1.2 requires the removeChild call or it freaks out, so add the line if you want to support this browser
// hook.removeChild(tr);
hook.appendChild(tr);
};
};
tr = tds = hook = null;
},
getInnerText: function(el) {
if (typeof el == "string" || typeof el == "undefined") return el;
if(el.innerText) return el.innerText;
var txt = '', i;
for(i = el.firstChild; i; i = i.nextSibling) {
if(i.nodeType == 3) txt += i.nodeValue;
else if(i.nodeType == 1) txt += fdTableSort.getInnerText(i);
};
return txt;
},
dateFormat: function(dateIn, favourDMY) {
var dateTest = [
{ regExp:/^(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])([- \/.])((\d\d)?\d\d)$/, d:3, m:1, y:5 }, // mdy
{ regExp:/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/, d:1, m:3, y:5 }, // dmy
{ regExp:/^(\d\d\d\d)([- \/.])(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])$/, d:5, m:3, y:1 } // ymd
];
var start, cnt = 0, numFormats = dateTest.length;
while(cnt < numFormats) {
start = (cnt + (favourDMY ? numFormats + 1 : numFormats)) % numFormats;
if(dateIn.match(dateTest[start].regExp)) {
res = dateIn.match(dateTest[start].regExp);
y = res[dateTest[start].y];
m = res[dateTest[start].m];
d = res[dateTest[start].d];
if(m.length == 1) m = "0" + String(m);
if(d.length == 1) d = "0" + String(d);
if(y.length != 4) y = (parseInt(y) < 50) ? "20" + String(y) : "19" + String(y);
return y+String(m)+d;
};
cnt++;
};
return 0;
},
sortNumeric:function(a,b) {
var aa = a[fdTableSort.pos];
var bb = b[fdTableSort.pos];
if(aa == bb) return 0;
if(aa === "" && !isNaN(bb)) return -1;
if(bb === "" && !isNaN(aa)) return 1;
return aa - bb;
},
sortText:function(a,b) {
var aa = a[fdTableSort.pos];
var bb = b[fdTableSort.pos];
if(aa == bb) return 0;
if(aa < bb) return -1;
return 1;
}
};
})();
fdTableSort.addEvent(window, "load", fdTableSort.initEvt);
fdTableSort.addEvent(window, "unload", fdTableSort.onUnload);
/*
paginate table object v1.6 by frequency-decoder.com
Released under a creative commons Attribution-ShareAlike 2.5 license (http://creativecommons.org/licenses/by-sa/2.5/)
Please credit frequency decoder in any derivative work - thanks
You are free:
* to copy, distribute, display, and perform the work
* to make derivative works
* to make commercial use of the work
Under the following conditions:
by Attribution.
--------------
You must attribute the work in the manner specified by the author or licensor.
sa
--
Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one.
* For any reuse or distribution, you must make clear to others the license terms of this work.
* Any of these conditions can be waived if you get permission from the copyright holder.
*/
tablePaginater = {
tableInfo: {},
uniqueID:0,
/*
Localise the button titles here...
%p is replaced with the appropriate page number
%t is replaced with the total number of pages
*/
text: ["First Page","Previous Page (Page %p)","Next Page (Page %p)","Last Page (Page %t)","Page %p of %t"],
addEvent: function(obj, type, fn, tmp) {
tmp || (tmp = true);
if( obj.attachEvent ) {
obj["e"+type+fn] = fn;
obj[type+fn] = function(){obj["e"+type+fn]( window.event );};
obj.attachEvent( "on"+type, obj[type+fn] );
} else {
obj.addEventListener( type, fn, true );
};
},
addClass: function(e,c) {
if(new RegExp("(^|\\s)" + c + "(\\s|$)").test(e.className)) return;
e.className += ( e.className ? " " : "" ) + c;
},
/*@cc_on
/*@if (@_win32)
removeClass: function(e,c) {
e.className = !c ? "" : e.className.replace(new RegExp("(^|\\s)" + c + "(\\s|$)"), " ").replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
},
@else @*/
removeClass: function(e,c) {
e.className = !c ? "" : e.className.replace(new RegExp("(^|\\s)" + c + "(\\s|$)"), " ").replace(/^\s\s*/, '').replace(/\s\s*$/, '');
},
/*@end
@*/
init: function(tableId) {
var tables = tableId && typeof(tableId) == "string" ? [document.getElementById(tableId)] : document.getElementsByTagName('table');
var hook, maxPages, visibleRows, numPages, cp, cb, rowList;
for(var t = 0, tbl; tbl = tables[t]; t++) {
if(tbl.className.search(/paginate-([0-9]+)/) == -1) { continue; };
if(!tbl.id) { tbl.id = "fdUniqueTableId_" + tablePaginater.uniqueID++; };
maxPages = tbl.className.search(/max-pages-([0-9]+)/) == -1 ? null : Number(tbl.className.match(/max-pages-([0-9]+)/)[1]);
if(maxPages % 2 == 0 && maxPages > 1) { maxPages--; };
hook = tbl.getElementsByTagName('tbody');
hook = (hook.length) ? hook[0] : tbl;
visibleRows = tablePaginater.calculateVisibleRows(hook);
if(maxPages > (visibleRows / Number(tbl.className.match(/paginate-([0-9]+)/)[1]))) {
maxPages = null;
};
numPages = Math.ceil(visibleRows / Number(tbl.className.match(/paginate-([0-9]+)/)[1]));
if(numPages < 2 && !(tbl.id in tablePaginater.tableInfo)) {
continue;
};
cp = (tbl.id in tablePaginater.tableInfo) ? Math.min(tablePaginater.tableInfo[tbl.id].currentPage, numPages) : 1;
cb = tbl.className.search(/paginationcallback-([\S-]+)/) == -1 ? "" : tbl.className.match(/paginationcallback-([\S]+)/)[1];
// Replace "-" with "." to enable Object.method callbacks
cb = cb.replace("-", ".");
tablePaginater.tableInfo[tbl.id] = {
rowsPerPage:Number(tbl.className.match(/paginate-([0-9]+)/)[1]),
currentPage:cp,
totalRows:hook.getElementsByTagName('tr').length,
hook:hook,
maxPages:maxPages,
numPages:numPages,
rowStyle:tbl.className.search(/rowstyle-([\S]+)/) != -1 ? tbl.className.match(/rowstyle-([\S]+)/)[1] : false,
callback:cb || "paginationCallback"
};
tablePaginater.showPage(tbl.id);
hook = null;
};
},
calculateVisibleRows: function(hook) {
var trs = hook.rows;
var cnt = 0;
var reg = /(^|\s)invisibleRow(\s|$)/;
for(var i = 0, tr; tr = trs[i]; i++) {
if(tr.parentNode != hook || tr.getElementsByTagName("th").length || (tr.parentNode && tr.parentNode.tagName.toLowerCase().search(/thead|tfoot/) != -1)) continue;
if(tr.className.search(reg) == -1) {
cnt++;
};
};
return cnt;
},
createButton: function(details, ul, pseudo) {
var li = document.createElement("li");
var but = document.createElement(pseudo ? "div" : "a");
var span = document.createElement("span");
if(!pseudo) { but.href = "#"; };
if(!pseudo) { but.title = details.title; };
but.className = details.className;
ul.appendChild(li);
li.appendChild(but);
but.appendChild(span);
span.appendChild(document.createTextNode(details.text));
if(!pseudo) { li.onclick = but.onclick = tablePaginater.buttonClick; };
if(!pseudo && details.id) { but.id = details.id; };
li = but = span = null;
},
removePagination: function(tableId) {
var wrapT = document.getElementById(tableId + "-fdtablePaginaterWrapTop");
var wrapB = document.getElementById(tableId + "-fdtablePaginaterWrapBottom");
if(wrapT) { wrapT.parentNode.removeChild(wrapT); };
if(wrapB) { wrapB.parentNode.removeChild(wrapB); };
},
buildPagination: function(tblId) {
if(!(tblId in tablePaginater.tableInfo)) { return; };
tablePaginater.removePagination(tblId);
var details = tablePaginater.tableInfo[tblId];
if(details.numPages < 2) return;
function resolveText(txt, curr) {
curr = curr || details.currentPage;
return txt.replace("%p", curr).replace("%t", details.numPages);
};
if(details.maxPages) {
findex = Math.max(0, Math.floor(Number(details.currentPage - 1) - (Number(details.maxPages - 1) / 2)));
lindex = findex + Number(details.maxPages);
if(lindex > details.numPages) {
lindex = details.numPages;
findex = Math.max(0, details.numPages - Number(details.maxPages));
};
} else {
findex = 0;
lindex = details.numPages;
};
var wrapT = document.createElement("div");
wrapT.className = "fdtablePaginaterWrap";
wrapT.id = tblId + "-fdtablePaginaterWrapTop";
var wrapB = document.createElement("div");
wrapB.className = "fdtablePaginaterWrap";
wrapB.id = tblId + "-fdtablePaginaterWrapBottom";
// Create list scaffold
var ulT = document.createElement("ul");
ulT.id = tblId + "-tablePaginater";
var ulB = document.createElement("ul");
ulB.id = tblId + "-tablePaginaterClone";
ulT.className = ulB.className = "fdtablePaginater";
// Add to the wrapper DIVs
wrapT.appendChild(ulT);
wrapB.appendChild(ulB);
// FIRST (only created if maxPages set)
if(details.maxPages) {
tablePaginater.createButton({title:tablePaginater.text[0], className:"first-page", text:"\u00ab"}, ulT, !findex);
tablePaginater.createButton({title:tablePaginater.text[0], className:"first-page", text:"\u00ab"}, ulB, !findex);
};
// PREVIOUS (only created if there are more than two pages)
if(details.numPages > 2) {
tablePaginater.createButton({title:resolveText(tablePaginater.text[1], details.currentPage-1), className:"previous-page", text:"\u2039", id:tblId+"-previousPage"}, ulT, details.currentPage == 1);
tablePaginater.createButton({title:resolveText(tablePaginater.text[1], details.currentPage-1), className:"previous-page", text:"\u2039", id:tblId+"-previousPageC"}, ulB, details.currentPage == 1);
};
// NUMBERED
for(var i = findex; i < lindex; i++) {
tablePaginater.createButton({title:resolveText(tablePaginater.text[4], i+1), className:i != (details.currentPage-1) ? "page-"+(i+1) : "currentPage page-"+(i+1), text:(i+1), id:i == (details.currentPage-1) ? tblId + "-currentPage" : ""}, ulT);
tablePaginater.createButton({title:resolveText(tablePaginater.text[4], i+1), className:i != (details.currentPage-1) ? "page-"+(i+1) : "currentPage page-"+(i+1), text:(i+1), id:i == (details.currentPage-1) ? tblId + "-currentPageC" : ""}, ulB);
};
// NEXT (only created if there are more than two pages)
if(details.numPages > 2) {
tablePaginater.createButton({title:resolveText(tablePaginater.text[2], details.currentPage + 1), className:"next-page", text:"\u203a", id:tblId+"-nextPage"}, ulT, details.currentPage == details.numPages);
tablePaginater.createButton({title:resolveText(tablePaginater.text[2], details.currentPage + 1), className:"next-page", text:"\u203a", id:tblId+"-nextPageC"}, ulB, details.currentPage == details.numPages);
};
// LAST (only created if maxPages set)
if(details.maxPages) {
tablePaginater.createButton({title:resolveText(tablePaginater.text[3], details.numPages), className:"last-page", text:"\u00bb"}, ulT, lindex == details.numPages);
tablePaginater.createButton({title:resolveText(tablePaginater.text[3], details.numPages), className:"last-page", text:"\u00bb"}, ulB, lindex == details.numPages);
};
// DOM inject wrapper DIVs (FireFox Bug: this has to be done here if you use display:table)
if(document.getElementById(tblId+"-paginationListWrapTop")) {
document.getElementById(tblId+"-paginationListWrapTop").appendChild(wrapT);
} else {
document.getElementById(tblId).parentNode.insertBefore(wrapT, document.getElementById(tblId));
};
if(document.getElementById(tblId+"-paginationListWrapBottom")) {
document.getElementById(tblId+"-paginationListWrapBottom").appendChild(wrapB);
} else {
document.getElementById(tblId).parentNode.insertBefore(wrapB, document.getElementById(tblId).nextSibling);
};
},
// The tableSort script uses this function to redraw.
redraw: function(tableid, identical) {
if(!tableid || !(tableid in fdTableSort.tableCache) || !(tableid in tablePaginater.tableInfo)) { return; };
var dataObj = fdTableSort.tableCache[tableid];
var data = dataObj.data;
var len1 = data.length;
var len2 = len1 ? data[0].length - 1 : 0;
var hook = dataObj.hook;
var colStyle = dataObj.colStyle;
var rowStyle = dataObj.rowStyle;
var colOrder = dataObj.colOrder;
var page = tablePaginater.tableInfo[tableid].currentPage - 1;
var d1 = tablePaginater.tableInfo[tableid].rowsPerPage * page;
var d2 = Math.min(tablePaginater.tableInfo[tableid].totalRows, d1 + tablePaginater.tableInfo[tableid].rowsPerPage);
var cnt = 0;
var rs = 0;
var reg = /(^|\s)invisibleRow(\s|$)/;
var tr, tds, cell, pos;
for(var i = 0; i < len1; i++) {
tr = data[i][len2];
if(colStyle) {
tds = tr.cells;
for(thPos in colOrder) {
if(!colOrder[thPos]) tablePaginater.removeClass(tds[thPos], colStyle);
else tablePaginater.addClass(tds[thPos], colStyle);
};
};
if(tr.className.search(reg) != -1) {
continue;
};
if(!identical) {
cnt++;
if(cnt > d1 && cnt <= d2) {
if(rowStyle) {
if(rs++ & 1) tablePaginater.addClass(tr, rowStyle);
else tablePaginater.removeClass(tr, rowStyle);
};
tr.style.display = "";
} else {
tr.style.display = "none";
};
// Netscape 8.1.2 requires the removeChild call or it freaks out, so add the line if you want to support this browser
// hook.removeChild(tr);
hook.appendChild(tr);
};
};
tr = tds = hook = null;
},
showPage: function(tblId, pageNum) {
if(!(tblId in tablePaginater.tableInfo)) { return; };
var page = !pageNum ? tablePaginater.tableInfo[tblId].currentPage - 1 : pageNum - 1;
var d1 = tablePaginater.tableInfo[tblId].rowsPerPage * page;
var d2 = Math.min(tablePaginater.tableInfo[tblId].totalRows, d1 + tablePaginater.tableInfo[tblId].rowsPerPage);
var trs = tablePaginater.tableInfo[tblId].hook.rows;
var cnt = 0;
var rc = 0;
var len = trs.length;
var rs = tablePaginater.tableInfo[tblId].rowStyle;
var reg = /(^|\s)invisibleRow(\s|$)/;
for(var i = 0; i < len; i++) {
if(trs[i].getElementsByTagName("th").length || (trs[i].parentNode && trs[i].parentNode.tagName.toLowerCase().search(/thead|tfoot/) != -1)) continue;
if(trs[i].className.search(reg) != -1) {
continue;
};
cnt++;
if(cnt > d1 && cnt <= d2) {
if(rs) {
if(rc++ & 1) {
tablePaginater.addClass(trs[i], rs);
} else {
tablePaginater.removeClass(trs[i], rs);
}
};
trs[i].style.display = "";
} else {
trs[i].style.display = "none";
};
};
tablePaginater.buildPagination(tblId);
tablePaginater.callback(tblId);
},
callback: function(tblId) {
var func;
if(tablePaginater.tableInfo[tblId].callback.indexOf(".") != -1) {
var split = tablePaginater.tableInfo[tblId].callback.split(".");
func = window;
for(var i = 0, f; f = split[i]; i++) {
if(f in func) {
func = func[f];
} else {
func = "";
break;
};
};
} else if(tablePaginater.tableInfo[tblId].callback in window) {
func = window[tablePaginater.tableInfo[tblId].callback];
};
if(typeof func == "function") {
func(tblId);
};
func = null;
},
buttonClick: function(e) {
e = e || window.event;
var a = this.tagName.toLowerCase() == "a" ? this : this.getElementsByTagName("a")[0];
if(a.className.search("currentPage") != -1) return false;
var ul = this;
while(ul.tagName.toLowerCase() != "ul") ul = ul.parentNode;
var tblId = ul.id.replace("-tablePaginaterClone","").replace("-tablePaginater", "");
tablePaginater.tableInfo[tblId].lastPage = tablePaginater.tableInfo[tblId].currentPage;
var showPrevNext = 0;
if(a.className.search("previous-page") != -1) {
tablePaginater.tableInfo[tblId].currentPage = tablePaginater.tableInfo[tblId].currentPage > 1 ? tablePaginater.tableInfo[tblId].currentPage - 1 : tablePaginater.tableInfo[tblId].numPages;
showPrevNext = 1;
} else if(a.className.search("next-page") != -1) {
tablePaginater.tableInfo[tblId].currentPage = tablePaginater.tableInfo[tblId].currentPage < tablePaginater.tableInfo[tblId].numPages ? tablePaginater.tableInfo[tblId].currentPage + 1 : 1;
showPrevNext = 2;
} else if(a.className.search("first-page") != -1) {
tablePaginater.tableInfo[tblId].currentPage = 1;
} else if(a.className.search("last-page") != -1) {
tablePaginater.tableInfo[tblId].currentPage = tablePaginater.tableInfo[tblId].numPages;
} else {
tablePaginater.tableInfo[tblId].currentPage = parseInt(a.className.match(/page-([0-9]+)/)[1]) || 1;
};
tablePaginater.showPage(tblId);
// Focus on the appropriate button (previous, next or the current page)
// I'm hoping screen readers are savvy enough to indicate the focus event to the user
if(showPrevNext == 1) {
var elem = document.getElementById(ul.id.search("-tablePaginaterClone") != -1 ? tblId + "-previousPageC" : tblId + "-previousPage");
} else if(showPrevNext == 2) {
var elem = document.getElementById(ul.id.search("-tablePaginaterClone") != -1 ? tblId + "-nextPageC" : tblId + "-nextPage");
} else {
var elem = document.getElementById(ul.id.search("-tablePaginaterClone") != -1 ? tblId + "-currentPageC" : tblId + "-currentPage");
};
if(elem && elem.tagName.toLowerCase() == "a") { elem.focus(); };
if(e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
};
/*@cc_on
@if(@_win32)
e.cancelBubble = true;
e.returnValue = false;
@end
@*/
return false;
},
onUnLoad: function(e) {
var tbl, lis, pagination, uls;
for(tblId in tablePaginater.tableInfo) {
uls = [tblId + "-tablePaginater", tblId + "-tablePaginaterClone"];
for(var z = 0; z < 2; z++) {
pagination = document.getElementById(uls[z]);
if(!pagination) { continue; };
lis = pagination.getElementsByTagName("li");
for(var i = 0, li; li = lis[i]; i++) {
li.onclick = null;
if(li.getElementsByTagName("a").length) { li.getElementsByTagName("a")[0].onclick = null; };
};
};
};
}
};
tablePaginater.addEvent(window, "load", tablePaginater.init);
tablePaginater.addEvent(window, "unload", tablePaginater.onUnLoad);
window.addEvent( 'domready', function(){
$("zoneSearch_name").addEvent( 'keydown', FilterResults );
$("zoneSearch_name").addEvent( 'keyup', FilterResults );
$("zoneSearch_name").addEvent( 'keypress', FilterResults );
$("zoneSearch_name").addEvent( 'change', FilterResults );
$("zoneSearch_name").addEvent( 'blur', FilterResults );
$("zoneSearch_category").addEvent( 'keyup', FilterResults );
$("zoneSearch_category").addEvent( 'change', FilterResults );
$("zoneSearch_category").addEvent( 'blur', FilterResults );
$("zoneSearch_category").addEvent( 'click', FilterResults );
$("zoneSearch_territory").addEvent( 'keyup', FilterResults );
$("zoneSearch_territory").addEvent( 'change', FilterResults );
$("zoneSearch_territory").addEvent( 'blur', FilterResults );
$("zoneSearch_territory").addEvent( 'click', FilterResults );
// Cancel Button
$("zoneSearch_cancel").addEvent( 'click', function( event ) {
$("zoneSearch_name").value = "";
$("zoneSearch_cancel").style.display = "none";
event.preventDefault();
FilterResults();
} );
$("zoneSearch_cancel").style.display = "none";
var trs = $("zones").getElementsByTagName("tbody")[0].rows;
$('zones-listinfo').innerHTML = "Showing all " + trs.length + " zones.";
});
var origSearchName = "";
var origSearchTerritory = -1;
var origSearchCategory = -1;
function FilterResults() {
var searchName = $("zoneSearch_name").value;
var searchTerritory = $("zoneSearch_territory").value;
var searchCategory = $("zoneSearch_category").value;
// Check whether we need a cancel button
if( searchName != "" )
$("zoneSearch_cancel").style.display = "block";
else
$("zoneSearch_cancel").style.display = "none";
var filterChanged = false;
// Check whether something changed
if( searchName != origSearchName ) {
filterChanged = true;
origSearchName = searchName;
}
if( searchTerritory != origSearchTerritory ) {
filterChanged = true;
origSearchTerritory = searchTerritory;
}
if( searchCategory != origSearchCategory ) {
filterChanged = true;
origSearchCategory = searchCategory;
}
if( filterChanged == false ) {
// Filter didn't change, bail out
return;
}
// Get All table rows
var trs = $("zones").getElementsByTagName("tbody")[0].rows;
// Ok filter DID change
tablePaginater.showPage( "zones", 1 );
resetTable();
tablePaginater.showPage( "zones", 1 );
// Routine check: Did we reset all filters to default?
if( searchName == "" && searchTerritory == -1 && searchCategory == -1 ) {
// Hey, we don't have to do anything. Just exit already! Table was reset anyway...
$('zones-listinfo').innerHTML = "Showing all " + trs.length + " zones.";
return;
}
var allRows = 0;
var showRows = 0;
// Loop over all the rows and check whether we should kick them out
for( var i = 0, tr; tr = trs[i]; i++ ) {
allRows++;
showRows++;
var TDElements = tr.getElementsByTagName("td");
var name = TDElements[0].getElementsByTagName("a")[0].innerHTML;
var territory = TDElements[2].innerHTML;
var category = TDElements[4].innerHTML;
// Are we refining by name?
if( searchName != "" && name.test( searchName, "i" ) == false ) {
hideRow( tr );
showRows--;
continue;
}
// Are we refining by category?
if( searchCategory != -1 && category.test( searchCategory, "i" ) == false ) {
hideRow( tr );
showRows--;
continue;
}
// Are we refining by territory?
if( searchTerritory != -1 && territory.test( searchTerritory, "i" ) == false ) {
hideRow( tr );
showRows--;
continue;
}
};
if( showRows == allRows )
$('zones-listinfo').innerHTML = "Showing all " + allRows + " zones.";
else
$('zones-listinfo').innerHTML = "Showing " + showRows + " of " + allRows + " zones.";
// Init the paginater
tablePaginater.init( "zones" );
tablePaginater.showPage( "zones", 1 );
};
function hideRow( tr ) {
if(tr.className.search("invisibleRow") == -1) {
tr.className += (tr.className ? " " : "") + "invisibleRow";
};
}
function resetTable() {
var trs = $("zones").getElementsByTagName("tbody")[0].getElementsByTagName("tr");
for(var i = 0, tr; tr = trs[i]; i++) {
tr.className = tr.className.replace( "invisibleRow", "" );
};
tablePaginater.init("zones");
};