
var MooTools = {
'version': '1.2.4',
'build': '0d9113241a90b9cd5643b926795852a2026710d4'
};
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'){
var pa1 = this.prototype[a1];
if ((a1 = pa1)) 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(natives[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 l = iterable.length, array = new Array(l);
while (l--) array[l] = iterable[l];
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 ($type(value) == 'function') ? value : function(){
return value;
};
};
function $merge(){
var args = Array.slice(arguments);
args.unshift({});
return $mixin.apply(null, args);
};
function $mixin(mix){
for (var i = 1, 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') ? $mixin(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;
};
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) ? ((document.querySelectorAll) ? 6 : 5) : 4);
},
webkit: function(){
return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
},
gecko: function(){
return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? 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');
}, function(){
return new ActiveXObject('Microsoft.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], 10) || 0, build: parseInt(version[2], 10) || 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);
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('');
}
});
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})();
}
});
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']);
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(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
scripts += arguments[1] + '\n';
return '';
});
if (option === true) $exec(scripts);
else if ($type(option) == 'function') option(scripts, text);
return text;
},
substitute: function(object, regexp){
return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
if (match.charAt(0) == '\\') return match.slice(1);
return (object[name] != undefined) ? object[name] : '';
});
}
});
Hash.implement({
has: Object.prototype.hasOwnProperty,
keyOf: function(value){
for (var key in this){
if (this.hasOwnProperty(key) && this[key] === value) return key;
}
return null;
},
hasValue: function(value){
return (Hash.keyOf(this, value) !== null);
},
extend: function(properties){
Hash.each(properties || {}, function(value, key){
Hash.set(this, key, value);
}, this);
return this;
},
combine: function(properties){
Hash.each(properties || {}, function(value, key){
Hash.include(this, key, value);
}, this);
return this;
},
erase: function(key){
if (this.hasOwnProperty(key)) delete this[key];
return this;
},
get: function(key){
return (this.hasOwnProperty(key)) ? this[key] : null;
},
set: function(key, value){
if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
return this;
},
empty: function(){
Hash.each(this, function(value, key){
delete this[key];
}, this);
return this;
},
include: function(key, value){
if (this[key] == undefined) this[key] = value;
return this;
},
map: function(fn, bind){
var results = new Hash;
Hash.each(this, function(value, key){
results.set(key, fn.call(bind, value, key, this));
}, this);
return results;
},
filter: function(fn, bind){
var results = new Hash;
Hash.each(this, function(value, key){
if (fn.call(bind, value, key, this)) results.set(key, value);
}, this);
return results;
},
every: function(fn, bind){
for (var key in this){
if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false;
}
return true;
},
some: function(fn, bind){
for (var key in this){
if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true;
}
return false;
},
getKeys: function(){
var keys = [];
Hash.each(this, function(value, key){
keys.push(key);
});
return keys;
},
getValues: function(){
var values = [];
Hash.each(this, function(value){
values.push(value);
});
return values;
},
toQueryString: function(base){
var queryString = [];
Hash.each(this, function(value, key){
if (base) key = base + '[' + key + ']';
var result;
switch ($type(value)){
case 'object': result = Hash.toQueryString(value, key); break;
case 'array':
var qs = {};
value.each(function(val, i){
qs[i] = val;
});
result = Hash.toQueryString(qs, key);
break;
default: result = key + '=' + encodeURIComponent(value);
}
if (value != undefined) queryString.push(result);
});
return queryString.join('&');
}
});
Hash.alias({keyOf: 'indexOf', hasValue: 'contains'});
var Event = new Native({
name: 'Event',
initialize: function(event, win){
win = win || window;
var doc = win.document;
event = event || win.event;
if (event.$extended) return event;
this.$extended = true;
var type = event.type;
var target = event.target || event.srcElement;
while (target && target.nodeType == 3) target = target.parentNode;
if (type.test(/key/)){
var code = event.which || event.keyCode;
var key = Event.Keys.keyOf(code);
if (type == 'keydown'){
var fKey = code - 111;
if (fKey > 0 && fKey < 13) key = 'f' + fKey;
}
key = key || String.fromCharCode(code).toLowerCase();
} else if (type.match(/(click|mouse|menu)/i)){
doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
var page = {
x: event.pageX || event.clientX + doc.scrollLeft,
y: event.pageY || event.clientY + doc.scrollTop
};
var client = {
x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
};
if (type.match(/DOMMouseScroll|mousewheel/)){
var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
}
var rightClick = (event.which == 3) || (event.button == 2);
var related = null;
if (type.match(/over|out/)){
switch (type){
case 'mouseover': related = event.relatedTarget || event.fromElement; break;
case 'mouseout': related = event.relatedTarget || event.toElement;
}
if (!(function(){
while (related && related.nodeType == 3) related = related.parentNode;
return true;
}).create({attempt: Browser.Engine.gecko})()) related = false;
}
}
return $extend(this, {
event: event,
type: type,
page: page,
client: client,
rightClick: rightClick,
wheel: wheel,
relatedTarget: related,
target: target,
code: code,
key: key,
shift: event.shiftKey,
control: event.ctrlKey,
alt: event.altKey,
meta: event.metaKey
});
}
});
Event.Keys = new Hash({
'enter': 13,
'up': 38,
'down': 40,
'left': 37,
'right': 39,
'esc': 27,
'space': 32,
'backspace': 8,
'tab': 9,
'delete': 46
});
Event.implement({
stop: function(){
return this.stopPropagation().preventDefault();
},
stopPropagation: function(){
if (this.event.stopPropagation) this.event.stopPropagation();
else this.event.cancelBubble = true;
return this;
},
preventDefault: function(){
if (this.event.preventDefault) this.event.preventDefault();
else this.event.returnValue = false;
return this;
}
});
function Class(params){
if (params instanceof Function) params = {initialize: params};
var newClass = function(){
Object.reset(this);
if (newClass._prototyping) return this;
this._current = $empty;
var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
delete this._current; delete this.caller;
return value;
}.extend(this);
newClass.implement(params);
newClass.constructor = Class;
newClass.prototype.constructor = newClass;
return newClass;
};
Function.prototype.protect = function(){
this._protected = true;
return this;
};
Object.reset = function(object, key){
if (key == null){
for (var p in object) Object.reset(object, p);
return object;
}
delete object[key];
switch ($type(object[key])){
case 'object':
var F = function(){};
F.prototype = object[key];
var i = new F;
object[key] = Object.reset(i);
break;
case 'array': object[key] = $unlink(object[key]); break;
}
return object;
};
new Native({name: 'Class', initialize: Class}).extend({
instantiate: function(F){
F._prototyping = true;
var proto = new F;
delete F._prototyping;
return proto;
},
wrap: function(self, key, method){
if (method._origin) method = method._origin;
return function(){
if (method._protected && this._current == null) throw new Error('The method "' + key + '" cannot be called.');
var caller = this.caller, current = this._current;
this.caller = current; this._current = arguments.callee;
var result = method.apply(this, arguments);
this._current = current; this.caller = caller;
return result;
}.extend({_owner: self, _origin: method, _name: key});
}
});
Class.implement({
implement: function(key, value){
if ($type(key) == 'object'){
for (var p in key) this.implement(p, key[p]);
return this;
}
var mutator = Class.Mutators[key];
if (mutator){
value = mutator.call(this, value);
if (value == null) return this;
}
var proto = this.prototype;
switch ($type(value)){
case 'function':
if (value._hidden) return this;
proto[key] = Class.wrap(this, key, value);
break;
case 'object':
var previous = proto[key];
if ($type(previous) == 'object') $mixin(previous, value);
else proto[key] = $unlink(value);
break;
case 'array':
proto[key] = $unlink(value);
break;
default: proto[key] = value;
}
return this;
}
});
Class.Mutators = {
Extends: function(parent){
this.parent = parent;
this.prototype = Class.instantiate(parent);
this.implement('parent', function(){
var name = this.caller._name, previous = this.caller._owner.parent.prototype[name];
if (!previous) throw new Error('The method "' + name + '" has no parent.');
return previous.apply(this, arguments);
}.protect());
},
Implements: function(items){
$splat(items).each(function(item){
if (item instanceof Function) item = Class.instantiate(item);
this.implement(item);
}, this);
}
};
var Chain = new Class({
$chain: [],
chain: function(){
this.$chain.extend(Array.flatten(arguments));
return this;
},
callChain: function(){
return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
},
clearChain: function(){
this.$chain.empty();
return this;
}
});
var Events = new Class({
$events: {},
addEvent: function(type, fn, internal){
type = Events.removeOn(type);
if (fn != $empty){
this.$events[type] = this.$events[type] || [];
this.$events[type].include(fn);
if (internal) fn.internal = true;
}
return this;
},
addEvents: function(events){
for (var type in events) this.addEvent(type, events[type]);
return this;
},
fireEvent: function(type, args, delay){
type = Events.removeOn(type);
if (!this.$events || !this.$events[type]) return this;
this.$events[type].each(function(fn){
fn.create({'bind': this, 'delay': delay, 'arguments': args})();
}, this);
return this;
},
removeEvent: function(type, fn){
type = Events.removeOn(type);
if (!this.$events[type]) return this;
if (!fn.internal) this.$events[type].erase(fn);
return this;
},
removeEvents: function(events){
var type;
if ($type(events) == 'object'){
for (type in events) this.removeEvent(type, events[type]);
return this;
}
if (events) events = Events.removeOn(events);
for (type in this.$events){
if (events && events != type) continue;
var fns = this.$events[type];
for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]);
}
return this;
}
});
Events.removeOn = function(string){
return string.replace(/^on([A-Z])/, function(full, first){
return first.toLowerCase();
});
};
var Options = new Class({
setOptions: function(){
this.options = $merge.run([this.options].extend(arguments));
if (!this.addEvent) return this;
for (var option in this.options){
if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
this.addEvent(option, this.options[option]);
delete this.options[option];
}
return this;
}
});
var Element = new Native({
name: 'Element',
legacy: window.Element,
initialize: function(tag, props){
var konstructor = Element.Constructors.get(tag);
if (konstructor) return konstructor(props);
if (typeof tag == 'string') return document.newElement(tag, props);
return document.id(tag).set(props);
},
afterImplement: function(key, value){
Element.Prototype[key] = value;
if (Array[key]) return;
Elements.implement(key, function(){
var items = [], elements = true;
for (var i = 0, j = this.length; i < j; i++){
var returns = this[i][key].apply(this[i], arguments);
items.push(returns);
if (elements) elements = ($type(returns) == 'element');
}
return (elements) ? new Elements(items) : items;
});
}
});
Element.Prototype = {$family: {name: 'element'}};
Element.Constructors = new Hash;
var IFrame = new Native({
name: 'IFrame',
generics: false,
initialize: function(){
var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
var props = params.properties || {};
var iframe = document.id(params.iframe);
var onload = props.onload || $empty;
delete props.onload;
props.id = props.name = $pick(props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + $time());
iframe = new Element(iframe || 'iframe', props);
var onFrameLoad = function(){
var host = $try(function(){
return iframe.contentWindow.location.host;
});
if (!host || host == window.location.host){
var win = new Window(iframe.contentWindow);
new Document(iframe.contentWindow.document);
$extend(win.Element.prototype, Element.Prototype);
}
onload.call(iframe.contentWindow, iframe.contentWindow.document);
};
var contentWindow = $try(function(){
return iframe.contentWindow;
});
((contentWindow && contentWindow.document.body) || window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad);
return iframe;
}
});
var Elements = new Native({
initialize: function(elements, options){
options = $extend({ddup: true, cash: true}, options);
elements = elements || [];
if (options.ddup || options.cash){
var uniques = {}, returned = [];
for (var i = 0, l = elements.length; i < l; i++){
var el = document.id(elements[i], !options.cash);
if (options.ddup){
if (uniques[el.uid]) continue;
uniques[el.uid] = true;
}
if (el) returned.push(el);
}
elements = returned;
}
return (options.cash) ? $extend(elements, this) : elements;
}
});
Elements.implement({
filter: function(filter, bind){
if (!filter) return this;
return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
return item.match(filter);
} : filter, bind));
}
});
Document.implement({
newElement: function(tag, props){
if (Browser.Engine.trident && props){
['name', 'type', 'checked'].each(function(attribute){
if (!props[attribute]) return;
tag += ' ' + attribute + '="' + props[attribute] + '"';
if (attribute != 'checked') delete props[attribute];
});
tag = '<' + tag + '>';
}
return document.id(this.createElement(tag)).set(props);
},
newTextNode: function(text){
return this.createTextNode(text);
},
getDocument: function(){
return this;
},
getWindow: function(){
return this.window;
},
id: (function(){
var types = {
string: function(id, nocash, doc){
id = doc.getElementById(id);
return (id) ? types.element(id, nocash) : null;
},
element: function(el, nocash){
$uid(el);
if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
var proto = Element.Prototype;
for (var p in proto) el[p] = proto[p];
};
return el;
},
object: function(obj, nocash, doc){
if (obj.toElement) return types.element(obj.toElement(doc), nocash);
return null;
}
};
types.textnode = types.whitespace = types.window = types.document = $arguments(0);
return function(el, nocash, doc){
if (el && el.$family && el.uid) return el;
var type = $type(el);
return (types[type]) ? types[type](el, nocash, doc || document) : null;
};
})()
});
if (window.$ == null) Window.implement({
$: function(el, nc){
return document.id(el, nc, this.document);
}
});
Window.implement({
$$: function(selector){
if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector);
var elements = [];
var args = Array.flatten(arguments);
for (var i = 0, l = args.length; i < l; i++){
var item = args[i];
switch ($type(item)){
case 'element': elements.push(item); break;
case 'string': elements.extend(this.document.getElements(item, true));
}
}
return new Elements(elements);
},
getDocument: function(){
return this.document;
},
getWindow: function(){
return this;
}
});
Native.implement([Element, Document], {
getElement: function(selector, nocash){
return document.id(this.getElements(selector, true)[0] || null, nocash);
},
getElements: function(tags, nocash){
tags = tags.split(',');
var elements = [];
var ddup = (tags.length > 1);
tags.each(function(tag){
var partial = this.getElementsByTagName(tag.trim());
(ddup) ? elements.extend(partial) : elements = partial;
}, this);
return new Elements(elements, {ddup: ddup, cash: !nocash});
}
});
(function(){
var collected = {}, storage = {};
var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'};
var get = function(uid){
return (storage[uid] || (storage[uid] = {}));
};
var clean = function(item, retain){
if (!item) return;
var uid = item.uid;
if (Browser.Engine.trident){
if (item.clearAttributes){
var clone = retain && item.cloneNode(false);
item.clearAttributes();
if (clone) item.mergeAttributes(clone);
} else if (item.removeEvents){
item.removeEvents();
}
if ((/object/i).test(item.tagName)){
for (var p in item){
if (typeof item[p] == 'function') item[p] = $empty;
}
Element.dispose(item);
}
}
if (!uid) return;
collected[uid] = storage[uid] = null;
};
var purge = function(){
Hash.each(collected, clean);
if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean);
if (window.CollectGarbage) CollectGarbage();
collected = storage = null;
};
var walk = function(element, walk, start, match, all, nocash){
var el = element[start || walk];
var elements = [];
while (el){
if (el.nodeType == 1 && (!match || Element.match(el, match))){
if (!all) return document.id(el, nocash);
elements.push(el);
}
el = el[walk];
}
return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null;
};
var attributes = {
'html': 'innerHTML',
'class': 'className',
'for': 'htmlFor',
'defaultValue': 'defaultValue',
'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent'
};
var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer'];
var camels = ['value', 'type', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap'];
bools = bools.associate(bools);
Hash.extend(attributes, bools);
Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase)));
var inserters = {
before: function(context, element){
if (element.parentNode) element.parentNode.insertBefore(context, element);
},
after: function(context, element){
if (!element.parentNode) return;
var next = element.nextSibling;
(next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context);
},
bottom: function(context, element){
element.appendChild(context);
},
top: function(context, element){
var first = element.firstChild;
(first) ? element.insertBefore(context, first) : element.appendChild(context);
}
};
inserters.inside = inserters.bottom;
Hash.each(inserters, function(inserter, where){
where = where.capitalize();
Element.implement('inject' + where, function(el){
inserter(this, document.id(el, true));
return this;
});
Element.implement('grab' + where, function(el){
inserter(document.id(el, true), this);
return this;
});
});
Element.implement({
set: function(prop, value){
switch ($type(prop)){
case 'object':
for (var p in prop) this.set(p, prop[p]);
break;
case 'string':
var property = Element.Properties.get(prop);
(property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value);
}
return this;
},
get: function(prop){
var property = Element.Properties.get(prop);
return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop);
},
erase: function(prop){
var property = Element.Properties.get(prop);
(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
return this;
},
setProperty: function(attribute, value){
var key = attributes[attribute];
if (value == undefined) return this.removeProperty(attribute);
if (key && bools[attribute]) value = !!value;
(key) ? this[key] = value : this.setAttribute(attribute, '' + value);
return this;
},
setProperties: function(attributes){
for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
return this;
},
getProperty: function(attribute){
var key = attributes[attribute];
var value = (key) ? this[key] : this.getAttribute(attribute, 2);
return (bools[attribute]) ? !!value : (key) ? value : value || null;
},
getProperties: function(){
var args = $A(arguments);
return args.map(this.getProperty, this).associate(args);
},
removeProperty: function(attribute){
var key = attributes[attribute];
(key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute);
return this;
},
removeProperties: function(){
Array.each(arguments, this.removeProperty, this);
return this;
},
hasClass: function(className){
return this.className.contains(className, ' ');
},
addClass: function(className){
if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
return this;
},
removeClass: function(className){
this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
return this;
},
toggleClass: function(className){
return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
},
adopt: function(){
Array.flatten(arguments).each(function(element){
element = document.id(element, true);
if (element) this.appendChild(element);
}, this);
return this;
},
appendText: function(text, where){
return this.grab(this.getDocument().newTextNode(text), where);
},
grab: function(el, where){
inserters[where || 'bottom'](document.id(el, true), this);
return this;
},
inject: function(el, where){
inserters[where || 'bottom'](this, document.id(el, true));
return this;
},
replaces: function(el){
el = document.id(el, true);
el.parentNode.replaceChild(this, el);
return this;
},
wraps: function(el, where){
el = document.id(el, true);
return this.replaces(el).grab(el, where);
},
getPrevious: function(match, nocash){
return walk(this, 'previousSibling', null, match, false, nocash);
},
getAllPrevious: function(match, nocash){
return walk(this, 'previousSibling', null, match, true, nocash);
},
getNext: function(match, nocash){
return walk(this, 'nextSibling', null, match, false, nocash);
},
getAllNext: function(match, nocash){
return walk(this, 'nextSibling', null, match, true, nocash);
},
getFirst: function(match, nocash){
return walk(this, 'nextSibling', 'firstChild', match, false, nocash);
},
getLast: function(match, nocash){
return walk(this, 'previousSibling', 'lastChild', match, false, nocash);
},
getParent: function(match, nocash){
return walk(this, 'parentNode', null, match, false, nocash);
},
getParents: function(match, nocash){
return walk(this, 'parentNode', null, match, true, nocash);
},
getSiblings: function(match, nocash){
return this.getParent().getChildren(match, nocash).erase(this);
},
getChildren: function(match, nocash){
return walk(this, 'nextSibling', 'firstChild', match, true, nocash);
},
getWindow: function(){
return this.ownerDocument.window;
},
getDocument: function(){
return this.ownerDocument;
},
getElementById: function(id, nocash){
var el = this.ownerDocument.getElementById(id);
if (!el) return null;
for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
if (!parent) return null;
}
return document.id(el, nocash);
},
getSelected: function(){
return new Elements($A(this.options).filter(function(option){
return option.selected;
}));
},
getComputedStyle: function(property){
if (this.currentStyle) return this.currentStyle[property.camelCase()];
var computed = this.getDocument().defaultView.getComputedStyle(this, null);
return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null;
},
toQueryString: function(){
var queryString = [];
this.getElements('input, select, textarea', true).each(function(el){
if (!el.name || el.disabled || el.type == 'submit' || el.type == 'reset' || el.type == 'file') return;
var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
return opt.value;
}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
$splat(value).each(function(val){
if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val));
});
});
return queryString.join('&');
},
clone: function(contents, keepid){
contents = contents !== false;
var clone = this.cloneNode(contents);
var clean = function(node, element){
if (!keepid) node.removeAttribute('id');
if (Browser.Engine.trident){
node.clearAttributes();
node.mergeAttributes(element);
node.removeAttribute('uid');
if (node.options){
var no = node.options, eo = element.options;
for (var j = no.length; j--;) no[j].selected = eo[j].selected;
}
}
var prop = props[element.tagName.toLowerCase()];
if (prop && element[prop]) node[prop] = element[prop];
};
if (contents){
var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
for (var i = ce.length; i--;) clean(ce[i], te[i]);
}
clean(clone, this);
return document.id(clone);
},
destroy: function(){
Element.empty(this);
Element.dispose(this);
clean(this, true);
return null;
},
empty: function(){
$A(this.childNodes).each(function(node){
Element.destroy(node);
});
return this;
},
dispose: function(){
return (this.parentNode) ? this.parentNode.removeChild(this) : this;
},
hasChild: function(el){
el = document.id(el, true);
if (!el) return false;
if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el);
return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16);
},
match: function(tag){
return (!tag || (tag == this) || (Element.get(this, 'tag') == tag));
}
});
Native.implement([Element, Window, Document], {
addListener: function(type, fn){
if (type == 'unload'){
var old = fn, self = this;
fn = function(){
self.removeListener('unload', fn);
old();
};
} else {
collected[this.uid] = this;
}
if (this.addEventListener) this.addEventListener(type, fn, false);
else this.attachEvent('on' + type, fn);
return this;
},
removeListener: function(type, fn){
if (this.removeEventListener) this.removeEventListener(type, fn, false);
else this.detachEvent('on' + type, fn);
return this;
},
retrieve: function(property, dflt){
var storage = get(this.uid), prop = storage[property];
if (dflt != undefined && prop == undefined) prop = storage[property] = dflt;
return $pick(prop);
},
store: function(property, value){
var storage = get(this.uid);
storage[property] = value;
return this;
},
eliminate: function(property){
var storage = get(this.uid);
delete storage[property];
return this;
}
});
window.addListener('unload', purge);
})();
Element.Properties = new Hash;
Element.Properties.style = {
set: function(style){
this.style.cssText = style;
},
get: function(){
return this.style.cssText;
},
erase: function(){
this.style.cssText = '';
}
};
Element.Properties.tag = {
get: function(){
return this.tagName.toLowerCase();
}
};
Element.Properties.html = (function(){
var wrapper = document.createElement('div');
var translations = {
table: [1, '<table>', '</table>'],
select: [1, '<select>', '</select>'],
tbody: [2, '<table><tbody>', '</tbody></table>'],
tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
};
translations.thead = translations.tfoot = translations.tbody;
var html = {
set: function(){
var html = Array.flatten(arguments).join('');
var wrap = Browser.Engine.trident && translations[this.get('tag')];
if (wrap){
var first = wrapper;
first.innerHTML = wrap[1] + html + wrap[2];
for (var i = wrap[0]; i--;) first = first.firstChild;
this.empty().adopt(first.childNodes);
} else {
this.innerHTML = html;
}
}
};
html.erase = html.set;
return html;
})();
if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = {
get: function(){
if (this.innerText) return this.innerText;
var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body);
var text = temp.innerText;
temp.destroy();
return text;
}
};
Element.Properties.events = {set: function(events){
this.addEvents(events);
}};
Native.implement([Element, Window, Document], {
addEvent: function(type, fn){
var events = this.retrieve('events', {});
events[type] = events[type] || {'keys': [], 'values': []};
if (events[type].keys.contains(fn)) return this;
events[type].keys.push(fn);
var realType = type, custom = Element.Events.get(type), condition = fn, self = this;
if (custom){
if (custom.onAdd) custom.onAdd.call(this, fn);
if (custom.condition){
condition = function(event){
if (custom.condition.call(this, event)) return fn.call(this, event);
return true;
};
}
realType = custom.base || realType;
}
var defn = function(){
return fn.call(self);
};
var nativeEvent = Element.NativeEvents[realType];
if (nativeEvent){
if (nativeEvent == 2){
defn = function(event){
event = new Event(event, self.getWindow());
if (condition.call(self, event) === false) event.stop();
};
}
this.addListener(realType, defn);
}
events[type].values.push(defn);
return this;
},
removeEvent: function(type, fn){
var events = this.retrieve('events');
if (!events || !events[type]) return this;
var pos = events[type].keys.indexOf(fn);
if (pos == -1) return this;
events[type].keys.splice(pos, 1);
var value = events[type].values.splice(pos, 1)[0];
var custom = Element.Events.get(type);
if (custom){
if (custom.onRemove) custom.onRemove.call(this, fn);
type = custom.base || type;
}
return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this;
},
addEvents: function(events){
for (var event in events) this.addEvent(event, events[event]);
return this;
},
removeEvents: function(events){
var type;
if ($type(events) == 'object'){
for (type in events) this.removeEvent(type, events[type]);
return this;
}
var attached = this.retrieve('events');
if (!attached) return this;
if (!events){
for (type in attached) this.removeEvents(type);
this.eliminate('events');
} else if (attached[events]){
while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]);
attached[events] = null;
}
return this;
},
fireEvent: function(type, args, delay){
var events = this.retrieve('events');
if (!events || !events[type]) return this;
events[type].keys.each(function(fn){
fn.create({'bind': this, 'delay': delay, 'arguments': args})();
}, this);
return this;
},
cloneEvents: function(from, type){
from = document.id(from);
var fevents = from.retrieve('events');
if (!fevents) return this;
if (!type){
for (var evType in fevents) this.cloneEvents(from, evType);
} else if (fevents[type]){
fevents[type].keys.each(function(fn){
this.addEvent(type, fn);
}, this);
}
return this;
}
});
Element.NativeEvents = {
click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
keydown: 2, keypress: 2, keyup: 2, //keyboard
focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
error: 1, abort: 1, scroll: 1 //misc
};
(function(){
var $check = function(event){
var related = event.relatedTarget;
if (related == undefined) return true;
if (related === false) return false;
return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related));
};
Element.Events = new Hash({
mouseenter: {
base: 'mouseover',
condition: $check
},
mouseleave: {
base: 'mouseout',
condition: $check
},
mousewheel: {
base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel'
}
});
})();
Element.Properties.styles = {set: function(styles){
this.setStyles(styles);
}};
Element.Properties.opacity = {
set: function(opacity, novisibility){
if (!novisibility){
if (opacity == 0){
if (this.style.visibility != 'hidden') this.style.visibility = 'hidden';
} else {
if (this.style.visibility != 'visible') this.style.visibility = 'visible';
}
}
if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
this.style.opacity = opacity;
this.store('opacity', opacity);
},
get: function(){
return this.retrieve('opacity', 1);
}
};
Element.implement({
setOpacity: function(value){
return this.set('opacity', value, true);
},
getOpacity: function(){
return this.get('opacity');
},
setStyle: function(property, value){
switch (property){
case 'opacity': return this.set('opacity', parseFloat(value));
case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
}
property = property.camelCase();
if ($type(value) != 'string'){
var map = (Element.Styles.get(property) || '@').split(' ');
value = $splat(value).map(function(val, i){
if (!map[i]) return '';
return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
}).join(' ');
} else if (value == String(Number(value))){
value = Math.round(value);
}
this.style[property] = value;
return this;
},
getStyle: function(property){
switch (property){
case 'opacity': return this.get('opacity');
case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
}
property = property.camelCase();
var result = this.style[property];
if (!$chk(result)){
result = [];
for (var style in Element.ShortStyles){
if (property != style) continue;
for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
return result.join(' ');
}
result = this.getComputedStyle(property);
}
if (result){
result = String(result);
var color = result.match(/rgba?\([\d\s,]+\)/);
if (color) result = result.replace(color[0], color[0].rgbToHex());
}
if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result, 10)))){
if (property.test(/^(height|width)$/)){
var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
values.each(function(value){
size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
}, this);
return this['offset' + property.capitalize()] - size + 'px';
}
if ((Browser.Engine.presto) && String(result).test('px')) return result;
if (property.test(/(border(.+)Width|margin|padding)/)) return '0px';
}
return result;
},
setStyles: function(styles){
for (var style in styles) this.setStyle(style, styles[style]);
return this;
},
getStyles: function(){
var result = {};
Array.flatten(arguments).each(function(key){
result[key] = this.getStyle(key);
}, this);
return result;
}
});
Element.Styles = new Hash({
left: '@px', top: '@px', bottom: '@px', right: '@px',
width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
});
Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
var Short = Element.ShortStyles;
var All = Element.Styles;
['margin', 'padding'].each(function(style){
var sd = style + direction;
Short[style][sd] = All[sd] = '@px';
});
var bd = 'border' + direction;
Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
Short[bd] = {};
Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
});
(function(){
Element.implement({
scrollTo: function(x, y){
if (isBody(this)){
this.getWindow().scrollTo(x, y);
} else {
this.scrollLeft = x;
this.scrollTop = y;
}
return this;
},
getSize: function(){
if (isBody(this)) return this.getWindow().getSize();
return {x: this.offsetWidth, y: this.offsetHeight};
},
getScrollSize: function(){
if (isBody(this)) return this.getWindow().getScrollSize();
return {x: this.scrollWidth, y: this.scrollHeight};
},
getScroll: function(){
if (isBody(this)) return this.getWindow().getScroll();
return {x: this.scrollLeft, y: this.scrollTop};
},
getScrolls: function(){
var element = this, position = {x: 0, y: 0};
while (element && !isBody(element)){
position.x += element.scrollLeft;
position.y += element.scrollTop;
element = element.parentNode;
}
return position;
},
getOffsetParent: function(){
var element = this;
if (isBody(element)) return null;
if (!Browser.Engine.trident) return element.offsetParent;
while ((element = element.parentNode) && !isBody(element)){
if (styleString(element, 'position') != 'static') return element;
}
return null;
},
getOffsets: function(){
if (this.getBoundingClientRect){
var bound = this.getBoundingClientRect(),
html = document.id(this.getDocument().documentElement),
htmlScroll = html.getScroll(),
elemScrolls = this.getScrolls(),
elemScroll = this.getScroll(),
isFixed = (styleString(this, 'position') == 'fixed');
return {
x: bound.left.toInt() + elemScrolls.x - elemScroll.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
y: bound.top.toInt()  + elemScrolls.y - elemScroll.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
};
}
var element = this, position = {x: 0, y: 0};
if (isBody(this)) return position;
while (element && !isBody(element)){
position.x += element.offsetLeft;
position.y += element.offsetTop;
if (Browser.Engine.gecko){
if (!borderBox(element)){
position.x += leftBorder(element);
position.y += topBorder(element);
}
var parent = element.parentNode;
if (parent && styleString(parent, 'overflow') != 'visible'){
position.x += leftBorder(parent);
position.y += topBorder(parent);
}
} else if (element != this && Browser.Engine.webkit){
position.x += leftBorder(element);
position.y += topBorder(element);
}
element = element.offsetParent;
}
if (Browser.Engine.gecko && !borderBox(this)){
position.x -= leftBorder(this);
position.y -= topBorder(this);
}
return position;
},
getPosition: function(relative){
if (isBody(this)) return {x: 0, y: 0};
var offset = this.getOffsets(),
scroll = this.getScrolls();
var position = {
x: offset.x - scroll.x,
y: offset.y - scroll.y
};
var relativePosition = (relative && (relative = document.id(relative))) ? relative.getPosition() : {x: 0, y: 0};
return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
},
getCoordinates: function(element){
if (isBody(this)) return this.getWindow().getCoordinates();
var position = this.getPosition(element),
size = this.getSize();
var obj = {
left: position.x,
top: position.y,
width: size.x,
height: size.y
};
obj.right = obj.left + obj.width;
obj.bottom = obj.top + obj.height;
return obj;
},
computePosition: function(obj){
return {
left: obj.x - styleNumber(this, 'margin-left'),
top: obj.y - styleNumber(this, 'margin-top')
};
},
setPosition: function(obj){
return this.setStyles(this.computePosition(obj));
}
});
Native.implement([Document, Window], {
getSize: function(){
if (Browser.Engine.presto || Browser.Engine.webkit){
var win = this.getWindow();
return {x: win.innerWidth, y: win.innerHeight};
}
var doc = getCompatElement(this);
return {x: doc.clientWidth, y: doc.clientHeight};
},
getScroll: function(){
var win = this.getWindow(), doc = getCompatElement(this);
return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
},
getScrollSize: function(){
var doc = getCompatElement(this), min = this.getSize();
return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)};
},
getPosition: function(){
return {x: 0, y: 0};
},
getCoordinates: function(){
var size = this.getSize();
return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
}
});
var styleString = Element.getComputedStyle;
function styleNumber(element, style){
return styleString(element, style).toInt() || 0;
};
function borderBox(element){
return styleString(element, '-moz-box-sizing') == 'border-box';
};
function topBorder(element){
return styleNumber(element, 'border-top-width');
};
function leftBorder(element){
return styleNumber(element, 'border-left-width');
};
function isBody(element){
return (/^(?:body|html)$/i).test(element.tagName);
};
function getCompatElement(element){
var doc = element.getDocument();
return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
};
})();
Element.alias('setPosition', 'position'); //compatability
Native.implement([Window, Document, Element], {
getHeight: function(){
return this.getSize().y;
},
getWidth: function(){
return this.getSize().x;
},
getScrollTop: function(){
return this.getScroll().y;
},
getScrollLeft: function(){
return this.getScroll().x;
},
getScrollHeight: function(){
return this.getScrollSize().y;
},
getScrollWidth: function(){
return this.getScrollSize().x;
},
getTop: function(){
return this.getPosition().y;
},
getLeft: function(){
return this.getPosition().x;
}
});
Native.implement([Document, Element], {
getElements: function(expression, nocash){
expression = expression.split(',');
var items, local = {};
for (var i = 0, l = expression.length; i < l; i++){
var selector = expression[i], elements = Selectors.Utils.search(this, selector, local);
if (i != 0 && elements.item) elements = $A(elements);
items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements);
}
return new Elements(items, {ddup: (expression.length > 1), cash: !nocash});
}
});
Element.implement({
match: function(selector){
if (!selector || (selector == this)) return true;
var tagid = Selectors.Utils.parseTagAndID(selector);
var tag = tagid[0], id = tagid[1];
if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false;
var parsed = Selectors.Utils.parseSelector(selector);
return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true;
}
});
var Selectors = {Cache: {nth: {}, parsed: {}}};
Selectors.RegExps = {
id: (/#([\w-]+)/),
tag: (/^(\w+|\*)/),
quick: (/^(\w+|\*)$/),
splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),
combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)
};
Selectors.Utils = {
chk: function(item, uniques){
if (!uniques) return true;
var uid = $uid(item);
if (!uniques[uid]) return uniques[uid] = true;
return false;
},
parseNthArgument: function(argument){
if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument];
var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);
if (!parsed) return false;
var inta = parseInt(parsed[1], 10);
var a = (inta || inta === 0) ? inta : 1;
var special = parsed[2] || false;
var b = parseInt(parsed[3], 10) || 0;
if (a != 0){
b--;
while (b < 1) b += a;
while (b >= a) b -= a;
} else {
a = b;
special = 'index';
}
switch (special){
case 'n': parsed = {a: a, b: b, special: 'n'}; break;
case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break;
case 'even': parsed = {a: 2, b: 1, special: 'n'}; break;
case 'first': parsed = {a: 0, special: 'index'}; break;
case 'last': parsed = {special: 'last-child'}; break;
case 'only': parsed = {special: 'only-child'}; break;
default: parsed = {a: (a - 1), special: 'index'};
}
return Selectors.Cache.nth[argument] = parsed;
},
parseSelector: function(selector){
if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector];
var m, parsed = {classes: [], pseudos: [], attributes: []};
while ((m = Selectors.RegExps.combined.exec(selector))){
var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7];
if (cn){
parsed.classes.push(cn);
} else if (pn){
var parser = Selectors.Pseudo.get(pn);
if (parser) parsed.pseudos.push({parser: parser, argument: pa});
else parsed.attributes.push({name: pn, operator: '=', value: pa});
} else if (an){
parsed.attributes.push({name: an, operator: ao, value: av});
}
}
if (!parsed.classes.length) delete parsed.classes;
if (!parsed.attributes.length) delete parsed.attributes;
if (!parsed.pseudos.length) delete parsed.pseudos;
if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null;
return Selectors.Cache.parsed[selector] = parsed;
},
parseTagAndID: function(selector){
var tag = selector.match(Selectors.RegExps.tag);
var id = selector.match(Selectors.RegExps.id);
return [(tag) ? tag[1] : '*', (id) ? id[1] : false];
},
filter: function(item, parsed, local){
var i;
if (parsed.classes){
for (i = parsed.classes.length; i--; i){
var cn = parsed.classes[i];
if (!Selectors.Filters.byClass(item, cn)) return false;
}
}
if (parsed.attributes){
for (i = parsed.attributes.length; i--; i){
var att = parsed.attributes[i];
if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false;
}
}
if (parsed.pseudos){
for (i = parsed.pseudos.length; i--; i){
var psd = parsed.pseudos[i];
if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false;
}
}
return true;
},
getByTagAndID: function(ctx, tag, id){
if (id){
var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true);
return (item && Selectors.Filters.byTag(item, tag)) ? [item] : [];
} else {
return ctx.getElementsByTagName(tag);
}
},
search: function(self, expression, local){
var splitters = [];
var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){
splitters.push(m1);
return ':)' + m2;
}).split(':)');
var items, filtered, item;
for (var i = 0, l = selectors.length; i < l; i++){
var selector = selectors[i];
if (i == 0 && Selectors.RegExps.quick.test(selector)){
items = self.getElementsByTagName(selector);
continue;
}
var splitter = splitters[i - 1];
var tagid = Selectors.Utils.parseTagAndID(selector);
var tag = tagid[0], id = tagid[1];
if (i == 0){
items = Selectors.Utils.getByTagAndID(self, tag, id);
} else {
var uniques = {}, found = [];
for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques);
items = found;
}
var parsed = Selectors.Utils.parseSelector(selector);
if (parsed){
filtered = [];
for (var m = 0, n = items.length; m < n; m++){
item = items[m];
if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item);
}
items = filtered;
}
}
return items;
}
};
Selectors.Getters = {
' ': function(found, self, tag, id, uniques){
var items = Selectors.Utils.getByTagAndID(self, tag, id);
for (var i = 0, l = items.length; i < l; i++){
var item = items[i];
if (Selectors.Utils.chk(item, uniques)) found.push(item);
}
return found;
},
'>': function(found, self, tag, id, uniques){
var children = Selectors.Utils.getByTagAndID(self, tag, id);
for (var i = 0, l = children.length; i < l; i++){
var child = children[i];
if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child);
}
return found;
},
'+': function(found, self, tag, id, uniques){
while ((self = self.nextSibling)){
if (self.nodeType == 1){
if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
break;
}
}
return found;
},
'~': function(found, self, tag, id, uniques){
while ((self = self.nextSibling)){
if (self.nodeType == 1){
if (!Selectors.Utils.chk(self, uniques)) break;
if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
}
}
return found;
}
};
Selectors.Filters = {
byTag: function(self, tag){
return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag));
},
byID: function(self, id){
return (!id || (self.id && self.id == id));
},
byClass: function(self, klass){
return (self.className && self.className.contains && self.className.contains(klass, ' '));
},
byPseudo: function(self, parser, argument, local){
return parser.call(self, argument, local);
},
byAttribute: function(self, name, operator, value){
var result = Element.prototype.getProperty.call(self, name);
if (!result) return (operator == '!=');
if (!operator || value == undefined) return true;
switch (operator){
case '=': return (result == value);
case '*=': return (result.contains(value));
case '^=': return (result.substr(0, value.length) == value);
case '$=': return (result.substr(result.length - value.length) == value);
case '!=': return (result != value);
case '~=': return result.contains(value, ' ');
case '|=': return result.contains(value, '-');
}
return false;
}
};
Selectors.Pseudo = new Hash({
checked: function(){
return this.checked;
},
empty: function(){
return !(this.innerText || this.textContent || '').length;
},
not: function(selector){
return !Element.match(this, selector);
},
contains: function(text){
return (this.innerText || this.textContent || '').contains(text);
},
'first-child': function(){
return Selectors.Pseudo.index.call(this, 0);
},
'last-child': function(){
var element = this;
while ((element = element.nextSibling)){
if (element.nodeType == 1) return false;
}
return true;
},
'only-child': function(){
var prev = this;
while ((prev = prev.previousSibling)){
if (prev.nodeType == 1) return false;
}
var next = this;
while ((next = next.nextSibling)){
if (next.nodeType == 1) return false;
}
return true;
},
'nth-child': function(argument, local){
argument = (argument == undefined) ? 'n' : argument;
var parsed = Selectors.Utils.parseNthArgument(argument);
if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local);
var count = 0;
local.positions = local.positions || {};
var uid = $uid(this);
if (!local.positions[uid]){
var self = this;
while ((self = self.previousSibling)){
if (self.nodeType != 1) continue;
count ++;
var position = local.positions[$uid(self)];
if (position != undefined){
count = position + count;
break;
}
}
local.positions[uid] = count;
}
return (local.positions[uid] % parsed.a == parsed.b);
},
index: function(index){
var element = this, count = 0;
while ((element = element.previousSibling)){
if (element.nodeType == 1 && ++count > index) return false;
}
return (count == index);
},
even: function(argument, local){
return Selectors.Pseudo['nth-child'].call(this, '2n+1', local);
},
odd: function(argument, local){
return Selectors.Pseudo['nth-child'].call(this, '2n', local);
},
selected: function(){
return this.selected;
},
enabled: function(){
return (this.disabled === false);
}
});
Element.Events.domready = {
onAdd: function(fn){
if (Browser.loaded) fn.call(this);
}
};
(function(){
var domready = function(){
if (Browser.loaded) return;
Browser.loaded = true;
window.fireEvent('domready');
document.fireEvent('domready');
};
window.addEvent('load', domready);
if (Browser.Engine.trident){
var temp = document.createElement('div');
(function(){
($try(function(){
temp.doScroll(); // Technique by Diego Perini
return document.id(temp).inject(document.body).set('html', 'temp').dispose();
})) ? domready() : arguments.callee.delay(50);
})();
} else if (Browser.Engine.webkit && Browser.Engine.version < 525){
(function(){
(['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
})();
} else {
document.addEvent('DOMContentLoaded', domready);
}
})();
var JSON = new Hash(this.JSON && {
stringify: JSON.stringify,
parse: JSON.parse
}).extend({
$specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},
$replaceChars: function(chr){
return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
},
encode: function(obj){
switch ($type(obj)){
case 'string':
return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"';
case 'array':
return '[' + String(obj.map(JSON.encode).clean()) + ']';
case 'object': case 'hash':
var string = [];
Hash.each(obj, function(value, key){
var json = JSON.encode(value);
if (json) string.push(JSON.encode(key) + ':' + json);
});
return '{' + string + '}';
case 'number': case 'boolean': return String(obj);
case false: return 'null';
}
return null;
},
decode: function(string, secure){
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return eval('(' + string + ')');
}
});
Native.implement([Hash, Array, String, Number], {
toJSON: function(){
return JSON.encode(this);
}
});
var Cookie = new Class({
Implements: Options,
options: {
path: false,
domain: false,
duration: false,
secure: false,
document: document
},
initialize: function(key, options){
this.key = key;
this.setOptions(options);
},
write: function(value){
value = encodeURIComponent(value);
if (this.options.domain) value += '; domain=' + this.options.domain;
if (this.options.path) value += '; path=' + this.options.path;
if (this.options.duration){
var date = new Date();
date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
value += '; expires=' + date.toGMTString();
}
if (this.options.secure) value += '; secure';
this.options.document.cookie = this.key + '=' + value;
return this;
},
read: function(){
var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
return (value) ? decodeURIComponent(value[1]) : null;
},
dispose: function(){
new Cookie(this.key, $merge(this.options, {duration: -1})).write('');
return this;
}
});
Cookie.write = function(key, value, options){
return new Cookie(key, options).write(value);
};
Cookie.read = function(key){
return new Cookie(key).read();
};
Cookie.dispose = function(key, options){
return new Cookie(key, options).dispose();
};
var Swiff = new Class({
Implements: [Options],
options: {
id: null,
height: 1,
width: 1,
container: null,
properties: {},
params: {
quality: 'high',
allowScriptAccess: 'always',
wMode: 'transparent',
swLiveConnect: true
},
callBacks: {},
vars: {}
},
toElement: function(){
return this.object;
},
initialize: function(path, options){
this.instance = 'Swiff_' + $time();
this.setOptions(options);
options = this.options;
var id = this.id = options.id || this.instance;
var container = document.id(options.container);
Swiff.CallBacks[this.instance] = {};
var params = options.params, vars = options.vars, callBacks = options.callBacks;
var properties = $extend({height: options.height, width: options.width}, options.properties);
var self = this;
for (var callBack in callBacks){
Swiff.CallBacks[this.instance][callBack] = (function(option){
return function(){
return option.apply(self.object, arguments);
};
})(callBacks[callBack]);
vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
}
params.flashVars = Hash.toQueryString(vars);
if (Browser.Engine.trident){
properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
params.movie = path;
} else {
properties.type = 'application/x-shockwave-flash';
properties.data = path;
}
var build = '<object id="' + id + '"';
for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
build += '>';
for (var param in params){
if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
}
build += '</object>';
this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
},
replaces: function(element){
element = document.id(element, true);
element.parentNode.replaceChild(this.toElement(), element);
return this;
},
inject: function(element){
document.id(element, true).appendChild(this.toElement());
return this;
},
remote: function(){
return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments));
}
});
Swiff.CallBacks = {};
Swiff.remote = function(obj, fn){
var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
return eval(rs);
};
var Fx = new Class({
Implements: [Chain, Events, Options],
options: {
fps: 50,
unit: false,
duration: 500,
link: 'ignore'
},
initialize: function(options){
this.subject = this.subject || this;
this.setOptions(options);
this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt();
var wait = this.options.wait;
if (wait === false) this.options.link = 'cancel';
},
getTransition: function(){
return function(p){
return -(Math.cos(Math.PI * p) - 1) / 2;
};
},
step: function(){
var time = $time();
if (time < this.time + this.options.duration){
var delta = this.transition((time - this.time) / this.options.duration);
this.set(this.compute(this.from, this.to, delta));
} else {
this.set(this.compute(this.from, this.to, 1));
this.complete();
}
},
set: function(now){
return now;
},
compute: function(from, to, delta){
return Fx.compute(from, to, delta);
},
check: function(){
if (!this.timer) return true;
switch (this.options.link){
case 'cancel': this.cancel(); return true;
case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
}
return false;
},
start: function(from, to){
if (!this.check(from, to)) return this;
this.from = from;
this.to = to;
this.time = 0;
this.transition = this.getTransition();
this.startTimer();
this.onStart();
return this;
},
complete: function(){
if (this.stopTimer()) this.onComplete();
return this;
},
cancel: function(){
if (this.stopTimer()) this.onCancel();
return this;
},
onStart: function(){
this.fireEvent('start', this.subject);
},
onComplete: function(){
this.fireEvent('complete', this.subject);
if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
},
onCancel: function(){
this.fireEvent('cancel', this.subject).clearChain();
},
pause: function(){
this.stopTimer();
return this;
},
resume: function(){
this.startTimer();
return this;
},
stopTimer: function(){
if (!this.timer) return false;
this.time = $time() - this.time;
this.timer = $clear(this.timer);
return true;
},
startTimer: function(){
if (this.timer) return false;
this.time = $time() - this.time;
this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this);
return true;
}
});
Fx.compute = function(from, to, delta){
return (to - from) * delta + from;
};
Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
Fx.CSS = new Class({
Extends: Fx,
prepare: function(element, property, values){
values = $splat(values);
var values1 = values[1];
if (!$chk(values1)){
values[1] = values[0];
values[0] = element.getStyle(property);
}
var parsed = values.map(this.parse);
return {from: parsed[0], to: parsed[1]};
},
parse: function(value){
value = $lambda(value)();
value = (typeof value == 'string') ? value.split(' ') : $splat(value);
return value.map(function(val){
val = String(val);
var found = false;
Fx.CSS.Parsers.each(function(parser, key){
if (found) return;
var parsed = parser.parse(val);
if ($chk(parsed)) found = {value: parsed, parser: parser};
});
found = found || {value: val, parser: Fx.CSS.Parsers.String};
return found;
});
},
compute: function(from, to, delta){
var computed = [];
(Math.min(from.length, to.length)).times(function(i){
computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
});
computed.$family = {name: 'fx:css:value'};
return computed;
},
serve: function(value, unit){
if ($type(value) != 'fx:css:value') value = this.parse(value);
var returned = [];
value.each(function(bit){
returned = returned.concat(bit.parser.serve(bit.value, unit));
});
return returned;
},
render: function(element, property, value, unit){
element.setStyle(property, this.serve(value, unit));
},
search: function(selector){
if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
var to = {};
Array.each(document.styleSheets, function(sheet, j){
var href = sheet.href;
if (href && href.contains('://') && !href.contains(document.domain)) return;
var rules = sheet.rules || sheet.cssRules;
Array.each(rules, function(rule, i){
if (!rule.style) return;
var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
return m.toLowerCase();
}) : null;
if (!selectorText || !selectorText.test('^' + selector + '$')) return;
Element.Styles.each(function(value, style){
if (!rule.style[style] || Element.ShortStyles[style]) return;
value = String(rule.style[style]);
to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value;
});
});
});
return Fx.CSS.Cache[selector] = to;
}
});
Fx.CSS.Cache = {};
Fx.CSS.Parsers = new Hash({
Color: {
parse: function(value){
if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
},
compute: function(from, to, delta){
return from.map(function(value, i){
return Math.round(Fx.compute(from[i], to[i], delta));
});
},
serve: function(value){
return value.map(Number);
}
},
Number: {
parse: parseFloat,
compute: Fx.compute,
serve: function(value, unit){
return (unit) ? value + unit : value;
}
},
String: {
parse: $lambda(false),
compute: $arguments(1),
serve: $arguments(0)
}
});
Fx.Tween = new Class({
Extends: Fx.CSS,
initialize: function(element, options){
this.element = this.subject = document.id(element);
this.parent(options);
},
set: function(property, now){
if (arguments.length == 1){
now = property;
property = this.property || this.options.property;
}
this.render(this.element, property, now, this.options.unit);
return this;
},
start: function(property, from, to){
if (!this.check(property, from, to)) return this;
var args = Array.flatten(arguments);
this.property = this.options.property || args.shift();
var parsed = this.prepare(this.element, this.property, args);
return this.parent(parsed.from, parsed.to);
}
});
Element.Properties.tween = {
set: function(options){
var tween = this.retrieve('tween');
if (tween) tween.cancel();
return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options));
},
get: function(options){
if (options || !this.retrieve('tween')){
if (options || !this.retrieve('tween:options')) this.set('tween', options);
this.store('tween', new Fx.Tween(this, this.retrieve('tween:options')));
}
return this.retrieve('tween');
}
};
Element.implement({
tween: function(property, from, to){
this.get('tween').start(arguments);
return this;
},
fade: function(how){
var fade = this.get('tween'), o = 'opacity', toggle;
how = $pick(how, 'toggle');
switch (how){
case 'in': fade.start(o, 1); break;
case 'out': fade.start(o, 0); break;
case 'show': fade.set(o, 1); break;
case 'hide': fade.set(o, 0); break;
case 'toggle':
var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
fade.start(o, (flag) ? 0 : 1);
this.store('fade:flag', !flag);
toggle = true;
break;
default: fade.start(o, arguments);
}
if (!toggle) this.eliminate('fade:flag');
return this;
},
highlight: function(start, end){
if (!end){
end = this.retrieve('highlight:original', this.getStyle('background-color'));
end = (end == 'transparent') ? '#fff' : end;
}
var tween = this.get('tween');
tween.start('background-color', start || '#ffff88', end).chain(function(){
this.setStyle('background-color', this.retrieve('highlight:original'));
tween.callChain();
}.bind(this));
return this;
}
});
Fx.Morph = new Class({
Extends: Fx.CSS,
initialize: function(element, options){
this.element = this.subject = document.id(element);
this.parent(options);
},
set: function(now){
if (typeof now == 'string') now = this.search(now);
for (var p in now) this.render(this.element, p, now[p], this.options.unit);
return this;
},
compute: function(from, to, delta){
var now = {};
for (var p in from) now[p] = this.parent(from[p], to[p], delta);
return now;
},
start: function(properties){
if (!this.check(properties)) return this;
if (typeof properties == 'string') properties = this.search(properties);
var from = {}, to = {};
for (var p in properties){
var parsed = this.prepare(this.element, p, properties[p]);
from[p] = parsed.from;
to[p] = parsed.to;
}
return this.parent(from, to);
}
});
Element.Properties.morph = {
set: function(options){
var morph = this.retrieve('morph');
if (morph) morph.cancel();
return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options));
},
get: function(options){
if (options || !this.retrieve('morph')){
if (options || !this.retrieve('morph:options')) this.set('morph', options);
this.store('morph', new Fx.Morph(this, this.retrieve('morph:options')));
}
return this.retrieve('morph');
}
};
Element.implement({
morph: function(props){
this.get('morph').start(props);
return this;
}
});
Fx.implement({
getTransition: function(){
var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
if (typeof trans == 'string'){
var data = trans.split(':');
trans = Fx.Transitions;
trans = trans[data[0]] || trans[data[0].capitalize()];
if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
}
return trans;
}
});
Fx.Transition = function(transition, params){
params = $splat(params);
return $extend(transition, {
easeIn: function(pos){
return transition(pos, params);
},
easeOut: function(pos){
return 1 - transition(1 - pos, params);
},
easeInOut: function(pos){
return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2;
}
});
};
Fx.Transitions = new Hash({
linear: $arguments(0)
});
Fx.Transitions.extend = function(transitions){
for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
};
Fx.Transitions.extend({
Pow: function(p, x){
return Math.pow(p, x[0] || 6);
},
Expo: function(p){
return Math.pow(2, 8 * (p - 1));
},
Circ: function(p){
return 1 - Math.sin(Math.acos(p));
},
Sine: function(p){
return 1 - Math.sin((1 - p) * Math.PI / 2);
},
Back: function(p, x){
x = x[0] || 1.618;
return Math.pow(p, 2) * ((x + 1) * p - x);
},
Bounce: function(p){
var value;
for (var a = 0, b = 1; 1; a += b, b /= 2){
if (p >= (7 - 4 * a) / 11){
value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
break;
}
}
return value;
},
Elastic: function(p, x){
return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3);
}
});
['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
Fx.Transitions[transition] = new Fx.Transition(function(p){
return Math.pow(p, [i + 2]);
});
});
var Request = new Class({
Implements: [Chain, Events, Options],
options: {/*
onRequest: $empty,
onComplete: $empty,
onCancel: $empty,
onSuccess: $empty,
onFailure: $empty,
onException: $empty,*/
url: '',
data: '',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
},
async: true,
format: false,
method: 'post',
link: 'ignore',
isSuccess: null,
emulation: true,
urlEncoded: true,
encoding: 'utf-8',
evalScripts: false,
evalResponse: false,
noCache: false
},
initialize: function(options){
this.xhr = new Browser.Request();
this.setOptions(options);
this.options.isSuccess = this.options.isSuccess || this.isSuccess;
this.headers = new Hash(this.options.headers);
},
onStateChange: function(){
if (this.xhr.readyState != 4 || !this.running) return;
this.running = false;
this.status = 0;
$try(function(){
this.status = this.xhr.status;
}.bind(this));
this.xhr.onreadystatechange = $empty;
if (this.options.isSuccess.call(this, this.status)){
this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML};
this.success(this.response.text, this.response.xml);
} else {
this.response = {text: null, xml: null};
this.failure();
}
},
isSuccess: function(){
return ((this.status >= 200) && (this.status < 300));
},
processScripts: function(text){
if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text);
return text.stripScripts(this.options.evalScripts);
},
success: function(text, xml){
this.onSuccess(this.processScripts(text), xml);
},
onSuccess: function(){
this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
},
failure: function(){
this.onFailure();
},
onFailure: function(){
this.fireEvent('complete').fireEvent('failure', this.xhr);
},
setHeader: function(name, value){
this.headers.set(name, value);
return this;
},
getHeader: function(name){
return $try(function(){
return this.xhr.getResponseHeader(name);
}.bind(this));
},
check: function(){
if (!this.running) return true;
switch (this.options.link){
case 'cancel': this.cancel(); return true;
case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
}
return false;
},
send: function(options){
if (!this.check(options)) return this;
this.running = true;
var type = $type(options);
if (type == 'string' || type == 'element') options = {data: options};
var old = this.options;
options = $extend({data: old.data, url: old.url, method: old.method}, options);
var data = options.data, url = String(options.url), method = options.method.toLowerCase();
switch ($type(data)){
case 'element': data = document.id(data).toQueryString(); break;
case 'object': case 'hash': data = Hash.toQueryString(data);
}
if (this.options.format){
var format = 'format=' + this.options.format;
data = (data) ? format + '&' + data : format;
}
if (this.options.emulation && !['get', 'post'].contains(method)){
var _method = '_method=' + method;
data = (data) ? _method + '&' + data : _method;
method = 'post';
}
if (this.options.urlEncoded && method == 'post'){
var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding);
}
if (this.options.noCache){
var noCache = 'noCache=' + new Date().getTime();
data = (data) ? noCache + '&' + data : noCache;
}
var trimPosition = url.lastIndexOf('/');
if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
if (data && method == 'get'){
url = url + (url.contains('?') ? '&' : '?') + data;
data = null;
}
this.xhr.open(method.toUpperCase(), url, this.options.async);
this.xhr.onreadystatechange = this.onStateChange.bind(this);
this.headers.each(function(value, key){
try {
this.xhr.setRequestHeader(key, value);
} catch (e){
this.fireEvent('exception', [key, value]);
}
}, this);
this.fireEvent('request');
this.xhr.send(data);
if (!this.options.async) this.onStateChange();
return this;
},
cancel: function(){
if (!this.running) return this;
this.running = false;
this.xhr.abort();
this.xhr.onreadystatechange = $empty;
this.xhr = new Browser.Request();
this.fireEvent('cancel');
return this;
}
});
(function(){
var methods = {};
['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
methods[method] = function(){
var params = Array.link(arguments, {url: String.type, data: $defined});
return this.send($extend(params, {method: method}));
};
});
Request.implement(methods);
})();
Element.Properties.send = {
set: function(options){
var send = this.retrieve('send');
if (send) send.cancel();
return this.eliminate('send').store('send:options', $extend({
data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
}, options));
},
get: function(options){
if (options || !this.retrieve('send')){
if (options || !this.retrieve('send:options')) this.set('send', options);
this.store('send', new Request(this.retrieve('send:options')));
}
return this.retrieve('send');
}
};
Element.implement({
send: function(url){
var sender = this.get('send');
sender.send({data: this, url: url || sender.options.url});
return this;
}
});
Request.HTML = new Class({
Extends: Request,
options: {
update: false,
append: false,
evalScripts: true,
filter: false
},
processHTML: function(text){
var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
text = (match) ? match[1] : text;
var container = new Element('div');
return $try(function(){
var root = '<root>' + text + '</root>', doc;
if (Browser.Engine.trident){
doc = new ActiveXObject('Microsoft.XMLDOM');
doc.async = false;
doc.loadXML(root);
} else {
doc = new DOMParser().parseFromString(root, 'text/xml');
}
root = doc.getElementsByTagName('root')[0];
if (!root) return null;
for (var i = 0, k = root.childNodes.length; i < k; i++){
var child = Element.clone(root.childNodes[i], true, true);
if (child) container.grab(child);
}
return container;
}) || container.set('html', text);
},
success: function(text){
var options = this.options, response = this.response;
response.html = text.stripScripts(function(script){
response.javascript = script;
});
var temp = this.processHTML(response.html);
response.tree = temp.childNodes;
response.elements = temp.getElements('*');
if (options.filter) response.tree = response.elements.filter(options.filter);
if (options.update) document.id(options.update).empty().set('html', response.html);
else if (options.append) document.id(options.append).adopt(temp.getChildren());
if (options.evalScripts) $exec(response.javascript);
this.onSuccess(response.tree, response.elements, response.html, response.javascript);
}
});
Element.Properties.load = {
set: function(options){
var load = this.retrieve('load');
if (load) load.cancel();
return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
},
get: function(options){
if (options || ! this.retrieve('load')){
if (options || !this.retrieve('load:options')) this.set('load', options);
this.store('load', new Request.HTML(this.retrieve('load:options')));
}
return this.retrieve('load');
}
};
Element.implement({
load: function(){
this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
return this;
}
});
Request.JSON = new Class({
Extends: Request,
options: {
secure: true
},
initialize: function(options){
this.parent(options);
this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});
},
success: function(text){
this.response.json = JSON.decode(text, this.options.secure);
this.onSuccess(this.response.json, text);
}
});
MooTools.More = {
'version': '1.2.4.2',
'build': 'bd5a93c0913cce25917c48cbdacde568e15e02ef'
};
(function(){
var data = {
language: 'en-US',
languages: {
'en-US': {}
},
cascades: ['en-US']
};
var cascaded;
MooTools.lang = new Events();
$extend(MooTools.lang, {
setLanguage: function(lang){
if (!data.languages[lang]) return this;
data.language = lang;
this.load();
this.fireEvent('langChange', lang);
return this;
},
load: function() {
var langs = this.cascade(this.getCurrentLanguage());
cascaded = {};
$each(langs, function(set, setName){
cascaded[setName] = this.lambda(set);
}, this);
},
getCurrentLanguage: function(){
return data.language;
},
addLanguage: function(lang){
data.languages[lang] = data.languages[lang] || {};
return this;
},
cascade: function(lang){
var cascades = (data.languages[lang] || {}).cascades || [];
cascades.combine(data.cascades);
cascades.erase(lang).push(lang);
var langs = cascades.map(function(lng){
return data.languages[lng];
}, this);
return $merge.apply(this, langs);
},
lambda: function(set) {
(set || {}).get = function(key, args){
return $lambda(set[key]).apply(this, $splat(args));
};
return set;
},
get: function(set, key, args){
if (cascaded && cascaded[set]) return (key ? cascaded[set].get(key, args) : cascaded[set]);
},
set: function(lang, set, members){
this.addLanguage(lang);
langData = data.languages[lang];
if (!langData[set]) langData[set] = {};
$extend(langData[set], members);
if (lang == this.getCurrentLanguage()){
this.load();
this.fireEvent('langChange', lang);
}
return this;
},
list: function(){
return Hash.getKeys(data.languages);
}
});
})();
(function(){
var global = this;
var log = function(){
if (global.console && console.log){
try {
console.log.apply(console, arguments);
} catch(e) {
console.log(Array.slice(arguments));
}
} else {
Log.logged.push(arguments);
}
return this;
};
var disabled = function(){
this.logged.push(arguments);
return this;
};
this.Log = new Class({
logged: [],
log: disabled,
resetLog: function(){
this.logged.empty();
return this;
},
enableLog: function(){
this.log = log;
this.logged.each(function(args){
this.log.apply(this, args);
}, this);
return this.resetLog();
},
disableLog: function(){
this.log = disabled;
return this;
}
});
Log.extend(new Log).enableLog();
Log.logger = function(){
return this.log.apply(this, arguments);
};
})();
var Depender = {
options: {
loadedSources: [],
loadedScripts: ['Core', 'Browser', 'Array', 'String', 'Function', 'Number', 'Hash', 'Element', 'Event', 'Element.Event', 'Class', 'DomReady', 'Class.Extras', 'Request', 'JSON', 'Request.JSON', 'More', 'Depender', 'Log'],
useScriptInjection: true
},
loaded: [],
sources: {},
libs: {},
include: function(libs){
this.log('include: ', libs);
this.mapLoaded = false;
var loader = function(data){
this.libs = $merge(this.libs, data);
$each(this.libs, function(data, lib){
if (data.scripts) this.loadSource(lib, data.scripts);
}, this);
}.bind(this);
if ($type(libs) == 'string'){
this.log('fetching libs ', libs);
this.request(libs, loader);
} else {
loader(libs);
}
return this;
},
required: [],
require: function(options){
var loaded = function(){
var scripts = this.calculateDependencies(options.scripts);
if (options.sources){
options.sources.each(function(source){
scripts.combine(this.libs[source].files);
}, this);
}
if (options.serial) scripts.combine(this.getLoadedScripts());
options.scripts = scripts;
this.required.push(options);
this.fireEvent('require', options);
this.loadScripts(options.scripts);
};
if (this.mapLoaded){
loaded.call(this);
} else {
this.addEvent('mapLoaded', function(){
loaded.call(this);
this.removeEvent('mapLoaded', arguments.callee);
});
}
return this;
},
cleanDoubleSlash: function(str){
if (!str) return str;
var prefix = '';
if (str.test(/^http:\/\//)){
prefix = 'http://';
str = str.substring(7, str.length);
}
str = str.replace(/\/\//g, '/');
return prefix + str;
},
request: function(url, callback){
new Request.JSON({
url: url,
secure: false,
onSuccess: callback
}).send();
},
loadSource: function(lib, source){
if (this.libs[lib].files){
this.dataLoaded();
return;
}
this.log('loading source: ', source);
this.request(this.cleanDoubleSlash(source + '/scripts.json'), function(result){
this.log('loaded source: ', source);
this.libs[lib].files = result;
this.dataLoaded();
}.bind(this));
},
dataLoaded: function(){
var loaded = true;
$each(this.libs, function(v, k){
if (!this.libs[k].files) loaded = false;
}, this);
if (loaded){
this.mapTree();
this.mapLoaded = true;
this.calculateLoaded();
this.lastLoaded = this.getLoadedScripts().getLength();
this.fireEvent('mapLoaded');
}
},
calculateLoaded: function(){
var set = function(script){
this.scriptsState[script] = true;
}.bind(this);
if (this.options.loadedScripts) this.options.loadedScripts.each(set);
if (this.options.loadedSources){
this.options.loadedSources.each(function(lib){
$each(this.libs[lib].files, function(dir){
$each(dir, function(data, file){
set(file);
}, this);
}, this);
}, this);
}
},
deps: {},
pathMap: {},
mapTree: function(){
$each(this.libs, function(data, source){
$each(data.files, function(scripts, folder){
$each(scripts, function(details, script){
var path = source + ':' + folder + ':' + script;
if (this.deps[path]) return;
this.deps[path] = details.deps;
this.pathMap[script] = path;
}, this);
}, this);
}, this);
},
getDepsForScript: function(script){
return this.deps[this.pathMap[script]] || [];
},
calculateDependencies: function(scripts){
var reqs = [];
$splat(scripts).each(function(script){
if (script == 'None' || !script) return;
var deps = this.getDepsForScript(script);
if (!deps){
if (window.console && console.warn) console.warn('dependencies not mapped: script: %o, map: %o, :deps: %o', script, this.pathMap, this.deps);
} else {
deps.each(function(scr){
if (scr == script || scr == 'None' || !scr) return;
if (!reqs.contains(scr)) reqs.combine(this.calculateDependencies(scr));
reqs.include(scr);
}, this);
}
reqs.include(script);
}, this);
return reqs;
},
getPath: function(script){
try {
var chunks = this.pathMap[script].split(':');
var lib = this.libs[chunks[0]];
var dir = (lib.path || lib.scripts) + '/';
chunks.shift();
return this.cleanDoubleSlash(dir + chunks.join('/') + '.js');
} catch(e){
return script;
}
},
loadScripts: function(scripts){
scripts = scripts.filter(function(s){
if (!this.scriptsState[s] && s != 'None'){
this.scriptsState[s] = false;
return true;
}
}, this);
if (scripts.length){
scripts.each(function(scr){
this.loadScript(scr);
}, this);
} else {
this.check();
}
},
toLoad: [],
loadScript: function(script){
if (this.scriptsState[script] && this.toLoad.length){
this.loadScript(this.toLoad.shift());
return;
} else if (this.loading){
this.toLoad.push(script);
return;
}
var finish = function(){
this.loading = false;
this.scriptLoaded(script);
if (this.toLoad.length) this.loadScript(this.toLoad.shift());
}.bind(this);
var error = function(){
this.log('could not load: ', scriptPath);
}.bind(this);
this.loading = true;
var scriptPath = this.getPath(script);
if (this.options.useScriptInjection){
this.log('injecting script: ', scriptPath);
var loaded = function(){
this.log('loaded script: ', scriptPath);
finish();
}.bind(this);
new Element('script', {
src: scriptPath + (this.options.noCache ? '?noCache=' + new Date().getTime() : ''),
events: {
load: loaded,
readystatechange: function(){
if (['loaded', 'complete'].contains(this.readyState)) loaded();
},
error: error
}
}).inject(this.options.target || document.head);
} else {
this.log('requesting script: ', scriptPath);
new Request({
url: scriptPath,
noCache: this.options.noCache,
onComplete: function(js){
this.log('loaded script: ', scriptPath);
$exec(js);
finish();
}.bind(this),
onFailure: error,
onException: error
}).send();
}
},
scriptsState: $H(),
getLoadedScripts: function(){
return this.scriptsState.filter(function(state){
return state;
});
},
scriptLoaded: function(script){
this.log('loaded script: ', script);
this.scriptsState[script] = true;
this.check();
var loaded = this.getLoadedScripts();
var loadedLength = loaded.getLength();
var toLoad = this.scriptsState.getLength();
this.fireEvent('scriptLoaded', {
script: script,
totalLoaded: (loadedLength / toLoad * 100).round(),
currentLoaded: ((loadedLength - this.lastLoaded) / (toLoad - this.lastLoaded) * 100).round(),
loaded: loaded
});
if (loadedLength == toLoad) this.lastLoaded = loadedLength;
},
lastLoaded: 0,
check: function(){
var incomplete = [];
this.required.each(function(required){
var loaded = [];
required.scripts.each(function(script){
if (this.scriptsState[script]) loaded.push(script);
}, this);
if (required.onStep){
required.onStep({
percent: loaded.length / required.scripts.length * 100,
scripts: loaded
});
};
if (required.scripts.length != loaded.length) return;
required.callback();
this.required.erase(required);
this.fireEvent('requirementLoaded', [loaded, required]);
}, this);
}
};
$extend(Depender, new Events);
$extend(Depender, new Options);
$extend(Depender, new Log);
Depender._setOptions = Depender.setOptions;
Depender.setOptions = function(){
Depender._setOptions.apply(Depender, arguments);
if (this.options.log) Depender.enableLog();
return this;
};
Class.refactor = function(original, refactors){
$each(refactors, function(item, name){
var origin = original.prototype[name];
if (origin && (origin = origin._origin) && typeof item == 'function') original.implement(name, function(){
var old = this.previous;
this.previous = origin;
var value = item.apply(this, arguments);
this.previous = old;
return value;
}); else original.implement(name, item);
});
return original;
};
Class.Mutators.Binds = function(binds){
return binds;
};
Class.Mutators.initialize = function(initialize){
return function(){
$splat(this.Binds).each(function(name){
var original = this[name];
if (original) this[name] = original.bind(this);
}, this);
return initialize.apply(this, arguments);
};
};
Class.Occlude = new Class({
occlude: function(property, element){
element = document.id(element || this.element);
var instance = element.retrieve(property || this.property);
if (instance && !$defined(this.occluded))
return this.occluded = instance;
this.occluded = false;
element.store(property || this.property, this);
return this.occluded;
}
});
(function(){
var wait = {
wait: function(duration){
return this.chain(function(){
this.callChain.delay($pick(duration, 500), this);
}.bind(this));
}
};
Chain.implement(wait);
if (window.Fx){
Fx.implement(wait);
['Css', 'Tween', 'Elements'].each(function(cls){
if (Fx[cls]) Fx[cls].implement(wait);
});
}
Element.implement({
chains: function(effects){
$splat($pick(effects, ['tween', 'morph', 'reveal'])).each(function(effect){
effect = this.get(effect);
if (!effect) return;
effect.setOptions({
link:'chain'
});
}, this);
return this;
},
pauseFx: function(duration, effect){
this.chains(effect).get($pick(effect, 'tween')).wait(duration);
return this;
}
});
})();
Array.implement({
min: function(){
return Math.min.apply(null, this);
},
max: function(){
return Math.max.apply(null, this);
},
average: function(){
return this.length ? this.sum() / this.length : 0;
},
sum: function(){
var result = 0, l = this.length;
if (l){
do {
result += this[--l];
} while (l);
}
return result;
},
unique: function(){
return [].combine(this);
}
});
(function(){
var Date = this.Date;
if (!Date.now) Date.now = $time;
Date.Methods = {
ms: 'Milliseconds',
year: 'FullYear',
min: 'Minutes',
mo: 'Month',
sec: 'Seconds',
hr: 'Hours'
};
['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds'].each(function(method){
Date.Methods[method.toLowerCase()] = method;
});
var pad = function(what, length){
return new Array(length - String(what).length + 1).join('0') + what;
};
Date.implement({
set: function(prop, value){
switch ($type(prop)){
case 'object':
for (var p in prop) this.set(p, prop[p]);
break;
case 'string':
prop = prop.toLowerCase();
var m = Date.Methods;
if (m[prop]) this['set' + m[prop]](value);
}
return this;
},
get: function(prop){
prop = prop.toLowerCase();
var m = Date.Methods;
if (m[prop]) return this['get' + m[prop]]();
return null;
},
clone: function(){
return new Date(this.get('time'));
},
increment: function(interval, times){
interval = interval || 'day';
times = $pick(times, 1);
switch (interval){
case 'year':
return this.increment('month', times * 12);
case 'month':
var d = this.get('date');
this.set('date', 1).set('mo', this.get('mo') + times);
return this.set('date', d.min(this.get('lastdayofmonth')));
case 'week':
return this.increment('day', times * 7);
case 'day':
return this.set('date', this.get('date') + times);
}
if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
return this.set('time', this.get('time') + times * Date.units[interval]());
},
decrement: function(interval, times){
return this.increment(interval, -1 * $pick(times, 1));
},
isLeapYear: function(){
return Date.isLeapYear(this.get('year'));
},
clearTime: function(){
return this.set({hr: 0, min: 0, sec: 0, ms: 0});
},
diff: function(date, resolution){
if ($type(date) == 'string') date = Date.parse(date);
return ((date - this) / Date.units[resolution || 'day'](3, 3)).toInt(); // non-leap year, 30-day month
},
getLastDayOfMonth: function(){
return Date.daysInMonth(this.get('mo'), this.get('year'));
},
getDayOfYear: function(){
return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
},
getWeek: function(){
return (this.get('dayofyear') / 7).ceil();
},
getOrdinal: function(day){
return Date.getMsg('ordinal', day || this.get('date'));
},
getTimezone: function(){
return this.toString()
.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
},
getGMTOffset: function(){
var off = this.get('timezoneOffset');
return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
},
setAMPM: function(ampm){
ampm = ampm.toUpperCase();
var hr = this.get('hr');
if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
return this;
},
getAMPM: function(){
return (this.get('hr') < 12) ? 'AM' : 'PM';
},
parse: function(str){
this.set('time', Date.parse(str));
return this;
},
isValid: function(date) {
return !!(date || this).valueOf();
},
format: function(f){
if (!this.isValid()) return 'invalid date';
f = f || '%x %X';
f = formats[f.toLowerCase()] || f; // replace short-hand with actual format
var d = this;
return f.replace(/%([a-z%])/gi,
function($0, $1){
switch ($1){
case 'a': return Date.getMsg('days')[d.get('day')].substr(0, 3);
case 'A': return Date.getMsg('days')[d.get('day')];
case 'b': return Date.getMsg('months')[d.get('month')].substr(0, 3);
case 'B': return Date.getMsg('months')[d.get('month')];
case 'c': return d.toString();
case 'd': return pad(d.get('date'), 2);
case 'H': return pad(d.get('hr'), 2);
case 'I': return ((d.get('hr') % 12) || 12);
case 'j': return pad(d.get('dayofyear'), 3);
case 'm': return pad((d.get('mo') + 1), 2);
case 'M': return pad(d.get('min'), 2);
case 'o': return d.get('ordinal');
case 'p': return Date.getMsg(d.get('ampm'));
case 'S': return pad(d.get('seconds'), 2);
case 'U': return pad(d.get('week'), 2);
case 'w': return d.get('day');
case 'x': return d.format(Date.getMsg('shortDate'));
case 'X': return d.format(Date.getMsg('shortTime'));
case 'y': return d.get('year').toString().substr(2);
case 'Y': return d.get('year');
case 'T': return d.get('GMTOffset');
case 'Z': return d.get('Timezone');
}
return $1;
}
);
},
toISOString: function(){
return this.format('iso8601');
}
});
Date.alias('toISOString', 'toJSON');
Date.alias('diff', 'compare');
Date.alias('format', 'strftime');
var formats = {
db: '%Y-%m-%d %H:%M:%S',
compact: '%Y%m%dT%H%M%S',
iso8601: '%Y-%m-%dT%H:%M:%S%T',
rfc822: '%a, %d %b %Y %H:%M:%S %Z',
'short': '%d %b %H:%M',
'long': '%B %d, %Y %H:%M'
};
var parsePatterns = [];
var nativeParse = Date.parse;
var parseWord = function(type, word, num){
var ret = -1;
var translated = Date.getMsg(type + 's');
switch ($type(word)){
case 'object':
ret = translated[word.get(type)];
break;
case 'number':
ret = translated[month - 1];
if (!ret) throw new Error('Invalid ' + type + ' index: ' + index);
break;
case 'string':
var match = translated.filter(function(name){
return this.test(name);
}, new RegExp('^' + word, 'i'));
if (!match.length)    throw new Error('Invalid ' + type + ' string');
if (match.length > 1) throw new Error('Ambiguous ' + type);
ret = match[0];
}
return (num) ? translated.indexOf(ret) : ret;
};
Date.extend({
getMsg: function(key, args) {
return MooTools.lang.get('Date', key, args);
},
units: {
ms: $lambda(1),
second: $lambda(1000),
minute: $lambda(60000),
hour: $lambda(3600000),
day: $lambda(86400000),
week: $lambda(608400000),
month: function(month, year){
var d = new Date;
return Date.daysInMonth($pick(month, d.get('mo')), $pick(year, d.get('year'))) * 86400000;
},
year: function(year){
year = year || new Date().get('year');
return Date.isLeapYear(year) ? 31622400000 : 31536000000;
}
},
daysInMonth: function(month, year){
return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
},
isLeapYear: function(year){
return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
},
parse: function(from){
var t = $type(from);
if (t == 'number') return new Date(from);
if (t != 'string') return from;
from = from.clean();
if (!from.length) return null;
var parsed;
parsePatterns.some(function(pattern){
var bits = pattern.re.exec(from);
return (bits) ? (parsed = pattern.handler(bits)) : false;
});
return parsed || new Date(nativeParse(from));
},
parseDay: function(day, num){
return parseWord('day', day, num);
},
parseMonth: function(month, num){
return parseWord('month', month, num);
},
parseUTC: function(value){
var localDate = new Date(value);
var utcSeconds = Date.UTC(
localDate.get('year'),
localDate.get('mo'),
localDate.get('date'),
localDate.get('hr'),
localDate.get('min'),
localDate.get('sec')
);
return new Date(utcSeconds);
},
orderIndex: function(unit){
return Date.getMsg('dateOrder').indexOf(unit) + 1;
},
defineFormat: function(name, format){
formats[name] = format;
},
defineFormats: function(formats){
for (var name in formats) Date.defineFormat(name, formats[name]);
},
parsePatterns: parsePatterns, // this is deprecated
defineParser: function(pattern){
parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
},
defineParsers: function(){
Array.flatten(arguments).each(Date.defineParser);
},
define2DigitYearStart: function(year){
startYear = year % 100;
startCentury = year - startYear;
}
});
var startCentury = 1900;
var startYear = 70;
var regexOf = function(type){
return new RegExp('(?:' + Date.getMsg(type).map(function(name){
return name.substr(0, 3);
}).join('|') + ')[a-z]*');
};
var replacers = function(key){
switch(key){
case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
return ((Date.orderIndex('month') == 1) ? '%m[.-/]%d' : '%d[.-/]%m') + '([.-/]%y)?';
case 'X':
return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%T?';
}
return null;
};
var keys = {
d: /[0-2]?[0-9]|3[01]/,
H: /[01]?[0-9]|2[0-3]/,
I: /0?[1-9]|1[0-2]/,
M: /[0-5]?\d/,
s: /\d+/,
o: /[a-z]*/,
p: /[ap]\.?m\.?/,
y: /\d{2}|\d{4}/,
Y: /\d{4}/,
T: /Z|[+-]\d{2}(?::?\d{2})?/
};
keys.m = keys.I;
keys.S = keys.M;
var currentLanguage;
var recompile = function(language){
currentLanguage = language;
keys.a = keys.A = regexOf('days');
keys.b = keys.B = regexOf('months');
parsePatterns.each(function(pattern, i){
if (pattern.format) parsePatterns[i] = build(pattern.format);
});
};
var build = function(format){
if (!currentLanguage) return {format: format};
var parsed = [];
var re = (format.source || format) // allow format to be regex
.replace(/%([a-z])/gi,
function($0, $1){
return replacers($1) || $0;
}
).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
.replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
.replace(/%([a-z%])/gi,
function($0, $1){
var p = keys[$1];
if (!p) return $1;
parsed.push($1);
return '(' + p.source + ')';
}
).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff]'); // handle unicode words
return {
format: format,
re: new RegExp('^' + re + '$', 'i'),
handler: function(bits){
bits = bits.slice(1).associate(parsed);
var date = new Date().clearTime();
if ('d' in bits) handle.call(date, 'd', 1);
if ('m' in bits) handle.call(date, 'm', 1);
for (var key in bits) handle.call(date, key, bits[key]);
return date;
}
};
};
var handle = function(key, value){
if (!value) return this;
switch(key){
case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
case 'd': return this.set('date', value);
case 'H': case 'I': return this.set('hr', value);
case 'm': return this.set('mo', value - 1);
case 'M': return this.set('min', value);
case 'p': return this.set('ampm', value.replace(/\./g, ''));
case 'S': return this.set('sec', value);
case 's': return this.set('ms', ('0.' + value) * 1000);
case 'w': return this.set('day', value);
case 'Y': return this.set('year', value);
case 'y':
value = +value;
if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
return this.set('year', value);
case 'T':
if (value == 'Z') value = '+00';
var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
return this.set('time', this - offset * 60000);
}
return this;
};
Date.defineParsers(
'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
'%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
'%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
'%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
'%Y %b( %d%o( %X)?)?', // Same as above with year coming first
'%o %b %d %X %T %Y' // "Thu Oct 22 08:11:23 +0000 2009"
);
MooTools.lang.addEvent('langChange', function(language){
if (MooTools.lang.get('Date')) recompile(language);
}).fireEvent('langChange', MooTools.lang.getCurrentLanguage());
})();
Date.implement({
timeDiffInWords: function(relative_to){
return Date.distanceOfTimeInWords(this, relative_to || new Date);
},
timeDiff: function(to, joiner){
if (to == null) to = new Date;
var delta = ((to - this) / 1000).toInt();
if (!delta) return '0s';
var durations = {s: 60, m: 60, h: 24, d: 365, y: 0};
var duration, vals = [];
for (var step in durations){
if (!delta) break;
if ((duration = durations[step])){
vals.unshift((delta % duration) + step);
delta = (delta / duration).toInt();
} else {
vals.unshift(delta + step);
}
}
return vals.join(joiner || ':');
}
});
Date.alias('timeDiffInWords', 'timeAgoInWords');
Date.extend({
distanceOfTimeInWords: function(from, to){
return Date.getTimePhrase(((to - from) / 1000).toInt());
},
getTimePhrase: function(delta){
var suffix = (delta < 0) ? 'Until' : 'Ago';
if (delta < 0) delta *= -1;
var units = {
minute: 60,
hour: 60,
day: 24,
week: 7,
month: 52 / 12,
year: 12,
eon: Infinity
};
var msg = 'lessThanMinute';
for (var unit in units){
var interval = units[unit];
if (delta < 1.5 * interval){
if (delta > 0.75 * interval) msg = unit;
break;
}
delta /= interval;
msg = unit + 's';
}
return Date.getMsg(msg + suffix).substitute({delta: delta.round()});
}
});
Date.defineParsers(
{
re: /^(?:tod|tom|yes)/i,
handler: function(bits){
var d = new Date().clearTime();
switch(bits[0]){
case 'tom': return d.increment();
case 'yes': return d.decrement();
default: 	return d;
}
}
},
{
re: /^(next|last) ([a-z]+)$/i,
handler: function(bits){
var d = new Date().clearTime();
var day = d.getDay();
var newDay = Date.parseDay(bits[2], true);
var addDays = newDay - day;
if (newDay <= day) addDays += 7;
if (bits[1] == 'last') addDays -= 7;
return d.set('date', d.getDate() + addDays);
}
}
);
Hash.implement({
getFromPath: function(notation){
var source = this.getClean();
notation.replace(/\[([^\]]+)\]|\.([^.[]+)|[^[.]+/g, function(match){
if (!source) return null;
var prop = arguments[2] || arguments[1] || arguments[0];
source = (prop in source) ? source[prop] : null;
return match;
});
return source;
},
cleanValues: function(method){
method = method || $defined;
this.each(function(v, k){
if (!method(v)) this.erase(k);
}, this);
return this;
},
run: function(){
var args = arguments;
this.each(function(v, k){
if ($type(v) == 'function') v.run(args);
});
}
});
(function(){
var special = ['À','à','Á','á','Â','â','Ã','ã','Ä','ä','Å','å','Ă','ă','Ą','ą','Ć','ć','Č','č','Ç','ç', 'Ď','ď','Đ','đ', 'È','è','É','é','Ê','ê','Ë','ë','Ě','ě','Ę','ę', 'Ğ','ğ','Ì','ì','Í','í','Î','î','Ï','ï', 'Ĺ','ĺ','Ľ','ľ','Ł','ł', 'Ñ','ñ','Ň','ň','Ń','ń','Ò','ò','Ó','ó','Ô','ô','Õ','õ','Ö','ö','Ø','ø','ő','Ř','ř','Ŕ','ŕ','Š','š','Ş','ş','Ś','ś', 'Ť','ť','Ť','ť','Ţ','ţ','Ù','ù','Ú','ú','Û','û','Ü','ü','Ů','ů', 'Ÿ','ÿ','ý','Ý','Ž','ž','Ź','ź','Ż','ż', 'Þ','þ','Ð','ð','ß','Œ','œ','Æ','æ','µ'];
var standard = ['A','a','A','a','A','a','A','a','Ae','ae','A','a','A','a','A','a','C','c','C','c','C','c','D','d','D','d', 'E','e','E','e','E','e','E','e','E','e','E','e','G','g','I','i','I','i','I','i','I','i','L','l','L','l','L','l', 'N','n','N','n','N','n', 'O','o','O','o','O','o','O','o','Oe','oe','O','o','o', 'R','r','R','r', 'S','s','S','s','S','s','T','t','T','t','T','t', 'U','u','U','u','U','u','Ue','ue','U','u','Y','y','Y','y','Z','z','Z','z','Z','z','TH','th','DH','dh','ss','OE','oe','AE','ae','u'];
var tidymap = {
"[\xa0\u2002\u2003\u2009]": " ",
"\xb7": "*",
"[\u2018\u2019]": "'",
"[\u201c\u201d]": '"',
"\u2026": "...",
"\u2013": "-",
"\u2014": "--",
"\uFFFD": "&raquo;"
};
var getRegForTag = function(tag, contents) {
tag = tag || '';
var regstr = contents ? "<" + tag + "[^>]*>([\\s\\S]*?)<\/" + tag + ">" : "<\/?" + tag + "([^>]+)?>";
reg = new RegExp(regstr, "gi");
return reg;
};
String.implement({
standardize: function(){
var text = this;
special.each(function(ch, i){
text = text.replace(new RegExp(ch, 'g'), standard[i]);
});
return text;
},
repeat: function(times){
return new Array(times + 1).join(this);
},
pad: function(length, str, dir){
if (this.length >= length) return this;
var pad = (str == null ? ' ' : '' + str).repeat(length - this.length).substr(0, length - this.length);
if (!dir || dir == 'right') return this + pad;
if (dir == 'left') return pad + this;
return pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0, (pad.length / 2).ceil());
},
getTags: function(tag, contents){
return this.match(getRegForTag(tag, contents)) || [];
},
stripTags: function(tag, contents){
return this.replace(getRegForTag(tag, contents), '');
},
tidy: function(){
var txt = this.toString();
$each(tidymap, function(value, key){
txt = txt.replace(new RegExp(key, 'g'), value);
});
return txt;
}
});
})();
String.implement({
parseQueryString: function(){
var vars = this.split(/[&;]/), res = {};
if (vars.length) vars.each(function(val){
var index = val.indexOf('='),
keys = index < 0 ? [''] : val.substr(0, index).match(/[^\]\[]+/g),
value = decodeURIComponent(val.substr(index + 1)),
obj = res;
keys.each(function(key, i){
var current = obj[key];
if(i < keys.length - 1)
obj = obj[key] = current || {};
else if($type(current) == 'array')
current.push(value);
else
obj[key] = $defined(current) ? [current, value] : value;
});
});
return res;
},
cleanQueryString: function(method){
return this.split('&').filter(function(val){
var index = val.indexOf('='),
key = index < 0 ? '' : val.substr(0, index),
value = val.substr(index + 1);
return method ? method.run([key, value]) : $chk(value);
}).join('&');
}
});
var URI = new Class({
Implements: Options,
options: {
},
regex: /^(?:(\w+):)?(?:\/\/(?:(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
parts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'],
schemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0},
initialize: function(uri, options){
this.setOptions(options);
var base = this.options.base || URI.base;
if(!uri) uri = base;
if (uri && uri.parsed) this.parsed = $unlink(uri.parsed);
else this.set('value', uri.href || uri.toString(), base ? new URI(base) : false);
},
parse: function(value, base){
var bits = value.match(this.regex);
if (!bits) return false;
bits.shift();
return this.merge(bits.associate(this.parts), base);
},
merge: function(bits, base){
if ((!bits || !bits.scheme) && (!base || !base.scheme)) return false;
if (base){
this.parts.every(function(part){
if (bits[part]) return false;
bits[part] = base[part] || '';
return true;
});
}
bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];
bits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/';
return bits;
},
parseDirectory: function(directory, baseDirectory) {
directory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory;
if (!directory.test(URI.regs.directoryDot)) return directory;
var result = [];
directory.replace(URI.regs.endSlash, '').split('/').each(function(dir){
if (dir == '..' && result.length > 0) result.pop();
else if (dir != '.') result.push(dir);
});
return result.join('/') + '/';
},
combine: function(bits){
return bits.value || bits.scheme + '://' +
(bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') +
(bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') +
(bits.directory || '/') + (bits.file || '') +
(bits.query ? '?' + bits.query : '') +
(bits.fragment ? '#' + bits.fragment : '');
},
set: function(part, value, base){
if (part == 'value'){
var scheme = value.match(URI.regs.scheme);
if (scheme) scheme = scheme[1];
if (scheme && !$defined(this.schemes[scheme.toLowerCase()])) this.parsed = { scheme: scheme, value: value };
else this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value });
} else if (part == 'data') {
this.setData(value);
} else {
this.parsed[part] = value;
}
return this;
},
get: function(part, base){
switch(part){
case 'value': return this.combine(this.parsed, base ? base.parsed : false);
case 'data' : return this.getData();
}
return this.parsed[part] || '';
},
go: function(){
document.location.href = this.toString();
},
toURI: function(){
return this;
},
getData: function(key, part){
var qs = this.get(part || 'query');
if (!$chk(qs)) return key ? null : {};
var obj = qs.parseQueryString();
return key ? obj[key] : obj;
},
setData: function(values, merge, part){
if (typeof values == 'string'){
values = this.getData();
values[arguments[0]] = arguments[1];
} else if (merge) {
values = $merge(this.getData(), values);
}
return this.set(part || 'query', Hash.toQueryString(values));
},
clearData: function(part){
return this.set(part || 'query', '');
}
});
URI.prototype.toString = URI.prototype.valueOf = function(){
return this.get('value');
};
URI.regs = {
endSlash: /\/$/,
scheme: /^(\w+):/,
directoryDot: /\.\/|\.$/
};
URI.base = new URI(document.getElements('base[href]', true).getLast(), {base: document.location});
String.implement({
toURI: function(options){
return new URI(this, options);
}
});
URI = Class.refactor(URI, {
combine: function(bits, base){
if (!base || bits.scheme != base.scheme || bits.host != base.host || bits.port != base.port)
return this.previous.apply(this, arguments);
var end = bits.file + (bits.query ? '?' + bits.query : '') + (bits.fragment ? '#' + bits.fragment : '');
if (!base.directory) return (bits.directory || (bits.file ? '' : './')) + end;
var baseDir = base.directory.split('/'),
relDir = bits.directory.split('/'),
path = '',
offset;
var i = 0;
for(offset = 0; offset < baseDir.length && offset < relDir.length && baseDir[offset] == relDir[offset]; offset++);
for(i = 0; i < baseDir.length - offset - 1; i++) path += '../';
for(i = offset; i < relDir.length - 1; i++) path += relDir[i] + '/';
return (path || (bits.file ? '' : './')) + end;
},
toAbsolute: function(base){
base = new URI(base);
if (base) base.set('directory', '').set('file', '');
return this.toRelative(base);
},
toRelative: function(base){
return this.get('value', new URI(base));
}
});
Element.implement({
tidy: function(){
this.set('value', this.get('value').tidy());
},
getTextInRange: function(start, end){
return this.get('value').substring(start, end);
},
getSelectedText: function(){
if (this.setSelectionRange) return this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd());
return document.selection.createRange().text;
},
getSelectedRange: function() {
if ($defined(this.selectionStart)) return {start: this.selectionStart, end: this.selectionEnd};
var pos = {start: 0, end: 0};
var range = this.getDocument().selection.createRange();
if (!range || range.parentElement() != this) return pos;
var dup = range.duplicate();
if (this.type == 'text') {
pos.start = 0 - dup.moveStart('character', -100000);
pos.end = pos.start + range.text.length;
} else {
var value = this.get('value');
var offset = value.length;
dup.moveToElementText(this);
dup.setEndPoint('StartToEnd', range);
if(dup.text.length) offset -= value.match(/[\n\r]*$/)[0].length;
pos.end = offset - dup.text.length;
dup.setEndPoint('StartToStart', range);
pos.start = offset - dup.text.length;
}
return pos;
},
getSelectionStart: function(){
return this.getSelectedRange().start;
},
getSelectionEnd: function(){
return this.getSelectedRange().end;
},
setCaretPosition: function(pos){
if (pos == 'end') pos = this.get('value').length;
this.selectRange(pos, pos);
return this;
},
getCaretPosition: function(){
return this.getSelectedRange().start;
},
selectRange: function(start, end){
if (this.setSelectionRange) {
this.focus();
this.setSelectionRange(start, end);
} else {
var value = this.get('value');
var diff = value.substr(start, end - start).replace(/\r/g, '').length;
start = value.substr(0, start).replace(/\r/g, '').length;
var range = this.createTextRange();
range.collapse(true);
range.moveEnd('character', start + diff);
range.moveStart('character', start);
range.select();
}
return this;
},
insertAtCursor: function(value, select){
var pos = this.getSelectedRange();
var text = this.get('value');
this.set('value', text.substring(0, pos.start) + value + text.substring(pos.end, text.length));
if ($pick(select, true)) this.selectRange(pos.start, pos.start + value.length);
else this.setCaretPosition(pos.start + value.length);
return this;
},
insertAroundCursor: function(options, select){
options = $extend({
before: '',
defaultMiddle: '',
after: ''
}, options);
var value = this.getSelectedText() || options.defaultMiddle;
var pos = this.getSelectedRange();
var text = this.get('value');
if (pos.start == pos.end){
this.set('value', text.substring(0, pos.start) + options.before + value + options.after + text.substring(pos.end, text.length));
this.selectRange(pos.start + options.before.length, pos.end + options.before.length + value.length);
} else {
var current = text.substring(pos.start, pos.end);
this.set('value', text.substring(0, pos.start) + options.before + current + options.after + text.substring(pos.end, text.length));
var selStart = pos.start + options.before.length;
if ($pick(select, true)) this.selectRange(selStart, selStart + current.length);
else this.setCaretPosition(selStart + text.length);
}
return this;
}
});
Elements.from = function(text, excludeScripts){
if ($pick(excludeScripts, true)) text = text.stripScripts();
var container, match = text.match(/^\s*<(t[dhr]|tbody|tfoot|thead)/i);
if (match){
container = new Element('table');
var tag = match[1].toLowerCase();
if (['td', 'th', 'tr'].contains(tag)){
container = new Element('tbody').inject(container);
if (tag != 'tr') container = new Element('tr').inject(container);
}
}
return (container || new Element('div')).set('html', text).getChildren();
};
(function(){
var match = /(.*?):relay\(([^)]+)\)$/,
combinators = /[+>~\s]/,
splitType = function(type){
var bits = type.match(match);
return !bits ? {event: type} : {
event: bits[1],
selector: bits[2]
};
},
check = function(e, selector){
var t = e.target;
if (combinators.test(selector = selector.trim())){
var els = this.getElements(selector);
for (var i = els.length; i--; ){
var el = els[i];
if (t == el || el.hasChild(t)) return el;
}
} else {
for ( ; t && t != this; t = t.parentNode){
if (Element.match(t, selector)) return document.id(t);
}
}
return null;
};
var oldAddEvent = Element.prototype.addEvent,
oldRemoveEvent = Element.prototype.removeEvent;
Element.implement({
addEvent: function(type, fn){
var splitted = splitType(type);
if (splitted.selector){
var monitors = this.retrieve('$moo:delegateMonitors', {});
if (!monitors[type]){
var monitor = function(e){
var el = check.call(this, e, splitted.selector);
if (el) this.fireEvent(type, [e, el], 0, el);
}.bind(this);
monitors[type] = monitor;
oldAddEvent.call(this, splitted.event, monitor);
}
}
return oldAddEvent.apply(this, arguments);
},
removeEvent: function(type, fn){
var splitted = splitType(type);
if (splitted.selector){
var events = this.retrieve('events');
if (!events || !events[type] || (fn && !events[type].keys.contains(fn))) return this;
if (fn) oldRemoveEvent.apply(this, [type, fn]);
else oldRemoveEvent.apply(this, type);
events = this.retrieve('events');
if (events && events[type] && events[type].length == 0){
var monitors = this.retrieve('$moo:delegateMonitors', {});
oldRemoveEvent.apply(this, [splitted.event, monitors[type]]);
delete monitors[type];
}
return this;
}
return oldRemoveEvent.apply(this, arguments);
},
fireEvent: function(type, args, delay, bind){
var events = this.retrieve('events');
if (!events || !events[type]) return this;
events[type].keys.each(function(fn){
fn.create({bind: bind || this, delay: delay, arguments: args})();
}, this);
return this;
}
});
})();
Element.implement({
measure: function(fn){
var vis = function(el) {
return !!(!el || el.offsetHeight || el.offsetWidth);
};
if (vis(this)) return fn.apply(this);
var parent = this.getParent(),
restorers = [],
toMeasure = [];
while (!vis(parent) && parent != document.body) {
toMeasure.push(parent.expose());
parent = parent.getParent();
}
var restore = this.expose();
var result = fn.apply(this);
restore();
toMeasure.each(function(restore){
restore();
});
return result;
},
expose: function(){
if (this.getStyle('display') != 'none') return $empty;
var before = this.style.cssText;
this.setStyles({
display: 'block',
position: 'absolute',
visibility: 'hidden'
});
return function(){
this.style.cssText = before;
}.bind(this);
},
getDimensions: function(options){
options = $merge({computeSize: false},options);
var dim = {};
var getSize = function(el, options){
return (options.computeSize)?el.getComputedSize(options):el.getSize();
};
var parent = this.getParent('body');
if (parent && this.getStyle('display') == 'none'){
dim = this.measure(function(){
return getSize(this, options);
});
} else if (parent){
try { //safari sometimes crashes here, so catch it
dim = getSize(this, options);
}catch(e){}
} else {
dim = {x: 0, y: 0};
}
return $chk(dim.x) ? $extend(dim, {width: dim.x, height: dim.y}) : $extend(dim, {x: dim.width, y: dim.height});
},
getComputedSize: function(options){
options = $merge({
styles: ['padding','border'],
plains: {
height: ['top','bottom'],
width: ['left','right']
},
mode: 'both'
}, options);
var size = {width: 0,height: 0};
switch (options.mode){
case 'vertical':
delete size.width;
delete options.plains.width;
break;
case 'horizontal':
delete size.height;
delete options.plains.height;
break;
}
var getStyles = [];
$each(options.plains, function(plain, key){
plain.each(function(edge){
options.styles.each(function(style){
getStyles.push((style == 'border') ? style + '-' + edge + '-' + 'width' : style + '-' + edge);
});
});
});
var styles = {};
getStyles.each(function(style){ styles[style] = this.getComputedStyle(style); }, this);
var subtracted = [];
$each(options.plains, function(plain, key){ //keys: width, height, plains: ['left', 'right'], ['top','bottom']
var capitalized = key.capitalize();
size['total' + capitalized] = size['computed' + capitalized] = 0;
plain.each(function(edge){ //top, left, right, bottom
size['computed' + edge.capitalize()] = 0;
getStyles.each(function(style, i){ //padding, border, etc.
if (style.test(edge)){
styles[style] = styles[style].toInt() || 0; //styles['padding-left'] = 5;
size['total' + capitalized] = size['total' + capitalized] + styles[style];
size['computed' + edge.capitalize()] = size['computed' + edge.capitalize()] + styles[style];
}
if (style.test(edge) && key != style &&
(style.test('border') || style.test('padding')) && !subtracted.contains(style)){
subtracted.push(style);
size['computed' + capitalized] = size['computed' + capitalized]-styles[style];
}
});
});
});
['Width', 'Height'].each(function(value){
var lower = value.toLowerCase();
if(!$chk(size[lower])) return;
size[lower] = size[lower] + this['offset' + value] + size['computed' + value];
size['total' + value] = size[lower] + size['total' + value];
delete size['computed' + value];
}, this);
return $extend(styles, size);
}
});
(function(){
var supportsPositionFixed = false;
window.addEvent('domready', function(){
var test = new Element('div').setStyles({
position: 'fixed',
top: 0,
right: 0
}).inject(document.body);
supportsPositionFixed = (test.offsetTop === 0);
test.dispose();
});
Element.implement({
pin: function(enable){
if (this.getStyle('display') == 'none') return null;
var p,
scroll = window.getScroll();
if (enable !== false){
p = this.getPosition();
if (!this.retrieve('pinned')){
var pos = {
top: p.y - scroll.y,
left: p.x - scroll.x
};
if (supportsPositionFixed){
this.setStyle('position', 'fixed').setStyles(pos);
} else {
this.store('pinnedByJS', true);
this.setStyles({
position: 'absolute',
top: p.y,
left: p.x
}).addClass('isPinned');
this.store('scrollFixer', (function(){
if (this.retrieve('pinned'))
var scroll = window.getScroll();
this.setStyles({
top: pos.top.toInt() + scroll.y,
left: pos.left.toInt() + scroll.x
});
}).bind(this));
window.addEvent('scroll', this.retrieve('scrollFixer'));
}
this.store('pinned', true);
}
} else {
var op;
if (!Browser.Engine.trident){
var parent = this.getParent();
op = (parent.getComputedStyle('position') != 'static' ? parent : parent.getOffsetParent());
}
p = this.getPosition(op);
this.store('pinned', false);
var reposition;
if (supportsPositionFixed && !this.retrieve('pinnedByJS')){
reposition = {
top: p.y + scroll.y,
left: p.x + scroll.x
};
} else {
this.store('pinnedByJS', false);
window.removeEvent('scroll', this.retrieve('scrollFixer'));
reposition = {
top: p.y,
left: p.x
};
}
this.setStyles($merge(reposition, {position: 'absolute'})).removeClass('isPinned');
}
return this;
},
unpin: function(){
return this.pin(false);
},
togglepin: function(){
this.pin(!this.retrieve('pinned'));
}
});
})();
(function(){
var original = Element.prototype.position;
Element.implement({
position: function(options){
if (options && ($defined(options.x) || $defined(options.y))) return original ? original.apply(this, arguments) : this;
$each(options||{}, function(v, k){ if (!$defined(v)) delete options[k]; });
options = $merge({
relativeTo: document.body,
position: {
x: 'center', //left, center, right
y: 'center' //top, center, bottom
},
edge: false,
offset: {x: 0, y: 0},
returnPos: false,
relFixedPosition: false,
ignoreMargins: false,
ignoreScroll: false,
allowNegative: false
}, options);
var parentOffset = {x: 0, y: 0},
parentPositioned = false;
var offsetParent = this.measure(function(){
return document.id(this.getOffsetParent());
});
if (offsetParent && offsetParent != this.getDocument().body){
parentOffset = offsetParent.measure(function(){
return this.getPosition();
});
parentPositioned = offsetParent != document.id(options.relativeTo);
options.offset.x = options.offset.x - parentOffset.x;
options.offset.y = options.offset.y - parentOffset.y;
}
var fixValue = function(option){
if ($type(option) != 'string') return option;
option = option.toLowerCase();
var val = {};
if (option.test('left')) val.x = 'left';
else if (option.test('right')) val.x = 'right';
else val.x = 'center';
if (option.test('upper') || option.test('top')) val.y = 'top';
else if (option.test('bottom')) val.y = 'bottom';
else val.y = 'center';
return val;
};
options.edge = fixValue(options.edge);
options.position = fixValue(options.position);
if (!options.edge){
if (options.position.x == 'center' && options.position.y == 'center') options.edge = {x:'center', y:'center'};
else options.edge = {x:'left', y:'top'};
}
this.setStyle('position', 'absolute');
var rel = document.id(options.relativeTo) || document.body,
calc = rel == document.body ? window.getScroll() : rel.getPosition(),
top = calc.y, left = calc.x;
var scrolls = rel.getScrolls();
top += scrolls.y;
left += scrolls.x;
var dim = this.getDimensions({computeSize: true, styles:['padding', 'border','margin']});
var pos = {},
prefY = options.offset.y,
prefX = options.offset.x,
winSize = window.getSize();
switch(options.position.x){
case 'left':
pos.x = left + prefX;
break;
case 'right':
pos.x = left + prefX + rel.offsetWidth;
break;
default: //center
pos.x = left + ((rel == document.body ? winSize.x : rel.offsetWidth)/2) + prefX;
break;
}
switch(options.position.y){
case 'top':
pos.y = top + prefY;
break;
case 'bottom':
pos.y = top + prefY + rel.offsetHeight;
break;
default: //center
pos.y = top + ((rel == document.body ? winSize.y : rel.offsetHeight)/2) + prefY;
break;
}
if (options.edge){
var edgeOffset = {};
switch(options.edge.x){
case 'left':
edgeOffset.x = 0;
break;
case 'right':
edgeOffset.x = -dim.x-dim.computedRight-dim.computedLeft;
break;
default: //center
edgeOffset.x = -(dim.totalWidth/2);
break;
}
switch(options.edge.y){
case 'top':
edgeOffset.y = 0;
break;
case 'bottom':
edgeOffset.y = -dim.y-dim.computedTop-dim.computedBottom;
break;
default: //center
edgeOffset.y = -(dim.totalHeight/2);
break;
}
pos.x += edgeOffset.x;
pos.y += edgeOffset.y;
}
pos = {
left: ((pos.x >= 0 || parentPositioned || options.allowNegative) ? pos.x : 0).toInt(),
top: ((pos.y >= 0 || parentPositioned || options.allowNegative) ? pos.y : 0).toInt()
};
var xy = {left: 'x', top: 'y'};
['minimum', 'maximum'].each(function(minmax) {
['left', 'top'].each(function(lr) {
var val = options[minmax] ? options[minmax][xy[lr]] : null;
if (val != null && pos[lr] < val) pos[lr] = val;
});
});
if (rel.getStyle('position') == 'fixed' || options.relFixedPosition){
var winScroll = window.getScroll();
pos.top+= winScroll.y;
pos.left+= winScroll.x;
}
if (options.ignoreScroll) {
var relScroll = rel.getScroll();
pos.top-= relScroll.y;
pos.left-= relScroll.x;
}
if (options.ignoreMargins) {
pos.left += (
options.edge.x == 'right' ? dim['margin-right'] :
options.edge.x == 'center' ? -dim['margin-left'] + ((dim['margin-right'] + dim['margin-left'])/2) :
- dim['margin-left']
);
pos.top += (
options.edge.y == 'bottom' ? dim['margin-bottom'] :
options.edge.y == 'center' ? -dim['margin-top'] + ((dim['margin-bottom'] + dim['margin-top'])/2) :
- dim['margin-top']
);
}
pos.left = Math.ceil(pos.left);
pos.top = Math.ceil(pos.top);
if (options.returnPos) return pos;
else this.setStyles(pos);
return this;
}
});
})();
Element.implement({
isDisplayed: function(){
return this.getStyle('display') != 'none';
},
isVisible: function(){
var w = this.offsetWidth,
h = this.offsetHeight;
return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.isDisplayed();
},
toggle: function(){
return this[this.isDisplayed() ? 'hide' : 'show']();
},
hide: function(){
var d;
try {
if ((d = this.getStyle('display')) == 'none') d = null;
} catch(e){}
return this.store('originalDisplay', d || 'block').setStyle('display', 'none');
},
show: function(display){
return this.setStyle('display', display || this.retrieve('originalDisplay') || 'block');
},
swapClass: function(remove, add){
return this.removeClass(remove).addClass(add);
}
});
if (!window.Form) window.Form = {};
(function(){
Form.Request = new Class({
Binds: ['onSubmit', 'onFormValidate'],
Implements: [Options, Events, Class.Occlude],
options: {
requestOptions: {
evalScripts: true,
useSpinner: true,
emulation: false,
link: 'ignore'
},
extraData: {},
resetForm: true
},
property: 'form.request',
initialize: function(form, update, options) {
this.element = document.id(form);
if (this.occlude()) return this.occluded;
this.update = document.id(update);
this.setOptions(options);
this.makeRequest();
if (this.options.resetForm) {
this.request.addEvent('success', function(){
$try(function(){ this.element.reset(); }.bind(this));
if (window.OverText) OverText.update();
}.bind(this));
}
this.attach();
},
toElement: function() {
return this.element;
},
makeRequest: function(){
this.request = new Request.HTML($merge({
url: this.element.get('action'),
update: this.update,
emulation: false,
spinnerTarget: this.element,
method: this.element.get('method') || 'post'
}, this.options.requestOptions)).addEvents({
success: function(text, xml){
['success', 'complete'].each(function(evt){
this.fireEvent(evt, [this.update, text, xml]);
}, this);
}.bind(this),
failure: function(xhr){
this.fireEvent('failure', xhr);
}.bind(this),
exception: function(){
this.fireEvent('failure', xhr);
}.bind(this)
});
},
attach: function(attach){
attach = $pick(attach, true);
method = attach ? 'addEvent' : 'removeEvent';
var fv = this.element.retrieve('validator');
if (fv) fv[method]('onFormValidate', this.onFormValidate);
if (!fv || !attach) this.element[method]('submit', this.onSubmit);
},
detach: function(){
this.attach(false);
},
enable: function(){
this.attach();
},
disable: function(){
this.detach();
},
onFormValidate: function(valid, form, e) {
if (valid || !fv.options.stopOnFailure) {
if (e && e.stop) e.stop();
this.send();
}
},
onSubmit: function(e){
if (this.element.retrieve('validator')) {
this.detach();
this.addFormEvent();
return;
}
e.stop();
this.send();
},
send: function(){
var str = this.element.toQueryString().trim();
var data = $H(this.options.extraData).toQueryString();
if (str) str += "&" + data;
else str = data;
this.fireEvent('send', [this.element, str]);
this.request.send({data: str});
return this;
}
});
Element.Properties.formRequest = {
set: function(){
var opt = Array.link(arguments, {options: Object.type, update: Element.type, updateId: String.type});
var update = opt.update || opt.updateId;
var updater = this.retrieve('form.request');
if (update) {
if (updater) updater.update = document.id(update);
this.store('form.request:update', update);
}
if (opt.options) {
if (updater) updater.setOptions(opt.options);
this.store('form.request:options', opt.options);
}
return this;
},
get: function(){
var opt = Array.link(arguments, {options: Object.type, update: Element.type, updateId: String.type});
var update = opt.update || opt.updateId;
if (opt.options || update || !this.retrieve('form.request')){
if (opt.options || !this.retrieve('form.request:options')) this.set('form.request', opt.options);
if (update) this.set('form.request', update);
this.store('form.request', new Form.Request(this, this.retrieve('form.request:update'), this.retrieve('form.request:options')));
}
return this.retrieve('form.request');
}
};
Element.implement({
formUpdate: function(update, options){
this.get('form.request', update, options).send();
return this;
}
});
})();
Form.Request.Append = new Class({
Extends: Form.Request,
options: {
useReveal: true,
revealOptions: {},
inject: 'bottom'
},
makeRequest: function(){
this.request = new Request.HTML($merge({
url: this.element.get('action'),
method: this.element.get('method') || 'post',
spinnerTarget: this.element
}, this.options.requestOptions, {
evalScripts: false
})
).addEvents({
success: function(tree, elements, html, javascript){
var container;
var kids = Elements.from(html);
if (kids.length == 1) {
container = kids[0];
} else {
container = new Element('div', {
styles: {
display: 'none'
}
}).adopt(kids);
}
container.inject(this.update, this.options.inject);
if (this.options.requestOptions.evalScripts) $exec(javascript);
this.fireEvent('beforeEffect', container);
var finish = function(){
this.fireEvent('success', [container, this.update, tree, elements, html, javascript]);
}.bind(this);
if (this.options.useReveal) {
container.get('reveal', this.options.revealOptions).chain(finish);
container.reveal();
} else {
finish();
}
}.bind(this),
failure: function(xhr){
this.fireEvent('failure', xhr);
}.bind(this)
});
}
});
if (!window.Form) window.Form = {};
var InputValidator = new Class({
Implements: [Options],
options: {
errorMsg: 'Validation failed.',
test: function(field){return true;}
},
initialize: function(className, options){
this.setOptions(options);
this.className = className;
},
test: function(field, props){
if (document.id(field)) return this.options.test(document.id(field), props||this.getProps(field));
else return false;
},
getError: function(field, props){
var err = this.options.errorMsg;
if ($type(err) == 'function') err = err(document.id(field), props||this.getProps(field));
return err;
},
getProps: function(field){
if (!document.id(field)) return {};
return field.get('validatorProps');
}
});
Element.Properties.validatorProps = {
set: function(props){
return this.eliminate('validatorProps').store('validatorProps', props);
},
get: function(props){
if (props) this.set(props);
if (this.retrieve('validatorProps')) return this.retrieve('validatorProps');
if (this.getProperty('validatorProps')){
try {
this.store('validatorProps', JSON.decode(this.getProperty('validatorProps')));
}catch(e){
return {};
}
} else {
var vals = this.get('class').split(' ').filter(function(cls){
return cls.test(':');
});
if (!vals.length){
this.store('validatorProps', {});
} else {
props = {};
vals.each(function(cls){
var split = cls.split(':');
if (split[1]) {
try {
props[split[0]] = JSON.decode(split[1]);
} catch(e) {}
}
});
this.store('validatorProps', props);
}
}
return this.retrieve('validatorProps');
}
};
Form.Validator = new Class({
Implements:[Options, Events],
Binds: ['onSubmit'],
options: {/*
onFormValidate: $empty(isValid, form, event),
onElementValidate: $empty(isValid, field, className, warn),
onElementPass: $empty(field),
onElementFail: $empty(field, validatorsFailed) */
fieldSelectors: 'input, select, textarea',
ignoreHidden: true,
ignoreDisabled: true,
useTitles: false,
evaluateOnSubmit: true,
evaluateFieldsOnBlur: true,
evaluateFieldsOnChange: true,
serial: true,
stopOnFailure: true,
warningPrefix: function(){
return Form.Validator.getMsg('warningPrefix') || 'Warning: ';
},
errorPrefix: function(){
return Form.Validator.getMsg('errorPrefix') || 'Error: ';
}
},
initialize: function(form, options){
this.setOptions(options);
this.element = document.id(form);
this.element.store('validator', this);
this.warningPrefix = $lambda(this.options.warningPrefix)();
this.errorPrefix = $lambda(this.options.errorPrefix)();
if (this.options.evaluateOnSubmit) this.element.addEvent('submit', this.onSubmit);
if (this.options.evaluateFieldsOnBlur || this.options.evaluateFieldsOnChange) this.watchFields(this.getFields());
},
toElement: function(){
return this.element;
},
getFields: function(){
return (this.fields = this.element.getElements(this.options.fieldSelectors));
},
watchFields: function(fields){
fields.each(function(el){
if (this.options.evaluateFieldsOnBlur)
el.addEvent('blur', this.validationMonitor.pass([el, false], this));
if (this.options.evaluateFieldsOnChange)
el.addEvent('change', this.validationMonitor.pass([el, true], this));
}, this);
},
validationMonitor: function(){
$clear(this.timer);
this.timer = this.validateField.delay(50, this, arguments);
},
onSubmit: function(event){
if (!this.validate(event) && event) event.preventDefault();
else this.reset();
},
reset: function(){
this.getFields().each(this.resetField, this);
return this;
},
validate: function(event){
var result = this.getFields().map(function(field){
return this.validateField(field, true);
}, this).every(function(v){ return v;});
this.fireEvent('formValidate', [result, this.element, event]);
if (this.options.stopOnFailure && !result && event) event.preventDefault();
return result;
},
validateField: function(field, force){
if (this.paused) return true;
field = document.id(field);
var passed = !field.hasClass('validation-failed');
var failed, warned;
if (this.options.serial && !force){
failed = this.element.getElement('.validation-failed');
warned = this.element.getElement('.warning');
}
if (field && (!failed || force || field.hasClass('validation-failed') || (failed && !this.options.serial))){
var validators = field.className.split(' ').some(function(cn){
return this.getValidator(cn);
}, this);
var validatorsFailed = [];
field.className.split(' ').each(function(className){
if (className && !this.test(className, field)) validatorsFailed.include(className);
}, this);
passed = validatorsFailed.length === 0;
if (validators && !field.hasClass('warnOnly')){
if (passed){
field.addClass('validation-passed').removeClass('validation-failed');
this.fireEvent('elementPass', field);
} else {
field.addClass('validation-failed').removeClass('validation-passed');
this.fireEvent('elementFail', [field, validatorsFailed]);
}
}
if (!warned){
var warnings = field.className.split(' ').some(function(cn){
if (cn.test('^warn-') || field.hasClass('warnOnly'))
return this.getValidator(cn.replace(/^warn-/,''));
else return null;
}, this);
field.removeClass('warning');
var warnResult = field.className.split(' ').map(function(cn){
if (cn.test('^warn-') || field.hasClass('warnOnly'))
return this.test(cn.replace(/^warn-/,''), field, true);
else return null;
}, this);
}
}
return passed;
},
test: function(className, field, warn){
field = document.id(field);
if((this.options.ignoreHidden && !field.isVisible()) || (this.options.ignoreDisabled && field.get('disabled'))) return true;
var validator = this.getValidator(className);
if (field.hasClass('ignoreValidation')) return true;
warn = $pick(warn, false);
if (field.hasClass('warnOnly')) warn = true;
var isValid = validator ? validator.test(field) : true;
if (validator && field.isVisible()) this.fireEvent('elementValidate', [isValid, field, className, warn]);
if (warn) return true;
return isValid;
},
resetField: function(field){
field = document.id(field);
if (field){
field.className.split(' ').each(function(className){
if (className.test('^warn-')) className = className.replace(/^warn-/, '');
field.removeClass('validation-failed');
field.removeClass('warning');
field.removeClass('validation-passed');
}, this);
}
return this;
},
stop: function(){
this.paused = true;
return this;
},
start: function(){
this.paused = false;
return this;
},
ignoreField: function(field, warn){
field = document.id(field);
if (field){
this.enforceField(field);
if (warn) field.addClass('warnOnly');
else field.addClass('ignoreValidation');
}
return this;
},
enforceField: function(field){
field = document.id(field);
if (field) field.removeClass('warnOnly').removeClass('ignoreValidation');
return this;
}
});
Form.Validator.getMsg = function(key){
return MooTools.lang.get('Form.Validator', key);
};
Form.Validator.adders = {
validators:{},
add : function(className, options){
this.validators[className] = new InputValidator(className, options);
if (!this.initialize){
this.implement({
validators: this.validators
});
}
},
addAllThese : function(validators){
$A(validators).each(function(validator){
this.add(validator[0], validator[1]);
}, this);
},
getValidator: function(className){
return this.validators[className.split(':')[0]];
}
};
$extend(Form.Validator, Form.Validator.adders);
Form.Validator.implement(Form.Validator.adders);
Form.Validator.add('IsEmpty', {
errorMsg: false,
test: function(element){
if (element.type == 'select-one' || element.type == 'select')
return !(element.selectedIndex >= 0 && element.options[element.selectedIndex].value != '');
else
return ((element.get('value') == null) || (element.get('value').length == 0));
}
});
Form.Validator.addAllThese([
['required', {
errorMsg: function(){
return Form.Validator.getMsg('required');
},
test: function(element){
return !Form.Validator.getValidator('IsEmpty').test(element);
}
}],
['minLength', {
errorMsg: function(element, props){
if ($type(props.minLength))
return Form.Validator.getMsg('minLength').substitute({minLength:props.minLength,length:element.get('value').length });
else return '';
},
test: function(element, props){
if ($type(props.minLength)) return (element.get('value').length >= $pick(props.minLength, 0));
else return true;
}
}],
['maxLength', {
errorMsg: function(element, props){
if ($type(props.maxLength))
return Form.Validator.getMsg('maxLength').substitute({maxLength:props.maxLength,length:element.get('value').length });
else return '';
},
test: function(element, props){
return (element.get('value').length <= $pick(props.maxLength, 10000));
}
}],
['validate-integer', {
errorMsg: Form.Validator.getMsg.pass('integer'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) || (/^(-?[1-9]\d*|0)$/).test(element.get('value'));
}
}],
['validate-numeric', {
errorMsg: Form.Validator.getMsg.pass('numeric'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) ||
(/^-?(?:0$0(?=\d*\.)|[1-9]|0)\d*(\.\d+)?$/).test(element.get('value'));
}
}],
['validate-digits', {
errorMsg: Form.Validator.getMsg.pass('digits'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) || (/^[\d() .:\-\+#]+$/.test(element.get('value')));
}
}],
['validate-alpha', {
errorMsg: Form.Validator.getMsg.pass('alpha'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) ||  (/^[a-zA-Z]+$/).test(element.get('value'));
}
}],
['validate-alphanum', {
errorMsg: Form.Validator.getMsg.pass('alphanum'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) || !(/\W/).test(element.get('value'));
}
}],
['validate-date', {
errorMsg: function(element, props){
if (Date.parse){
var format = props.dateFormat || '%x';
return Form.Validator.getMsg('dateSuchAs').substitute({date: new Date().format(format)});
} else {
return Form.Validator.getMsg('dateInFormatMDY');
}
},
test: function(element, props){
if (Form.Validator.getValidator('IsEmpty').test(element)) return true;
var d;
if (Date.parse){
var format = props.dateFormat || '%x';
d = Date.parse(element.get('value'));
var formatted = d.format(format);
if (formatted != 'invalid date') element.set('value', formatted);
return !isNaN(d);
} else {
var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
if (!regex.test(element.get('value'))) return false;
d = new Date(element.get('value').replace(regex, '$1/$2/$3'));
return (parseInt(RegExp.$1, 10) == (1 + d.getMonth())) &&
(parseInt(RegExp.$2, 10) == d.getDate()) &&
(parseInt(RegExp.$3, 10) == d.getFullYear());
}
}
}],
['validate-email', {
errorMsg: Form.Validator.getMsg.pass('email'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) || (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i).test(element.get('value'));
}
}],
['validate-url', {
errorMsg: Form.Validator.getMsg.pass('url'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) || (/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i).test(element.get('value'));
}
}],
['validate-currency-dollar', {
errorMsg: Form.Validator.getMsg.pass('currencyDollar'),
test: function(element){
return Form.Validator.getValidator('IsEmpty').test(element) ||  (/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
}
}],
['validate-one-required', {
errorMsg: Form.Validator.getMsg.pass('oneRequired'),
test: function(element, props){
var p = document.id(props['validate-one-required']) || element.getParent();
return p.getElements('input').some(function(el){
if (['checkbox', 'radio'].contains(el.get('type'))) return el.get('checked');
return el.get('value');
});
}
}]
]);
Element.Properties.validator = {
set: function(options){
var validator = this.retrieve('validator');
if (validator) validator.setOptions(options);
return this.store('validator:options');
},
get: function(options){
if (options || !this.retrieve('validator')){
if (options || !this.retrieve('validator:options')) this.set('validator', options);
this.store('validator', new Form.Validator(this, this.retrieve('validator:options')));
}
return this.retrieve('validator');
}
};
Element.implement({
validate: function(options){
this.set('validator', options);
return this.get('validator', options).validate();
}
});
var FormValidator = Form.Validator;
Form.Validator.Inline = new Class({
Extends: Form.Validator,
options: {
scrollToErrorsOnSubmit: true,
scrollFxOptions: {
transition: 'quad:out',
offset: {
y: -20
}
}
},
initialize: function(form, options){
this.parent(form, options);
this.addEvent('onElementValidate', function(isValid, field, className, warn){
var validator = this.getValidator(className);
if (!isValid && validator.getError(field)){
if (warn) field.addClass('warning');
var advice = this.makeAdvice(className, field, validator.getError(field), warn);
this.insertAdvice(advice, field);
this.showAdvice(className, field);
} else {
this.hideAdvice(className, field);
}
});
},
makeAdvice: function(className, field, error, warn){
var errorMsg = (warn)?this.warningPrefix:this.errorPrefix;
errorMsg += (this.options.useTitles) ? field.title || error:error;
var cssClass = (warn) ? 'warning-advice' : 'validation-advice';
var advice = this.getAdvice(className, field);
if(advice) {
advice = advice.set('html', errorMsg);
} else {
advice = new Element('div', {
html: errorMsg,
styles: { display: 'none' },
id: 'advice-' + className + '-' + this.getFieldId(field)
}).addClass(cssClass);
}
field.store('advice-' + className, advice);
return advice;
},
getFieldId : function(field){
return field.id ? field.id : field.id = 'input_' + field.name;
},
showAdvice: function(className, field){
var advice = this.getAdvice(className, field);
if (advice && !field.retrieve(this.getPropName(className))
&& (advice.getStyle('display') == 'none'
|| advice.getStyle('visiblity') == 'hidden'
|| advice.getStyle('opacity') == 0)){
field.store(this.getPropName(className), true);
if (advice.reveal) advice.reveal();
else advice.setStyle('display', 'block');
}
},
hideAdvice: function(className, field){
var advice = this.getAdvice(className, field);
if (advice && field.retrieve(this.getPropName(className))){
field.store(this.getPropName(className), false);
if (advice.dissolve) advice.dissolve();
else advice.setStyle('display', 'none');
}
},
getPropName: function(className){
return 'advice' + className;
},
resetField: function(field){
field = document.id(field);
if (!field) return this;
this.parent(field);
field.className.split(' ').each(function(className){
this.hideAdvice(className, field);
}, this);
return this;
},
getAllAdviceMessages: function(field, force){
var advice = [];
if (field.hasClass('ignoreValidation') && !force) return advice;
var validators = field.className.split(' ').some(function(cn){
var warner = cn.test('^warn-') || field.hasClass('warnOnly');
if (warner) cn = cn.replace(/^warn-/, '');
var validator = this.getValidator(cn);
if (!validator) return;
advice.push({
message: validator.getError(field),
warnOnly: warner,
passed: validator.test(),
validator: validator
});
}, this);
return advice;
},
getAdvice: function(className, field){
return field.retrieve('advice-' + className);
},
insertAdvice: function(advice, field){
var props = field.get('validatorProps');
if (!props.msgPos || !document.id(props.msgPos)){
if(field.type.toLowerCase() == 'radio') field.getParent().adopt(advice);
else advice.inject(document.id(field), 'after');
} else {
document.id(props.msgPos).grab(advice);
}
},
validateField: function(field, force){
var result = this.parent(field, force);
if (this.options.scrollToErrorsOnSubmit && !result){
var failed = document.id(this).getElement('.validation-failed');
var par = document.id(this).getParent();
while (par != document.body && par.getScrollSize().y == par.getSize().y){
par = par.getParent();
}
var fx = par.retrieve('fvScroller');
if (!fx && window.Fx && Fx.Scroll){
fx = new Fx.Scroll(par, this.options.scrollFxOptions);
par.store('fvScroller', fx);
}
if (failed){
if (fx) fx.toElement(failed);
else par.scrollTo(par.getScroll().x, failed.getPosition(par).y - 20);
}
}
return result;
}
});
Form.Validator.addAllThese([
['validate-enforce-oncheck', {
test: function(element, props){
if (element.checked){
var fv = element.getParent('form').retrieve('validator');
if (!fv) return true;
(props.toEnforce || document.id(props.enforceChildrenOf).getElements('input, select, textarea')).map(function(item){
fv.enforceField(item);
});
}
return true;
}
}],
['validate-ignore-oncheck', {
test: function(element, props){
if (element.checked){
var fv = element.getParent('form').retrieve('validator');
if (!fv) return true;
(props.toIgnore || document.id(props.ignoreChildrenOf).getElements('input, select, textarea')).each(function(item){
fv.ignoreField(item);
fv.resetField(item);
});
}
return true;
}
}],
['validate-nospace', {
errorMsg: function(){
return Form.Validator.getMsg('noSpace');
},
test: function(element, props){
return !element.get('value').test(/\s/);
}
}],
['validate-toggle-oncheck', {
test: function(element, props){
var fv = element.getParent('form').retrieve('validator');
if (!fv) return true;
var eleArr = props.toToggle || document.id(props.toToggleChildrenOf).getElements('input, select, textarea');
if (!element.checked){
eleArr.each(function(item){
fv.ignoreField(item);
fv.resetField(item);
});
} else {
eleArr.each(function(item){
fv.enforceField(item);
});
}
return true;
}
}],
['validate-reqchk-bynode', {
errorMsg: function(){
return Form.Validator.getMsg('reqChkByNode');
},
test: function(element, props){
return (document.id(props.nodeId).getElements(props.selector || 'input[type=checkbox], input[type=radio]')).some(function(item){
return item.checked;
});
}
}],
['validate-required-check', {
errorMsg: function(element, props){
return props.useTitle ? element.get('title') : Form.Validator.getMsg('requiredChk');
},
test: function(element, props){
return !!element.checked;
}
}],
['validate-reqchk-byname', {
errorMsg: function(element, props){
return Form.Validator.getMsg('reqChkByName').substitute({label: props.label || element.get('type')});
},
test: function(element, props){
var grpName = props.groupName || element.get('name');
var oneCheckedItem = $$(document.getElementsByName(grpName)).some(function(item, index){
return item.checked;
});
var fv = element.getParent('form').retrieve('validator');
if (oneCheckedItem && fv) fv.resetField(element);
return oneCheckedItem;
}
}],
['validate-match', {
errorMsg: function(element, props){
return Form.Validator.getMsg('match').substitute({matchName: props.matchName || document.id(props.matchInput).get('name')});
},
test: function(element, props){
var eleVal = element.get('value');
var matchVal = document.id(props.matchInput) && document.id(props.matchInput).get('value');
return eleVal && matchVal ? eleVal == matchVal : true;
}
}],
['validate-after-date', {
errorMsg: function(element, props){
return Form.Validator.getMsg('afterDate').substitute({
label: props.afterLabel || (props.afterElement ? Form.Validator.getMsg('startDate') : Form.Validator.getMsg('currentDate'))
});
},
test: function(element, props){
var start = document.id(props.afterElement) ? Date.parse(document.id(props.afterElement).get('value')) : new Date();
var end = Date.parse(element.get('value'));
return end && start ? end >= start : true;
}
}],
['validate-before-date', {
errorMsg: function(element, props){
return Form.Validator.getMsg('beforeDate').substitute({
label: props.beforeLabel || (props.beforeElement ? Form.Validator.getMsg('endDate') : Form.Validator.getMsg('currentDate'))
});
},
test: function(element, props){
var start = Date.parse(element.get('value'));
var end = document.id(props.beforeElement) ? Date.parse(document.id(props.beforeElement).get('value')) : new Date();
return end && start ? end >= start : true;
}
}],
['validate-custom-required', {
errorMsg: function(){
return Form.Validator.getMsg('required');
},
test: function(element, props){
return element.get('value') != props.emptyValue;
}
}],
['validate-same-month', {
errorMsg: function(element, props){
var startMo = document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value');
var eleVal = element.get('value');
if (eleVal != '') return Form.Validator.getMsg(startMo ? 'sameMonth' : 'startMonth');
},
test: function(element, props){
var d1 = Date.parse(element.get('value'));
var d2 = Date.parse(document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value'));
return d1 && d2 ? d1.format('%B') == d2.format('%B') : true;
}
}],
['validate-cc-num', {
errorMsg: function(element){
var ccNum = element.get('value').ccNum.replace(/[^0-9]/g, '');
return Form.Validator.getMsg('creditcard').substitute({length: ccNum.length});
},
test: function(element){
if (Form.Validator.getValidator('IsEmpty').test(element)) { return true; }
var ccNum = element.get('value');
ccNum = ccNum.replace(/[^0-9]/g, '');
var valid_type = false;
if (ccNum.test(/^4[0-9]{12}([0-9]{3})?$/)) valid_type = 'Visa';
else if (ccNum.test(/^5[1-5]([0-9]{14})$/)) valid_type = 'Master Card';
else if (ccNum.test(/^3[47][0-9]{13}$/)) valid_type = 'American Express';
else if (ccNum.test(/^6011[0-9]{12}$/)) valid_type = 'Discover';
if (valid_type) {
var sum = 0;
var cur = 0;
for(var i=ccNum.length-1; i>=0; --i) {
cur = ccNum.charAt(i).toInt();
if (cur == 0) { continue; }
if ((ccNum.length-i) % 2 == 0) { cur += cur; }
if (cur > 9) { cur = cur.toString().charAt(0).toInt() + cur.toString().charAt(1).toInt(); }
sum += cur;
}
if ((sum % 10) == 0) { return true; }
}
var chunks = '';
while (ccNum != '') {
chunks += ' ' + ccNum.substr(0,4);
ccNum = ccNum.substr(4);
}
element.getParent('form').retrieve('validator').ignoreField(element);
element.set('value', chunks.clean());
element.getParent('form').retrieve('validator').enforceField(element);
return false;
}
}]
]);
var OverText = new Class({
Implements: [Options, Events, Class.Occlude],
Binds: ['reposition', 'assert', 'focus', 'hide'],
options: {/*
textOverride: null,
onFocus: $empty()
onTextHide: $empty(textEl, inputEl),
onTextShow: $empty(textEl, inputEl), */
element: 'label',
positionOptions: {
position: 'upperLeft',
edge: 'upperLeft',
offset: {
x: 4,
y: 2
}
},
poll: false,
pollInterval: 250,
wrap: false
},
property: 'OverText',
initialize: function(element, options){
this.element = document.id(element);
if (this.occlude()) return this.occluded;
this.setOptions(options);
this.attach(this.element);
OverText.instances.push(this);
if (this.options.poll) this.poll();
return this;
},
toElement: function(){
return this.element;
},
attach: function(){
var val = this.options.textOverride || this.element.get('alt') || this.element.get('title');
if (!val) return;
this.text = new Element(this.options.element, {
'class': 'overTxtLabel',
styles: {
lineHeight: 'normal',
position: 'absolute',
cursor: 'text'
},
html: val,
events: {
click: this.hide.pass(this.options.element == 'label', this)
}
}).inject(this.element, 'after');
if (this.options.element == 'label') {
if (!this.element.get('id')) this.element.set('id', 'input_' + new Date().getTime());
this.text.set('for', this.element.get('id'));
}
if (this.options.wrap) {
this.textHolder = new Element('div', {
styles: {
lineHeight: 'normal',
position: 'relative'
},
'class':'overTxtWrapper'
}).adopt(this.text).inject(this.element, 'before');
}
this.element.addEvents({
focus: this.focus,
blur: this.assert,
change: this.assert
}).store('OverTextDiv', this.text);
window.addEvent('resize', this.reposition.bind(this));
this.assert(true);
this.reposition();
},
wrap: function(){
if (this.options.element == 'label') {
if (!this.element.get('id')) this.element.set('id', 'input_' + new Date().getTime());
this.text.set('for', this.element.get('id'));
}
},
startPolling: function(){
this.pollingPaused = false;
return this.poll();
},
poll: function(stop){
if (this.poller && !stop) return this;
var test = function(){
if (!this.pollingPaused) this.assert(true);
}.bind(this);
if (stop) $clear(this.poller);
else this.poller = test.periodical(this.options.pollInterval, this);
return this;
},
stopPolling: function(){
this.pollingPaused = true;
return this.poll(true);
},
focus: function(){
if (this.text && (!this.text.isDisplayed() || this.element.get('disabled'))) return;
this.hide();
},
hide: function(suppressFocus, force){
if (this.text && (this.text.isDisplayed() && (!this.element.get('disabled') || force))){
this.text.hide();
this.fireEvent('textHide', [this.text, this.element]);
this.pollingPaused = true;
try {
if (!suppressFocus) this.element.fireEvent('focus');
this.element.focus();
} catch(e){} //IE barfs if you call focus on hidden elements
}
return this;
},
show: function(){
if (this.text && !this.text.isDisplayed()){
this.text.show();
this.reposition();
this.fireEvent('textShow', [this.text, this.element]);
this.pollingPaused = false;
}
return this;
},
assert: function(suppressFocus){
this[this.test() ? 'show' : 'hide'](suppressFocus);
},
test: function(){
var v = this.element.get('value');
return !v;
},
reposition: function(){
this.assert(true);
if (!this.element.isVisible()) return this.stopPolling().hide();
if (this.text && this.test()) this.text.position($merge(this.options.positionOptions, {relativeTo: this.element}));
return this;
}
});
OverText.instances = [];
$extend(OverText, {
each: function(fn) {
return OverText.instances.map(function(ot, i){
if (ot.element && ot.text) return fn.apply(OverText, [ot, i]);
return null; //the input or the text was destroyed
});
},
update: function(){
return OverText.each(function(ot){
return ot.reposition();
});
},
hideAll: function(){
return OverText.each(function(ot){
return ot.hide(true, true);
});
},
showAll: function(){
return OverText.each(function(ot) {
return ot.show();
});
}
});
if (window.Fx && Fx.Reveal) {
Fx.Reveal.implement({
hideInputs: Browser.Engine.trident ? 'select, input, textarea, object, embed, .overTxtLabel' : false
});
}
Fx.Elements = new Class({
Extends: Fx.CSS,
initialize: function(elements, options){
this.elements = this.subject = $$(elements);
this.parent(options);
},
compute: function(from, to, delta){
var now = {};
for (var i in from){
var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
}
return now;
},
set: function(now){
for (var i in now){
var iNow = now[i];
for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);
}
return this;
},
start: function(obj){
if (!this.check(obj)) return this;
var from = {}, to = {};
for (var i in obj){
var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
for (var p in iProps){
var parsed = this.prepare(this.elements[i], p, iProps[p]);
iFrom[p] = parsed.from;
iTo[p] = parsed.to;
}
}
return this.parent(from, to);
}
});
var Accordion = Fx.Accordion = new Class({
Extends: Fx.Elements,
options: {/*
onActive: $empty(toggler, section),
onBackground: $empty(toggler, section),
fixedHeight: false,
fixedWidth: false,
*/
display: 0,
show: false,
height: true,
width: false,
opacity: true,
alwaysHide: false,
trigger: 'click',
initialDisplayFx: true,
returnHeightToAuto: true
},
initialize: function(){
var params = Array.link(arguments, {'container': Element.type, 'options': Object.type, 'togglers': $defined, 'elements': $defined});
this.parent(params.elements, params.options);
this.togglers = $$(params.togglers);
this.container = document.id(params.container);
this.previous = -1;
this.internalChain = new Chain();
if (this.options.alwaysHide) this.options.wait = true;
if ($chk(this.options.show)){
this.options.display = false;
this.previous = this.options.show;
}
if (this.options.start){
this.options.display = false;
this.options.show = false;
}
this.effects = {};
if (this.options.opacity) this.effects.opacity = 'fullOpacity';
if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth';
if (this.options.height) this.effects.height = this.options.fixedHeight ? 'fullHeight' : 'scrollHeight';
for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]);
this.elements.each(function(el, i){
if (this.options.show === i){
this.fireEvent('active', [this.togglers[i], el]);
} else {
for (var fx in this.effects) el.setStyle(fx, 0);
}
}, this);
if ($chk(this.options.display)) this.display(this.options.display, this.options.initialDisplayFx);
this.addEvent('complete', this.internalChain.callChain.bind(this.internalChain));
},
addSection: function(toggler, element){
toggler = document.id(toggler);
element = document.id(element);
var test = this.togglers.contains(toggler);
this.togglers.include(toggler);
this.elements.include(element);
var idx = this.togglers.indexOf(toggler);
var displayer = this.display.bind(this, idx);
toggler.store('accordion:display', displayer);
toggler.addEvent(this.options.trigger, displayer);
if (this.options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
if (this.options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
element.fullOpacity = 1;
if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth;
if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight;
element.setStyle('overflow', 'hidden');
if (!test){
for (var fx in this.effects) element.setStyle(fx, 0);
}
return this;
},
detach: function(){
this.togglers.each(function(toggler) {
toggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display'));
}, this);
},
display: function(index, useFx){
if (!this.check(index, useFx)) return this;
useFx = $pick(useFx, true);
if (this.options.returnHeightToAuto){
var prev = this.elements[this.previous];
if (prev && !this.selfHidden){
for (var fx in this.effects){
prev.setStyle(fx, prev[this.effects[fx]]);
}
}
}
index = ($type(index) == 'element') ? this.elements.indexOf(index) : index;
if ((this.timer && this.options.wait) || (index === this.previous && !this.options.alwaysHide)) return this;
this.previous = index;
var obj = {};
this.elements.each(function(el, i){
obj[i] = {};
var hide;
if (i != index){
hide = true;
} else if (this.options.alwaysHide && ((el.offsetHeight > 0 && this.options.height) || el.offsetWidth > 0 && this.options.width)){
hide = true;
this.selfHidden = true;
}
this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);
for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]];
}, this);
this.internalChain.chain(function(){
if (this.options.returnHeightToAuto && !this.selfHidden){
var el = this.elements[index];
if (el) el.setStyle('height', 'auto');
};
}.bind(this));
return useFx ? this.start(obj) : this.set(obj);
}
});
Fx.Move = new Class({
Extends: Fx.Morph,
options: {
relativeTo: document.body,
position: 'center',
edge: false,
offset: {x: 0, y: 0}
},
start: function(destination){
return this.parent(this.element.position($merge(this.options, destination, {returnPos: true})));
}
});
Element.Properties.move = {
set: function(options){
var morph = this.retrieve('move');
if (morph) morph.cancel();
return this.eliminate('move').store('move:options', $extend({link: 'cancel'}, options));
},
get: function(options){
if (options || !this.retrieve('move')){
if (options || !this.retrieve('move:options')) this.set('move', options);
this.store('move', new Fx.Move(this, this.retrieve('move:options')));
}
return this.retrieve('move');
}
};
Element.implement({
move: function(options){
this.get('move').start(options);
return this;
}
});
Fx.Reveal = new Class({
Extends: Fx.Morph,
options: {/*
onShow: $empty(thisElement),
onHide: $empty(thisElement),
onComplete: $empty(thisElement),
heightOverride: null,
widthOverride: null, */
link: 'cancel',
styles: ['padding', 'border', 'margin'],
transitionOpacity: !Browser.Engine.trident4,
mode: 'vertical',
display: 'block',
hideInputs: Browser.Engine.trident ? 'select, input, textarea, object, embed' : false
},
dissolve: function(){
try {
if (!this.hiding && !this.showing){
if (this.element.getStyle('display') != 'none'){
this.hiding = true;
this.showing = false;
this.hidden = true;
this.cssText = this.element.style.cssText;
var startStyles = this.element.getComputedSize({
styles: this.options.styles,
mode: this.options.mode
});
this.element.setStyle('display', 'block');
if (this.options.transitionOpacity) startStyles.opacity = 1;
var zero = {};
$each(startStyles, function(style, name){
zero[name] = [style, 0];
}, this);
this.element.setStyle('overflow', 'hidden');
var hideThese = this.options.hideInputs ? this.element.getElements(this.options.hideInputs) : null;
this.$chain.unshift(function(){
if (this.hidden){
this.hiding = false;
$each(startStyles, function(style, name){
startStyles[name] = style;
}, this);
this.element.style.cssText = this.cssText;
this.element.setStyle('display', 'none');
if (hideThese) hideThese.setStyle('visibility', 'visible');
}
this.fireEvent('hide', this.element);
this.callChain();
}.bind(this));
if (hideThese) hideThese.setStyle('visibility', 'hidden');
this.start(zero);
} else {
this.callChain.delay(10, this);
this.fireEvent('complete', this.element);
this.fireEvent('hide', this.element);
}
} else if (this.options.link == 'chain'){
this.chain(this.dissolve.bind(this));
} else if (this.options.link == 'cancel' && !this.hiding){
this.cancel();
this.dissolve();
}
} catch(e){
this.hiding = false;
this.element.setStyle('display', 'none');
this.callChain.delay(10, this);
this.fireEvent('complete', this.element);
this.fireEvent('hide', this.element);
}
return this;
},
reveal: function(){
try {
if (!this.showing && !this.hiding){
if (this.element.getStyle('display') == 'none' ||
this.element.getStyle('visiblity') == 'hidden' ||
this.element.getStyle('opacity') == 0){
this.showing = true;
this.hiding = this.hidden =  false;
var startStyles;
this.cssText = this.element.style.cssText;
this.element.measure(function(){
startStyles = this.element.getComputedSize({
styles: this.options.styles,
mode: this.options.mode
});
}.bind(this));
$each(startStyles, function(style, name){
startStyles[name] = style;
});
if ($chk(this.options.heightOverride)) startStyles.height = this.options.heightOverride.toInt();
if ($chk(this.options.widthOverride)) startStyles.width = this.options.widthOverride.toInt();
if (this.options.transitionOpacity) {
this.element.setStyle('opacity', 0);
startStyles.opacity = 1;
}
var zero = {
height: 0,
display: this.options.display
};
$each(startStyles, function(style, name){ zero[name] = 0; });
this.element.setStyles($merge(zero, {overflow: 'hidden'}));
var hideThese = this.options.hideInputs ? this.element.getElements(this.options.hideInputs) : null;
if (hideThese) hideThese.setStyle('visibility', 'hidden');
this.start(startStyles);
this.$chain.unshift(function(){
this.element.style.cssText = this.cssText;
this.element.setStyle('display', this.options.display);
if (!this.hidden) this.showing = false;
if (hideThese) hideThese.setStyle('visibility', 'visible');
this.callChain();
this.fireEvent('show', this.element);
}.bind(this));
} else {
this.callChain();
this.fireEvent('complete', this.element);
this.fireEvent('show', this.element);
}
} else if (this.options.link == 'chain'){
this.chain(this.reveal.bind(this));
} else if (this.options.link == 'cancel' && !this.showing){
this.cancel();
this.reveal();
}
} catch(e){
this.element.setStyles({
display: this.options.display,
visiblity: 'visible',
opacity: 1
});
this.showing = false;
this.callChain.delay(10, this);
this.fireEvent('complete', this.element);
this.fireEvent('show', this.element);
}
return this;
},
toggle: function(){
if (this.element.getStyle('display') == 'none' ||
this.element.getStyle('visiblity') == 'hidden' ||
this.element.getStyle('opacity') == 0){
this.reveal();
} else {
this.dissolve();
}
return this;
},
cancel: function(){
this.parent.apply(this, arguments);
this.element.style.cssText = this.cssText;
this.hidding = false;
this.showing = false;
}
});
Element.Properties.reveal = {
set: function(options){
var reveal = this.retrieve('reveal');
if (reveal) reveal.cancel();
return this.eliminate('reveal').store('reveal:options', options);
},
get: function(options){
if (options || !this.retrieve('reveal')){
if (options || !this.retrieve('reveal:options')) this.set('reveal', options);
this.store('reveal', new Fx.Reveal(this, this.retrieve('reveal:options')));
}
return this.retrieve('reveal');
}
};
Element.Properties.dissolve = Element.Properties.reveal;
Element.implement({
reveal: function(options){
this.get('reveal', options).reveal();
return this;
},
dissolve: function(options){
this.get('reveal', options).dissolve();
return this;
},
nix: function(){
var params = Array.link(arguments, {destroy: Boolean.type, options: Object.type});
this.get('reveal', params.options).dissolve().chain(function(){
this[params.destroy ? 'destroy' : 'dispose']();
}.bind(this));
return this;
},
wink: function(){
var params = Array.link(arguments, {duration: Number.type, options: Object.type});
var reveal = this.get('reveal', params.options);
reveal.reveal().chain(function(){
(function(){
reveal.dissolve();
}).delay(params.duration || 2000);
});
}
});
Fx.Scroll = new Class({
Extends: Fx,
options: {
offset: {x: 0, y: 0},
wheelStops: true
},
initialize: function(element, options){
this.element = this.subject = document.id(element);
this.parent(options);
var cancel = this.cancel.bind(this, false);
if ($type(this.element) != 'element') this.element = document.id(this.element.getDocument().body);
var stopper = this.element;
if (this.options.wheelStops){
this.addEvent('start', function(){
stopper.addEvent('mousewheel', cancel);
}, true);
this.addEvent('complete', function(){
stopper.removeEvent('mousewheel', cancel);
}, true);
}
},
set: function(){
var now = Array.flatten(arguments);
if (Browser.Engine.gecko) now = [Math.round(now[0]), Math.round(now[1])];
this.element.scrollTo(now[0], now[1]);
},
compute: function(from, to, delta){
return [0, 1].map(function(i){
return Fx.compute(from[i], to[i], delta);
});
},
start: function(x, y){
if (!this.check(x, y)) return this;
var scrollSize = this.element.getScrollSize(),
scroll = this.element.getScroll(),
values = {x: x, y: y};
for (var z in values){
var max = scrollSize[z];
if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? values[z] : max;
else values[z] = scroll[z];
values[z] += this.options.offset[z];
}
return this.parent([scroll.x, scroll.y], [values.x, values.y]);
},
toTop: function(){
return this.start(false, 0);
},
toLeft: function(){
return this.start(0, false);
},
toRight: function(){
return this.start('right', false);
},
toBottom: function(){
return this.start(false, 'bottom');
},
toElement: function(el){
var position = document.id(el).getPosition(this.element);
return this.start(position.x, position.y);
},
scrollIntoView: function(el, axes, offset){
axes = axes ? $splat(axes) : ['x','y'];
var to = {};
el = document.id(el);
var pos = el.getPosition(this.element);
var size = el.getSize();
var scroll = this.element.getScroll();
var containerSize = this.element.getSize();
var edge = {
x: pos.x + size.x,
y: pos.y + size.y
};
['x','y'].each(function(axis) {
if (axes.contains(axis)) {
if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis];
if (pos[axis] < scroll[axis]) to[axis] = pos[axis];
}
if (to[axis] == null) to[axis] = scroll[axis];
if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
}, this);
if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
return this;
},
scrollToCenter: function(el, axes, offset){
axes = axes ? $splat(axes) : ['x', 'y'];
el = $(el);
var to = {},
pos = el.getPosition(this.element),
size = el.getSize(),
scroll = this.element.getScroll(),
containerSize = this.element.getSize(),
edge = {
x: pos.x + size.x,
y: pos.y + size.y
};
['x','y'].each(function(axis){
if(axes.contains(axis)){
to[axis] = pos[axis] - (containerSize[axis] - size[axis])/2;
}
if(to[axis] == null) to[axis] = scroll[axis];
if(offset && offset[axis]) to[axis] = to[axis] + offset[axis];
}, this);
if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
return this;
}
});
Fx.Slide = new Class({
Extends: Fx,
options: {
mode: 'vertical',
hideOverflow: true
},
initialize: function(element, options){
this.addEvent('complete', function(){
this.open = (this.wrapper['offset' + this.layout.capitalize()] != 0);
if (this.open && Browser.Engine.webkit419) this.element.dispose().inject(this.wrapper);
}, true);
this.element = this.subject = document.id(element);
this.parent(options);
var wrapper = this.element.retrieve('wrapper');
var styles = this.element.getStyles('margin', 'position', 'overflow');
if (this.options.hideOverflow) styles = $extend(styles, {overflow: 'hidden'});
this.wrapper = wrapper || new Element('div', {
styles: styles
}).wraps(this.element);
this.element.store('wrapper', this.wrapper).setStyle('margin', 0);
this.now = [];
this.open = true;
},
vertical: function(){
this.margin = 'margin-top';
this.layout = 'height';
this.offset = this.element.offsetHeight;
},
horizontal: function(){
this.margin = 'margin-left';
this.layout = 'width';
this.offset = this.element.offsetWidth;
},
set: function(now){
this.element.setStyle(this.margin, now[0]);
this.wrapper.setStyle(this.layout, now[1]);
return this;
},
compute: function(from, to, delta){
return [0, 1].map(function(i){
return Fx.compute(from[i], to[i], delta);
});
},
start: function(how, mode){
if (!this.check(how, mode)) return this;
this[mode || this.options.mode]();
var margin = this.element.getStyle(this.margin).toInt();
var layout = this.wrapper.getStyle(this.layout).toInt();
var caseIn = [[margin, layout], [0, this.offset]];
var caseOut = [[margin, layout], [-this.offset, 0]];
var start;
switch (how){
case 'in': start = caseIn; break;
case 'out': start = caseOut; break;
case 'toggle': start = (layout == 0) ? caseIn : caseOut;
}
return this.parent(start[0], start[1]);
},
slideIn: function(mode){
return this.start('in', mode);
},
slideOut: function(mode){
return this.start('out', mode);
},
hide: function(mode){
this[mode || this.options.mode]();
this.open = false;
return this.set([-this.offset, 0]);
},
show: function(mode){
this[mode || this.options.mode]();
this.open = true;
return this.set([0, this.offset]);
},
toggle: function(mode){
return this.start('toggle', mode);
}
});
Element.Properties.slide = {
set: function(options){
var slide = this.retrieve('slide');
if (slide) slide.cancel();
return this.eliminate('slide').store('slide:options', $extend({link: 'cancel'}, options));
},
get: function(options){
if (options || !this.retrieve('slide')){
if (options || !this.retrieve('slide:options')) this.set('slide', options);
this.store('slide', new Fx.Slide(this, this.retrieve('slide:options')));
}
return this.retrieve('slide');
}
};
Element.implement({
slide: function(how, mode){
how = how || 'toggle';
var slide = this.get('slide'), toggle;
switch (how){
case 'hide': slide.hide(mode); break;
case 'show': slide.show(mode); break;
case 'toggle':
var flag = this.retrieve('slide:flag', slide.open);
slide[flag ? 'slideOut' : 'slideIn'](mode);
this.store('slide:flag', !flag);
toggle = true;
break;
default: slide.start(how, mode);
}
if (!toggle) this.eliminate('slide:flag');
return this;
}
});
var SmoothScroll = Fx.SmoothScroll = new Class({
Extends: Fx.Scroll,
initialize: function(options, context){
context = context || document;
this.doc = context.getDocument();
var win = context.getWindow();
this.parent(this.doc, options);
this.links = $$(this.options.links || this.doc.links);
var location = win.location.href.match(/^[^#]*/)[0] + '#';
this.links.each(function(link){
if (link.href.indexOf(location) != 0) {return;}
var anchor = link.href.substr(location.length);
if (anchor) this.useLink(link, anchor);
}, this);
if (!Browser.Engine.webkit419) {
this.addEvent('complete', function(){
win.location.hash = this.anchor;
}, true);
}
},
useLink: function(link, anchor){
var el;
link.addEvent('click', function(event){
if (el !== false && !el) el = document.id(anchor) || this.doc.getElement('a[name=' + anchor + ']');
if (el) {
event.preventDefault();
this.anchor = anchor;
this.toElement(el).chain(function(){
this.fireEvent('scrolledTo', [link, el]);
}.bind(this));
link.blur();
}
}.bind(this));
}
});
Fx.Sort = new Class({
Extends: Fx.Elements,
options: {
mode: 'vertical'
},
initialize: function(elements, options){
this.parent(elements, options);
this.elements.each(function(el){
if (el.getStyle('position') == 'static') el.setStyle('position', 'relative');
});
this.setDefaultOrder();
},
setDefaultOrder: function(){
this.currentOrder = this.elements.map(function(el, index){
return index;
});
},
sort: function(newOrder){
if ($type(newOrder) != 'array') return false;
var top = 0,
left = 0,
next = {},
zero = {},
vert = this.options.mode == 'vertical';
var current = this.elements.map(function(el, index){
var size = el.getComputedSize({styles: ['border', 'padding', 'margin']});
var val;
if (vert){
val = {
top: top,
margin: size['margin-top'],
height: size.totalHeight
};
top += val.height - size['margin-top'];
} else {
val = {
left: left,
margin: size['margin-left'],
width: size.totalWidth
};
left += val.width;
}
var plain = vert ? 'top' : 'left';
zero[index] = {};
var start = el.getStyle(plain).toInt();
zero[index][plain] = start || 0;
return val;
}, this);
this.set(zero);
newOrder = newOrder.map(function(i){ return i.toInt(); });
if (newOrder.length != this.elements.length){
this.currentOrder.each(function(index){
if (!newOrder.contains(index)) newOrder.push(index);
});
if (newOrder.length > this.elements.length)
newOrder.splice(this.elements.length-1, newOrder.length - this.elements.length);
}
var margin = top = left = 0;
newOrder.each(function(item, index){
var newPos = {};
if (vert){
newPos.top = top - current[item].top - margin;
top += current[item].height;
} else {
newPos.left = left - current[item].left;
left += current[item].width;
}
margin = margin + current[item].margin;
next[item]=newPos;
}, this);
var mapped = {};
$A(newOrder).sort().each(function(index){
mapped[index] = next[index];
});
this.start(mapped);
this.currentOrder = newOrder;
return this;
},
rearrangeDOM: function(newOrder){
newOrder = newOrder || this.currentOrder;
var parent = this.elements[0].getParent();
var rearranged = [];
this.elements.setStyle('opacity', 0);
newOrder.each(function(index){
rearranged.push(this.elements[index].inject(parent).setStyles({
top: 0,
left: 0
}));
}, this);
this.elements.setStyle('opacity', 1);
this.elements = $$(rearranged);
this.setDefaultOrder();
return this;
},
getDefaultOrder: function(){
return this.elements.map(function(el, index){
return index;
});
},
forward: function(){
return this.sort(this.getDefaultOrder());
},
backward: function(){
return this.sort(this.getDefaultOrder().reverse());
},
reverse: function(){
return this.sort(this.currentOrder.reverse());
},
sortByElements: function(elements){
return this.sort(elements.map(function(el){
return this.elements.indexOf(el);
}, this));
},
swap: function(one, two){
if ($type(one) == 'element') one = this.elements.indexOf(one);
if ($type(two) == 'element') two = this.elements.indexOf(two);
var newOrder = $A(this.currentOrder);
newOrder[this.currentOrder.indexOf(one)] = two;
newOrder[this.currentOrder.indexOf(two)] = one;
return this.sort(newOrder);
}
});
var Drag = new Class({
Implements: [Events, Options],
options: {/*
onBeforeStart: $empty(thisElement),
onStart: $empty(thisElement, event),
onSnap: $empty(thisElement)
onDrag: $empty(thisElement, event),
onCancel: $empty(thisElement),
onComplete: $empty(thisElement, event),*/
snap: 6,
unit: 'px',
grid: false,
style: true,
limit: false,
handle: false,
invert: false,
preventDefault: false,
stopPropagation: false,
modifiers: {x: 'left', y: 'top'}
},
initialize: function(){
var params = Array.link(arguments, {'options': Object.type, 'element': $defined});
this.element = document.id(params.element);
this.document = this.element.getDocument();
this.setOptions(params.options || {});
var htype = $type(this.options.handle);
this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;
this.mouse = {'now': {}, 'pos': {}};
this.value = {'start': {}, 'now': {}};
this.selection = (Browser.Engine.trident) ? 'selectstart' : 'mousedown';
this.bound = {
start: this.start.bind(this),
check: this.check.bind(this),
drag: this.drag.bind(this),
stop: this.stop.bind(this),
cancel: this.cancel.bind(this),
eventStop: $lambda(false)
};
this.attach();
},
attach: function(){
this.handles.addEvent('mousedown', this.bound.start);
return this;
},
detach: function(){
this.handles.removeEvent('mousedown', this.bound.start);
return this;
},
start: function(event){
if (event.rightClick) return;
if (this.options.preventDefault) event.preventDefault();
if (this.options.stopPropagation) event.stopPropagation();
this.mouse.start = event.page;
this.fireEvent('beforeStart', this.element);
var limit = this.options.limit;
this.limit = {x: [], y: []};
for (var z in this.options.modifiers){
if (!this.options.modifiers[z]) continue;
if (this.options.style) this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt();
else this.value.now[z] = this.element[this.options.modifiers[z]];
if (this.options.invert) this.value.now[z] *= -1;
this.mouse.pos[z] = event.page[z] - this.value.now[z];
if (limit && limit[z]){
for (var i = 2; i--; i){
if ($chk(limit[z][i])) this.limit[z][i] = $lambda(limit[z][i])();
}
}
}
if ($type(this.options.grid) == 'number') this.options.grid = {x: this.options.grid, y: this.options.grid};
this.document.addEvents({mousemove: this.bound.check, mouseup: this.bound.cancel});
this.document.addEvent(this.selection, this.bound.eventStop);
},
check: function(event){
if (this.options.preventDefault) event.preventDefault();
var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
if (distance > this.options.snap){
this.cancel();
this.document.addEvents({
mousemove: this.bound.drag,
mouseup: this.bound.stop
});
this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
}
},
drag: function(event){
if (this.options.preventDefault) event.preventDefault();
this.mouse.now = event.page;
for (var z in this.options.modifiers){
if (!this.options.modifiers[z]) continue;
this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
if (this.options.invert) this.value.now[z] *= -1;
if (this.options.limit && this.limit[z]){
if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){
this.value.now[z] = this.limit[z][1];
} else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){
this.value.now[z] = this.limit[z][0];
}
}
if (this.options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % this.options.grid[z]);
if (this.options.style) {
this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit);
} else {
this.element[this.options.modifiers[z]] = this.value.now[z];
}
}
this.fireEvent('drag', [this.element, event]);
},
cancel: function(event){
this.document.removeEvent('mousemove', this.bound.check);
this.document.removeEvent('mouseup', this.bound.cancel);
if (event){
this.document.removeEvent(this.selection, this.bound.eventStop);
this.fireEvent('cancel', this.element);
}
},
stop: function(event){
this.document.removeEvent(this.selection, this.bound.eventStop);
this.document.removeEvent('mousemove', this.bound.drag);
this.document.removeEvent('mouseup', this.bound.stop);
if (event) this.fireEvent('complete', [this.element, event]);
}
});
Element.implement({
makeResizable: function(options){
var drag = new Drag(this, $merge({modifiers: {x: 'width', y: 'height'}}, options));
this.store('resizer', drag);
return drag.addEvent('drag', function(){
this.fireEvent('resize', drag);
}.bind(this));
}
});
Drag.Move = new Class({
Extends: Drag,
options: {/*
onEnter: $empty(thisElement, overed),
onLeave: $empty(thisElement, overed),
onDrop: $empty(thisElement, overed, event),*/
droppables: [],
container: false,
precalculate: false,
includeMargins: true,
checkDroppables: true
},
initialize: function(element, options){
this.parent(element, options);
element = this.element;
this.droppables = $$(this.options.droppables);
this.container = document.id(this.options.container);
if (this.container && $type(this.container) != 'element')
this.container = document.id(this.container.getDocument().body);
var styles = element.getStyles('left', 'right', 'position');
if (styles.left == 'auto' || styles.top == 'auto')
element.setPosition(element.getPosition(element.getOffsetParent()));
if (styles.position == 'static')
element.setStyle('position', 'absolute');
this.addEvent('start', this.checkDroppables, true);
this.overed = null;
},
start: function(event){
if (this.container) this.options.limit = this.calculateLimit();
if (this.options.precalculate){
this.positions = this.droppables.map(function(el){
return el.getCoordinates();
});
}
this.parent(event);
},
calculateLimit: function(){
var offsetParent = this.element.getOffsetParent(),
containerCoordinates = this.container.getCoordinates(offsetParent),
containerBorder = {},
elementMargin = {},
elementBorder = {},
containerMargin = {},
offsetParentPadding = {};
['top', 'right', 'bottom', 'left'].each(function(pad){
containerBorder[pad] = this.container.getStyle('border-' + pad).toInt();
elementBorder[pad] = this.element.getStyle('border-' + pad).toInt();
elementMargin[pad] = this.element.getStyle('margin-' + pad).toInt();
containerMargin[pad] = this.container.getStyle('margin-' + pad).toInt();
offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();
}, this);
var width = this.element.offsetWidth + elementMargin.left + elementMargin.right,
height = this.element.offsetHeight + elementMargin.top + elementMargin.bottom,
left = 0,
top = 0,
right = containerCoordinates.right - containerBorder.right - width,
bottom = containerCoordinates.bottom - containerBorder.bottom - height;
if (this.options.includeMargins){
left += elementMargin.left;
top += elementMargin.top;
} else {
right += elementMargin.right;
bottom += elementMargin.bottom;
}
if (this.element.getStyle('position') == 'relative'){
var coords = this.element.getCoordinates(offsetParent);
coords.left -= this.element.getStyle('left').toInt();
coords.top -= this.element.getStyle('top').toInt();
left += containerBorder.left - coords.left;
top += containerBorder.top - coords.top;
right += elementMargin.left - coords.left;
bottom += elementMargin.top - coords.top;
if (this.container != offsetParent){
left += containerMargin.left + offsetParentPadding.left;
top += (Browser.Engine.trident4 ? 0 : containerMargin.top) + offsetParentPadding.top;
}
} else {
left -= elementMargin.left;
top -= elementMargin.top;
if (this.container == offsetParent){
right -= containerBorder.left;
bottom -= containerBorder.top;
} else {
left += containerCoordinates.left + containerBorder.left;
top += containerCoordinates.top + containerBorder.top;
}
}
return {
x: [left, right],
y: [top, bottom]
};
},
checkAgainst: function(el, i){
el = (this.positions) ? this.positions[i] : el.getCoordinates();
var now = this.mouse.now;
return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
},
checkDroppables: function(){
var overed = this.droppables.filter(this.checkAgainst, this).getLast();
if (this.overed != overed){
if (this.overed) this.fireEvent('leave', [this.element, this.overed]);
if (overed) this.fireEvent('enter', [this.element, overed]);
this.overed = overed;
}
},
drag: function(event){
this.parent(event);
if (this.options.checkDroppables && this.droppables.length) this.checkDroppables();
},
stop: function(event){
this.checkDroppables();
this.fireEvent('drop', [this.element, this.overed, event]);
this.overed = null;
return this.parent(event);
}
});
Element.implement({
makeDraggable: function(options){
var drag = new Drag.Move(this, options);
this.store('dragger', drag);
return drag;
}
});
var Slider = new Class({
Implements: [Events, Options],
Binds: ['clickedElement', 'draggedKnob', 'scrolledElement'],
options: {/*
onTick: $empty(intPosition),
onChange: $empty(intStep),
onComplete: $empty(strStep),*/
onTick: function(position){
if (this.options.snap) position = this.toPosition(this.step);
this.knob.setStyle(this.property, position);
},
initialStep: 0,
snap: false,
offset: 0,
range: false,
wheel: false,
steps: 100,
mode: 'horizontal'
},
initialize: function(element, knob, options){
this.setOptions(options);
this.element = document.id(element);
this.knob = document.id(knob);
this.previousChange = this.previousEnd = this.step = -1;
var offset, limit = {}, modifiers = {'x': false, 'y': false};
switch (this.options.mode){
case 'vertical':
this.axis = 'y';
this.property = 'top';
offset = 'offsetHeight';
break;
case 'horizontal':
this.axis = 'x';
this.property = 'left';
offset = 'offsetWidth';
}
this.full = this.element.measure(function(){
this.half = this.knob[offset] / 2;
return this.element[offset] - this.knob[offset] + (this.options.offset * 2);
}.bind(this));
this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0;
this.max = $chk(this.options.range[1]) ? this.options.range[1] : this.options.steps;
this.range = this.max - this.min;
this.steps = this.options.steps || this.full;
this.stepSize = Math.abs(this.range) / this.steps;
this.stepWidth = this.stepSize * this.full / Math.abs(this.range) ;
this.knob.setStyle('position', 'relative').setStyle(this.property, this.options.initialStep ? this.toPosition(this.options.initialStep) : - this.options.offset);
modifiers[this.axis] = this.property;
limit[this.axis] = [- this.options.offset, this.full - this.options.offset];
var dragOptions = {
snap: 0,
limit: limit,
modifiers: modifiers,
onDrag: this.draggedKnob,
onStart: this.draggedKnob,
onBeforeStart: (function(){
this.isDragging = true;
}).bind(this),
onCancel: function() {
this.isDragging = false;
}.bind(this),
onComplete: function(){
this.isDragging = false;
this.draggedKnob();
this.end();
}.bind(this)
};
if (this.options.snap){
dragOptions.grid = Math.ceil(this.stepWidth);
dragOptions.limit[this.axis][1] = this.full;
}
this.drag = new Drag(this.knob, dragOptions);
this.attach();
},
attach: function(){
this.element.addEvent('mousedown', this.clickedElement);
if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement);
this.drag.attach();
return this;
},
detach: function(){
this.element.removeEvent('mousedown', this.clickedElement);
this.element.removeEvent('mousewheel', this.scrolledElement);
this.drag.detach();
return this;
},
set: function(step){
if (!((this.range > 0) ^ (step < this.min))) step = this.min;
if (!((this.range > 0) ^ (step > this.max))) step = this.max;
this.step = Math.round(step);
this.checkStep();
this.fireEvent('tick', this.toPosition(this.step));
this.end();
return this;
},
clickedElement: function(event){
if (this.isDragging || event.target == this.knob) return;
var dir = this.range < 0 ? -1 : 1;
var position = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half;
position = position.limit(-this.options.offset, this.full -this.options.offset);
this.step = Math.round(this.min + dir * this.toStep(position));
this.checkStep();
this.fireEvent('tick', position);
this.end();
},
scrolledElement: function(event){
var mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0);
this.set(mode ? this.step - this.stepSize : this.step + this.stepSize);
event.stop();
},
draggedKnob: function(){
var dir = this.range < 0 ? -1 : 1;
var position = this.drag.value.now[this.axis];
position = position.limit(-this.options.offset, this.full -this.options.offset);
this.step = Math.round(this.min + dir * this.toStep(position));
this.checkStep();
},
checkStep: function(){
if (this.previousChange != this.step){
this.previousChange = this.step;
this.fireEvent('change', this.step);
}
},
end: function(){
if (this.previousEnd !== this.step){
this.previousEnd = this.step;
this.fireEvent('complete', this.step + '');
}
},
toStep: function(position){
var step = (position + this.options.offset) * this.stepSize / this.full * this.steps;
return this.options.steps ? Math.round(step -= step % this.stepSize) : step;
},
toPosition: function(step){
return (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset;
}
});
var Sortables = new Class({
Implements: [Events, Options],
options: {/*
onSort: $empty(element, clone),
onStart: $empty(element, clone),
onComplete: $empty(element),*/
snap: 4,
opacity: 1,
clone: false,
revert: false,
handle: false,
constrain: false
},
initialize: function(lists, options){
this.setOptions(options);
this.elements = [];
this.lists = [];
this.idle = true;
this.addLists($$(document.id(lists) || lists));
if (!this.options.clone) this.options.revert = false;
if (this.options.revert) this.effect = new Fx.Morph(null, $merge({duration: 250, link: 'cancel'}, this.options.revert));
},
attach: function(){
this.addLists(this.lists);
return this;
},
detach: function(){
this.lists = this.removeLists(this.lists);
return this;
},
addItems: function(){
Array.flatten(arguments).each(function(element){
this.elements.push(element);
var start = element.retrieve('sortables:start', this.start.bindWithEvent(this, element));
(this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start);
}, this);
return this;
},
addLists: function(){
Array.flatten(arguments).each(function(list){
this.lists.push(list);
this.addItems(list.getChildren());
}, this);
return this;
},
removeItems: function(){
return $$(Array.flatten(arguments).map(function(element){
this.elements.erase(element);
var start = element.retrieve('sortables:start');
(this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start);
return element;
}, this));
},
removeLists: function(){
return $$(Array.flatten(arguments).map(function(list){
this.lists.erase(list);
this.removeItems(list.getChildren());
return list;
}, this));
},
getClone: function(event, element){
if (!this.options.clone) return new Element('div').inject(document.body);
if ($type(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list);
return element.clone(true).setStyles({
margin: '0px',
position: 'absolute',
visibility: 'hidden',
'width': element.getStyle('width')
}).inject(this.list).setPosition(element.getPosition(element.getOffsetParent()));
},
getDroppables: function(){
var droppables = this.list.getChildren();
if (!this.options.constrain) droppables = this.lists.concat(droppables).erase(this.list);
return droppables.erase(this.clone).erase(this.element);
},
insert: function(dragging, element){
var where = 'inside';
if (this.lists.contains(element)){
this.list = element;
this.drag.droppables = this.getDroppables();
} else {
where = this.element.getAllPrevious().contains(element) ? 'before' : 'after';
}
this.element.inject(element, where);
this.fireEvent('sort', [this.element, this.clone]);
},
start: function(event, element){
if (!this.idle) return;
this.idle = false;
this.element = element;
this.opacity = element.get('opacity');
this.list = element.getParent();
this.clone = this.getClone(event, element);
this.drag = new Drag.Move(this.clone, {
snap: this.options.snap,
container: this.options.constrain && this.element.getParent(),
droppables: this.getDroppables(),
onSnap: function(){
event.stop();
this.clone.setStyle('visibility', 'visible');
this.element.set('opacity', this.options.opacity || 0);
this.fireEvent('start', [this.element, this.clone]);
}.bind(this),
onEnter: this.insert.bind(this),
onCancel: this.reset.bind(this),
onComplete: this.end.bind(this)
});
this.clone.inject(this.element, 'before');
this.drag.start(event);
},
end: function(){
this.drag.detach();
this.element.set('opacity', this.opacity);
if (this.effect){
var dim = this.element.getStyles('width', 'height');
var pos = this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));
this.effect.element = this.clone;
this.effect.start({
top: pos.top,
left: pos.left,
width: dim.width,
height: dim.height,
opacity: 0.25
}).chain(this.reset.bind(this));
} else {
this.reset();
}
},
reset: function(){
this.idle = true;
this.clone.destroy();
this.fireEvent('complete', this.element);
},
serialize: function(){
var params = Array.link(arguments, {modifier: Function.type, index: $defined});
var serial = this.lists.map(function(list){
return list.getChildren().map(params.modifier || function(element){
return element.get('id');
}, this);
}, this);
var index = params.index;
if (this.lists.length == 1) index = 0;
return $chk(index) && index >= 0 && index < this.lists.length ? serial[index] : serial;
}
});
Request.JSONP = new Class({
Implements: [Chain, Events, Options, Log],
options: {/*
onRetry: $empty(intRetries),
onRequest: $empty(scriptElement),
onComplete: $empty(data),
onSuccess: $empty(data),
onCancel: $empty(),
log: false,
*/
url: '',
data: {},
retries: 0,
timeout: 0,
link: 'ignore',
callbackKey: 'callback',
injectScript: document.head
},
initialize: function(options){
this.setOptions(options);
if (this.options.log) this.enableLog();
this.running = false;
this.requests = 0;
this.triesRemaining = [];
},
check: function(){
if (!this.running) return true;
switch (this.options.link){
case 'cancel': this.cancel(); return true;
case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
}
return false;
},
send: function(options){
if (!$chk(arguments[1]) && !this.check(options)) return this;
var type = $type(options),
old = this.options,
index = $chk(arguments[1]) ? arguments[1] : this.requests++;
if (type == 'string' || type == 'element') options = {data: options};
options = $extend({data: old.data, url: old.url}, options);
if (!$chk(this.triesRemaining[index])) this.triesRemaining[index] = this.options.retries;
var remaining = this.triesRemaining[index];
(function(){
var script = this.getScript(options);
this.log('JSONP retrieving script with url: ' + script.get('src'));
this.fireEvent('request', script);
this.running = true;
(function(){
if (remaining){
this.triesRemaining[index] = remaining - 1;
if (script){
script.destroy();
this.send(options, index).fireEvent('retry', this.triesRemaining[index]);
}
} else if(script && this.options.timeout){
script.destroy();
this.cancel().fireEvent('failure');
}
}).delay(this.options.timeout, this);
}).delay(Browser.Engine.trident ? 50 : 0, this);
return this;
},
cancel: function(){
if (!this.running) return this;
this.running = false;
this.fireEvent('cancel');
return this;
},
getScript: function(options){
var index = Request.JSONP.counter,
data;
Request.JSONP.counter++;
switch ($type(options.data)){
case 'element': data = document.id(options.data).toQueryString(); break;
case 'object': case 'hash': data = Hash.toQueryString(options.data);
}
var src = options.url +
(options.url.test('\\?') ? '&' :'?') +
(options.callbackKey || this.options.callbackKey) +
'=Request.JSONP.request_map.request_'+ index +
(data ? '&' + data : '');
if (src.length > 2083) this.log('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
var script = new Element('script', {type: 'text/javascript', src: src});
Request.JSONP.request_map['request_' + index] = function(data){ this.success(data, script); }.bind(this);
return script.inject(this.options.injectScript);
},
success: function(data, script){
if (script) script.destroy();
this.running = false;
this.log('JSONP successfully retrieved: ', data);
this.fireEvent('complete', [data]).fireEvent('success', [data]).callChain();
}
});
Request.JSONP.counter = 0;
Request.JSONP.request_map = {};
Request.Queue = new Class({
Implements: [Options, Events],
Binds: ['attach', 'request', 'complete', 'cancel', 'success', 'failure', 'exception'],
options: {/*
onRequest: $empty(argsPassedToOnRequest),
onSuccess: $empty(argsPassedToOnSuccess),
onComplete: $empty(argsPassedToOnComplete),
onCancel: $empty(argsPassedToOnCancel),
onException: $empty(argsPassedToOnException),
onFailure: $empty(argsPassedToOnFailure),
onEnd: $empty,
*/
stopOnFailure: true,
autoAdvance: true,
concurrent: 1,
requests: {}
},
initialize: function(options){
if(options){
var requests = options.requests;
delete options.requests;
}
this.setOptions(options);
this.requests = new Hash;
this.queue = [];
this.reqBinders = {};
if(requests) this.addRequests(requests);
},
addRequest: function(name, request){
this.requests.set(name, request);
this.attach(name, request);
return this;
},
addRequests: function(obj){
$each(obj, function(req, name){
this.addRequest(name, req);
}, this);
return this;
},
getName: function(req){
return this.requests.keyOf(req);
},
attach: function(name, req){
if (req._groupSend) return this;
['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){
if(!this.reqBinders[name]) this.reqBinders[name] = {};
this.reqBinders[name][evt] = function(){
this['on' + evt.capitalize()].apply(this, [name, req].extend(arguments));
}.bind(this);
req.addEvent(evt, this.reqBinders[name][evt]);
}, this);
req._groupSend = req.send;
req.send = function(options){
this.send(name, options);
return req;
}.bind(this);
return this;
},
removeRequest: function(req){
var name = $type(req) == 'object' ? this.getName(req) : req;
if (!name && $type(name) != 'string') return this;
req = this.requests.get(name);
if (!req) return this;
['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){
req.removeEvent(evt, this.reqBinders[name][evt]);
}, this);
req.send = req._groupSend;
delete req._groupSend;
return this;
},
getRunning: function(){
return this.requests.filter(function(r){
return r.running;
});
},
isRunning: function(){
return !!(this.getRunning().getKeys().length);
},
send: function(name, options){
var q = function(){
this.requests.get(name)._groupSend(options);
this.queue.erase(q);
}.bind(this);
q.name = name;
if (this.getRunning().getKeys().length >= this.options.concurrent || (this.error && this.options.stopOnFailure)) this.queue.push(q);
else q();
return this;
},
hasNext: function(name){
return (!name) ? !!this.queue.length : !!this.queue.filter(function(q){ return q.name == name; }).length;
},
resume: function(){
this.error = false;
(this.options.concurrent - this.getRunning().getKeys().length).times(this.runNext, this);
return this;
},
runNext: function(name){
if (!this.queue.length) return this;
if (!name){
this.queue[0]();
} else {
var found;
this.queue.each(function(q){
if (!found && q.name == name){
found = true;
q();
}
});
}
return this;
},
runAll: function() {
this.queue.each(function(q) {
q();
});
return this;
},
clear: function(name){
if (!name){
this.queue.empty();
} else {
this.queue = this.queue.map(function(q){
if (q.name != name) return q;
else return false;
}).filter(function(q){ return q; });
}
return this;
},
cancel: function(name){
this.requests.get(name).cancel();
return this;
},
onRequest: function(){
this.fireEvent('request', arguments);
},
onComplete: function(){
this.fireEvent('complete', arguments);
if (!this.queue.length) this.fireEvent('end');
},
onCancel: function(){
if (this.options.autoAdvance && !this.error) this.runNext();
this.fireEvent('cancel', arguments);
},
onSuccess: function(){
if (this.options.autoAdvance && !this.error) this.runNext();
this.fireEvent('success', arguments);
},
onFailure: function(){
this.error = true;
if (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();
this.fireEvent('failure', arguments);
},
onException: function(){
this.error = true;
if (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();
this.fireEvent('exception', arguments);
}
});
Request.implement({
options: {
initialDelay: 5000,
delay: 5000,
limit: 60000
},
startTimer: function(data){
var fn = function(){
if (!this.running) this.send({data: data});
};
this.timer = fn.delay(this.options.initialDelay, this);
this.lastDelay = this.options.initialDelay;
this.completeCheck = function(response){
$clear(this.timer);
this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit);
this.timer = fn.delay(this.lastDelay, this);
};
return this.addEvent('complete', this.completeCheck);
},
stopTimer: function(){
$clear(this.timer);
return this.removeEvent('complete', this.completeCheck);
}
});
var Asset = {
javascript: function(source, properties){
properties = $extend({
onload: $empty,
document: document,
check: $lambda(true)
}, properties);
var script = new Element('script', {src: source, type: 'text/javascript'});
var load = properties.onload.bind(script),
check = properties.check,
doc = properties.document;
delete properties.onload;
delete properties.check;
delete properties.document;
script.addEvents({
load: load,
readystatechange: function(){
if (['loaded', 'complete'].contains(this.readyState)) load();
}
}).set(properties);
if (Browser.Engine.webkit419) var checker = (function(){
if (!$try(check)) return;
$clear(checker);
load();
}).periodical(50);
return script.inject(doc.head);
},
css: function(source, properties){
return new Element('link', $merge({
rel: 'stylesheet',
media: 'screen',
type: 'text/css',
href: source
}, properties)).inject(document.head);
},
image: function(source, properties){
properties = $merge({
onload: $empty,
onabort: $empty,
onerror: $empty
}, properties);
var image = new Image();
var element = document.id(image) || new Element('img');
['load', 'abort', 'error'].each(function(name){
var type = 'on' + name;
var event = properties[type];
delete properties[type];
image[type] = function(){
if (!image) return;
if (!element.parentNode){
element.width = image.width;
element.height = image.height;
}
image = image.onload = image.onabort = image.onerror = null;
event.delay(1, element, element);
element.fireEvent(name, element, 1);
};
});
image.src = element.src = source;
if (image && image.complete) image.onload.delay(1);
return element.set(properties);
},
images: function(sources, options){
options = $merge({
onComplete: $empty,
onProgress: $empty,
onError: $empty,
properties: {}
}, options);
sources = $splat(sources);
var images = [];
var counter = 0;
return new Elements(sources.map(function(source){
return Asset.image(source, $extend(options.properties, {
onload: function(){
options.onProgress.call(this, counter, sources.indexOf(source));
counter++;
if (counter == sources.length) options.onComplete();
},
onerror: function(){
options.onError.call(this, counter, sources.indexOf(source));
counter++;
if (counter == sources.length) options.onComplete();
}
}));
}));
}
};
var Color = new Native({
initialize: function(color, type){
if (arguments.length >= 3){
type = 'rgb'; color = Array.slice(arguments, 0, 3);
} else if (typeof color == 'string'){
if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);
else if (color.match(/hsb/)) color = color.hsbToRgb();
else color = color.hexToRgb(true);
}
type = type || 'rgb';
switch (type){
case 'hsb':
var old = color;
color = color.hsbToRgb();
color.hsb = old;
break;
case 'hex': color = color.hexToRgb(true); break;
}
color.rgb = color.slice(0, 3);
color.hsb = color.hsb || color.rgbToHsb();
color.hex = color.rgbToHex();
return $extend(color, this);
}
});
Color.implement({
mix: function(){
var colors = Array.slice(arguments);
var alpha = ($type(colors.getLast()) == 'number') ? colors.pop() : 50;
var rgb = this.slice();
colors.each(function(color){
color = new Color(color);
for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));
});
return new Color(rgb, 'rgb');
},
invert: function(){
return new Color(this.map(function(value){
return 255 - value;
}));
},
setHue: function(value){
return new Color([value, this.hsb[1], this.hsb[2]], 'hsb');
},
setSaturation: function(percent){
return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');
},
setBrightness: function(percent){
return new Color([this.hsb[0], this.hsb[1], percent], 'hsb');
}
});
var $RGB = function(r, g, b){
return new Color([r, g, b], 'rgb');
};
var $HSB = function(h, s, b){
return new Color([h, s, b], 'hsb');
};
var $HEX = function(hex){
return new Color(hex, 'hex');
};
Array.implement({
rgbToHsb: function(){
var red = this[0],
green = this[1],
blue = this[2],
hue = 0;
var max = Math.max(red, green, blue),
min = Math.min(red, green, blue);
var delta = max - min;
var brightness = max / 255,
saturation = (max != 0) ? delta / max : 0;
if(saturation != 0) {
var rr = (max - red) / delta;
var gr = (max - green) / delta;
var br = (max - blue) / delta;
if (red == max) hue = br - gr;
else if (green == max) hue = 2 + rr - br;
else hue = 4 + gr - rr;
hue /= 6;
if (hue < 0) hue++;
}
return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)];
},
hsbToRgb: function(){
var br = Math.round(this[2] / 100 * 255);
if (this[1] == 0){
return [br, br, br];
} else {
var hue = this[0] % 360;
var f = hue % 60;
var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);
var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255);
switch (Math.floor(hue / 60)){
case 0: return [br, t, p];
case 1: return [q, br, p];
case 2: return [p, br, t];
case 3: return [p, q, br];
case 4: return [t, p, br];
case 5: return [br, p, q];
}
}
return false;
}
});
String.implement({
rgbToHsb: function(){
var rgb = this.match(/\d{1,3}/g);
return (rgb) ? rgb.rgbToHsb() : null;
},
hsbToRgb: function(){
var hsb = this.match(/\d{1,3}/g);
return (hsb) ? hsb.hsbToRgb() : null;
}
});
var Group = new Class({
initialize: function(){
this.instances = Array.flatten(arguments);
this.events = {};
this.checker = {};
},
addEvent: function(type, fn){
this.checker[type] = this.checker[type] || {};
this.events[type] = this.events[type] || [];
if (this.events[type].contains(fn)) return false;
else this.events[type].push(fn);
this.instances.each(function(instance, i){
instance.addEvent(type, this.check.bind(this, [type, instance, i]));
}, this);
return this;
},
check: function(type, instance, i){
this.checker[type][i] = true;
var every = this.instances.every(function(current, j){
return this.checker[type][j] || false;
}, this);
if (!every) return;
this.checker[type] = {};
this.events[type].each(function(event){
event.call(this, this.instances, instance);
}, this);
}
});
Hash.Cookie = new Class({
Extends: Cookie,
options: {
autoSave: true
},
initialize: function(name, options){
this.parent(name, options);
this.load();
},
save: function(){
var value = JSON.encode(this.hash);
if (!value || value.length > 4096) return false; //cookie would be truncated!
if (value == '{}') this.dispose();
else this.write(value);
return true;
},
load: function(){
this.hash = new Hash(JSON.decode(this.read(), true));
return this;
}
});
Hash.each(Hash.prototype, function(method, name){
if (typeof method == 'function') Hash.Cookie.implement(name, function(){
var value = method.apply(this.hash, arguments);
if (this.options.autoSave) this.save();
return value;
});
});
var IframeShim = new Class({
Implements: [Options, Events, Class.Occlude],
options: {
className: 'iframeShim',
src: 'javascript:false;document.write("");',
display: false,
zIndex: null,
margin: 0,
offset: {x: 0, y: 0},
browsers: (Browser.Engine.trident4 || (Browser.Engine.gecko && !Browser.Engine.gecko19 && Browser.Platform.mac))
},
property: 'IframeShim',
initialize: function(element, options){
this.element = document.id(element);
if (this.occlude()) return this.occluded;
this.setOptions(options);
this.makeShim();
return this;
},
makeShim: function(){
if(this.options.browsers){
var zIndex = this.element.getStyle('zIndex').toInt();
if (!zIndex){
zIndex = 1;
var pos = this.element.getStyle('position');
if (pos == 'static' || !pos) this.element.setStyle('position', 'relative');
this.element.setStyle('zIndex', zIndex);
}
zIndex = ($chk(this.options.zIndex) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1;
if (zIndex < 0) zIndex = 1;
this.shim = new Element('iframe', {
src: this.options.src,
scrolling: 'no',
frameborder: 0,
styles: {
zIndex: zIndex,
position: 'absolute',
border: 'none',
filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
},
'class': this.options.className
}).store('IframeShim', this);
var inject = (function(){
this.shim.inject(this.element, 'after');
this[this.options.display ? 'show' : 'hide']();
this.fireEvent('inject');
}).bind(this);
if (IframeShim.ready) window.addEvent('load', inject);
else inject();
} else {
this.position = this.hide = this.show = this.dispose = $lambda(this);
}
},
position: function(){
if (!IframeShim.ready || !this.shim) return this;
var size = this.element.measure(function(){
return this.getSize();
});
if (this.options.margin != undefined){
size.x = size.x - (this.options.margin * 2);
size.y = size.y - (this.options.margin * 2);
this.options.offset.x += this.options.margin;
this.options.offset.y += this.options.margin;
}
this.shim.set({width: size.x, height: size.y}).position({
relativeTo: this.element,
offset: this.options.offset
});
return this;
},
hide: function(){
if (this.shim) this.shim.setStyle('display', 'none');
return this;
},
show: function(){
if (this.shim) this.shim.setStyle('display', 'block');
return this.position();
},
dispose: function(){
if (this.shim) this.shim.dispose();
return this;
},
destroy: function(){
if (this.shim) this.shim.destroy();
return this;
}
});
window.addEvent('load', function(){
IframeShim.ready = true;
});
var HtmlTable = new Class({
Implements: [Options, Events, Class.Occlude],
options: {
properties: {
cellpadding: 0,
cellspacing: 0,
border: 0
},
rows: [],
headers: [],
footers: []
},
property: 'HtmlTable',
initialize: function(){
var params = Array.link(arguments, {options: Object.type, table: Element.type});
this.setOptions(params.options);
this.element = params.table || new Element('table', this.options.properties);
if (this.occlude()) return this.occluded;
this.build();
},
build: function(){
this.element.store('HtmlTable', this);
this.body = document.id(this.element.tBodies[0]) || new Element('tbody').inject(this.element);
$$(this.body.rows);
if (this.options.headers.length) this.setHeaders(this.options.headers);
else this.thead = document.id(this.element.tHead);
if (this.thead) this.head = document.id(this.thead.rows[0]);
if (this.options.footers.length) this.setFooters(this.options.footers);
this.tfoot = document.id(this.element.tFoot);
if (this.tfoot) this.foot = document.id(this.thead.rows[0]);
this.options.rows.each(function(row){
this.push(row);
}, this);
['adopt', 'inject', 'wraps', 'grab', 'replaces', 'dispose'].each(function(method){
this[method] = this.element[method].bind(this.element);
}, this);
},
toElement: function(){
return this.element;
},
empty: function(){
this.body.empty();
return this;
},
setHeaders: function(headers){
this.thead = (document.id(this.element.tHead) || new Element('thead').inject(this.element, 'top')).empty();
this.push(headers, this.thead, 'th');
this.head = document.id(this.thead.rows[0]);
return this;
},
setFooters: function(footers){
this.tfoot = (document.id(this.element.tFoot) || new Element('tfoot').inject(this.element, 'top')).empty();
this.push(footers, this.tfoot);
this.foot = document.id(this.thead.rows[0]);
return this;
},
push: function(row, target, tag){
var tds = row.map(function(data){
var td = new Element(tag || 'td', data.properties),
type = data.content || data || '',
element = document.id(type);
if(element) td.adopt(element);
else td.set('html', type);
return td;
});
return {
tr: new Element('tr').inject(target || this.body).adopt(tds),
tds: tds
};
}
});
HtmlTable = Class.refactor(HtmlTable, {
options: {
classZebra: 'table-tr-odd',
zebra: true
},
initialize: function(){
this.previous.apply(this, arguments);
if (this.occluded) return this.occluded;
if (this.options.zebra) this.updateZebras();
},
updateZebras: function(){
Array.each(this.body.rows, this.zebra, this);
},
zebra: function(row, i){
return row[((i % 2) ? 'remove' : 'add')+'Class'](this.options.classZebra);
},
push: function(){
var pushed = this.previous.apply(this, arguments);
if (this.options.zebra) this.updateZebras();
return pushed;
}
});
HtmlTable = Class.refactor(HtmlTable, {
options: {/*
onSort: $empty, */
sortIndex: 0,
sortReverse: false,
parsers: [],
defaultParser: 'string',
classSortable: 'table-sortable',
classHeadSort: 'table-th-sort',
classHeadSortRev: 'table-th-sort-rev',
classNoSort: 'table-th-nosort',
classGroupHead: 'table-tr-group-head',
classGroup: 'table-tr-group',
classCellSort: 'table-td-sort',
classSortSpan: 'table-th-sort-span',
sortable: false
},
initialize: function () {
this.previous.apply(this, arguments);
if (this.occluded) return this.occluded;
this.sorted = {index: null, dir: 1};
this.bound = {
headClick: this.headClick.bind(this)
};
this.sortSpans = new Elements();
if (this.options.sortable) {
this.enableSort();
if (this.options.sortIndex != null) this.sort(this.options.sortIndex, this.options.sortReverse);
}
},
attachSorts: function(attach){
this.element[$pick(attach, true) ? 'addEvent' : 'removeEvent']('click:relay(th)', this.bound.headClick);
},
setHeaders: function(){
this.previous.apply(this, arguments);
if (this.sortEnabled) this.detectParsers();
},
detectParsers: function(force){
if (!this.head) return;
var parsers = this.options.parsers,
rows = this.body.rows;
this.parsers = $$(this.head.cells).map(function(cell, index) {
if (!force && (cell.hasClass(this.options.classNoSort) || cell.retrieve('htmltable-sort'))) return cell.retrieve('htmltable-sort');
var sortSpan = new Element('span', {'html': '&#160;', 'class': this.options.classSortSpan}).inject(cell, 'top');
this.sortSpans.push(sortSpan);
var parser = parsers[index],
cancel;
switch ($type(parser)) {
case 'function': parser = {convert: parser}; cancel = true; break;
case 'string': parser = parser; cancel = true; break;
}
if (!cancel) {
HtmlTable.Parsers.some(function(current) {
var match = current.match;
if (!match) return false;
if (Browser.Engine.trident) return false;
for (var i = 0, j = rows.length; i < j; i++) {
var text = rows[i].cells[index].get('html').clean();
if (text && match.test(text)) {
parser = current;
return true;
}
}
});
}
if (!parser) parser = this.options.defaultParser;
cell.store('htmltable-parser', parser);
return parser;
}, this);
},
headClick: function(event, el) {
if (!this.head) return;
var index = Array.indexOf(this.head.cells, el);
this.sort(index);
return false;
},
sort: function(index, reverse, pre) {
if (!this.head) return;
pre = !!(pre);
var classCellSort = this.options.classCellSort;
var classGroup = this.options.classGroup,
classGroupHead = this.options.classGroupHead;
if (!pre) {
if (index != null) {
if (this.sorted.index == index) {
this.sorted.reverse = !(this.sorted.reverse);
} else {
if (this.sorted.index != null) {
this.sorted.reverse = false;
this.head.cells[this.sorted.index].removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev);
} else {
this.sorted.reverse = true;
}
this.sorted.index = index;
}
} else {
index = this.sorted.index;
}
if (reverse != null) this.sorted.reverse = reverse;
var head = document.id(this.head.cells[index]);
if (head) {
head.addClass(this.options.classHeadSort);
if (this.sorted.reverse) head.addClass(this.options.classHeadSortRev);
else head.removeClass(this.options.classHeadSortRev);
}
this.body.getElements('td').removeClass(this.options.classCellSort);
}
var parser = this.parsers[index];
if ($type(parser) == 'string') parser = HtmlTable.Parsers.get(parser);
if (!parser) return;
if (!Browser.Engine.trident) {
var rel = this.body.getParent();
this.body.dispose();
}
var data = Array.map(this.body.rows, function(row, i) {
var value = parser.convert.call(document.id(row.cells[index]));
return {
position: i,
value: value,
toString:  function() {
return value.toString();
}
};
}, this);
data.reverse(true);
data.sort(function(a, b){
if (a.value === b.value) return 0;
return a.value > b.value ? 1 : -1;
});
if (!this.sorted.reverse) data.reverse(true);
var i = data.length, body = this.body;
var j, position, entry, group;
while (i) {
var item = data[--i];
position = item.position;
var row = body.rows[position];
if (row.disabled) continue;
if (!pre) {
if (group === item.value) {
row.removeClass(classGroupHead).addClass(classGroup);
} else {
group = item.value;
row.removeClass(classGroup).addClass(classGroupHead);
}
if (this.zebra) this.zebra(row, i);
row.cells[index].addClass(classCellSort);
}
body.appendChild(row);
for (j = 0; j < i; j++) {
if (data[j].position > position) data[j].position--;
}
};
data = null;
if (rel) rel.grab(body);
return this.fireEvent('sort', [body, index]);
},
reSort: function(){
if (this.sortEnabled) this.sort.call(this, this.sorted.index, this.sorted.reverse);
return this;
},
enableSort: function(){
this.element.addClass(this.options.classSortable);
this.attachSorts(true);
this.detectParsers();
this.sortEnabled = true;
return this;
},
disableSort: function(){
this.element.remove(this.options.classSortable);
this.attachSorts(false);
this.sortSpans.each(function(span) { span.destroy(); });
this.sortSpans.empty();
this.sortEnabled = false;
return this;
}
});
HtmlTable.Parsers = new Hash({
'date': {
match: /^\d{2}[-\/ ]\d{2}[-\/ ]\d{2,4}$/,
convert: function() {
return Date.parse(this.get('text').format('db'));
},
type: 'date'
},
'input-checked': {
match: / type="(radio|checkbox)" /,
convert: function() {
return this.getElement('input').checked;
}
},
'input-value': {
match: /<input/,
convert: function() {
return this.getElement('input').value;
}
},
'number': {
match: /^\d+[^\d.,]*$/,
convert: function() {
return this.get('text').toInt();
},
number: true
},
'numberLax': {
match: /^[^\d]+\d+$/,
convert: function() {
return this.get('text').replace(/[^-?^0-9]/, '').toInt();
},
number: true
},
'float': {
match: /^[\d]+\.[\d]+/,
convert: function() {
return this.get('text').replace(/[^-?^\d.]/, '').toFloat();
},
number: true
},
'floatLax': {
match: /^[^\d]+[\d]+\.[\d]+$/,
convert: function() {
return this.get('text').replace(/[^-?^\d.]/, '');
},
number: true
},
'string': {
match: null,
convert: function() {
return this.get('text');
}
},
'title': {
match: null,
convert: function() {
return this.title;
}
}
});
HtmlTable = Class.refactor(HtmlTable, {
options: {
useKeyboard: true,
classRowSelected: 'table-tr-selected',
classRowHovered: 'table-tr-hovered',
classSelectable: 'table-selectable',
allowMultiSelect: true,
selectable: false
},
initialize: function(){
this.previous.apply(this, arguments);
if (this.occluded) return this.occluded;
this.selectedRows = new Elements();
this.bound = {
mouseleave: this.mouseleave.bind(this),
focusRow: this.focusRow.bind(this)
};
if (this.options.selectable) this.enableSelect();
},
enableSelect: function(){
this.selectEnabled = true;
this.attachSelects();
this.element.addClass(this.options.classSelectable);
},
disableSelect: function(){
this.selectEnabled = false;
this.attach(false);
this.element.removeClass(this.options.classSelectable);
},
attachSelects: function(attach){
attach = $pick(attach, true);
var method = attach ? 'addEvents' : 'removeEvents';
this.element[method]({
mouseleave: this.bound.mouseleave
});
this.body[method]({
'click:relay(tr)': this.bound.focusRow
});
if (this.options.useKeyboard || this.keyboard){
if (!this.keyboard) this.keyboard = new Keyboard({
events: {
down: function(e) {
e.preventDefault();
this.shiftFocus(1);
}.bind(this),
up: function(e) {
e.preventDefault();
this.shiftFocus(-1);
}.bind(this),
enter: function(e) {
e.preventDefault();
if (this.hover) this.focusRow(this.hover);
}.bind(this)
},
active: true
});
this.keyboard[attach ? 'activate' : 'deactivate']();
}
this.updateSelects();
},
mouseleave: function(){
if (this.hover) this.leaveRow(this.hover);
},
focus: function(){
if (this.keyboard) this.keyboard.activate();
},
blur: function(){
if (this.keyboard) this.keyboard.deactivate();
},
push: function(){
var ret = this.previous.apply(this, arguments);
this.updateSelects();
return ret;
},
updateSelects: function(){
Array.each(this.body.rows, function(row){
var binders = row.retrieve('binders');
if ((binders && this.selectEnabled) || (!binders && !this.selectEnabled)) return;
if (!binders){
binders = {
mouseenter: this.enterRow.bind(this, [row]),
mouseleave: this.leaveRow.bind(this, [row])
};
row.store('binders', binders).addEvents(binders);
} else {
row.removeEvents(binders);
}
}, this);
},
enterRow: function(row){
if (this.hover) this.hover = this.leaveRow(this.hover);
this.hover = row.addClass(this.options.classRowHovered);
},
shiftFocus: function(offset){
if (!this.hover) return this.enterRow(this.body.rows[0]);
var to = Array.indexOf(this.body.rows, this.hover) + offset;
if (to < 0) to = 0;
if (to >= this.body.rows.length) to = this.body.rows.length - 1;
if (this.hover == this.body.rows[to]) return this;
this.enterRow(this.body.rows[to]);
},
leaveRow: function(row){
row.removeClass(this.options.classRowHovered);
},
focusRow: function(){
var row = arguments[1] || arguments[0]; //delegation passes the event first
if (!this.body.getChildren().contains(row)) return;
var unfocus = function(row){
this.selectedRows.erase(row);
row.removeClass(this.options.classRowSelected);
this.fireEvent('rowUnfocus', [row, this.selectedRows]);
}.bind(this);
if (!this.options.allowMultiSelect) this.selectedRows.each(unfocus);
if (!this.selectedRows.contains(row)) {
this.selectedRows.push(row);
row.addClass(this.options.classRowSelected);
this.fireEvent('rowFocus', [row, this.selectedRows]);
} else {
unfocus(row);
}
return false;
},
selectAll: function(status){
status = $pick(status, true);
if (!this.options.allowMultiSelect && status) return;
if (!status) this.selectedRows.removeClass(this.options.classRowSelected).empty();
else this.selectedRows.combine(this.body.rows).addClass(this.options.classRowSelected);
return this;
},
selectNone: function(){
return this.selectAll(false);
}
});
(function(){
var parsed = {};
var modifiers = ['shift', 'control', 'alt', 'meta'];
var regex = /^(?:shift|control|ctrl|alt|meta)$/;
var parse = function(type, eventType){
type = type.toLowerCase().replace(/^(keyup|keydown):/, function($0, $1){
eventType = $1;
return '';
});
if (!parsed[type]){
var key = '', mods = {};
type.split('+').each(function(part){
if (regex.test(part)) mods[part] = true;
else key = part;
});
mods.control = mods.control || mods.ctrl; // allow both control and ctrl
var match = '';
modifiers.each(function(mod){
if (mods[mod]) match += mod + '+';
});
parsed[type] = match + key;
}
return eventType + ':' + parsed[type];
};
this.Keyboard = new Class({
Extends: Events,
Implements: [Options, Log],
options: {
defaultEventType: 'keydown',
active: false,
events: {}
},
initialize: function(options){
this.setOptions(options);
if (Keyboard.manager) Keyboard.manager.manage(this);
this.setup();
},
setup: function(){
this.addEvents(this.options.events);
if (this.options.active) this.activate();
},
handle: function(event, type){
if (!this.active || event.preventKeyboardPropagation) return;
var bubbles = !!this.manager;
if (bubbles && this.activeKB){
this.activeKB.handle(event, type);
if (event.preventKeyboardPropagation) return;
}
this.fireEvent(type, event);
if (!bubbles && this.activeKB) this.activeKB.handle(event, type);
},
addEvent: function(type, fn, internal) {
return this.parent(parse(type, this.options.defaultEventType), fn, internal);
},
removeEvent: function(type, fn) {
return this.parent(parse(type, this.options.defaultEventType), fn);
},
activate: function(){
this.active = true;
return this.enable();
},
deactivate: function(){
this.active = false;
return this.fireEvent('deactivate');
},
toggleActive: function(){
return this[this.active ? 'deactivate' : 'activate']();
},
enable: function(instance){
if (instance) {
if (instance != this.activeKB) this.previous = this.activeKB;
this.activeKB = instance.fireEvent('activate');
} else if (this.manager) {
this.manager.enable(this);
}
return this;
},
relenquish: function(){
if (this.previous) this.enable(this.previous);
},
manage: function(instance) {
if (instance.manager) instance.manager.drop(instance);
this.instances.push(instance);
instance.manager = this;
if (!this.activeKB) this.enable(instance);
else this._disable(instance);
},
_disable: function(instance) {
if (this.activeKB == instance) this.activeKB = null;
},
drop: function(instance) {
this._disable(instance);
this.instances.erase(instance);
},
instances: [],
trace: function(){
this.enableLog();
var item = this;
this.log('the following items have focus: ');
while (item) {
this.log(document.id(item.widget) || item.widget || item, 'active: ' + this.active);
item = item.activeKB;
}
}
});
Keyboard.stop = function(event) {
event.preventKeyboardPropagation = true;
};
Keyboard.manager = new this.Keyboard({
active: true
});
Keyboard.trace = function(){
Keyboard.manager.trace();
};
var handler = function(event){
var mods = '';
modifiers.each(function(mod){
if (event[mod]) mods += mod + '+';
});
Keyboard.manager.handle(event, event.type + ':' + mods + event.key);
};
document.addEvents({
'keyup': handler,
'keydown': handler
});
Event.Keys.extend({
'pageup': 33,
'pagedown': 34,
'end': 35,
'home': 36,
'capslock': 20,
'numlock': 144,
'scrolllock': 145
});
})();
var Mask = new Class({
Implements: [Options, Events],
Binds: ['resize'],
options: {
style: {},
'class': 'mask',
maskMargins: false,
useIframeShim: true
},
initialize: function(target, options){
this.target = document.id(target) || document.body;
this.target.store('mask', this);
this.setOptions(options);
this.render();
this.inject();
},
render: function() {
this.element = new Element('div', {
'class': this.options['class'],
id: this.options.id || 'mask-' + $time(),
styles: $merge(this.options.style, {
display: 'none'
}),
events: {
click: function(){
this.fireEvent('click');
if (this.options.hideOnClick) this.hide();
}.bind(this)
}
});
this.hidden = true;
},
toElement: function(){
return this.element;
},
inject: function(target, where){
where = where || this.options.inject ? this.options.inject.where : '' || this.target == document.body ? 'inside' : 'after';
target = target || this.options.inject ? this.options.inject.target : '' || this.target;
this.element.inject(target, where);
if (this.options.useIframeShim) {
this.shim = new IframeShim(this.element);
this.addEvents({
show: this.shim.show.bind(this.shim),
hide: this.shim.hide.bind(this.shim),
destroy: this.shim.destroy.bind(this.shim)
});
}
},
position: function(){
this.resize(this.options.width, this.options.height);
this.element.position({
relativeTo: this.target,
position: 'topLeft',
ignoreMargins: !this.options.maskMargins,
ignoreScroll: this.target == document.body
});
return this;
},
resize: function(x, y){
var opt = {
styles: ['padding', 'border']
};
if (this.options.maskMargins) opt.styles.push('margin');
var dim = this.target.getComputedSize(opt);
if (this.target == document.body) {
var win = window.getSize();
if (dim.totalHeight < win.y) dim.totalHeight = win.y;
if (dim.totalWidth < win.x) dim.totalWidth = win.x;
}
this.element.setStyles({
width: $pick(x, dim.totalWidth, dim.x),
height: $pick(y, dim.totalHeight, dim.y)
});
return this;
},
show: function(){
if (!this.hidden) return this;
this.target.addEvent('resize', this.resize);
if (this.target != document.body) document.id(document.body).addEvent('resize', this.resize);
this.position();
this.showMask.apply(this, arguments);
return this;
},
showMask: function(){
this.element.setStyle('display', 'block');
this.hidden = false;
this.fireEvent('show');
},
hide: function(){
if (this.hidden) return this;
this.target.removeEvent('resize', this.resize);
this.hideMask.apply(this, arguments);
if (this.options.destroyOnHide) return this.destroy();
return this;
},
hideMask: function(){
this.element.setStyle('display', 'none');
this.hidden = true;
this.fireEvent('hide');
},
toggle: function(){
this[this.hidden ? 'show' : 'hide']();
},
destroy: function(){
this.hide();
this.element.destroy();
this.fireEvent('destroy');
this.target.eliminate('mask');
}
});
Element.Properties.mask = {
set: function(options){
var mask = this.retrieve('mask');
return this.eliminate('mask').store('mask:options', options);
},
get: function(options){
if (options || !this.retrieve('mask')){
if (this.retrieve('mask')) this.retrieve('mask').destroy();
if (options || !this.retrieve('mask:options')) this.set('mask', options);
this.store('mask', new Mask(this, this.retrieve('mask:options')));
}
return this.retrieve('mask');
}
};
Element.implement({
mask: function(options){
this.get('mask', options).show();
return this;
},
unmask: function(){
this.get('mask').hide();
return this;
}
});
var Scroller = new Class({
Implements: [Events, Options],
options: {
area: 20,
velocity: 1,
onChange: function(x, y){
this.element.scrollTo(x, y);
},
fps: 50
},
initialize: function(element, options){
this.setOptions(options);
this.element = document.id(element);
this.listener = ($type(this.element) != 'element') ? document.id(this.element.getDocument().body) : this.element;
this.timer = null;
this.bound = {
attach: this.attach.bind(this),
detach: this.detach.bind(this),
getCoords: this.getCoords.bind(this)
};
},
start: function(){
this.listener.addEvents({
mouseover: this.bound.attach,
mouseout: this.bound.detach
});
},
stop: function(){
this.listener.removeEvents({
mouseover: this.bound.attach,
mouseout: this.bound.detach
});
this.detach();
this.timer = $clear(this.timer);
},
attach: function(){
this.listener.addEvent('mousemove', this.bound.getCoords);
},
detach: function(){
this.listener.removeEvent('mousemove', this.bound.getCoords);
this.timer = $clear(this.timer);
},
getCoords: function(event){
this.page = (this.listener.get('tag') == 'body') ? event.client : event.page;
if (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 / this.options.fps), this);
},
scroll: function(){
var size = this.element.getSize(),
scroll = this.element.getScroll(),
pos = this.element.getOffsets(),
scrollSize = this.element.getScrollSize(),
change = {x: 0, y: 0};
for (var z in this.page){
if (this.page[z] < (this.options.area + pos[z]) && scroll[z] != 0)
change[z] = (this.page[z] - this.options.area - pos[z]) * this.options.velocity;
else if (this.page[z] + this.options.area > (size[z] + pos[z]) && scroll[z] + size[z] != scrollSize[z])
change[z] = (this.page[z] - size[z] + this.options.area - pos[z]) * this.options.velocity;
}
if (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]);
}
});
(function(){
var read = function(option, element){
return (option) ? ($type(option) == 'function' ? option(element) : element.get(option)) : '';
};
this.Tips = new Class({
Implements: [Events, Options],
options: {
onShow: function(){
this.tip.setStyle('display', 'block');
},
onHide: function(){
this.tip.setStyle('display', 'none');
},
title: 'title',
text: function(element){
return element.get('rel') || element.get('href');
},
showDelay: 100,
hideDelay: 100,
className: 'tip-wrap',
offset: {x: 16, y: 16},
fixed: false
},
initialize: function(){
var params = Array.link(arguments, {options: Object.type, elements: $defined});
this.setOptions(params.options);
document.id(this);
if (params.elements) this.attach(params.elements);
},
toElement: function(){
if (this.tip) return this.tip;
this.container = new Element('div', {'class': 'tip'});
return this.tip = new Element('div', {
'class': this.options.className,
styles: {
position: 'absolute',
top: 0,
left: 0
}
}).adopt(
new Element('div', {'class': 'tip-top'}),
this.container,
new Element('div', {'class': 'tip-bottom'})
).inject(document.body);
},
attach: function(elements){
$$(elements).each(function(element){
var title = read(this.options.title, element),
text = read(this.options.text, element);
element.erase('title').store('tip:native', title).retrieve('tip:title', title);
element.retrieve('tip:text', text);
this.fireEvent('attach', [element]);
var events = ['enter', 'leave'];
if (!this.options.fixed) events.push('move');
events.each(function(value){
var event = element.retrieve('tip:' + value);
if (!event) event = this['element' + value.capitalize()].bindWithEvent(this, element);
element.store('tip:' + value, event).addEvent('mouse' + value, event);
}, this);
}, this);
return this;
},
detach: function(elements){
$$(elements).each(function(element){
['enter', 'leave', 'move'].each(function(value){
element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value);
});
this.fireEvent('detach', [element]);
if (this.options.title == 'title'){ // This is necessary to check if we can revert the title
var original = element.retrieve('tip:native');
if (original) element.set('title', original);
}
}, this);
return this;
},
elementEnter: function(event, element){
this.container.empty();
['title', 'text'].each(function(value){
var content = element.retrieve('tip:' + value);
if (content) this.fill(new Element('div', {'class': 'tip-' + value}).inject(this.container), content);
}, this);
$clear(this.timer);
this.timer = this.show.delay(this.options.showDelay, this, element);
this.position((this.options.fixed) ? {page: element.getPosition()} : event);
},
elementLeave: function(event, element){
$clear(this.timer);
this.timer = this.hide.delay(this.options.hideDelay, this, element);
this.fireForParent(event, element);
},
fireForParent: function(event, element){
if (!element) return;
parentNode = element.getParent();
if (parentNode == document.body) return;
if (parentNode.retrieve('tip:enter')) parentNode.fireEvent('mouseenter', event);
else this.fireForParent(parentNode, event);
},
elementMove: function(event, element){
this.position(event);
},
position: function(event){
var size = window.getSize(), scroll = window.getScroll(),
tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
props = {x: 'left', y: 'top'},
obj = {};
for (var z in props){
obj[props[z]] = event.page[z] + this.options.offset[z];
if ((obj[props[z]] + tip[z] - scroll[z]) > size[z]) obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
}
this.tip.setStyles(obj);
},
fill: function(element, contents){
if(typeof contents == 'string') element.set('html', contents);
else element.adopt(contents);
},
show: function(element){
this.fireEvent('show', [this.tip, element]);
},
hide: function(element){
this.fireEvent('hide', [this.tip, element]);
}
});
})();
var Spinner = new Class({
Extends: Mask,
options: {
'class':'spinner',
containerPosition: {},
content: {
'class':'spinner-content'
},
messageContainer: {
'class':'spinner-msg'
},
img: {
'class':'spinner-img'
},
fxOptions: {
link: 'chain'
}
},
initialize: function(){
this.parent.apply(this, arguments);
this.target.store('spinner', this);
var deactivate = function(){ this.active = false; }.bind(this);
this.addEvents({
hide: deactivate,
show: deactivate
});
},
render: function(){
this.parent();
this.element.set('id', this.options.id || 'spinner-'+$time());
this.content = document.id(this.options.content) || new Element('div', this.options.content);
this.content.inject(this.element);
if (this.options.message) {
this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message);
this.msg.inject(this.content);
}
if (this.options.img) {
this.img = document.id(this.options.img) || new Element('div', this.options.img);
this.img.inject(this.content);
}
this.element.set('tween', this.options.fxOptions);
},
show: function(noFx){
if (this.active) return this.chain(this.show.bind(this));
if (!this.hidden) {
this.callChain.delay(20, this);
return this;
}
this.active = true;
return this.parent(noFx);
},
showMask: function(noFx){
var pos = function(){
this.content.position($merge({
relativeTo: this.element
}, this.options.containerPosition));
}.bind(this);
if (noFx) {
this.parent();
pos();
} else {
this.element.setStyles({
display: 'block',
opacity: 0
}).tween('opacity', this.options.style.opacity || 0.9);
pos();
this.hidden = false;
this.fireEvent('show');
this.callChain();
}
},
hide: function(noFx){
if (this.active) return this.chain(this.hide.bind(this));
if (this.hidden) {
this.callChain.delay(20, this);
return this;
}
this.active = true;
return this.parent(noFx);
},
hideMask: function(noFx){
if (noFx) return this.parent();
this.element.tween('opacity', 0).get('tween').chain(function(){
this.element.setStyle('display', 'none');
this.hidden = true;
this.fireEvent('hide');
this.callChain();
}.bind(this));
},
destroy: function(){
this.content.destroy();
this.parent();
this.target.eliminate('spinner');
}
});
Spinner.implement(new Chain);
if (window.Request) {
Request = Class.refactor(Request, {
options: {
useSpinner: false,
spinnerOptions: {},
spinnerTarget: false
},
initialize: function(options){
this._send = this.send;
this.send = function(options){
if (this.spinner) this.spinner.chain(this._send.bind(this, options)).show();
else this._send(options);
return this;
};
this.previous(options);
var update = document.id(this.options.spinnerTarget) || document.id(this.options.update);
if (this.options.useSpinner && update) {
this.spinner = update.get('spinner', this.options.spinnerOptions);
['onComplete', 'onException', 'onCancel'].each(function(event){
this.addEvent(event, this.spinner.hide.bind(this.spinner));
}, this);
}
},
getSpinner: function(){
return this.spinner;
}
});
}
Element.Properties.spinner = {
set: function(options){
var spinner = this.retrieve('spinner');
return this.eliminate('spinner').store('spinner:options', options);
},
get: function(options){
if (options || !this.retrieve('spinner')){
if (this.retrieve('spinner')) this.retrieve('spinner').destroy();
if (options || !this.retrieve('spinner:options')) this.set('spinner', options);
new Spinner(this, this.retrieve('spinner:options'));
}
return this.retrieve('spinner');
}
};
Element.implement({
spin: function(options){
this.get('spinner', options).show();
return this;
},
unspin: function(){
var opt = Array.link(arguments, {options: Object.type, callback: Function.type});
this.get('spinner', opt.options).hide(opt.callback);
return this;
}
});
MooTools.lang.set('en-US', 'Date', {
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
dateOrder: ['month', 'date', 'year'],
shortDate: '%m/%d/%Y',
shortTime: '%I:%M%p',
AM: 'AM',
PM: 'PM',
ordinal: function(dayOfMonth){
return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
},
lessThanMinuteAgo: 'less than a minute ago',
minuteAgo: 'about a minute ago',
minutesAgo: '{delta} minutes ago',
hourAgo: 'about an hour ago',
hoursAgo: 'about {delta} hours ago',
dayAgo: '1 day ago',
daysAgo: '{delta} days ago',
weekAgo: '1 week ago',
weeksAgo: '{delta} weeks ago',
monthAgo: '1 month ago',
monthsAgo: '{delta} months ago',
yearAgo: '1 year ago',
yearsAgo: '{delta} years ago',
lessThanMinuteUntil: 'less than a minute from now',
minuteUntil: 'about a minute from now',
minutesUntil: '{delta} minutes from now',
hourUntil: 'about an hour from now',
hoursUntil: 'about {delta} hours from now',
dayUntil: '1 day from now',
daysUntil: '{delta} days from now',
weekUntil: '1 week from now',
weeksUntil: '{delta} weeks from now',
monthUntil: '1 month from now',
monthsUntil: '{delta} months from now',
yearUntil: '1 year from now',
yearsUntil: '{delta} years from now'
});
MooTools.lang.set('en-US', 'Form.Validator', {
required:'This field is required.',
minLength:'Please enter at least {minLength} characters (you entered {length} characters).',
maxLength:'Please enter no more than {maxLength} characters (you entered {length} characters).',
integer:'Please enter an integer in this field. Numbers with decimals (e.g. 1.25) are not permitted.',
numeric:'Please enter only numeric values in this field (i.e. "1" or "1.1" or "-1" or "-1.1").',
digits:'Please use numbers and punctuation only in this field (for example, a phone number with dashes or dots is permitted).',
alpha:'Please use letters only (a-z) with in this field. No spaces or other characters are allowed.',
alphanum:'Please use only letters (a-z) or numbers (0-9) only in this field. No spaces or other characters are allowed.',
dateSuchAs:'Please enter a valid date such as {date}',
dateInFormatMDY:'Please enter a valid date such as MM/DD/YYYY (i.e. "12/31/1999")',
email:'Please enter a valid email address. For example "fred@domain.com".',
url:'Please enter a valid URL such as http://www.google.com.',
currencyDollar:'Please enter a valid $ amount. For example $100.00 .',
oneRequired:'Please enter something for at least one of these inputs.',
errorPrefix: 'Error: ',
warningPrefix: 'Warning: ',
noSpace: 'There can be no spaces in this input.',
reqChkByNode: 'No items are selected.',
requiredChk: 'This field is required.',
reqChkByName: 'Please select a {label}.',
match: 'This field needs to match the {matchName} field',
startDate: 'the start date',
endDate: 'the end date',
currendDate: 'the current date',
afterDate: 'The date should be the same or after {label}.',
beforeDate: 'The date should be the same or before {label}.',
startMonth: 'Please select a start month',
sameMonth: 'These two dates must be in the same month - you must change one or the other.',
creditcard: 'The credit card number entered is invalid. Please check the number and try again. {length} digits entered.'
});
(function(global){
var $ = global.document.id || global.$;
var isIE6 = Browser.Engine.trident4; // better compression and faster
var BgIframe = new Class({
Implements: Options,
options: {
top		: 'auto',
left	: 'auto',
width	: 'auto',
height	: 'auto',
opacity	: true,
src		: 'javascript:false;'
},
initialize: function(element, options){
if(!isIE6) return;
this.setOptions(options);
this.element = $(element);
var firstChild = this.element.getFirst();
if(!(firstChild && firstChild.hasClass('bgiframe')))
this.element.grab(document.createElement(this.render()), 'top');
},
toPx: function(n){
return isFinite(n) ? n + 'px' : n;
},
render: function(){
var options = this.options;
return '<iframe class="bgiframe" frameborder="0" tabindex="-1" src="' + options.src + '" ' +
'style="display:block;position:absolute;z-index:-1;' +
(options.opacity !== false ? 'filter:alpha(opacity=\'0\');' : '') +
'top:' + (options.top == 'auto' ? 'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')' : this.toPx(options.top)) + ';' +
'left:' + (options.left == 'auto' ? 'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')' : this.toPx(options.left)) + ';' +
'width:' + (options.width == 'auto' ? 'expression(this.parentNode.offsetWidth+\'px\')' : this.toPx(options.width)) + ';' +
'height:' + (options.height == 'auto' ? 'expression(this.parentNode.offsetHeight+\'px\')' : this.toPx(options.height)) + ';' +
'"/>';
}
});
Element.implement('bgiframe', function(options){
if(isIE6) new BgIframe(this, options);
return this;
});
})(this);
(function(global){
var $ = global.document.id || global.$;
var browserEngine = Browser.Engine; // better compression and faster
$extend(Element.NativeEvents, {
'paste': 2, 'input': 2
});
Element.Events.paste = {
base : (browserEngine.presto || (browserEngine.gecko && browserEngine.version < 19)) ? 'input' : 'paste',
condition: function(e){
this.fireEvent('paste', e, 1);
return false;
}
};
Element.Events.keyrepeat = {
base: (browserEngine.trident) ? 'keydown' : 'keypress',
condition: $lambda(true)
};
var Meio = {};
var globalCache;
var keysThatDontChangeValueOnKeyUp = {
9:   1,  // tab
16:  1,  // shift
17:  1,  // control
18:  1,  // alt
224: 1,  // command (meta onkeypress)
91:  1,  // command (meta onkeydown)
37:  1,  // left
38:  1,  // up
39:  1,  // right
40:  1   // down
};
var encode = function(str){
return str.replace(/"/g, '&quot;').replace(/'/g, '&#39;');
};
Meio.Widget = new Class({
initialize: function(){
this.elements = {};
},
addElement: function(name, obj){
this.elements[name] = obj;
},
addEventToElement: function(name, eventName, event){
this.elements[name].addEvent(eventName, event.bindWithEvent(this));
},
addEventsToElement: function(name, events){
for(eventName in events){
this.addEventToElement(name, eventName, events[eventName]);
};
},
attach: function(){
for(element in this.elements){
this.elements[element].attach();
}
},
detach: function(){
for(element in this.elements){
this.elements[element].detach();
}
},
destroy: function(){
for(element in this.elements){
this.elements[element] && this.elements[element].destroy();
}
}
});
Meio.Autocomplete = new Class({
Extends: Meio.Widget,
Implements: [Options, Events],
options: {
delay: 200,
minChars: 0,
cacheLength: 20,
selectOnTab: true,
maxVisibleItems: 10,
cacheType: 'shared', // 'shared' or 'own'
filter: {
},
fieldOptions: {}, // see Element options
listOptions: {}, // see List options
requestOptions: {}, // see DataRequest options
urlOptions: {} // see URL options
},
initialize: function(input, data, options, listInstance){
this.parent();
this.setOptions(options);
this.active = 0;
this.filters = Meio.Autocomplete.Filter.get(this.options.filter);
this.addElement('list', listInstance || new Meio.Element.List(this.options.listOptions));
this.addListEvents();
this.addElement('field', new Meio.Element.Field(input, this.options.fieldOptions));
this.addFieldEvents();
this.addSelectEvents();
this.attach();
this.initCache();
this.initData(data);
},
addFieldEvents: function(){
this.addEventsToElement('field', {
'beforeKeyrepeat': function(e){
this.active = 1;
var e_key = e.key, list = this.elements.list;
if(e_key == 'up' || e_key == 'down' || (e_key == 'enter' && list.showing)) e.preventDefault();
},
'delayedKeyrepeat': function(e){
var e_key = e.key, field = this.elements.field;
field.keyPressControl[e_key] = true;
switch(e_key){
case 'up': case 'down':
this.focusItem(e_key);
break;
case 'enter':
this.setInputValue();
break;
case 'tab':
if(this.options.selectOnTab) this.setInputValue();
field.keyPressControl[e_key] = false; // tab blurs the input so the keyup event wont happen at the same input you made a keydown
break;
case 'esc':
this.elements.list.hide();
break;
default:
this.setupList();
}
this.oldInputedText = field.node.get('value');
},
'keyup': function(e){
var field = this.elements.field;
if(!keysThatDontChangeValueOnKeyUp[e.code]){
if(!field.keyPressControl[e.key]) this.setupList();
field.keyPressControl[e.key] = false;
}
},
'focus': function(){
this.active = 1;
var list = this.elements.list;
list.focusedItem = null;
list.positionNextTo(this.elements.field.node);
},
'click': function(){
if(this.active++ > 1 && !this.elements.list.showing){
this.forceSetupList();
}
},
'blur': function(e){
this.active = 0;
var list = this.elements.list;
if(list.shouldNotBlur){
this.elements.field.node.setCaretPosition('end');
list.shouldNotBlur = false;
if(list.focusedItem) list.hide();
}else{
list.hide();
}
},
'paste': function(){
return this.setupList();
}
});
},
addListEvents: function(){
this.addEventsToElement('list', {
'mousedown': function(e){
if(this.active && !e.dontHide) this.setInputValue();
}
});
},
update: function(){
var text = this.inputedText, data = this.data, options = this.options, list = this.elements.list;
var filter = this.filters.filter, formatMatch = this.filters.formatMatch, formatItem = this.filters.formatItem;
var cacheKey = data.getKey(), cached = this.cache.get(cacheKey), html;
if(cached){
html = cached.html;
this.itemsData = cached.data;
}else{
data = data.get();
var itemsHtml = [], itemsData = [], classes = list.options.classes;
for(var row, i = 0, n = 0; row = data[i++];){
if(filter.call(this, text, row)){
itemsHtml.push(
'<li title="', encode(formatMatch.call(this, text, row)),
'" data-index="', n,
'" class="', (n%2 ? classes.even : classes.odd), '">',
formatItem.call(this, text, row, n),
'</li>'
);
itemsData.push(row);
n++;
}
}
html = itemsHtml.join('');
this.cache.set(cacheKey, {html: html, data: itemsData});
this.itemsData = itemsData;
}
list.focusedItem = null;
this.fireEvent('deselect', [this.elements]);
list.list.set('html', html);
if(this.options.maxVisibleItems) list.applyMaxHeight(this.options.maxVisibleItems);
},
setupList: function(){
this.inputedText = this.elements.field.node.get('value');
if(this.inputedText !== this.oldInputedText){
this.forceSetupList(this.inputedText);
}else{
this.elements.list.hide();
}
return true;
},
forceSetupList: function(inputedText){
inputedText = inputedText || this.elements.field.node.get('value');
if(inputedText.length >= this.options.minChars){
$clear(this.prepareTimer);
this.prepareTimer = this.data.prepare.delay(this.options.delay, this.data, this.inputedText);
}
},
dataReady: function(){
this.update();
if(this.onUpdate){
this.onUpdate();
this.onUpdate = null;
}
var list = this.elements.list;
if(list.list.get('html')){
if(this.active) list.show();
}else{
this.fireEvent('noItemToList', [this.elements]);
list.hide();
}
},
setInputValue: function(){
var list = this.elements.list;
if(list.focusedItem){
var text = list.focusedItem.get('title');
this.elements.field.node.set('value', text);
var index = list.focusedItem.get('data-index');
this.fireEvent('select', [this.elements, this.itemsData[index], text, index]);
}
list.hide();
},
focusItem: function(direction){
var list = this.elements.list;
if(list.showing){
list.focusItem(direction);
}else{
this.forceSetupList();
this.onUpdate = function(){ list.focusItem(direction); };
}
},
addSelectEvents: function(){
this.addEvents({
select: function(elements){
elements.field.addSelectedClass();
},
deselect: function(elements){
elements.field.removeSelectedClass();
}
});
},
initData: function(data){
this.data = ($type(data) == 'string') ?
new Meio.Autocomplete.Data.Request(data, this.cache, this.elements.field, this.options.requestOptions, this.options.urlOptions) :
new Meio.Autocomplete.Data(data, this.cache);
this.data.addEvent('ready', this.dataReady.bind(this));
},
initCache: function(){
var cacheLength = this.options.cacheLength;
if(this.options.cacheType == 'shared'){
this.cache = globalCache;
this.cache.setMaxLength(cacheLength);
}else{ // 'own'
this.cache = new Meio.Autocomplete.Cache(cacheLength);
}
},
refreshCache: function(cacheLength){
this.cache.refresh();
this.cache.setMaxLength(cacheLength || this.options.cacheLength);
},
refreshAll: function(cacheLength, urlOptions){
this.refreshCache(cacheLength);
this.data.refreshKey(urlOptions);
}
});
Meio.Autocomplete.Select = new Class({
Extends: Meio.Autocomplete,
options: {
syncName: 'id', // if falsy it wont sync at start
valueField: null,
valueFilter: function(data){
return data.id;
}
},
initialize: function(input, data, options, listInstance){
this.parent(input, data, options, listInstance);
this.valueField = $(this.options.valueField);
if(!this.valueField) return;
if(this.options.syncName){
this.syncWithValueField(data);
}
this.addValueFieldEvents();
},
addValueFieldEvents: function(){
this.addEvents({
'select': function(elements, data){
this.valueField.set('value', this.options.valueFilter.call(this, data));
},
'deselect': function(elements){
this.valueField.set('value', '');
}
});
},
syncWithValueField: function(data){
var value = this.getValueFromValueField();
if(!value) return;
this.addParameter(data);
this.addDataReadyEvent(value);
this.data.prepare(this.elements.field.node.get('value'));
},
addParameter: function(data){
this.parameter = {
name: this.options.syncName,
value: function(){ return this.valueField.value; }.bind(this)
};
if(this.data.url) this.data.url.addParameter(this.parameter);
},
addDataReadyEvent: function(value){
var self = this;
this.data.addEvent('ready', function runOnce(){
var values = this.get();
for(var i = values.length; i--;){
if(self.options.valueFilter.call(self, values[i]) == value){
self.elements.field.node.set('value', self.filters.formatMatch.call(self, '', values[i], 0));
}
}
if(this.url) this.url.removeParameter(self.parameter);
this.removeEvent('ready', runOnce);
});
},
getValueFromValueField: function(){
return this.valueField.get('value');
}
});
Meio.Autocomplete.Select.One = new Class({
Extends: Meio.Autocomplete.Select,
options: {
filter: {
path: 'text' // path to the text value on each object thats contained on the data array
}
},
initialize: function(select, options, listInstance){
this.select = $(select);
this.replaceSelect();
this.parent(this.field, this.createDataArray(), $merge(options, {
valueField: this.select,
valueFilter: function(data){ return data.value; }
}), listInstance);
},
replaceSelect: function(){
var selectedOption = this.select.getSelected()[0];
this.field = new Element('input', {type: 'text'});
var optionValue = selectedOption.get('value');
if($chk(optionValue)) this.field.set('value', selectedOption.get('html'));
this.select.setStyle('display', 'none');
this.field.inject(this.select, 'after');
},
createDataArray: function(){
var selectOptions = this.select.options, data = [];
for(var i = 0, selectOption, optionValue; selectOption = selectOptions[i++];){
optionValue = selectOption.value;
if($chk(optionValue)) data.push({value: optionValue, text: selectOption.innerHTML});
}
return data;
},
addValueFieldEvents: function(){
this.addEvents({
'select': function(elements, data, text, index){
var option = this.valueField.getElement('option[value="' + this.options.valueFilter.call(this, data) + '"]');
if(option) option.selected = true;
},
'deselect': function(elements){
var option = this.valueField.getSelected()[0];
if(option) option.selected = false;
}
});
},
getValueFromValueField: function(){
return this.valueField.getSelected()[0].get('value');
}
});
Meio.Element = new Class({
Implements: [Events],
initialize: function(node){
this.setNode(node);
this.createBoundEvents();
this.attach();
},
setNode: function(node){
this.node = node ? $(node) || $$(node)[0] : this.render();
},
createBoundEvents: function(){
this.bound = {};
this.boundEvents.each(function(evt){
this.bound[evt] = function(e){
this.fireEvent('before' + evt.capitalize(), e);
this[evt] && this[evt](e);
this.fireEvent(evt, e);
return true;
}.bindWithEvent(this);
}, this);
},
attach: function(){
for(e in this.bound){
this.node.addEvent(e, this.bound[e]);
}
},
detach: function(){
for(e in this.bound){
this.node.removeEvent(e, this.bound[e]);
}
},
toElement: function(){
this.node;
},
render: $empty
});
Meio.Element.Field = new Class({
Extends: Meio.Element,
Implements: [Options],
options: {
classes: {
loading: 'ma-loading',
selected: 'ma-selected'
}
},
initialize: function(field, options){
this.keyPressControl = {};
this.boundEvents = ['paste', 'focus', 'blur', 'click', 'keyup', 'keyrepeat'];
if(browserEngine.trident4) this.boundEvents.push('keypress'); // yeah super ugly, but what can be awesome with ie?
this.setOptions(options);
this.parent(field);
$(global).addEvent('unload', function(){
if(this.node) this.node.set('autocomplete', 'on'); // if autocomplete is off when you reload the page the input value gets erased
}.bind(this));
},
setNode: function(element){
this.parent(element);
this.node.set('autocomplete', 'off');
},
keyrepeat: function(e){
$clear(this.keyrepeatTimer);
this.keyrepeatTimer = this._keyrepeat.delay(1, this, e);
},
_keyrepeat: function(e){
this.fireEvent('delayedKeyrepeat', e);
},
destroy: function(){
this.detach();
this.node.removeAttribute('autocomplete');
},
addLoadingClass: function(){
this.node.addClass(this.options.classes.loading);
},
removeLoadingClass: function(){
this.node.removeClass(this.options.classes.loading);
},
addSelectedClass: function(){
this.node.addClass(this.options.classes.selected);
},
removeSelectedClass: function(){
this.node.removeClass(this.options.classes.selected);
},
keypress: function(e){
if(e.key == 'enter') this.bound.keyrepeat(e);
}
});
Meio.Element.List = new Class({
Extends: Meio.Element,
Implements: [Options],
options: {
width: 'field', // you can pass any other value settable by set('width') to the list container
classes: {
container: 'ma-container',
hover: 'ma-hover',
odd: 'ma-odd',
even: 'ma-even'
}
},
initialize: function(options){
this.boundEvents = ['mousedown', 'mouseover'];
this.setOptions(options);
this.parent();
this.focusedItem = null;
},
applyMaxHeight: function(maxVisibleItems){
var listChildren = this.list.childNodes;
var node = listChildren[maxVisibleItems - 1] || (listChildren.length ? listChildren[listChildren.length - 1] : null);
if(!node) return;
node = $(node);
for(var i = 2; i--;) this.node.setStyle('height', node.getCoordinates(this.list).bottom);
},
mouseover: function(e){
var item = this.getItemFromEvent(e), hoverClass = this.options.classes.hover;
if(!item) return true;
if(this.focusedItem) this.focusedItem.removeClass(hoverClass);
item.addClass(hoverClass);
this.focusedItem = item;
this.fireEvent('focusItem', [this.focusedItem]);
},
mousedown: function(e){
e.preventDefault();
this.shouldNotBlur = true;
if(!(this.focusedItem = this.getItemFromEvent(e))){
e.dontHide = true;
return true;
}
this.focusedItem.removeClass(this.options.classes.hover);
},
focusItem: function(direction){
var hoverClass = this.options.classes.hover, newFocusedItem;
if(this.focusedItem){
if((newFocusedItem = this.focusedItem[direction == 'up' ? 'getPrevious' : 'getNext']())){
this.focusedItem.removeClass(hoverClass);
newFocusedItem.addClass(hoverClass);
this.focusedItem = newFocusedItem;
this.scrollFocusedItem(direction);
}
}
else{
if((newFocusedItem = this.list.getFirst())){
newFocusedItem.addClass(hoverClass);
this.focusedItem = newFocusedItem;
}
}
},
scrollFocusedItem: function(direction){
var focusedItemCoordinates = this.focusedItem.getCoordinates(this.list),
scrollTop = this.node.scrollTop;
if(direction == 'down'){
var delta = focusedItemCoordinates.bottom - this.node.getStyle('height').toInt();
if((delta - scrollTop) > 0){
this.node.scrollTop = delta;
}
}else{
var top = focusedItemCoordinates.top;
if(scrollTop && scrollTop > top){
this.node.scrollTop = top;
}
}
},
getItemFromEvent: function(e){
var target = e.target;
while(target && target.tagName != 'LI'){
if(target === this.node) return null;
target = target.parentNode;
}
return $(target);
},
render: function(){
var node = new Element('div', {'class': this.options.classes.container});
if(node.bgiframe) node.bgiframe({top: 0, left: 0});
this.list = new Element('ul').inject(node);
$(document.body).grab(node);
return node;
},
positionNextTo: function(fieldNode){
var width = this.options.width, listNode = this.node;
var elPosition = fieldNode.getCoordinates();
listNode.setStyle('width', width == 'field' ? fieldNode.getWidth().toInt() - listNode.getStyle('border-left-width').toInt() - listNode.getStyle('border-right-width').toInt() : width);
listNode.setPosition({x: elPosition.left, y: elPosition.bottom});
},
show: function(){
this.node.scrollTop = 0;
this.node.setStyle('visibility', 'visible');
this.showing = true;
},
hide: function(){
this.showing = false;
this.node.setStyle('visibility', 'hidden');
}
});
Meio.Autocomplete.Filter = {
filters: {},
get: function(options){
var type = options.type, keys = (options.path || '').split('.');
var filters = (type && this.filters[type]) ? this.filters[type](this, keys) : options;
return $merge(this.defaults(keys), filters);
},
define: function(name, options){
this.filters[name] = options;
},
defaults: function(keys){
var self = this;
return {
filter: function(text, data){
return text ? self._getValueFromKeys(data, keys).test(new RegExp(text.escapeRegExp(), 'i')) : true;
},
formatMatch: function(text, data){
return self._getValueFromKeys(data, keys);
},
formatItem: function(text, data, i){
return text ? self._getValueFromKeys(data, keys).replace(new RegExp('(' + text.escapeRegExp() + ')', 'gi'), '<strong>$1</strong>') : self._getValueFromKeys(data, keys);
}
};
},
_getValueFromKeys: function(obj, keys){
var key, value = obj;
for(var i = 0; key = keys[i++];) value = value[key];
return value;
}
};
Meio.Autocomplete.Filter.define('contains', function(self, keys){return {};});
Meio.Autocomplete.Filter.define('startswith', function(self, keys){
return {
filter: function(text, data){
return text ? self._getValueFromKeys(data, keys).test(new RegExp('^' + text.escapeRegExp(), 'i')) : true;
}
};
});
Meio.Autocomplete.Data = new Class({
Implements: [Options, Events],
initialize: function(data, cache){
this._cache = cache;
this.data = data;
this.dataString = JSON.encode(this.data);
},
get: function(){
return this.data;
},
getKey: function(){
return this.cachedKey;
},
prepare: function(text){
this.cachedKey = this.dataString + (text || '');
this.fireEvent('ready');
},
cache: function(key, data){
this._cache.set(key, data);
},
refreshKey: $empty
});
Meio.Autocomplete.Data.Request = new Class({
Extends: Meio.Autocomplete.Data,
options: {
noCache: true
},
initialize: function(url, cache, element, options, urlOptions){
this.setOptions(options);
this.rawUrl = url;
this._cache = cache;
this.element = element;
this.urlOptions = urlOptions;
this.refreshKey();
this.createRequest();
},
prepare: function(text){
this.cachedKey = this.url.evaluate(text);
if(this._cache.has(this.cachedKey)){
this.fireEvent('ready');
}else{
this.request.send({url: this.cachedKey});
}
},
createRequest: function(){
var self = this;
this.request = new Request.JSON(this.options);
this.request.addEvents({
request: function(){
self.element.addLoadingClass();
},
complete: function(){
self.element.removeLoadingClass();
},
success: function(jsonResponse){
self.data = jsonResponse;
self.fireEvent('ready');
}
});
},
refreshKey: function(urlOptions){
urlOptions = $merge(this.urlOptions, {url: this.rawUrl}, urlOptions || {});
this.url = new Meio.Autocomplete.Data.Request.URL(urlOptions.url, urlOptions);
}
});
Meio.Autocomplete.Data.Request.URL = new Class({
Implements: [Options],
options: {
extraParams: null,
max: 20
},
initialize: function(url, options){
this.setOptions(options);
this.rawUrl = url;
this.url = url;
this.url += this.url.contains('?') ? '&' : '?';
this.dynamicExtraParams = [];
var params = $splat(this.options.extraParams);
for(var i = params.length; i--;){
this.addParameter(params[i]);
}
if(this.options.max) this.addParameter('limit=' + this.options.max);
},
evaluate: function(text){
text = text || '';
var params = this.dynamicExtraParams, url = [];
url.push('q=' + encodeURIComponent(text));
for(var i = params.length; i--;){
url.push(encodeURIComponent(params[i].name) + '=' + encodeURIComponent($lambda(params[i].value)()));
}
return this.url + url.join('&');
},
addParameter: function(param){
if(isFinite(param.nodeType) || $type(param.value) == 'function'){
this.dynamicExtraParams.push(param);
}else{
this.url += (($type(param) == 'string') ? param : encodeURIComponent(param.name) + '=' + encodeURIComponent(param.value)) + '&';
}
},
removeParameter: function(param){
this.dynamicExtraParams.erase(param);
}
});
Meio.Autocomplete.Cache = new Class({
initialize: function(maxLength){
this.refresh();
this.setMaxLength(maxLength);
},
set: function(key, value){
if(!this.cache[key]){
if(this.getLength() >= this.maxLength){
var keyToRemove = this.pos.shift();
this.cache[keyToRemove] = null;
delete this.cache[keyToRemove];
}
this.cache[key] = value;
this.pos.push(key);
}
return this;
},
get: function(key){
return this.cache[key || ''] || null;
},
has: function(key){
return !!this.get(key);
},
getLength: function(){
return this.pos.length;
},
refresh: function(){
this.cache = {};
this.pos = [];
},
setMaxLength: function(maxLength){
this.maxLength = Math.max(maxLength, 1);
}
});
globalCache = new Meio.Autocomplete.Cache();
if($defined(global.Meio)) $extend(global.Meio, Meio);
else global.Meio = Meio;
})(this);
var NXC = NXC || {};
NXC.Paginator = NXC.Paginator || {};
NXC.Paginator.Base = new Class( {
Implements: [Options, Events],
options: {
'navigationBlocks': [ 'paginator' ],
'quantityBlocks': [ 'paginator-quantity-top', 'paginator-quantity-bottom' ],
'possbileQuantities': [ 5, 10, 25, 50 ],
'defaultQuantity': 10,
'currentQuantityCSSClass': 'paginator-quantity-current',
'otherQuantityCSSClass': 'paginator-quantity-other',
'currentLinkCSSClass': 'paginator-current',
'otherLinkCSSClass': 'paginator-other',
'disabledLinkCSSClass': 'paginator-disabled',
'prevLinkTitle': '&laquo;Previous',
'nextLinkTitle': 'Next&raquo;',
'prevLinkCSSClass': 'paginator-prev',
'nextLinkCSSClass': 'paginator-next',
'currentURL': true
},
itemsPerPage: 10,
pagesCount: 0,
currentPage: 1,
quantityBlocks: [],
navigationBlocks: [],
initialize: function( options ) {
this.setOptions( options );
this.itemsPerPage = this.options.defaultQuantity;
},
build: function() {
this.parseURL();
this.pagesCount = this.getPagesCount();
if ( this.pagesCount > 1 ) {
this.installPagesNavigation();
this.installQuantityNavigatoion();
}
this.showPage();
},
parseURL: function() {
if( this.options.currentURL ) {
var uri = new URI();
if( uri.get( 'fragment' ) ) {
var quantity = this.itemsPerPage;
var parts = uri.get( 'fragment' ).split( '/' );
parts.each( function( part ) {
var partElements = part.split( '=' );
if( partElements.length == 2 ) {
switch( partElements[0] ) {
case 'quatity':
quantity = partElements[1].toInt();
break;
case 'page':
this.currentPage = partElements[1].toInt();
break;
}
}
}.bind( this ) );
if( this.options.possbileQuantities.contains( quantity ) ) {
this.setItemsPerPage( quantity );
}
}
}
},
installPagesNavigation: function() {
this.options.navigationBlocks.each( function( el ) {
var navigationBlock = document.id( el );
if( $type( navigationBlock ) == 'element' ) {
this.navigationBlocks.include( navigationBlock );
}
}.bind( this ) );
this.navigationBlocks.each( function( navigationBlock ) {
navigationBlock.empty();
this.buildPagesNavigationLink( this.options.prevLinkTitle, this.options.prevLinkCSSClass )
.inject( navigationBlock )
.addEvent( 'click', function() {
if( this.currentPage == 1 ) {
return false;
}
this.currentPage--;
this.showPage();
}.bind( this ) );
if( this.pagesCount > 1 ) {
var pageNumber = 1;
while ( pageNumber <= this.pagesCount ) {
this.buildNavigationLink( pageNumber, navigationBlock );
pageNumber++;
}
}
this.buildPagesNavigationLink( this.options.nextLinkTitle, this.options.nextLinkCSSClass )
.inject( navigationBlock )
.addEvent( 'click', function() {
if( this.currentPage == this.pagesCount ) {
return false;
}
this.currentPage++;
this.showPage();
}.bind( this ) );
}.bind( this ) );
},
buildPagesNavigationLink: function( html, cssClass ) {
return new Element( 'a', {
'html': html,
'href': '#',
'class': cssClass,
'events': {
'click': function( e ){ e.stop(); }
}
} );
},
buildNavigationLink: function( pageNumber, container ) {
var el = this.buildPagesNavigationLink(
pageNumber,
( pageNumber == this.currentPage ) ? this.options.currentLinkCSSClass : this.options.otherLinkCSSClass
).inject( container ).store( 'page', pageNumber );
el.addEvent( 'click', function() {
this.currentPage = el.retrieve( 'page' );
this.showPage();
}.bind( this ) );
},
installQuantityNavigatoion: function() {
this.options.quantityBlocks.each( function( el ) {
var quantityBlock = document.id( el );
if( quantityBlock ) {
this.quantityBlocks.include( quantityBlock );
}
}.bind( this ) );
this.quantityBlocks.each( function( quantityBlock ) {
quantityBlock.empty();
this.options.possbileQuantities.each( function( quantity ) {
if( $type( quantity ) == 'number' ) {
new Element( 'a', {
'href': '#',
'html': quantity,
'class': ( quantity == this.itemsPerPage ) ? this.options.currentQuantityCSSClass : this.options.otherQuantityCSSClass,
'events': {
'click': function( e ){ e.stop(); }
}
} )
.inject( quantityBlock )
.store( 'quantity', quantity )
.addEvent( 'click', this.setItemsPerPage.bind( this, quantity ) )
}
}.bind( this ) );
}.bind( this ) );
},
setItemsPerPage: function( itemsCount ) {
var otherClass   = this.options.otherQuantityCSSClass;
var currentClass = this.options.currentQuantityCSSClass;
this.quantityBlocks.each( function( quantityBlock ) {
quantityBlock.getElements( 'a.' + otherClass ).extend(
quantityBlock.getElements( 'a.' + currentClass )
).each( function( el ) {
el.removeClass( otherClass );
el.removeClass( currentClass );
if( el.retrieve( 'quantity' ) == itemsCount ) {
el.addClass( currentClass );
} else {
el.addClass( otherClass );
}
} );
}.bind( this ) );
this.itemsPerPage = itemsCount;
this.pagesCount = this.getPagesCount();
if( this.currentPage > this.pagesCount ) {
this.currentPage = this.pagesCount;
}
this.installPagesNavigation();
this.showPage();
},
showPage: function() {
var linkClassCurrent  = this.options.currentLinkCSSClass;
var linkClassOther    = this.options.otherLinkCSSClass;
var linkClassDisabled = this.options.disabledLinkCSSClass;
this.navigationBlocks.each( function( navigationBlock ) {
if( this.pagesCount > 1 ) {
navigationBlock.getElements( 'a.' + linkClassOther ).extend(
navigationBlock.getElements( 'a.' + linkClassCurrent )
).each( function( el ) {
el.removeClass( linkClassOther );
el.removeClass( linkClassCurrent );
if( el.retrieve( 'page' ) == this.currentPage ) {
el.addClass( linkClassCurrent );
} else {
el.addClass( linkClassOther );
}
}.bind( this ) );
}
var prevLink = navigationBlock.getElement( 'a.' + this.options.prevLinkCSSClass );
var nextLink = navigationBlock.getElement( 'a.' + this.options.nextLinkCSSClass );
prevLink.removeClass( linkClassDisabled );
nextLink.removeClass( linkClassDisabled );
if( this.currentPage == 1 ) {
prevLink.addClass( linkClassDisabled );
}
if( this.currentPage == this.pagesCount ) {
nextLink.addClass( linkClassDisabled );
}
}.bind( this ) );
this.showItems();
this.updateCurrentURI();
},
updateCurrentURI: function() {
if( this.options.currentURL != false ) {
var uri = new URI();
uri.set( 'fragment', 'page=' + this.currentPage + '/quatity=' + this.itemsPerPage );
window.location = uri.toString();
}
},
calculatePagesCount: function() {},
showItems: function() {}
} );
NXC.Paginator.Simple = new Class( {
Extends: NXC.Paginator.Base,
Implements: [Options, Events],
options: {
'onShowPage': $empty()
},
initialize: function( blocksCSSPath, options ) {
this.blocks = document.getElements( blocksCSSPath );
this.setOptions( options );
this.parent( options );
},
getPagesCount: function() {
return Math.ceil( this.blocks.length / this.itemsPerPage );
},
showItems: function() {
var minBlock = ( this.currentPage - 1 ) * this.itemsPerPage;
var maxBlock = this.currentPage * this.itemsPerPage;
var displayItems = [];
var tag = ( this.blocks[0] ) ? this.blocks[0].get( 'tag' ) : false;
var displayStyle = 'block';
if( tag == 'tr' && !Browser.Engine.trident ) {
displayStyle = 'table-row';
} else if ( tag == 'li' ) {
displayStyle = 'list-item';
}
this.blocks.each( function( block, index ) {
if( index >= minBlock && index < maxBlock ) {
block.setStyle( 'display', displayStyle );
displayItems.include( block );
} else {
block.setStyle( 'display', 'none' );
}
} );
new Fx.Scroll( window ).toElement( this.blocks[0] );
this.fireEvent( 'pageShow', [ displayItems ] );
}
} );
NXC.Paginator.AJAX = new Class( {
Extends: NXC.Paginator.Base,
Implements: [Options, Events],
options: {
'onStartShowPage': $empty(),
'onCompleteShowPage': $empty()
},
ajaxURL: '',
itemsContainer: false,
itemsCount: 0,
initialize: function( ajaxURL, itemsContainer, itemsCount, options ) {
this.ajaxURL        = ajaxURL;
this.itemsContainer = document.id( itemsContainer );
this.itemsCount     = itemsCount;
this.setOptions( options );
this.parent( options );
},
getPagesCount: function() {
return Math.ceil( this.itemsCount / this.itemsPerPage );
},
showItems: function() {
this.fireEvent( 'startShowPage' );
this.itemsContainer.empty();
new Request.HTML( {
'url': this.ajaxURL.replace( '%offset%', ( this.currentPage -1 ) * this.itemsPerPage ).replace( '%limit%', this.itemsPerPage ),
'method': 'get',
'update': this.itemsContainer,
'onSuccess': function() {
new Fx.Scroll( window ).toElement( this.itemsContainer );
this.fireEvent( 'onCompleteShowPage' );
}.bind( this )
} ).send( 'offset=' + ( this.currentPage -1 ) * this.itemsPerPage  + '&limit=' + this.itemsPerPage );
}
} );
var NXC = NXC || {};
NXC.MessageStack = new Class( {
Implements: [Options, Events],
options:{
'stackBlockClass' : 'nxc-message-stack'
},
stackBlock : false,
initialize: function( options ) {
this.setOptions( options );
this.images = $$( this.options.imagesSelector );
this.createStackBlock();
},
createStackBlock: function() {
this.stackBlock = new Element( 'div', { 'class': this.options.stackBlockClass } ).inject( document.body );
},
showMessage: function( text, type, options ) {
var messageInstance = new NXC.NotifyMessage( text, type, options )
messageInstance.getMessageElement().inject( this.stackBlock );
}
} );
var NXC = NXC || {};
NXC.NotifyMessage = new Class( {
Implements : [Options, Events],
options:{
'tag'              : 'div',
'hideTimeout'      : 5000,
'hideTweenOptions' : {
'property': 'opacity',
'duration': 500
},
'closButtonClass'  : 'nxc-message-close-button',
'typesClasses'     : {
'notice'         : 'nxc-message-notice',
'warning'        : 'nxc-message-warning',
'error'          : 'nxc-message-error'
}
},
message : false,
initialize: function( text, type, options ) {
this.setOptions( options );
this.message = new Element( this.options.tag, {
'class' : $defined( this.options.typesClasses[ type ] ) ? this.options.typesClasses[ type ] : type,
'html'  : text
} );
if( this.options.hideTimeout.toInt() > 0 ) {
this.message.store(
'hideFunctionTimeout',
this.hide.delay( this.options.hideTimeout, this, [] )
);
}
var closeButton = new Element( 'a', {
'class'  : this.options.closButtonClass,
'html'   : '&nbsp',
'href'   : '#',
'events' : {
'click' : function( event ) {
event.stop();
this.hide();
}.bind( this )
}
} ).inject( this.message, 'top' );
},
hide: function() {
var hideFunctionTimeout = this.message.retrieve( 'hideFunctionTimeout', false );
if( hideFunctionTimeout !== false ) {
$clear( hideFunctionTimeout );
}
this.message.get( 'tween', this.options.hideTweenOptions ).start( 0 ).chain(
function() { this.message.setStyle( 'display', 'none' ); }.bind( this )
);
},
getMessageElement: function() {
return this.message;
}
} );
var DatePicker = new Class({
Implements: Options,
d: '',
today: '',
choice: {},
bodysize: {},
limit: {},
attachTo: null,    // selector for target inputs
picker: null,      // main datepicker container
slider: null,      // slider that contains both oldContents and newContents, used to animate between 2 different views
oldContents: null, // used in animating from-view to new-view
newContents: null, // used in animating from-view to new-view
input: null,       // original input element (used for input/output)
visual: null,      // visible input (used for rendering)
options: {
pickerClass: 'datepicker',
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
dayShort: 2,
monthShort: 3,
startDay: 1, // Sunday (0) through Saturday (6) - be aware that this may affect your layout, since the days on the right might have a different margin
timePicker: false,
timePickerOnly: false,
yearPicker: true,
yearsPerPage: 20,
format: 'd-m-Y',
allowEmpty: false,
inputOutputFormat: 'U', // default to unix timestamp
animationDuration: 400,
useFadeInOut: !Browser.Engine.trident, // dont animate fade-in/fade-out for IE
startView: 'month', // allowed values: {time, month, year, decades}
positionOffset: { x: 0, y: 0 },
minDate: null, // { date: '[date-string]', format: '[date-string-interpretation-format]' }
maxDate: null, // same as minDate
debug: false,
toggleElements: null,
onShow: $empty,   // triggered when the datepicker pops up
onClose: $empty,  // triggered after the datepicker is closed (destroyed)
onSelect: $empty  // triggered when a date is selected
},
initialize: function(attachTo, options) {
this.attachTo = attachTo;
this.setOptions(options).attach();
if (this.options.timePickerOnly) {
this.options.timePicker = true;
this.options.startView = 'time';
}
this.formatMinMaxDates();
document.addEvent('mousedown', this.close.bind(this));
},
formatMinMaxDates: function() {
if (this.options.minDate && this.options.minDate.format) {
this.options.minDate = this.unformat(this.options.minDate.date, this.options.minDate.format);
}
if (this.options.maxDate && this.options.maxDate.format) {
this.options.maxDate = this.unformat(this.options.maxDate.date, this.options.maxDate.format);
this.options.maxDate.setHours(23);
this.options.maxDate.setMinutes(59);
this.options.maxDate.setSeconds(59);
}
},
attach: function() {
if ($chk(this.options.toggleElements)) {
var togglers = $$(this.options.toggleElements);
document.addEvents({
'keydown': function(e) {
if (e.key == "tab") {
this.close(null, true);
}
}.bind(this)
});
};
$$(this.attachTo).each(function(item, index) {
if (item.retrieve('datepicker')) return;
if ($chk(item.get('value'))) {
var init_clone_val = this.format(new Date(this.unformat(item.get('value'), this.options.inputOutputFormat)), this.options.format);
} else if (!this.options.allowEmpty) {
var init_clone_val = this.format(new Date(), this.options.format);
} else {
var init_clone_val = '';
}
var display = item.getStyle('display');
var clone = item
.setStyle('display', this.options.debug ? display : 'none')
.store('datepicker', true) // to prevent double attachment...
.clone()
.store('datepicker', true) // ...even for the clone (!)
.removeProperty('name')    // secure clean (form)submission
.setStyle('display', display)
.set('value', init_clone_val)
.inject(item, 'after');
if ($chk(this.options.toggleElements)) {
togglers[index]
.setStyle('cursor', 'pointer')
.addEvents({
'click': function(e) {
this.onFocus(item, clone);
}.bind(this)
});
clone.addEvents({
'blur': function() {
if( item.get( 'readonly' ) === false ) {
item.set('value', clone.get('value'));
}
}
});
} else {
clone.addEvents({
'keydown': function(e) {
if (this.options.allowEmpty && (e.key == "delete" || e.key == "backspace")) {
item.set('value', '');
e.target.set('value', '');
this.close(null, true);
} else if (e.key == "tab") {
this.close(null, true);
} else {
e.stop();
}
}.bind(this),
'focus': function(e) {
this.onFocus(item, clone);
}.bind(this)
});
}
}.bind(this));
},
onFocus: function(original_input, visual_input) {
var init_visual_date, d = visual_input.getCoordinates();
if ($chk(original_input.get('value'))) {
init_visual_date = this.unformat(original_input.get('value'), this.options.inputOutputFormat).valueOf();
} else {
init_visual_date = new Date();
if ($chk(this.options.maxDate) && init_visual_date.valueOf() > this.options.maxDate.valueOf()) {
init_visual_date = new Date(this.options.maxDate.valueOf());
}
if ($chk(this.options.minDate) && init_visual_date.valueOf() < this.options.minDate.valueOf()) {
init_visual_date = new Date(this.options.minDate.valueOf());
}
}
this.show({ left: d.left + this.options.positionOffset.x, top: d.top + d.height + this.options.positionOffset.y }, init_visual_date);
this.input = original_input;
this.visual = visual_input;
this.options.onShow();
},
dateToObject: function(d) {
return {
year: d.getFullYear(),
month: d.getMonth(),
day: d.getDate(),
hours: d.getHours(),
minutes: d.getMinutes(),
seconds: d.getSeconds()
};
},
dateFromObject: function(values) {
var d = new Date();
d.setDate(1);
['year', 'month', 'day', 'hours', 'minutes', 'seconds'].each(function(type) {
var v = values[type];
if (!$chk(v)) return;
switch (type) {
case 'day': d.setDate(v); break;
case 'month': d.setMonth(v); break;
case 'year': d.setFullYear(v); break;
case 'hours': d.setHours(v); break;
case 'minutes': d.setMinutes(v); break;
case 'seconds': d.setSeconds(v); break;
}
});
return d;
},
show: function(position, timestamp) {
this.formatMinMaxDates();
if ($chk(timestamp)) {
this.d = new Date(timestamp);
} else {
this.d = new Date();
}
this.today = new Date();
this.choice = this.dateToObject(this.d);
this.mode = (this.options.startView == 'time' && !this.options.timePicker) ? 'month' : this.options.startView;
this.render();
this.picker.setStyles(position);
},
render: function(fx) {
if (!$chk(this.picker)) {
this.constructPicker();
} else {
var o = this.oldContents;
this.oldContents = this.newContents;
this.newContents = o;
this.newContents.empty();
}
var startDate = new Date(this.d.getTime());
this.limit = { right: false, left: false };
if (this.mode == 'decades') {
this.renderDecades();
} else if (this.mode == 'year') {
this.renderYear();
} else if (this.mode == 'time') {
this.renderTime();
this.limit = { right: true, left: true }; // no left/right in timeview
} else {
this.renderMonth();
}
this.picker.getElement('.previous').setStyle('visibility', this.limit.left ? 'hidden' : 'visible');
this.picker.getElement('.next').setStyle('visibility', this.limit.right ? 'hidden' : 'visible');
this.picker.getElement('.titleText').setStyle('cursor', this.allowZoomOut() ? 'pointer' : 'default');
this.d = startDate;
if (this.picker.getStyle('opacity') == 0) {
this.picker.tween('opacity', 0, 1);
}
if ($chk(fx)) this.fx(fx);
},
fx: function(fx) {
if (fx == 'right') {
this.oldContents.setStyles({ left: 0, opacity: 1 });
this.newContents.setStyles({ left: this.bodysize.x, opacity: 1 });
this.slider.setStyle('left', 0).tween('left', 0, -this.bodysize.x);
} else if (fx == 'left') {
this.oldContents.setStyles({ left: this.bodysize.x, opacity: 1 });
this.newContents.setStyles({ left: 0, opacity: 1 });
this.slider.setStyle('left', -this.bodysize.x).tween('left', -this.bodysize.x, 0);
} else if (fx == 'fade') {
this.slider.setStyle('left', 0);
this.oldContents.setStyle('left', 0).set('tween', { duration: this.options.animationDuration / 2 }).tween('opacity', 1, 0);
this.newContents.setStyles({ opacity: 0, left: 0}).set('tween', { duration: this.options.animationDuration }).tween('opacity', 0, 1);
}
},
constructPicker: function() {
this.picker = new Element('div', { 'class': this.options.pickerClass }).inject(document.body);
if (this.options.useFadeInOut) {
this.picker.setStyle('opacity', 0).set('tween', { duration: this.options.animationDuration });
}
var h = new Element('div', { 'class': 'header' }).inject(this.picker);
var titlecontainer = new Element('div', { 'class': 'title' }).inject(h);
new Element('div', { 'class': 'previous' }).addEvent('click', this.previous.bind(this)).set('text', '«').inject(h);
new Element('div', { 'class': 'next' }).addEvent('click', this.next.bind(this)).set('text', '»').inject(h);
new Element('div', { 'class': 'closeButton' }).addEvent('click', this.close.bindWithEvent(this, true)).set('text', 'x').inject(h);
new Element('span', { 'class': 'titleText' }).addEvent('click', this.zoomOut.bind(this)).inject(titlecontainer);
var b = new Element('div', { 'class': 'body' }).inject(this.picker);
this.bodysize = b.getSize();
this.slider = new Element('div', { styles: { position: 'absolute', top: 0, left: 0, width: 2 * this.bodysize.x, height: this.bodysize.y }})
.set('tween', { duration: this.options.animationDuration, transition: Fx.Transitions.Quad.easeInOut }).inject(b);
this.oldContents = new Element('div', { styles: { position: 'absolute', top: 0, left: this.bodysize.x, width: this.bodysize.x, height: this.bodysize.y }}).inject(this.slider);
this.newContents = new Element('div', { styles: { position: 'absolute', top: 0, left: 0, width: this.bodysize.x, height: this.bodysize.y }}).inject(this.slider);
},
renderTime: function() {
var container = new Element('div', { 'class': 'time' }).inject(this.newContents);
if (this.options.timePickerOnly) {
this.picker.getElement('.titleText').set('text', 'Select a time');
} else {
this.picker.getElement('.titleText').set('text', this.format(this.d, 'j M, Y'));
}
new Element('input', { type: 'text', 'class': 'hour' })
.set('value', this.leadZero(this.d.getHours()))
.addEvents({
mousewheel: function(e) {
var i = e.target, v = i.get('value').toInt();
i.focus();
if (e.wheel > 0) {
v = (v < 23) ? v + 1 : 0;
} else {
v = (v > 0) ? v - 1 : 23;
}
i.set('value', this.leadZero(v));
e.stop();
}.bind(this)
})
.set('maxlength', 2)
.inject(container);
new Element('input', { type: 'text', 'class': 'minutes' })
.set('value', this.leadZero(this.d.getMinutes()))
.addEvents({
mousewheel: function(e) {
var i = e.target, v = i.get('value').toInt();
i.focus();
if (e.wheel > 0) {
v = (v < 59) ? v + 1 : 0;
} else {
v = (v > 0) ? v - 1 : 59;
}
i.set('value', this.leadZero(v));
e.stop();
}.bind(this)
})
.set('maxlength', 2)
.inject(container);
new Element('div', { 'class': 'separator' }).set('text', ':').inject(container);
new Element('input', { type: 'submit', value: 'OK', 'class': 'ok' })
.addEvents({
click: function(e) {
e.stop();
this.select($merge(this.dateToObject(this.d), { hours: this.picker.getElement('.hour').get('value').toInt(), minutes: this.picker.getElement('.minutes').get('value').toInt() }));
}.bind(this)
})
.set('maxlength', 2)
.inject(container);
},
renderMonth: function() {
var month = this.d.getMonth();
this.picker.getElement('.titleText').set('text', this.options.months[month] + ' ' + this.d.getFullYear());
this.d.setDate(1);
while (this.d.getDay() != this.options.startDay) {
this.d.setDate(this.d.getDate() - 1);
}
var container = new Element('div', { 'class': 'days' }).inject(this.newContents);
var titles = new Element('div', { 'class': 'titles' }).inject(container);
var d, i, classes, e, weekcontainer;
for (d = this.options.startDay; d < (this.options.startDay + 7); d++) {
new Element('div', { 'class': 'title day day' + (d % 7) }).set('text', this.options.days[(d % 7)].substring(0,this.options.dayShort)).inject(titles);
}
var available = false;
var t = this.today.toDateString();
var currentChoice = this.dateFromObject(this.choice).toDateString();
for (i = 0; i < 42; i++) {
classes = [];
classes.push('day');
classes.push('day'+this.d.getDay());
if (this.d.toDateString() == t) classes.push('today');
if (this.d.toDateString() == currentChoice) classes.push('selected');
if (this.d.getMonth() != month) classes.push('otherMonth');
if (i % 7 == 0) {
weekcontainer = new Element('div', { 'class': 'week week'+(Math.floor(i/7)) }).inject(container);
}
e = new Element('div', { 'class': classes.join(' ') }).set('text', this.d.getDate()).inject(weekcontainer);
if (this.limited('date')) {
e.addClass('unavailable');
if (available) {
this.limit.right = true;
} else if (this.d.getMonth() == month) {
this.limit.left = true;
}
} else {
available = true;
e.addEvent('click', function(e, d) {
if (this.options.timePicker) {
this.d.setDate(d.day);
this.d.setMonth(d.month);
this.mode = 'time';
this.render('fade');
} else {
this.select($merge(d, { hours: 0, minutes: 0 }));
}
}.bindWithEvent(this, { day: this.d.getDate(), month: this.d.getMonth(), year: this.d.getFullYear() }));
}
this.d.setDate(this.d.getDate() + 1);
}
if (!available) this.limit.right = true;
},
renderYear: function() {
var month = this.today.getMonth();
var thisyear = this.d.getFullYear() == this.today.getFullYear();
var selectedyear = this.d.getFullYear() == this.choice.year;
this.picker.getElement('.titleText').set('text', this.d.getFullYear());
this.d.setMonth(0);
var i, e;
var available = false;
var container = new Element('div', { 'class': 'months' }).inject(this.newContents);
for (i = 0; i <= 11; i++) {
e = new Element('div', { 'class': 'month month'+(i+1)+(i == month && thisyear ? ' today' : '')+(i == this.choice.month && selectedyear ? ' selected' : '') })
.set('text', this.options.monthShort ? this.options.months[i].substring(0, this.options.monthShort) : this.options.months[i]).inject(container);
if (this.limited('month')) {
e.addClass('unavailable');
if (available) {
this.limit.right = true;
} else {
this.limit.left = true;
}
} else {
available = true;
e.addEvent('click', function(e, d) {
this.d.setDate(1);
this.d.setMonth(d);
this.mode = 'month';
this.render('fade');
}.bindWithEvent(this, i));
}
this.d.setMonth(i);
}
if (!available) this.limit.right = true;
},
renderDecades: function() {
while (this.d.getFullYear() % this.options.yearsPerPage > 0) {
this.d.setFullYear(this.d.getFullYear() - 1);
}
this.picker.getElement('.titleText').set('text', this.d.getFullYear() + '-' + (this.d.getFullYear() + this.options.yearsPerPage - 1));
var i, y, e;
var available = false;
var container = new Element('div', { 'class': 'years' }).inject(this.newContents);
if ($chk(this.options.minDate) && this.d.getFullYear() <= this.options.minDate.getFullYear()) {
this.limit.left = true;
}
for (i = 0; i < this.options.yearsPerPage; i++) {
y = this.d.getFullYear();
e = new Element('div', { 'class': 'year year' + i + (y == this.today.getFullYear() ? ' today' : '') + (y == this.choice.year ? ' selected' : '') }).set('text', y).inject(container);
if (this.limited('year')) {
e.addClass('unavailable');
if (available) {
this.limit.right = true;
} else {
this.limit.left = true;
}
} else {
available = true;
e.addEvent('click', function(e, d) {
this.d.setFullYear(d);
this.mode = 'year';
this.render('fade');
}.bindWithEvent(this, y));
}
this.d.setFullYear(this.d.getFullYear() + 1);
}
if (!available) {
this.limit.right = true;
}
if ($chk(this.options.maxDate) && this.d.getFullYear() >= this.options.maxDate.getFullYear()) {
this.limit.right = true;
}
},
limited: function(type) {
var cs = $chk(this.options.minDate);
var ce = $chk(this.options.maxDate);
if (!cs && !ce) return false;
switch (type) {
case 'year':
return (cs && this.d.getFullYear() < this.options.minDate.getFullYear()) || (ce && this.d.getFullYear() > this.options.maxDate.getFullYear());
case 'month':
var ms = ('' + this.d.getFullYear() + this.leadZero(this.d.getMonth())).toInt();
return cs && ms < ('' + this.options.minDate.getFullYear() + this.leadZero(this.options.minDate.getMonth())).toInt()
|| ce && ms > ('' + this.options.maxDate.getFullYear() + this.leadZero(this.options.maxDate.getMonth())).toInt()
case 'date':
return (cs && this.d < this.options.minDate) || (ce && this.d > this.options.maxDate);
}
},
allowZoomOut: function() {
if (this.mode == 'time' && this.options.timePickerOnly) return false;
if (this.mode == 'decades') return false;
if (this.mode == 'year' && !this.options.yearPicker) return false;
return true;
},
zoomOut: function() {
if (!this.allowZoomOut()) return;
if (this.mode == 'year') {
this.mode = 'decades';
} else if (this.mode == 'time') {
this.mode = 'month';
} else {
this.mode = 'year';
}
this.render('fade');
},
previous: function() {
if (this.mode == 'decades') {
this.d.setFullYear(this.d.getFullYear() - this.options.yearsPerPage);
} else if (this.mode == 'year') {
this.d.setFullYear(this.d.getFullYear() - 1);
} else if (this.mode == 'month') {
this.d.setMonth(this.d.getMonth() - 1);
}
this.render('left');
},
next: function() {
if (this.mode == 'decades') {
this.d.setFullYear(this.d.getFullYear() + this.options.yearsPerPage);
} else if (this.mode == 'year') {
this.d.setFullYear(this.d.getFullYear() + 1);
} else if (this.mode == 'month') {
this.d.setMonth(this.d.getMonth() + 1);
}
this.render('right');
},
close: function(e, force) {
if (!$(this.picker)) return;
var clickOutside = ($chk(e) && e.target != this.picker && !this.picker.hasChild(e.target) && e.target != this.visual);
if (force || clickOutside) {
if (this.options.useFadeInOut) {
this.picker.set('tween', { duration: this.options.animationDuration / 2, onComplete: this.destroy.bind(this) }).tween('opacity', 1, 0);
} else {
this.destroy();
}
}
},
destroy: function() {
this.picker.destroy();
this.picker = null;
this.options.onClose();
},
select: function(values) {
this.choice = $merge(this.choice, values);
var d = this.dateFromObject(this.choice);
this.input.set('value', this.format(d, this.options.inputOutputFormat));
this.visual.set('value', this.format(d, this.options.format));
this.options.onSelect(d);
this.close(null, true);
},
leadZero: function(v) {
return v < 10 ? '0'+v : v;
},
format: function(t, format) {
var f = '';
var h = t.getHours();
var m = t.getMonth();
for (var i = 0; i < format.length; i++) {
switch(format.charAt(i)) {
case '\\': i++; f+= format.charAt(i); break;
case 'y': f += (100 + t.getYear() + '').substring(1); break
case 'Y': f += t.getFullYear(); break;
case 'm': f += this.leadZero(m + 1); break;
case 'n': f += (m + 1); break;
case 'M': f += this.options.months[m].substring(0,this.options.monthShort); break;
case 'F': f += this.options.months[m]; break;
case 'd': f += this.leadZero(t.getDate()); break;
case 'j': f += t.getDate(); break;
case 'D': f += this.options.days[t.getDay()].substring(0,this.options.dayShort); break;
case 'l': f += this.options.days[t.getDay()]; break;
case 'G': f += h; break;
case 'H': f += this.leadZero(h); break;
case 'g': f += (h % 12 ? h % 12 : 12); break;
case 'h': f += this.leadZero(h % 12 ? h % 12 : 12); break;
case 'a': f += (h > 11 ? 'pm' : 'am'); break;
case 'A': f += (h > 11 ? 'PM' : 'AM'); break;
case 'i': f += this.leadZero(t.getMinutes()); break;
case 's': f += this.leadZero(t.getSeconds()); break;
case 'U': f += Math.floor(t.valueOf() / 1000); break;
default:  f += format.charAt(i);
}
}
return f;
},
unformat: function(t, format) {
var d = new Date();
var a = {};
var c, m;
t = t.toString();
for (var i = 0; i < format.length; i++) {
c = format.charAt(i);
switch(c) {
case '\\': r = null; i++; break;
case 'y': r = '[0-9]{2}'; break;
case 'Y': r = '[0-9]{4}'; break;
case 'm': r = '0[1-9]|1[012]'; break;
case 'n': r = '[1-9]|1[012]'; break;
case 'M': r = '[A-Za-z]{'+this.options.monthShort+'}'; break;
case 'F': r = '[A-Za-z]+'; break;
case 'd': r = '0[1-9]|[12][0-9]|3[01]'; break;
case 'j': r = '[1-9]|[12][0-9]|3[01]'; break;
case 'D': r = '[A-Za-z]{'+this.options.dayShort+'}'; break;
case 'l': r = '[A-Za-z]+'; break;
case 'G':
case 'H':
case 'g':
case 'h': r = '[0-9]{1,2}'; break;
case 'a': r = '(am|pm)'; break;
case 'A': r = '(AM|PM)'; break;
case 'i':
case 's': r = '[012345][0-9]'; break;
case 'U': r = '-?[0-9]+$'; break;
default:  r = null;
}
if ($chk(r)) {
m = t.match('^'+r);
if ($chk(m)) {
a[c] = m[0];
t = t.substring(a[c].length);
} else {
if (this.options.debug) alert("Fatal Error in DatePicker\n\nUnexpected format at: '"+t+"' expected format character '"+c+"' (pattern '"+r+"')");
return d;
}
} else {
t = t.substring(1);
}
}
for (c in a) {
var v = a[c];
switch(c) {
case 'y': d.setFullYear(v < 30 ? 2000 + v.toInt() : 1900 + v.toInt()); break; // assume between 1930 - 2029
case 'Y': d.setFullYear(v); break;
case 'm':
case 'n': d.setMonth(v - 1); break;
case 'M': v = this.options.months.filter(function(item, index) { return item.substring(0,this.options.monthShort) == v }.bind(this))[0];
case 'F': d.setMonth(this.options.months.indexOf(v)); break;
case 'd':
case 'j': d.setDate(v); break;
case 'G':
case 'H': d.setHours(v); break;
case 'g':
case 'h': if (a['a'] == 'pm' || a['A'] == 'PM') { d.setHours(v == 12 ? 0 : v.toInt() + 12); } else { d.setHours(v); } break;
case 'i': d.setMinutes(v); break;
case 's': d.setSeconds(v); break;
case 'U': d = new Date(v.toInt() * 1000);
}
};
return d;
}
});
var NXC = NXC || {};
NXC.AJAXContainer = new Class( {
Implements: [Options, Events],
container: false,
loadMore: false,
loader: false,
displayed: 0,
portion: 10,
options: {
'loaderID'  : 'nxc-ajaxcontainer-loader',
'ajaxURL'   : 'get_elements.php?offset=%displayed%&limit=%portion%',
'displayed' : 0,
'portion'   : 10,
'onLoad'    : $empty
},
initialize: function( containerID, loadMoreID, options ) {
this.setOptions( options );
this.container = document.id( containerID );
this.loadMore  = document.id( loadMoreID );
this.loader    = document.id( this.options.loaderID );
if( $type( this.loader ) == 'element' ) {
this.loader.setStyle( 'display', 'none' );
}
this.displayed = this.options.displayed;
this.portion   = this.options.portion;
this.installEvents();
if( this.displayed == 0 ) {
this.loadElements();
}
},
installEvents: function() {
this.loadMore.addEvent( 'click', function( e ) {
this.loadElements();e.stop();
}.bind( this ) );
},
loadElements: function() {
this.loadMore.setStyle( 'display', 'none' );
if( $type( this.loader ) == 'element' ) {
this.loader.setStyle( 'display', 'block' );
}
var url = this.options.ajaxURL.replace( '%displayed%', this.displayed ).replace( '%portion%', this.portion );
new Request.JSON( {
url: url,
onSuccess: function( response ) {
response = new Hash( response );
if( $type( this.loader ) == 'element' ) {
this.loader.setStyle( 'display', 'none' );
}
this.container.set( 'html', this.container.get( 'html' ) + response.get( 'html' ) );
this.displayed += this.portion;
if( response.has( 'totalObjectsCount' ) === false ) {
this.loadMore.setStyle( 'display', 'block' );
} else if( response.get( 'totalObjectsCount' ) > this.displayed ) {
this.loadMore.setStyle( 'display', 'block' );
}
this.fireEvent( 'load' );
}.bind( this )
} ).send();
}
} );
var NXC = NXC || {};
NXC.LightBox = new Class( {
Implements: [Options, Events],
options:{
'overlayOpacity' : 0.5,
'topPosition'    : 50,
'bgColor'        : '2A2A2A',
'shadow'         : true,
'outerCloser'    : true,
'closer'         : true,
'onOpen'         : $empty,
'onSetContent'   : function( el ) { el.setStyle( 'display', 'block' ) },
'onClose'        : $empty
},
opened       : false,
contentBlock : new Element( 'div' ),
initialize: function( options ) {
this.setOptions( options );
this.prepareHTML();
},
prepareHTML: function() {
this.overlay = new Element( 'div', {
'class': 'nxc-lightbox-overlay',
'styles': {
'opacity'          : 0,
'visibility'       : 'visible',
'height'           : 0,
'overflow'         : 'hidden',
'background-color' : '#' + this.options.bgColor
}
} ).inject( document.id( document.body ) );
this.overlay.get( 'tween' ).addEvent( 'onComplete', function() {
if( this.overlay.getStyle( 'opacity' ) == 0 ) {
this.overlay.setStyles( {
'height': 0,
'top': ''
} );
};
}.bindWithEvent( this ) );
window.addEvent( 'resize', function() {
if( this.overlay.getStyle( 'opacity' ) != 0 ) {
var scrollSize = document.id( window ).getScrollSize().y;
var scrollTop = document.id( window ).getScroll().y;
this.overlay.setStyles( {
'height': scrollSize + scrollTop,
'top': -scrollTop
} );
}
}.bindWithEvent(this));
this.center = new Element( 'div', {
'class': 'nxc-lightbox-center',
'styles': {
'opacity': 0
}
} ).inject( document.id( document.body ) );
if( this.options.shadow ) {
if( !Browser.Engine.trident4 ) {
var shadow = new Element( 'div', { 'class': 'nxc-lightbox-bg-wrap' } ).inject( this.center );
['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'].each( function( dir ) {
new Element( 'div', { 'class': 'nxc-lightbox-bg nxc-lightbox-bg-' + dir } ).inject( shadow );
} );
}
}
if( this.options.closer ) {
var closer = new Element('a', {
'class': 'nxc-lightbox-btn-close',
'events': { 'click': this.close.bind( this ) }
} ).inject( this.center );
}
if( this.options.outerCloser ) {
this.overlay.addEvent( 'click', function() {
this.close();
}.bind( this ) );
}
},
setContent: function( el, clone ) {
el = document.id( el );
if( el === false ) {
return false;
}
if( clone === undefined ) {
clone = true;
}
this.contentBlock.destroy();
if( clone ) {
this.contentBlock = el.clone( true, true ).cloneEvents( el );
} else {
this.contentBlock = el;
}
this.contentBlock.inject( this.center );
this.fireEvent( 'setContent', this.contentBlock );
this.setCenterPosition();
},
setCenterPosition: function() {
var width  = this.contentBlock.getStyle( 'width' ).toInt() + this.contentBlock.getStyle( 'padding-left' ).toInt() + this.contentBlock.getStyle( 'padding-right' ).toInt();
this.center.setStyles( {
'width': width,
'margin-left': -1 * ( width / 2 ).toInt()
} );
},
open: function() {
this.opened = true;
this.fireEvent( 'open', this.contentBlock );
this.overlay.setStyles( {
'top': -document.id( window ).getScroll().y,
'height': document.id( window ).getScrollSize().y + document.id( window ).getScroll().y
} );
this.center.setStyle( 'top', document.id( window ).getScroll().y + this.options.topPosition );
this.center.setStyle( 'opacity', 1 );
this.overlay.setStyle( 'z-index', 99 ).tween( 'opacity', this.options.overlayOpacity );
},
close: function() {
this.opened = false;
this.fireEvent( 'close', this.contentBlock );
this.center.setStyle( 'opacity', 0 );
this.overlay.tween( 'opacity', 0 );
}
} );
var NXC = NXC || {};
NXC.ProgressBar = new Class( {
Implements: [Options, Chain],
wrapper: false,
bar: false,
image: false,
test: false,
options: {
'transitionDuration': 500,
'textPattern': 'Loading... %loadPercent%%',
'barCSSPath': 'div.nxc-progress-bar',
'imageCSSPath': 'img.nxc-progress-bar-image',
'textCSSPath': 'div.nxc-progress-bar-text'
},
initialize: function( wrapper, options ) {
this.setOptions( options );
this.wrapper = document.id( wrapper );
this.bar     = this.wrapper.getElement( this.options.barCSSPath );
this.image   = this.wrapper.getElement( this.options.imageCSSPath );
this.text    = this.wrapper.getElement( this.options.textCSSPath );
this.image.setStyle( 'margin-left', -1 * this.image.getStyle( 'width' ).toInt() );
},
progress: function( loadPercent, fx ) {
if( fx === undefined ) {
fx = true;
}
if( loadPercent <= 0 || loadPercent > 100 ) {
return false;
}
var newBarImageMargin = this.getImageOffset( loadPercent );
if( fx ) {
this.image.get( 'tween', { property: 'margin-left', duration: this.options.transitionDuration } ).start( newBarImageMargin );
} else {
this.image.setStyle( 'margin-left', newBarImageMargin );
}
this.text.set( 'html', this.options.textPattern.replace( '%loadPercent%', loadPercent.toFixed( 0 ) ) );
},
getImageOffset: function( loadPercent ) {
var barWidth          = this.bar.getStyle( 'width' ).toInt();
return ( barWidth * ( loadPercent / 100 ) ).toInt() - barWidth;
},
remove: function() {
this.wrapper.get( 'tween', { property: 'opacity', duration: this.options.transitionDuration } ).start( 0 ).chain( function() {
this.wrapper.destroy();
}.bind( this ) );
}
} );
var NXC = NXC || {};
NXC.Tabs = new Class( {
Implements: [Options, Events],
options: {
'transitionDuration': 500,
'startIndex': 0,
'selectedLinkStyle': false,
'selectedTabStyle': false,
'onStart': $empty,
'onComplete': $empty
},
tabs         : [],
links        : [],
currentIndex : 0,
initialize: function( linksSelector, tabsSelector, options ) {
this.links = document.getElements( linksSelector );
this.tabs  = document.getElements( tabsSelector );
this.setOptions( options );
var fragment = new URI().get( 'fragment' );
this.currentIndex = this.options.startIndex;
if( fragment ) {
fragment = decodeURIComponent( fragment );
this.links.each( function( link, index ) {
if( fragment == link.get( 'href' ).replace( '#', '' ) ) {
this.currentIndex = index;
}
}.bind( this ) );
}
this.showStartTab( this.currentIndex );
this.installEvents();
},
installEvents: function() {
this.links.each( function( link, index ) {
link.addEvent( 'click', function( e ) {
e.stop();
if( index !== this.currentIndex ) {
this.showTab( index );
if( link.get( 'href' ) ) {
window.location = new URI().set( 'fragment', link.get( 'href' ).replace( '#', '' ) ).toString();
}
}
}.bind( this ) );
}.bind( this ) );
},
showStartTab: function( index ) {
this.links.removeClass( this.options.selectedLinkStyle );
this.tabs.setStyle( 'display', 'none' );
this.tabs.setStyle( 'opacity', 0 );
this.tabs.removeClass( this.options.selectedTabStyle );
this.tabs[ index ].setStyles( {
'display': 'block',
'opacity': '1'
} ).getParent().setStyle(
'height', this.getContentWrapperHeight( this.tabs[ index ] )
);
if( this.options.selectedLinkStyle !== false ) {
this.links[ index ].addClass( this.options.selectedLinkStyle );
}
if( this.options.selectedTabStyle !== false ) {
this.tabs[ index ].addClass( this.options.selectedTabStyle )
}
this.currentIndex = index;
},
showTab: function( index ) {
var link       = this.links[ index ];
var showTab    = this.tabs[ index ];
var currentTab = this.tabs[ this.currentIndex ];
this.fireEvent( 'start', [ currentTab, showTab ] );
if( this.options.selectedLinkStyle !== false ) {
this.links.removeClass( this.options.selectedLinkStyle );
link.addClass( this.options.selectedLinkStyle );
}
if( this.options.selectedTabStyle !== false ) {
this.tabs.removeClass( this.options.selectedTabStyle );
showTab.addClass( this.options.selectedTabStyle );
}
currentTab.get( 'tween', { property: 'opacity', duration: this.options.transitionDuration } ).start( 0 ).chain( function() {
currentTab.setStyle( 'display', 'none' );
}.bind( this ) );
showTab.setStyle( 'display', 'block' );
showTab.get( 'tween', { property: 'opacity', duration: this.options.transitionDuration } ).start( 1 );
showTab.getParent().get( 'tween', { property: 'height', duration: this.options.transitionDuration } ).start(
this.getContentWrapperHeight( showTab )
).chain( function() {
this.fireEvent( 'complete', [ currentTab, showTab ] );
}.bind( this ) );
this.currentIndex = index;
},
getContentWrapperHeight: function( tab ) {
return tab.getStyle( 'height' ).toInt() + tab.getParent().getStyle( 'padding-top' ).toInt() + tab.getParent().getStyle( 'padding-bottom' ).toInt();
}
} );
var NXC = NXC || {};
NXC.FrontMenu = new Class( {
Implements: [Options, Events],
options: {'slidesSelector': 'div.nxc-frontmenu-slide-item','navigationSelector': 'div.nxc-frontmenu-navigation-item','timerDelay': 3000,'fade': true,'fadeDuration': 500,'slideShow': true,'onShow': $empty,'onHide': $empty},
container: false,
slides: [],
navigationLinks: [],
currentSlide: 0,
timer: $empty,
initialize: function( containerID, options ) {
this.setOptions( options );
this.container       = document.id( containerID )
this.slides          = this.container.getElements( this.options.slidesSelector );
this.navigationLinks = this.container.getElements( this.options.navigationSelector );
if( this.slides.length != this.navigationLinks.length ) {
console.log( 'Slides and naviagtion links quantity dosen`t the same' );
return false;
}
this.hideAllSlides();
this.showSlide( this.currentSlide, false );
this.installEvents();
this.installSlideShow();
},
installEvents: function() {
this.navigationLinks.each( function( navigationLink, index ) {
navigationLink.addEvents( {
'mouseover': function(){
this.currentSlide = index;
this.stopTimer();
this.hideAllSlides();
this.showSlide( this.currentSlide, false );
}.bind( this ),
'mouseout': function(){
this.startTimer();
}.bind( this )
} );
}.bind( this ) );
this.slides.addEvents( {
'mouseover': function(){
this.stopTimer();
}.bind( this ),
'mouseout': function(){
this.startTimer();
}.bind( this )
} );
},
installSlideShow: function() {
if( this.options.slideShow ) {
this.startTimer();
}
},
startTimer: function() {
if( this.options.slideShow ) {
this.timer = function() {
this.showNextSlide( this.options.fade );
}.periodical( this.options.timerDelay + this.options.fadeDuration, this );
}
},
stopTimer: function() {
$clear( this.timer );
},
showNextSlide: function( fade ) {
this.hideSlide( this.getPreviousIndex(), fade);
this.showSlide( this.currentSlide, fade );
},
showPreviousSlide: function( fade ) {
var prevIndex = this.getPreviousIndex();
var showIndex = ( prevIndex == 0 ) ? this.slides.length - 1 : prevIndex - 1;
this.hideSlide( prevIndex, fade );
this.showSlide( showIndex, fade );
},
showSlide: function( index, fade ) {
var index = $defined( index ) ? index : this.currentSlide;
var fade  = $defined( fade ) ? fade : true;
var slide = this.slides[ index ];
slide.setStyle( 'display', 'block' );
if( fade ) {
slide.get( 'tween', { property: 'opacity', duration: this.options.fadeDuration } ).start( 1 ).chain(
this.fireEvent.bind( this, [ 'show', index ] )
);
} else {
slide.get( 'tween' ).cancel();
slide.setStyle( 'opacity', 1 );
this.fireEvent( 'show', index );
}
if( index == ( this.slides.length - 1 ) ) {
this.currentSlide = 0;
} else {
this.currentSlide = index + 1;
}
},
hideSlide: function( index, fade ) {
var fade  = $defined( fade ) ? fade : true;
var index = $defined( index ) ? index : this.getPreviousIndex();
var slide = this.slides[index];
if( fade ) {
slide.get( 'tween', { 'property': 'opacity', 'duration': this.options.fadeDuration } ).start( 0 ).chain(
function() {
slide.setStyle( 'display', 'none' );
this.fireEvent( 'hide', index );
}
);
} else {
slide.setStyles( {
'display': 'none',
'opacity': 0
} );
this.fireEvent( 'hide', index );
}
},
hideAllSlides: function() {
this.slides.each( function( slide, index ) {
this.hideSlide( index, false );
}.bind( this ) );
},
getPreviousIndex: function() {
return ( this.currentSlide == 0 ) ? this.slides.length - 1 : this.currentSlide - 1;
}
} );
var loadingImage = '/extension/skf/design/sf/images/lightbox/loading.gif';
var closeButton = '/extension/skf/design/sf/images/lightbox/close.gif';
function getPageScroll(){
var yScroll;
if (self.pageYOffset) {
yScroll = self.pageYOffset;
} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
yScroll = document.documentElement.scrollTop;
} else if (document.body) {// all other Explorers
yScroll = document.body.scrollTop;
}
arrayPageScroll = new Array('',yScroll)
return arrayPageScroll;
}
function getPageSize(){
var xScroll, yScroll;
if (window.innerHeight && window.scrollMaxY) {
xScroll = document.body.scrollWidth;
yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
xScroll = document.body.scrollWidth;
yScroll = document.body.scrollHeight;
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
xScroll = document.body.offsetWidth;
yScroll = document.body.offsetHeight;
}
var windowWidth, windowHeight;
if (self.innerHeight) {	// all except Explorer
windowWidth = self.innerWidth;
windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
windowWidth = document.documentElement.clientWidth;
windowHeight = document.documentElement.clientHeight;
} else if (document.body) { // other Explorers
windowWidth = document.body.clientWidth;
windowHeight = document.body.clientHeight;
}
if(yScroll < windowHeight){
pageHeight = windowHeight;
} else {
pageHeight = yScroll;
}
if(xScroll < windowWidth){
pageWidth = windowWidth;
} else {
pageWidth = xScroll;
}
arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
return arrayPageSize;
}
function pause(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
function getKey(e){
if (e == null) { // ie
keycode = event.keyCode;
} else { // mozilla
keycode = e.which;
}
key = String.fromCharCode(keycode).toLowerCase();
if(key == 'x'){ hideLightbox(); }
}
function listenKey () {	document.onkeypress = getKey; }
function showLightbox(objLink)
{
var objOverlay = document.getElementById('overlay');
var objLightbox = document.getElementById('lightbox');
var objCaption = document.getElementById('lightboxCaption');
var objImage = document.getElementById('lightboxImage');
var objLoadingImage = document.getElementById('loadingImage');
var objLightboxDetails = document.getElementById('lightboxDetails');
var arrayPageSize = getPageSize();
var arrayPageScroll = getPageScroll();
if (objLoadingImage) {
objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px');
objLoadingImage.style.left = (((arrayPageSize[0] - 20 - objLoadingImage.width) / 2) + 'px');
objLoadingImage.style.display = 'block';
}
objOverlay.style.height = (arrayPageSize[1] + 'px');
objOverlay.style.display = 'block';
imgPreload = new Image();
imgPreload.onload=function(){
objImage.src = objLink.href;
var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2);
var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2);
objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px";
objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px";
objLightboxDetails.style.width = imgPreload.width + 'px';
if(objLink.getAttribute('title')){
objCaption.style.display = 'block';
objCaption.innerHTML = objLink.getAttribute('title');
} else {
objCaption.style.display = 'none';
}
if (navigator.appVersion.indexOf("MSIE")!=-1){
pause(250);
}
if (objLoadingImage) {	objLoadingImage.style.display = 'none'; }
selects = document.getElementsByTagName("select");
for (i = 0; i != selects.length; i++) {
selects[i].style.visibility = "hidden";
}
objLightbox.style.display = 'block';
arrayPageSize = getPageSize();
objOverlay.style.height = (arrayPageSize[1] + 'px');
listenKey();
return false;
}
imgPreload.src = objLink.href;
}
function hideLightbox()
{
objOverlay = document.getElementById('overlay');
objLightbox = document.getElementById('lightbox');
objOverlay.style.display = 'none';
objLightbox.style.display = 'none';
selects = document.getElementsByTagName("select");
for (i = 0; i != selects.length; i++) {
selects[i].style.visibility = "visible";
}
document.onkeypress = '';
}
function initLightbox()
{
if (!document.getElementsByTagName){ return; }
var anchors = document.getElementsByTagName("a");
for (var i=0; i<anchors.length; i++){
var anchor = anchors[i];
if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "lightbox")){
anchor.onclick = function () {showLightbox(this); return false;}
}
}
var objBody = document.getElementsByTagName("body").item(0);
var objOverlay = document.createElement("div");
objOverlay.setAttribute('id','overlay');
objOverlay.onclick = function () {hideLightbox(); return false;}
objOverlay.style.display = 'none';
objOverlay.style.position = 'absolute';
objOverlay.style.top = '0';
objOverlay.style.left = '0';
objOverlay.style.zIndex = '90';
objOverlay.style.width = '100%';
objBody.insertBefore(objOverlay, objBody.firstChild);
var arrayPageSize = getPageSize();
var arrayPageScroll = getPageScroll();
var imgPreloader = new Image();
imgPreloader.onload=function(){
var objLoadingImageLink = document.createElement("a");
objLoadingImageLink.setAttribute('href','#');
objLoadingImageLink.onclick = function () {hideLightbox(); return false;}
objOverlay.appendChild(objLoadingImageLink);
var objLoadingImage = document.createElement("img");
objLoadingImage.src = loadingImage;
objLoadingImage.setAttribute('id','loadingImage');
objLoadingImage.style.position = 'absolute';
objLoadingImage.style.zIndex = '150';
objLoadingImageLink.appendChild(objLoadingImage);
imgPreloader.onload=function(){};	//	clear onLoad, as IE will flip out w/animated gifs
return false;
}
imgPreloader.src = loadingImage;
var objLightbox = document.createElement("div");
objLightbox.setAttribute('id','lightbox');
objLightbox.style.display = 'none';
objLightbox.style.position = 'absolute';
objLightbox.style.zIndex = '100';
objBody.insertBefore(objLightbox, objOverlay.nextSibling);
var objLink = document.createElement("a");
objLink.setAttribute('href','#');
objLink.setAttribute('title','Click to close');
objLink.onclick = function () {hideLightbox(); return false;}
objLightbox.appendChild(objLink);
var imgPreloadCloseButton = new Image();
imgPreloadCloseButton.onload=function(){
var objCloseButton = document.createElement("img");
objCloseButton.src = closeButton;
objCloseButton.setAttribute('id','closeButton');
objCloseButton.style.position = 'absolute';
objCloseButton.style.zIndex = '200';
objLink.appendChild(objCloseButton);
return false;
}
imgPreloadCloseButton.src = closeButton;
var objImage = document.createElement("img");
objImage.setAttribute('id','lightboxImage');
objLink.appendChild(objImage);
var objLightboxDetails = document.createElement("div");
objLightboxDetails.setAttribute('id','lightboxDetails');
objLightbox.appendChild(objLightboxDetails);
var objCaption = document.createElement("div");
objCaption.setAttribute('id','lightboxCaption');
objCaption.style.display = 'none';
objLightboxDetails.appendChild(objCaption);
var objKeyboardMsg = document.createElement("div");
objKeyboardMsg.setAttribute('id','keyboardMsg');
objKeyboardMsg.innerHTML = 'press <a href="#" onclick="hideLightbox(); return false;"><kbd>x</kbd></a> to close';
objLightboxDetails.appendChild(objKeyboardMsg);
}
function addLoadEvent(func)
{
var oldonload = window.onload;
if (typeof window.onload != 'function'){
window.onload = func;
} else {
window.onload = function(){
oldonload();
func();
}
}
}
function initLightboxImages( imageDir )
{
loadingImage = imageDir + "/" + loadingImage;
closeButton = imageDir + "/" + closeButton;
}
addLoadEvent(initLightbox);	// run initLightbox onLoad
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
var Cufon=(function(){var m=function(){return m.replace.apply(null,arguments)};var x=m.DOM={ready:(function(){var C=false,E={loaded:1,complete:1};var B=[],D=function(){if(C){return}C=true;for(var F;F=B.shift();F()){}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",D,false);window.addEventListener("pageshow",D,false)}if(!window.opera&&document.readyState){(function(){E[document.readyState]?D():setTimeout(arguments.callee,10)})()}if(document.readyState&&document.createStyleSheet){(function(){try{document.body.doScroll("left");D()}catch(F){setTimeout(arguments.callee,1)}})()}q(window,"load",D);return function(F){if(!arguments.length){D()}else{C?F():B.push(F)}}})(),root:function(){return document.documentElement||document.body}};var n=m.CSS={Size:function(C,B){this.value=parseFloat(C);this.unit=String(C).match(/[a-z%]*$/)[0]||"px";this.convert=function(D){return D/B*this.value};this.convertFrom=function(D){return D/this.value*B};this.toString=function(){return this.value+this.unit}},addClass:function(C,B){var D=C.className;C.className=D+(D&&" ")+B;return C},color:j(function(C){var B={};B.color=C.replace(/^rgba\((.*?),\s*([\d.]+)\)/,function(E,D,F){B.opacity=parseFloat(F);return"rgb("+D+")"});return B}),fontStretch:j(function(B){if(typeof B=="number"){return B}if(/%$/.test(B)){return parseFloat(B)/100}return{"ultra-condensed":0.5,"extra-condensed":0.625,condensed:0.75,"semi-condensed":0.875,"semi-expanded":1.125,expanded:1.25,"extra-expanded":1.5,"ultra-expanded":2}[B]||1}),getStyle:function(C){var B=document.defaultView;if(B&&B.getComputedStyle){return new a(B.getComputedStyle(C,null))}if(C.currentStyle){return new a(C.currentStyle)}return new a(C.style)},gradient:j(function(F){var G={id:F,type:F.match(/^-([a-z]+)-gradient\(/)[1],stops:[]},C=F.substr(F.indexOf("(")).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);for(var E=0,B=C.length,D;E<B;++E){D=C[E].split("=",2).reverse();G.stops.push([D[1]||E/(B-1),D[0]])}return G}),quotedList:j(function(E){var D=[],C=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,B;while(B=C.exec(E)){D.push(B[3]||B[1])}return D}),recognizesMedia:j(function(G){var E=document.createElement("style"),D,C,B;E.type="text/css";E.media=G;try{E.appendChild(document.createTextNode("/**/"))}catch(F){}C=g("head")[0];C.insertBefore(E,C.firstChild);D=(E.sheet||E.styleSheet);B=D&&!D.disabled;C.removeChild(E);return B}),removeClass:function(D,C){var B=RegExp("(?:^|\\s+)"+C+"(?=\\s|$)","g");D.className=D.className.replace(B,"");return D},supports:function(D,C){var B=document.createElement("span").style;if(B[D]===undefined){return false}B[D]=C;return B[D]===C},textAlign:function(E,D,B,C){if(D.get("textAlign")=="right"){if(B>0){E=" "+E}}else{if(B<C-1){E+=" "}}return E},textShadow:j(function(F){if(F=="none"){return null}var E=[],G={},B,C=0;var D=/(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;while(B=D.exec(F)){if(B[0]==","){E.push(G);G={};C=0}else{if(B[1]){G.color=B[1]}else{G[["offX","offY","blur"][C++]]=B[2]}}}E.push(G);return E}),textTransform:(function(){var B={uppercase:function(C){return C.toUpperCase()},lowercase:function(C){return C.toLowerCase()},capitalize:function(C){return C.replace(/\b./g,function(D){return D.toUpperCase()})}};return function(E,D){var C=B[D.get("textTransform")];return C?C(E):E}})(),whiteSpace:(function(){var D={inline:1,"inline-block":1,"run-in":1};var C=/^\s+/,B=/\s+$/;return function(H,F,G,E){if(E){if(E.nodeName.toLowerCase()=="br"){H=H.replace(C,"")}}if(D[F.get("display")]){return H}if(!G.previousSibling){H=H.replace(C,"")}if(!G.nextSibling){H=H.replace(B,"")}return H}})()};n.ready=(function(){var B=!n.recognizesMedia("all"),E=false;var D=[],H=function(){B=true;for(var K;K=D.shift();K()){}};var I=g("link"),J=g("style");function C(K){return K.disabled||G(K.sheet,K.media||"screen")}function G(M,P){if(!n.recognizesMedia(P||"all")){return true}if(!M||M.disabled){return false}try{var Q=M.cssRules,O;if(Q){search:for(var L=0,K=Q.length;O=Q[L],L<K;++L){switch(O.type){case 2:break;case 3:if(!G(O.styleSheet,O.media.mediaText)){return false}break;default:break search}}}}catch(N){}return true}function F(){if(document.createStyleSheet){return true}var L,K;for(K=0;L=I[K];++K){if(L.rel.toLowerCase()=="stylesheet"&&!C(L)){return false}}for(K=0;L=J[K];++K){if(!C(L)){return false}}return true}x.ready(function(){if(!E){E=n.getStyle(document.body).isUsable()}if(B||(E&&F())){H()}else{setTimeout(arguments.callee,10)}});return function(K){if(B){K()}else{D.push(K)}}})();function s(D){var C=this.face=D.face,B={"\u0020":1,"\u00a0":1,"\u3000":1};this.glyphs=D.glyphs;this.w=D.w;this.baseSize=parseInt(C["units-per-em"],10);this.family=C["font-family"].toLowerCase();this.weight=C["font-weight"];this.style=C["font-style"]||"normal";this.viewBox=(function(){var F=C.bbox.split(/\s+/);var E={minX:parseInt(F[0],10),minY:parseInt(F[1],10),maxX:parseInt(F[2],10),maxY:parseInt(F[3],10)};E.width=E.maxX-E.minX;E.height=E.maxY-E.minY;E.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")};return E})();this.ascent=-parseInt(C.ascent,10);this.descent=-parseInt(C.descent,10);this.height=-this.ascent+this.descent;this.spacing=function(L,N,E){var O=this.glyphs,M,K,G,P=[],F=0,J=-1,I=-1,H;while(H=L[++J]){M=O[H]||this.missingGlyph;if(!M){continue}if(K){F-=G=K[H]||0;P[I]-=G}F+=P[++I]=~~(M.w||this.w)+N+(B[H]?E:0);K=M.k}P.total=F;return P}}function f(){var C={},B={oblique:"italic",italic:"oblique"};this.add=function(D){(C[D.style]||(C[D.style]={}))[D.weight]=D};this.get=function(H,I){var G=C[H]||C[B[H]]||C.normal||C.italic||C.oblique;if(!G){return null}I={normal:400,bold:700}[I]||parseInt(I,10);if(G[I]){return G[I]}var E={1:1,99:0}[I%100],K=[],F,D;if(E===undefined){E=I>400}if(I==500){I=400}for(var J in G){if(!k(G,J)){continue}J=parseInt(J,10);if(!F||J<F){F=J}if(!D||J>D){D=J}K.push(J)}if(I<F){I=F}if(I>D){I=D}K.sort(function(M,L){return(E?(M>=I&&L>=I)?M<L:M>L:(M<=I&&L<=I)?M>L:M<L)?-1:1});return G[K[0]]}}function r(){function D(F,G){if(F.contains){return F.contains(G)}return F.compareDocumentPosition(G)&16}function B(G){var F=G.relatedTarget;if(!F||D(this,F)){return}C(this,G.type=="mouseover")}function E(F){C(this,F.type=="mouseenter")}function C(F,G){setTimeout(function(){var H=d.get(F).options;m.replace(F,G?h(H,H.hover):H,true)},10)}this.attach=function(F){if(F.onmouseenter===undefined){q(F,"mouseover",B);q(F,"mouseout",B)}else{q(F,"mouseenter",E);q(F,"mouseleave",E)}}}function u(){var C=[],D={};function B(H){var E=[],G;for(var F=0;G=H[F];++F){E[F]=C[D[G]]}return E}this.add=function(F,E){D[F]=C.push(E)-1};this.repeat=function(){var E=arguments.length?B(arguments):C,F;for(var G=0;F=E[G++];){m.replace(F[0],F[1],true)}}}function A(){var D={},B=0;function C(E){return E.cufid||(E.cufid=++B)}this.get=function(E){var F=C(E);return D[F]||(D[F]={})}}function a(B){var D={},C={};this.extend=function(E){for(var F in E){if(k(E,F)){D[F]=E[F]}}return this};this.get=function(E){return D[E]!=undefined?D[E]:B[E]};this.getSize=function(F,E){return C[F]||(C[F]=new n.Size(this.get(F),E))};this.isUsable=function(){return !!B}}function q(C,B,D){if(C.addEventListener){C.addEventListener(B,D,false)}else{if(C.attachEvent){C.attachEvent("on"+B,function(){return D.call(C,window.event)})}}}function v(C,B){var D=d.get(C);if(D.options){return C}if(B.hover&&B.hoverables[C.nodeName.toLowerCase()]){b.attach(C)}D.options=B;return C}function j(B){var C={};return function(D){if(!k(C,D)){C[D]=B.apply(null,arguments)}return C[D]}}function c(F,E){var B=n.quotedList(E.get("fontFamily").toLowerCase()),D;for(var C=0;D=B[C];++C){if(i[D]){return i[D].get(E.get("fontStyle"),E.get("fontWeight"))}}return null}function g(B){return document.getElementsByTagName(B)}function k(C,B){return C.hasOwnProperty(B)}function h(){var C={},B,F;for(var E=0,D=arguments.length;B=arguments[E],E<D;++E){for(F in B){if(k(B,F)){C[F]=B[F]}}}return C}function o(E,M,C,N,F,D){var K=document.createDocumentFragment(),H;if(M===""){return K}var L=N.separate;var I=M.split(p[L]),B=(L=="words");if(B&&t){if(/^\s/.test(M)){I.unshift("")}if(/\s$/.test(M)){I.push("")}}for(var J=0,G=I.length;J<G;++J){H=z[N.engine](E,B?n.textAlign(I[J],C,J,G):I[J],C,N,F,D,J<G-1);if(H){K.appendChild(H)}}return K}function l(D,M){var C=D.nodeName.toLowerCase();if(M.ignore[C]){return}var E=!M.textless[C];var B=n.getStyle(v(D,M)).extend(M);var F=c(D,B),G,K,I,H,L,J;if(!F){return}for(G=D.firstChild;G;G=I){K=G.nodeType;I=G.nextSibling;if(E&&K==3){if(H){H.appendData(G.data);D.removeChild(G)}else{H=G}if(I){continue}}if(H){D.replaceChild(o(F,n.whiteSpace(H.data,B,H,J),B,M,G,D),H);H=null}if(K==1){if(G.firstChild){if(G.nodeName.toLowerCase()=="cufon"){z[M.engine](F,null,B,M,G,D)}else{arguments.callee(G,M)}}J=G}}}var t=" ".split(/\s+/).length==0;var d=new A();var b=new r();var y=new u();var e=false;var z={},i={},w={autoDetect:false,engine:null,forceHitArea:false,hover:false,hoverables:{a:true},ignore:{applet:1,canvas:1,col:1,colgroup:1,head:1,iframe:1,map:1,optgroup:1,option:1,script:1,select:1,style:1,textarea:1,title:1,pre:1},printable:true,selector:(window.Sizzle||(window.jQuery&&function(B){return jQuery(B)})||(window.dojo&&dojo.query)||(window.Ext&&Ext.query)||(window.YAHOO&&YAHOO.util&&YAHOO.util.Selector&&YAHOO.util.Selector.query)||(window.$$&&function(B){return $$(B)})||(window.$&&function(B){return $(B)})||(document.querySelectorAll&&function(B){return document.querySelectorAll(B)})||g),separate:"words",textless:{dl:1,html:1,ol:1,table:1,tbody:1,thead:1,tfoot:1,tr:1,ul:1},textShadow:"none"};var p={words:/\s/.test("\u00a0")?/[^\S\u00a0]+/:/\s+/,characters:"",none:/^/};m.now=function(){x.ready();return m};m.refresh=function(){y.repeat.apply(y,arguments);return m};m.registerEngine=function(C,B){if(!B){return m}z[C]=B;return m.set("engine",C)};m.registerFont=function(D){if(!D){return m}var B=new s(D),C=B.family;if(!i[C]){i[C]=new f()}i[C].add(B);return m.set("fontFamily",'"'+C+'"')};m.replace=function(D,C,B){C=h(w,C);if(!C.engine){return m}if(!e){n.addClass(x.root(),"cufon-active cufon-loading");n.ready(function(){n.addClass(n.removeClass(x.root(),"cufon-loading"),"cufon-ready")});e=true}if(C.hover){C.forceHitArea=true}if(C.autoDetect){delete C.fontFamily}if(typeof C.textShadow=="string"){C.textShadow=n.textShadow(C.textShadow)}if(typeof C.color=="string"&&/^-/.test(C.color)){C.textGradient=n.gradient(C.color)}else{delete C.textGradient}if(!B){y.add(D,arguments)}if(D.nodeType||typeof D=="string"){D=[D]}n.ready(function(){for(var F=0,E=D.length;F<E;++F){var G=D[F];if(typeof G=="string"){m.replace(C.selector(G),C,true)}else{l(G,C)}}});return m};m.set=function(B,C){w[B]=C;return m};return m})();Cufon.registerEngine("vml",(function(){var e=document.namespaces;if(!e){return}e.add("cvml","urn:schemas-microsoft-com:vml");e=null;var b=document.createElement("cvml:shape");b.style.behavior="url(#default#VML)";if(!b.coordsize){return}b=null;var h=(document.documentMode||0)<8;document.write(('<style type="text/css">cufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:'+(h?"middle":"text-bottom")+";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}</style>").replace(/;/g,"!important;"));function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloat(m)}var k=l.style.left,j=l.runtimeStyle.left;l.runtimeStyle.left=l.currentStyle.left;l.style.left=m.replace("%","em");var i=l.style.pixelLeft;l.style.left=k;l.runtimeStyle.left=j;return i}function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[i]=m=(m=="normal")?0:~~j.convertFrom(a(l,m))}return m}var g={};function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElement("cvml:fill"),i=[];o.type="gradient";o.angle=180;o.focus="0";o.method="sigma";o.color=n[0][1];for(var m=1,l=n.length-1;m<l;++m){i.push(n[m][0]*100+"% "+n[m][1])}o.colors=i.join(",");o.color2=n[l][1];g[q]=o}return g[q]}return function(ac,G,Y,C,K,ad,W){var n=(G===null);if(n){G=K.alt}var I=ac.viewBox;var p=Y.computedFontSize||(Y.computedFontSize=new Cufon.CSS.Size(c(ad,Y.get("fontSize"))+"px",ac.baseSize));var y,q;if(n){y=K;q=K.firstChild}else{y=document.createElement("cufon");y.className="cufon cufon-vml";y.alt=G;q=document.createElement("cufoncanvas");y.appendChild(q);if(C.printable){var Z=document.createElement("cufontext");Z.appendChild(document.createTextNode(G));y.appendChild(Z)}if(!W){y.appendChild(document.createElement("cvml:shape"))}}var ai=y.style;var R=q.style;var l=p.convert(I.height),af=Math.ceil(l);var V=af/l;var P=V*Cufon.CSS.fontStretch(Y.get("fontStretch"));var U=I.minX,T=I.minY;R.height=af;R.top=Math.round(p.convert(T-ac.ascent));R.left=Math.round(p.convert(U));ai.height=p.convert(ac.height)+"px";var F=Y.get("color");var ag=Cufon.CSS.textTransform(G,Y).split("");var L=ac.spacing(ag,f(ad,Y,p,"letterSpacing"),f(ad,Y,p,"wordSpacing"));if(!L.length){return null}var k=L.total;var x=-U+k+(I.width-L[L.length-1]);var ah=p.convert(x*P),X=Math.round(ah);var O=x+","+I.height,m;var J="r"+O+"ns";var u=C.textGradient&&d(C.textGradient);var o=ac.glyphs,S=0;var H=C.textShadow;var ab=-1,aa=0,w;while(w=ag[++ab]){var D=o[ag[ab]]||ac.missingGlyph,v;if(!D){continue}if(n){v=q.childNodes[aa];while(v.firstChild){v.removeChild(v.firstChild)}}else{v=document.createElement("cvml:shape");q.appendChild(v)}v.stroked="f";v.coordsize=O;v.coordorigin=m=(U-S)+","+T;v.path=(D.d?"m"+D.d+"xe":"")+"m"+m+J;v.fillcolor=F;if(u){v.appendChild(u.cloneNode(false))}var ae=v.style;ae.width=X;ae.height=af;if(H){var s=H[0],r=H[1];var B=Cufon.CSS.color(s.color),z;var N=document.createElement("cvml:shadow");N.on="t";N.color=B.color;N.offset=s.offX+","+s.offY;if(r){z=Cufon.CSS.color(r.color);N.type="double";N.color2=z.color;N.offset2=r.offX+","+r.offY}N.opacity=B.opacity||(z&&z.opacity)||1;v.appendChild(N)}S+=L[aa++]}var M=v.nextSibling,t,A;if(C.forceHitArea){if(!M){M=document.createElement("cvml:rect");M.stroked="f";M.className="cufon-vml-cover";t=document.createElement("cvml:fill");t.opacity=0;M.appendChild(t);q.appendChild(M)}A=M.style;A.width=X;A.height=af}else{if(M){q.removeChild(M)}}ai.width=Math.max(Math.ceil(p.convert(k*P)),0);if(h){var Q=Y.computedYAdjust;if(Q===undefined){var E=Y.get("lineHeight");if(E=="normal"){E="1em"}else{if(!isNaN(E)){E+="em"}}Y.computedYAdjust=Q=0.5*(a(ad,E)-parseFloat(ai.height))}if(Q){ai.marginTop=Math.ceil(Q)+"px";ai.marginBottom=Q+"px"}}return y}})());Cufon.registerEngine("canvas",(function(){var b=document.createElement("canvas");if(!b||!b.getContext||!b.getContext.apply){return}b=null;var a=Cufon.CSS.supports("display","inline-block");var e=!a&&(document.compatMode=="BackCompat"||/frameset|transitional/i.test(document.doctype.publicId));var f=document.createElement("style");f.type="text/css";f.appendChild(document.createTextNode(("cufon{text-indent:0;}@media screen,projection{cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;"+(e?"":"font-size:1px;line-height:1px;")+"}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;overflow:hidden;text-indent:-10000in;}"+(a?"cufon canvas{position:relative;}":"cufon canvas{position:absolute;}")+"}@media print{cufon{padding:0;}cufon canvas{display:none;}}").replace(/;/g,"!important;")));document.getElementsByTagName("head")[0].appendChild(f);function d(p,h){var n=0,m=0;var g=[],o=/([mrvxe])([^a-z]*)/g,k;generate:for(var j=0;k=o.exec(p);++j){var l=k[2].split(",");switch(k[1]){case"v":g[j]={m:"bezierCurveTo",a:[n+~~l[0],m+~~l[1],n+~~l[2],m+~~l[3],n+=~~l[4],m+=~~l[5]]};break;case"r":g[j]={m:"lineTo",a:[n+=~~l[0],m+=~~l[1]]};break;case"m":g[j]={m:"moveTo",a:[n=~~l[0],m=~~l[1]]};break;case"x":g[j]={m:"closePath"};break;case"e":break generate}h[g[j].m].apply(h,g[j].a)}return g}function c(m,k){for(var j=0,h=m.length;j<h;++j){var g=m[j];k[g.m].apply(k,g.a)}}return function(V,w,P,t,C,W){var k=(w===null);if(k){w=C.getAttribute("alt")}var A=V.viewBox;var m=P.getSize("fontSize",V.baseSize);var B=0,O=0,N=0,u=0;var z=t.textShadow,L=[];if(z){for(var U=z.length;U--;){var F=z[U];var K=m.convertFrom(parseFloat(F.offX));var I=m.convertFrom(parseFloat(F.offY));L[U]=[K,I];if(I<B){B=I}if(K>O){O=K}if(I>N){N=I}if(K<u){u=K}}}var Z=Cufon.CSS.textTransform(w,P).split("");var E=V.spacing(Z,~~m.convertFrom(parseFloat(P.get("letterSpacing"))||0),~~m.convertFrom(parseFloat(P.get("wordSpacing"))||0));if(!E.length){return null}var h=E.total;O+=A.width-E[E.length-1];u+=A.minX;var s,n;if(k){s=C;n=C.firstChild}else{s=document.createElement("cufon");s.className="cufon cufon-canvas";s.setAttribute("alt",w);n=document.createElement("canvas");s.appendChild(n);if(t.printable){var S=document.createElement("cufontext");S.appendChild(document.createTextNode(w));s.appendChild(S)}}var aa=s.style;var H=n.style;var j=m.convert(A.height);var Y=Math.ceil(j);var M=Y/j;var G=M*Cufon.CSS.fontStretch(P.get("fontStretch"));var J=h*G;var Q=Math.ceil(m.convert(J+O-u));var o=Math.ceil(m.convert(A.height-B+N));n.width=Q;n.height=o;H.width=Q+"px";H.height=o+"px";B+=A.minY;H.top=Math.round(m.convert(B-V.ascent))+"px";H.left=Math.round(m.convert(u))+"px";var r=Math.max(Math.ceil(m.convert(J)),0)+"px";if(a){aa.width=r;aa.height=m.convert(V.height)+"px"}else{aa.paddingLeft=r;aa.paddingBottom=(m.convert(V.height)-1)+"px"}var X=n.getContext("2d"),D=j/A.height;X.scale(D,D*M);X.translate(-u,-B);X.save();function T(){var x=V.glyphs,ab,l=-1,g=-1,y;X.scale(G,1);while(y=Z[++l]){var ab=x[Z[l]]||V.missingGlyph;if(!ab){continue}if(ab.d){X.beginPath();if(ab.code){c(ab.code,X)}else{ab.code=d("m"+ab.d,X)}X.fill()}X.translate(E[++g],0)}X.restore()}if(z){for(var U=z.length;U--;){var F=z[U];X.save();X.fillStyle=F.color;X.translate.apply(X,L[U]);T()}}var q=t.textGradient;if(q){var v=q.stops,p=X.createLinearGradient(0,A.minY,0,A.maxY);for(var U=0,R=v.length;U<R;++U){p.addColorStop.apply(p,v[U])}X.fillStyle=p}else{X.fillStyle=P.get("color")}T();return s}})());
Cufon.registerFont({"w":200,"face":{"font-family":"Serifa","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 8 3 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"5","bbox":"-5 -329 352 66.3642","underline-thickness":"18","underline-position":"-36","unicode-range":"U+0021-U+00F8"},"glyphs":{" ":{},"A":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91","w":280},"\u00c6":{"d":"170,-106r-12,-101r-49,101r61,0xm7,0r0,-34r19,0r101,-201r217,0r0,70r-42,0r0,-36r-96,0r7,64r32,0r0,-32r38,0r0,96r-38,0r0,-32r-28,0r9,71r76,0r0,-43r42,0r0,77r-198,0r0,-34r33,0r-5,-38r-81,0r-19,38r30,0r0,34r-97,0","w":360},"\u00c4":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00c5":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm102,-291v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm120,-291v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20","w":280},"B":{"d":"89,-105r0,71v41,-1,87,7,85,-37v-2,-47,-46,-31,-85,-34xm89,-201r0,64v37,0,78,6,78,-34v0,-39,-43,-28,-78,-30xm10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0v43,0,93,0,93,57v0,32,-18,48,-48,55v30,1,56,23,56,54v0,71,-66,69,-103,69r-111,0","w":240},"C":{"d":"128,-240v29,-1,52,8,68,32r0,-27r45,0r0,87r-45,0v0,-36,-24,-58,-59,-58v-53,0,-69,47,-69,94v0,45,22,83,72,83v29,0,53,-21,54,-52r48,0v-1,66,-57,86,-103,86v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124","w":259},"D":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r129,0v23,0,120,3,120,117v0,78,-50,118,-126,118r-123,0xm89,-201r0,167v72,7,117,-17,117,-84v0,-67,-44,-90,-117,-83","w":280},"E":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r214,0r0,70r-41,0r0,-36r-94,0r0,64r36,0r0,-32r38,0r0,96r-38,0r0,-32r-36,0r0,71r94,0r0,-43r41,0r0,77r-214,0","w":240},"F":{"d":"10,-235r214,0r0,78r-41,0r0,-44r-94,0r0,69r33,0r0,-32r38,0r0,96r-38,0r0,-32r-33,0r0,66r35,0r0,34r-114,0r0,-34r30,0r0,-167r-30,0r0,-34","w":240},"G":{"d":"246,-235r0,82r-45,0v-2,-37,-29,-53,-64,-53v-53,0,-69,47,-69,94v0,45,22,83,72,83v33,0,60,-21,61,-57r-36,0r0,-35r106,0r0,35r-23,0r0,86r-45,0v-1,-8,2,-21,-1,-27v-13,23,-39,32,-63,32v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124v31,-1,56,9,73,28r0,-23r45,0","w":280},"H":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0r0,34r-34,0r0,64r102,0r0,-64r-34,0r0,-34r113,0r0,34r-30,0r0,167r30,0r0,34r-113,0r0,-34r34,0r0,-69r-102,0r0,69r34,0r0,34r-113,0","w":280},"I":{"d":"15,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-29,0r0,167r29,0r0,34r-109,0","w":139},"J":{"d":"190,-235r0,34r-27,0r0,130v0,32,-4,76,-80,76v-60,0,-72,-34,-71,-84r50,0v0,25,-2,49,27,50v14,0,24,-11,24,-34r0,-138r-37,0r0,-34r114,0"},"K":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-30,0r0,74r74,-74r-21,0r0,-34r102,0r0,34r-22,0r-75,76r82,91r21,0r0,34r-110,0r0,-34r27,0r-78,-86r0,86r30,0r0,34r-109,0","w":260},"L":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r117,0r0,34r-38,0r0,167r78,0r0,-49r43,0r0,83r-200,0","w":219},"M":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r110,0r50,174r49,-174r110,0r0,34r-29,0r0,167r29,0r0,34r-104,0r0,-34r27,0r-1,-167r-59,201r-51,0r-60,-201r0,167r27,0r0,34r-98,0","w":339},"N":{"d":"7,0r0,-34r30,0r0,-167r-30,0r0,-34r100,0r92,175r0,-141r-30,0r0,-34r104,0r0,34r-29,0r0,201r-66,0r-96,-182r0,148r29,0r0,34r-104,0","w":280},"O":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89","w":280},"\u00d6":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00d8":{"d":"240,-249r16,14r-25,28v67,71,29,212,-91,212v-32,0,-58,-8,-78,-23r-26,29r-17,-13r27,-30v-63,-75,-24,-208,94,-208v30,0,55,7,75,20xm78,-68r109,-122v-11,-10,-26,-16,-47,-16v-70,0,-85,82,-62,138xm200,-172r-110,123v12,13,28,20,50,20v71,0,86,-88,60,-143","w":280},"P":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r127,0v37,0,84,7,84,72v0,78,-58,77,-129,75r0,54r38,0r0,34r-120,0xm92,-201r0,79v40,0,79,5,79,-39v0,-51,-39,-38,-79,-40","w":240},"Q":{"d":"274,-34r0,34v-46,0,-95,5,-134,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,26,-11,69,-53,86v18,-5,41,-1,63,-2xm68,-118v0,50,21,89,72,89v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88","w":280},"R":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r135,0v42,0,81,6,81,66v1,33,-25,50,-54,56v42,3,45,45,56,79r24,0r0,34r-66,0v-16,-35,-8,-96,-57,-98r-37,0r0,64r30,0r0,34r-112,0xm92,-201r0,69v40,-1,86,9,86,-35v0,-46,-46,-32,-86,-34","w":259},"S":{"d":"19,0r0,-79r43,0v0,37,15,52,51,52v17,0,39,-12,39,-31v0,-72,-132,-18,-132,-114v0,-71,94,-89,134,-44r0,-19r41,0r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,71,-97,94,-141,47r0,19r-41,0","w":220},"T":{"d":"13,-235r214,0r0,81r-41,0r0,-47r-41,0r0,167r34,0r0,34r-118,0r0,-34r34,0r0,-167r-41,0r0,47r-41,0r0,-81","w":239},"U":{"d":"254,-235r0,34r-25,0r0,119v0,48,-40,87,-97,87v-142,0,-91,-97,-101,-206r-25,0r0,-34r107,0r0,34r-32,0r0,103v0,20,-3,69,51,69v57,0,52,-51,52,-69r0,-103r-32,0r0,-34r102,0","w":259},"V":{"d":"273,-235r0,34r-21,0r-84,201r-57,0r-83,-201r-21,0r0,-34r107,0r0,34r-32,0r60,152r59,-152r-32,0r0,-34r104,0","w":280},"W":{"d":"352,-235r0,34r-16,0r-50,201r-62,0r-45,-186r-46,186r-62,0r-47,-201r-16,0r0,-34r97,0r0,34r-32,0r32,148r45,-182r65,0r43,182r34,-148r-32,0r0,-34r92,0","w":359},"X":{"d":"6,0r0,-34r16,0r77,-87r-72,-80r-17,0r0,-34r106,0r0,34r-27,0r43,50r45,-50r-27,0r0,-34r99,0r0,34r-16,0r-72,80r77,87r16,0r0,34r-109,0r0,-34r31,0r-49,-57r-49,57r31,0r0,34r-103,0","w":259},"Y":{"d":"71,0r0,-34r34,0r0,-50r-79,-117r-20,0r0,-34r108,0r0,34r-30,0r48,74r49,-74r-30,0r0,-34r104,0r0,34r-20,0r-80,117r0,50r34,0r0,34r-118,0","w":260},"Z":{"d":"16,0r0,-44r145,-157r-100,0r0,43r-41,0r0,-77r201,0r0,43r-147,158r109,0r0,-48r42,0r0,82r-209,0","w":240},"a":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50"},"\u00e4":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"\u00e6":{"d":"171,-101r71,0v-1,-22,-9,-40,-35,-40v-23,0,-35,19,-36,40xm66,-119r-45,0v1,-64,107,-76,130,-23v12,-25,37,-32,63,-32v61,0,76,50,73,103r-116,0v-8,44,60,63,69,19r45,0v-5,70,-118,78,-144,19v-17,55,-130,52,-128,-12v3,-62,64,-55,113,-56v2,-25,-4,-40,-31,-40v-15,0,-28,7,-29,22xm126,-71v-29,0,-68,-3,-68,23v0,16,14,21,29,21v27,0,39,-23,39,-44","w":300},"&":{"d":"263,-143r0,35r-26,0v-3,23,-13,44,-29,61r13,13r42,0r0,34r-69,0r-18,-18v-55,43,-161,32,-162,-48v0,-36,17,-56,48,-70v-13,-14,-23,-28,-23,-48v0,-41,37,-56,73,-56v37,0,65,17,65,57v0,28,-21,45,-45,58r49,50v8,-9,14,-21,15,-33r-20,0r0,-35r87,0xm151,-45r-59,-60v-42,13,-33,78,15,78v17,0,31,-8,44,-18xm107,-208v-33,1,-24,42,-4,55v26,-7,45,-53,4,-55","w":280},"\u00e5":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm62,-224v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm80,-224v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20"},"^":{"d":"92,-235r33,0r63,131r-34,0r-46,-95r-46,95r-34,0","w":216},"~":{"d":"72,-119v24,0,53,23,73,23v14,0,22,-13,30,-25r12,28v-10,14,-22,30,-43,30v-35,0,-85,-49,-103,1r-12,-28v8,-14,20,-29,43,-29","w":216},"*":{"d":"79,-168r-41,-10r10,-33r39,17r-3,-41r34,0r-4,41r38,-17r10,33r-41,10r28,30r-27,20r-22,-35r-22,35r-27,-20"},"@":{"d":"148,-152v-41,-3,-58,73,-12,75v38,4,55,-73,12,-75xm188,-178r28,0r-18,83v-2,7,-5,20,3,20v18,0,37,-22,37,-58v0,-54,-38,-82,-89,-82v-57,0,-94,41,-94,98v0,89,111,126,166,70r29,0v-59,96,-225,48,-225,-71v0,-70,56,-122,124,-122v59,0,114,39,114,99v0,70,-60,95,-82,95v-10,0,-17,-7,-19,-17v-29,36,-86,7,-86,-39v0,-58,71,-113,108,-59","w":288},"b":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm81,-144v38,-57,129,-29,129,62v0,45,-24,87,-73,87v-30,1,-44,-11,-60,-33r0,28r-67,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,96","w":219},"\\":{"d":"98,5r-92,-245r36,0r92,245r-36,0","w":140},"|":{"d":"22,5r0,-245r36,0r0,245r-36,0","w":79},"{":{"d":"116,-260r0,27v-24,-3,-39,5,-39,26r0,56v0,37,-26,39,-35,43v10,1,35,7,35,42v0,37,-19,91,39,82r0,27v-42,3,-75,-1,-75,-48r0,-56v0,-24,-22,-32,-34,-32r0,-31v12,0,34,-8,34,-32r0,-55v6,-46,33,-52,75,-49","w":119},"}":{"d":"4,43r0,-27v24,3,39,-5,39,-26r0,-56v0,-37,26,-39,35,-43v-10,-1,-35,-7,-35,-42v0,-37,19,-91,-39,-82r0,-27v43,-3,75,2,75,49r0,55v0,24,22,33,34,33r0,30v-12,0,-34,9,-34,33r0,55v-6,46,-33,51,-75,48","w":119},"[":{"d":"105,-260r0,27r-38,0r0,249r38,0r0,27r-75,0r0,-303r75,0","w":119},"]":{"d":"15,43r0,-27r38,0r0,-249r-38,0r0,-27r75,0r0,303r-75,0","w":119},"c":{"d":"170,-168r0,65r-38,0v-1,-24,-10,-38,-35,-38v-52,1,-52,111,1,112v17,0,31,-12,32,-30r43,0v-4,43,-36,64,-75,64v-67,0,-88,-49,-88,-86v0,-53,22,-93,77,-93v20,-1,36,11,47,25r0,-19r36,0","w":180},":":{"d":"76,0r-52,0r0,-53r52,0r0,53xm76,-168r0,52r-52,0r0,-52r52,0","w":100},",":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0","w":100},"d":{"d":"186,-240r0,208r24,0r0,32r-67,0r0,-28v-15,24,-30,33,-60,33v-49,0,-73,-42,-73,-87v0,-93,94,-117,129,-62r0,-64r-24,0r0,-32r71,0xm95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55","w":219},"$":{"d":"185,-235r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,44,-32,70,-74,71r0,27r-35,0r0,-31v-13,-2,-22,-10,-32,-20r0,19r-41,0r0,-79r43,0v0,37,15,52,51,52v17,0,38,-12,38,-31v0,-72,-131,-18,-131,-114v0,-44,31,-67,72,-68r0,-29r35,0r0,33v11,2,17,12,27,20r0,-19r41,0"},"e":{"d":"64,-101r74,0v0,-24,-12,-40,-37,-40v-24,0,-37,17,-37,40xm186,-71r-122,0v-6,45,64,63,75,19r45,0v-8,41,-41,57,-80,57v-59,0,-90,-35,-90,-91v0,-102,157,-120,170,-23v2,13,2,26,2,38"},"8":{"d":"66,-172v0,23,11,34,34,34v23,0,35,-11,35,-34v0,-23,-12,-36,-35,-36v-23,0,-34,12,-34,36xm21,-172v0,-48,35,-68,79,-68v44,0,80,20,80,68v1,31,-20,43,-46,51v30,5,50,23,50,55v0,53,-35,71,-84,71v-50,0,-84,-16,-84,-71v-1,-30,24,-50,50,-56v-28,-5,-45,-20,-45,-50xm64,-67v0,24,12,40,36,40v23,0,36,-17,36,-40v0,-23,-12,-38,-36,-38v-24,0,-36,15,-36,38"},"=":{"d":"17,-112r0,-36r182,0r0,36r-182,0xm17,-34r0,-36r182,0r0,36r-182,0","w":216},"!":{"d":"97,-235r-11,167r-32,0r-11,-167r54,0xm44,0r0,-48r52,0r0,48r-52,0","w":140},"f":{"d":"15,0r0,-32r31,0r0,-104r-31,0r0,-32r31,0v-2,-45,3,-74,66,-78v10,0,22,3,32,4r0,35v-28,-9,-57,-2,-50,39r38,0r0,32r-38,0r0,104r31,0r0,32r-110,0","w":140},"5":{"d":"176,-235r0,34r-105,0r0,64v12,-15,29,-22,48,-22v46,0,68,39,68,82v0,40,-19,82,-88,82v-41,0,-79,-21,-78,-66r50,0v1,21,10,32,32,32v26,0,35,-23,35,-47v0,-24,-9,-49,-36,-49v-18,0,-31,14,-31,32r-48,0r0,-142r153,0"},"4":{"d":"115,-92r-1,-96r-70,96r71,0xm82,0r0,-34r33,0r0,-24r-107,0r0,-44r97,-133r58,0r0,143r29,0r0,34r-29,0r0,24r27,0r0,34r-108,0"},"g":{"d":"210,-168r0,32r-24,0v-5,99,30,202,-89,202v-50,0,-75,-16,-78,-56r52,0v1,21,16,24,31,24v28,-2,41,-28,37,-61v-16,17,-28,24,-57,24v-45,0,-72,-38,-72,-81v0,-50,23,-89,77,-89v28,-1,42,14,56,30r0,-25r67,0xm60,-86v0,26,13,49,40,49v30,0,41,-24,41,-51v0,-26,-10,-51,-40,-51v-30,0,-41,26,-41,53","w":219},"`":{"d":"45,-243r30,52r-31,0r-49,-52r50,0","w":100},">":{"d":"20,0r0,-36r127,-55r-127,-55r0,-36r176,76r0,30","w":216},"h":{"d":"6,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r1,96v25,-50,113,-37,113,32r0,80r23,0r0,32r-93,0r0,-32r22,0v0,-37,8,-112,-27,-107v-53,6,-36,58,-39,107r22,0r0,32r-93,0","w":219},"-":{"d":"18,-79r0,-36r84,0r0,36r-84,0","w":119},"i":{"d":"13,0r0,-32r23,0r0,-104r-23,0r0,-32r71,0r0,136r23,0r0,32r-94,0xm84,-240r0,47r-50,0r0,-47r50,0","w":119},"j":{"d":"77,-168r0,172v5,53,-27,69,-77,60r0,-32v23,2,29,-5,29,-29r0,-139r-23,0r0,-32r71,0xm77,-240r0,47r-50,0r0,-47r50,0","w":100},"k":{"d":"9,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,143v16,-13,35,-24,50,-39r-23,0r0,-32r95,0r0,32v-32,-2,-39,20,-58,30r48,74r20,0r0,32r-92,0r0,-32r20,0r-30,-47r-30,24r0,23r20,0r0,32r-91,0","w":220},"l":{"d":"13,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,208r23,0r0,32r-94,0","w":119},"<":{"d":"196,-182r0,36r-127,55r127,55r0,36r-176,-76r0,-30","w":216},"m":{"d":"9,0r0,-32r23,0r0,-104r-23,0r0,-32r67,0v1,9,-2,21,1,28v22,-43,91,-48,113,-2v23,-50,118,-42,118,23r0,87r23,0r0,32r-93,0r0,-32r22,0v-5,-42,17,-107,-29,-107v-49,0,-35,61,-37,107r22,0r0,32r-91,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":340},"n":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r67,0v1,9,-2,21,1,28v12,-22,33,-34,57,-34v74,0,59,75,60,142r24,0r0,32r-93,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":240},"9":{"d":"98,-208v-49,2,-50,97,1,96v50,-2,53,-95,-1,-96xm17,-57r50,0v0,19,9,30,27,30v37,0,40,-51,42,-78v-14,19,-29,25,-54,25v-44,0,-68,-40,-68,-81v0,-56,34,-79,87,-79v71,0,85,51,85,115v0,66,-18,130,-94,130v-43,0,-72,-18,-75,-62"},"#":{"d":"37,0r9,-68r-28,0r4,-28r28,0r7,-43r-29,0r4,-29r28,0r10,-67r29,0r-10,67r36,0r9,-67r29,0r-9,67r29,0r-5,29r-28,0r-6,43r28,0r-4,28r-28,0r-10,68r-28,0r9,-68r-36,0r-9,68r-29,0xm85,-139r-6,43r36,0r6,-43r-36,0"},"o":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90"},"\u00f6":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"1":{"d":"53,0r0,-34r36,0r0,-159v-16,14,-34,27,-52,39r0,-45v18,-12,34,-23,50,-36r50,0r0,201r36,0r0,34r-120,0"},"\u00f8":{"d":"177,-183r13,13r-22,23v46,53,16,152,-68,152v-22,0,-41,-6,-56,-18r-26,28r-13,-12r26,-28v-47,-53,-10,-149,69,-149v21,0,39,6,54,16xm63,-60r63,-69v-38,-32,-82,18,-63,69xm136,-112r-64,70v6,8,15,13,28,13v41,-1,45,-48,36,-83"},"p":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm10,61r0,-32r23,0r0,-165r-23,0r0,-32r67,0v1,9,-2,22,1,29v38,-66,132,-36,132,57v0,45,-24,87,-73,87v-26,1,-39,-8,-56,-28r0,52r26,0r0,32r-97,0","w":219},"(":{"d":"74,-260r36,0v-58,92,-60,214,0,303r-36,0v-66,-89,-63,-212,0,-303","w":119},")":{"d":"46,43r-36,0v58,-92,60,-214,0,-303r36,0v66,89,63,212,0,303","w":119},"%":{"d":"177,-57v0,-37,19,-62,58,-62v39,0,59,25,59,62v0,36,-21,62,-59,62v-39,0,-58,-26,-58,-62xm211,-57v0,16,3,37,24,37v34,0,37,-74,0,-74v-21,0,-24,21,-24,37xm26,-179v0,-37,20,-61,59,-61v39,0,58,24,58,61v0,36,-20,62,-58,62v-39,0,-59,-26,-59,-62xm56,7r178,-250r31,0r-179,250r-30,0xm85,-215v-36,2,-35,70,0,73v33,-2,36,-72,0,-73","w":320},".":{"d":"24,0r0,-53r52,0r0,53r-52,0","w":100},"+":{"d":"17,-73r0,-36r73,0r0,-73r36,0r0,73r73,0r0,36r-73,0r0,73r-36,0r0,-73r-73,0","w":216},"q":{"d":"95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55xm210,29r0,32r-97,0r0,-32r26,0v-1,-17,2,-37,-1,-52v-15,22,-30,28,-55,28v-49,0,-73,-42,-73,-87v0,-94,93,-121,133,-57r0,-29r67,0r0,32r-24,0r0,165r24,0","w":219},"?":{"d":"167,-180v0,53,-63,56,-58,112r-45,0r0,-12v-12,-37,54,-73,54,-104v0,-15,-11,-24,-27,-24v-24,0,-28,16,-29,40r-49,0v0,-52,29,-72,80,-72v39,0,74,19,74,60xm60,0r0,-48r53,0r0,48r-53,0","w":180},"\"":{"d":"148,-235r0,99r-36,0r0,-99r36,0xm52,-136r0,-99r36,0r0,99r-36,0"},"'":{"d":"32,-136r0,-99r36,0r0,99r-36,0","w":100},"r":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r68,0v1,10,-2,24,1,32v12,-28,38,-45,72,-35r0,39v-61,-14,-77,36,-70,100r29,0r0,32r-100,0","w":159},"s":{"d":"17,0r0,-59r38,0v0,21,17,32,36,32v10,0,25,-4,25,-20v0,-35,-100,0,-100,-75v0,-55,80,-69,107,-29r0,-17r36,0r0,55r-38,0v0,-20,-13,-28,-31,-28v-10,0,-26,2,-26,18v0,34,100,0,100,74v0,54,-86,71,-111,31r0,18r-36,0","w":180},";":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0xm76,-168r0,52r-52,0r0,-52r52,0","w":100},"7":{"d":"185,-235r0,39v-35,65,-60,127,-84,196r-53,0v27,-68,57,-136,93,-201r-81,0r0,41r-43,0r0,-75r168,0"},"6":{"d":"102,-27v48,-2,51,-97,0,-96v-51,1,-54,95,0,96xm183,-178r-49,0v0,-19,-10,-30,-28,-30v-37,0,-40,50,-42,77v14,-19,29,-25,54,-25v44,0,68,40,68,81v0,56,-34,80,-87,80v-71,0,-85,-51,-85,-115v0,-66,18,-130,94,-130v43,0,72,18,75,62"},"\/":{"d":"6,5r92,-245r36,0r-92,245r-36,0","w":140},"t":{"d":"123,-168r0,32r-45,0r0,81v0,12,1,26,15,26v14,0,14,-17,14,-25r29,0v1,39,-13,59,-53,59v-69,0,-50,-78,-52,-141r-27,0r0,-32r27,0r0,-33r47,-17r0,50r45,0","w":140},"3":{"d":"82,-103r0,-36v26,2,50,-5,50,-35v0,-22,-13,-32,-34,-32v-23,0,-32,16,-32,37r-50,0v-1,-50,41,-71,85,-71v44,0,80,17,80,65v0,32,-20,48,-49,54v30,3,52,24,52,55v0,48,-37,71,-88,71v-45,0,-83,-16,-83,-72r50,0v0,23,10,38,34,38v22,0,37,-14,37,-36v0,-35,-24,-38,-52,-38"},"2":{"d":"13,-46v26,-28,115,-83,116,-131v0,-18,-12,-29,-30,-29v-26,0,-33,20,-34,42r-50,0v1,-63,39,-76,88,-76v44,0,76,23,76,69v0,49,-85,108,-113,137r73,0r0,-31r44,0r0,65r-170,0r0,-46"},"u":{"d":"191,-168r0,136r23,0r0,32r-67,0r0,-28v-12,22,-34,33,-58,33v-74,0,-59,-74,-60,-141r-23,0r0,-32r71,0v7,50,-21,139,30,139v47,0,34,-61,36,-107r-22,0r0,-32r70,0","w":219},"_":{"d":"0,45r0,-18r180,0r0,18r-180,0","w":180},"v":{"d":"214,-168r0,32r-18,0r-57,136r-58,0r-57,-136r-18,0r0,-32r94,0r0,32r-25,0r37,97r37,-97r-25,0r0,-32r90,0","w":220},"w":{"d":"315,-168r0,32r-16,0r-42,136r-63,0r-34,-135r-35,135r-63,0r-41,-136r-16,0r0,-32r88,0r0,32r-24,0r27,98r33,-130r66,0r34,130r26,-98r-24,0r0,-32r84,0","w":320},"x":{"d":"10,0r0,-32r16,0r54,-55r-49,-49r-16,0r0,-32r88,0r0,32r-17,0r28,29r26,-29r-16,0r0,-32r82,0r0,32r-16,0r-49,49r53,55r16,0r0,32r-92,0r0,-32r21,0r-32,-35r-32,35r21,0r0,32r-86,0","w":220},"y":{"d":"215,-168r0,32r-17,0r-80,164v-14,37,-41,42,-84,36r0,-34v28,7,48,-1,53,-29r-65,-137r-17,0r0,-32r95,0r0,32r-25,0r37,86r38,-86r-25,0r0,-32r90,0","w":219},"z":{"d":"20,0r0,-38r98,-98r-56,0r0,25r-40,0r0,-57r157,0r0,36r-100,100r62,0r0,-29r40,0r0,61r-161,0"},"0":{"d":"63,-118v0,48,5,89,37,89v32,0,37,-41,37,-89v0,-48,-5,-88,-37,-88v-32,0,-37,40,-37,88xm13,-118v0,-59,18,-122,87,-122v69,0,87,63,87,122v0,59,-18,123,-87,123v-69,0,-87,-64,-87,-123"},"\u00a0":{}}});
Cufon.registerFont({"w":200,"face":{"font-family":"Serifa","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 8 3 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"5","bbox":"-5 -329 352 66.3642","underline-thickness":"18","underline-position":"-36","unicode-range":"U+0021-U+00F8"},"glyphs":{" ":{},"A":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91","w":280},"\u00c6":{"d":"170,-106r-12,-101r-49,101r61,0xm7,0r0,-34r19,0r101,-201r217,0r0,70r-42,0r0,-36r-96,0r7,64r32,0r0,-32r38,0r0,96r-38,0r0,-32r-28,0r9,71r76,0r0,-43r42,0r0,77r-198,0r0,-34r33,0r-5,-38r-81,0r-19,38r30,0r0,34r-97,0","w":360},"\u00c4":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00c5":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm102,-291v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm120,-291v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20","w":280},"B":{"d":"89,-105r0,71v41,-1,87,7,85,-37v-2,-47,-46,-31,-85,-34xm89,-201r0,64v37,0,78,6,78,-34v0,-39,-43,-28,-78,-30xm10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0v43,0,93,0,93,57v0,32,-18,48,-48,55v30,1,56,23,56,54v0,71,-66,69,-103,69r-111,0","w":240},"C":{"d":"128,-240v29,-1,52,8,68,32r0,-27r45,0r0,87r-45,0v0,-36,-24,-58,-59,-58v-53,0,-69,47,-69,94v0,45,22,83,72,83v29,0,53,-21,54,-52r48,0v-1,66,-57,86,-103,86v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124","w":259},"D":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r129,0v23,0,120,3,120,117v0,78,-50,118,-126,118r-123,0xm89,-201r0,167v72,7,117,-17,117,-84v0,-67,-44,-90,-117,-83","w":280},"E":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r214,0r0,70r-41,0r0,-36r-94,0r0,64r36,0r0,-32r38,0r0,96r-38,0r0,-32r-36,0r0,71r94,0r0,-43r41,0r0,77r-214,0","w":240},"F":{"d":"10,-235r214,0r0,78r-41,0r0,-44r-94,0r0,69r33,0r0,-32r38,0r0,96r-38,0r0,-32r-33,0r0,66r35,0r0,34r-114,0r0,-34r30,0r0,-167r-30,0r0,-34","w":240},"G":{"d":"246,-235r0,82r-45,0v-2,-37,-29,-53,-64,-53v-53,0,-69,47,-69,94v0,45,22,83,72,83v33,0,60,-21,61,-57r-36,0r0,-35r106,0r0,35r-23,0r0,86r-45,0v-1,-8,2,-21,-1,-27v-13,23,-39,32,-63,32v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124v31,-1,56,9,73,28r0,-23r45,0","w":280},"H":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0r0,34r-34,0r0,64r102,0r0,-64r-34,0r0,-34r113,0r0,34r-30,0r0,167r30,0r0,34r-113,0r0,-34r34,0r0,-69r-102,0r0,69r34,0r0,34r-113,0","w":280},"I":{"d":"15,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-29,0r0,167r29,0r0,34r-109,0","w":139},"J":{"d":"190,-235r0,34r-27,0r0,130v0,32,-4,76,-80,76v-60,0,-72,-34,-71,-84r50,0v0,25,-2,49,27,50v14,0,24,-11,24,-34r0,-138r-37,0r0,-34r114,0"},"K":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-30,0r0,74r74,-74r-21,0r0,-34r102,0r0,34r-22,0r-75,76r82,91r21,0r0,34r-110,0r0,-34r27,0r-78,-86r0,86r30,0r0,34r-109,0","w":260},"L":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r117,0r0,34r-38,0r0,167r78,0r0,-49r43,0r0,83r-200,0","w":219},"M":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r110,0r50,174r49,-174r110,0r0,34r-29,0r0,167r29,0r0,34r-104,0r0,-34r27,0r-1,-167r-59,201r-51,0r-60,-201r0,167r27,0r0,34r-98,0","w":339},"N":{"d":"7,0r0,-34r30,0r0,-167r-30,0r0,-34r100,0r92,175r0,-141r-30,0r0,-34r104,0r0,34r-29,0r0,201r-66,0r-96,-182r0,148r29,0r0,34r-104,0","w":280},"O":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89","w":280},"\u00d6":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00d8":{"d":"240,-249r16,14r-25,28v67,71,29,212,-91,212v-32,0,-58,-8,-78,-23r-26,29r-17,-13r27,-30v-63,-75,-24,-208,94,-208v30,0,55,7,75,20xm78,-68r109,-122v-11,-10,-26,-16,-47,-16v-70,0,-85,82,-62,138xm200,-172r-110,123v12,13,28,20,50,20v71,0,86,-88,60,-143","w":280},"P":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r127,0v37,0,84,7,84,72v0,78,-58,77,-129,75r0,54r38,0r0,34r-120,0xm92,-201r0,79v40,0,79,5,79,-39v0,-51,-39,-38,-79,-40","w":240},"Q":{"d":"274,-34r0,34v-46,0,-95,5,-134,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,26,-11,69,-53,86v18,-5,41,-1,63,-2xm68,-118v0,50,21,89,72,89v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88","w":280},"R":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r135,0v42,0,81,6,81,66v1,33,-25,50,-54,56v42,3,45,45,56,79r24,0r0,34r-66,0v-16,-35,-8,-96,-57,-98r-37,0r0,64r30,0r0,34r-112,0xm92,-201r0,69v40,-1,86,9,86,-35v0,-46,-46,-32,-86,-34","w":259},"S":{"d":"19,0r0,-79r43,0v0,37,15,52,51,52v17,0,39,-12,39,-31v0,-72,-132,-18,-132,-114v0,-71,94,-89,134,-44r0,-19r41,0r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,71,-97,94,-141,47r0,19r-41,0","w":220},"T":{"d":"13,-235r214,0r0,81r-41,0r0,-47r-41,0r0,167r34,0r0,34r-118,0r0,-34r34,0r0,-167r-41,0r0,47r-41,0r0,-81","w":239},"U":{"d":"254,-235r0,34r-25,0r0,119v0,48,-40,87,-97,87v-142,0,-91,-97,-101,-206r-25,0r0,-34r107,0r0,34r-32,0r0,103v0,20,-3,69,51,69v57,0,52,-51,52,-69r0,-103r-32,0r0,-34r102,0","w":259},"V":{"d":"273,-235r0,34r-21,0r-84,201r-57,0r-83,-201r-21,0r0,-34r107,0r0,34r-32,0r60,152r59,-152r-32,0r0,-34r104,0","w":280},"W":{"d":"352,-235r0,34r-16,0r-50,201r-62,0r-45,-186r-46,186r-62,0r-47,-201r-16,0r0,-34r97,0r0,34r-32,0r32,148r45,-182r65,0r43,182r34,-148r-32,0r0,-34r92,0","w":359},"X":{"d":"6,0r0,-34r16,0r77,-87r-72,-80r-17,0r0,-34r106,0r0,34r-27,0r43,50r45,-50r-27,0r0,-34r99,0r0,34r-16,0r-72,80r77,87r16,0r0,34r-109,0r0,-34r31,0r-49,-57r-49,57r31,0r0,34r-103,0","w":259},"Y":{"d":"71,0r0,-34r34,0r0,-50r-79,-117r-20,0r0,-34r108,0r0,34r-30,0r48,74r49,-74r-30,0r0,-34r104,0r0,34r-20,0r-80,117r0,50r34,0r0,34r-118,0","w":260},"Z":{"d":"16,0r0,-44r145,-157r-100,0r0,43r-41,0r0,-77r201,0r0,43r-147,158r109,0r0,-48r42,0r0,82r-209,0","w":240},"a":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50"},"\u00e4":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"\u00e6":{"d":"171,-101r71,0v-1,-22,-9,-40,-35,-40v-23,0,-35,19,-36,40xm66,-119r-45,0v1,-64,107,-76,130,-23v12,-25,37,-32,63,-32v61,0,76,50,73,103r-116,0v-8,44,60,63,69,19r45,0v-5,70,-118,78,-144,19v-17,55,-130,52,-128,-12v3,-62,64,-55,113,-56v2,-25,-4,-40,-31,-40v-15,0,-28,7,-29,22xm126,-71v-29,0,-68,-3,-68,23v0,16,14,21,29,21v27,0,39,-23,39,-44","w":300},"&":{"d":"263,-143r0,35r-26,0v-3,23,-13,44,-29,61r13,13r42,0r0,34r-69,0r-18,-18v-55,43,-161,32,-162,-48v0,-36,17,-56,48,-70v-13,-14,-23,-28,-23,-48v0,-41,37,-56,73,-56v37,0,65,17,65,57v0,28,-21,45,-45,58r49,50v8,-9,14,-21,15,-33r-20,0r0,-35r87,0xm151,-45r-59,-60v-42,13,-33,78,15,78v17,0,31,-8,44,-18xm107,-208v-33,1,-24,42,-4,55v26,-7,45,-53,4,-55","w":280},"\u00e5":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm62,-224v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm80,-224v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20"},"^":{"d":"92,-235r33,0r63,131r-34,0r-46,-95r-46,95r-34,0","w":216},"~":{"d":"72,-119v24,0,53,23,73,23v14,0,22,-13,30,-25r12,28v-10,14,-22,30,-43,30v-35,0,-85,-49,-103,1r-12,-28v8,-14,20,-29,43,-29","w":216},"*":{"d":"79,-168r-41,-10r10,-33r39,17r-3,-41r34,0r-4,41r38,-17r10,33r-41,10r28,30r-27,20r-22,-35r-22,35r-27,-20"},"@":{"d":"148,-152v-41,-3,-58,73,-12,75v38,4,55,-73,12,-75xm188,-178r28,0r-18,83v-2,7,-5,20,3,20v18,0,37,-22,37,-58v0,-54,-38,-82,-89,-82v-57,0,-94,41,-94,98v0,89,111,126,166,70r29,0v-59,96,-225,48,-225,-71v0,-70,56,-122,124,-122v59,0,114,39,114,99v0,70,-60,95,-82,95v-10,0,-17,-7,-19,-17v-29,36,-86,7,-86,-39v0,-58,71,-113,108,-59","w":288},"b":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm81,-144v38,-57,129,-29,129,62v0,45,-24,87,-73,87v-30,1,-44,-11,-60,-33r0,28r-67,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,96","w":219},"\\":{"d":"98,5r-92,-245r36,0r92,245r-36,0","w":140},"|":{"d":"22,5r0,-245r36,0r0,245r-36,0","w":79},"{":{"d":"116,-260r0,27v-24,-3,-39,5,-39,26r0,56v0,37,-26,39,-35,43v10,1,35,7,35,42v0,37,-19,91,39,82r0,27v-42,3,-75,-1,-75,-48r0,-56v0,-24,-22,-32,-34,-32r0,-31v12,0,34,-8,34,-32r0,-55v6,-46,33,-52,75,-49","w":119},"}":{"d":"4,43r0,-27v24,3,39,-5,39,-26r0,-56v0,-37,26,-39,35,-43v-10,-1,-35,-7,-35,-42v0,-37,19,-91,-39,-82r0,-27v43,-3,75,2,75,49r0,55v0,24,22,33,34,33r0,30v-12,0,-34,9,-34,33r0,55v-6,46,-33,51,-75,48","w":119},"[":{"d":"105,-260r0,27r-38,0r0,249r38,0r0,27r-75,0r0,-303r75,0","w":119},"]":{"d":"15,43r0,-27r38,0r0,-249r-38,0r0,-27r75,0r0,303r-75,0","w":119},"c":{"d":"170,-168r0,65r-38,0v-1,-24,-10,-38,-35,-38v-52,1,-52,111,1,112v17,0,31,-12,32,-30r43,0v-4,43,-36,64,-75,64v-67,0,-88,-49,-88,-86v0,-53,22,-93,77,-93v20,-1,36,11,47,25r0,-19r36,0","w":180},":":{"d":"76,0r-52,0r0,-53r52,0r0,53xm76,-168r0,52r-52,0r0,-52r52,0","w":100},",":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0","w":100},"d":{"d":"186,-240r0,208r24,0r0,32r-67,0r0,-28v-15,24,-30,33,-60,33v-49,0,-73,-42,-73,-87v0,-93,94,-117,129,-62r0,-64r-24,0r0,-32r71,0xm95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55","w":219},"$":{"d":"185,-235r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,44,-32,70,-74,71r0,27r-35,0r0,-31v-13,-2,-22,-10,-32,-20r0,19r-41,0r0,-79r43,0v0,37,15,52,51,52v17,0,38,-12,38,-31v0,-72,-131,-18,-131,-114v0,-44,31,-67,72,-68r0,-29r35,0r0,33v11,2,17,12,27,20r0,-19r41,0"},"e":{"d":"64,-101r74,0v0,-24,-12,-40,-37,-40v-24,0,-37,17,-37,40xm186,-71r-122,0v-6,45,64,63,75,19r45,0v-8,41,-41,57,-80,57v-59,0,-90,-35,-90,-91v0,-102,157,-120,170,-23v2,13,2,26,2,38"},"8":{"d":"66,-172v0,23,11,34,34,34v23,0,35,-11,35,-34v0,-23,-12,-36,-35,-36v-23,0,-34,12,-34,36xm21,-172v0,-48,35,-68,79,-68v44,0,80,20,80,68v1,31,-20,43,-46,51v30,5,50,23,50,55v0,53,-35,71,-84,71v-50,0,-84,-16,-84,-71v-1,-30,24,-50,50,-56v-28,-5,-45,-20,-45,-50xm64,-67v0,24,12,40,36,40v23,0,36,-17,36,-40v0,-23,-12,-38,-36,-38v-24,0,-36,15,-36,38"},"=":{"d":"17,-112r0,-36r182,0r0,36r-182,0xm17,-34r0,-36r182,0r0,36r-182,0","w":216},"!":{"d":"97,-235r-11,167r-32,0r-11,-167r54,0xm44,0r0,-48r52,0r0,48r-52,0","w":140},"f":{"d":"15,0r0,-32r31,0r0,-104r-31,0r0,-32r31,0v-2,-45,3,-74,66,-78v10,0,22,3,32,4r0,35v-28,-9,-57,-2,-50,39r38,0r0,32r-38,0r0,104r31,0r0,32r-110,0","w":140},"5":{"d":"176,-235r0,34r-105,0r0,64v12,-15,29,-22,48,-22v46,0,68,39,68,82v0,40,-19,82,-88,82v-41,0,-79,-21,-78,-66r50,0v1,21,10,32,32,32v26,0,35,-23,35,-47v0,-24,-9,-49,-36,-49v-18,0,-31,14,-31,32r-48,0r0,-142r153,0"},"4":{"d":"115,-92r-1,-96r-70,96r71,0xm82,0r0,-34r33,0r0,-24r-107,0r0,-44r97,-133r58,0r0,143r29,0r0,34r-29,0r0,24r27,0r0,34r-108,0"},"g":{"d":"210,-168r0,32r-24,0v-5,99,30,202,-89,202v-50,0,-75,-16,-78,-56r52,0v1,21,16,24,31,24v28,-2,41,-28,37,-61v-16,17,-28,24,-57,24v-45,0,-72,-38,-72,-81v0,-50,23,-89,77,-89v28,-1,42,14,56,30r0,-25r67,0xm60,-86v0,26,13,49,40,49v30,0,41,-24,41,-51v0,-26,-10,-51,-40,-51v-30,0,-41,26,-41,53","w":219},"`":{"d":"45,-243r30,52r-31,0r-49,-52r50,0","w":100},">":{"d":"20,0r0,-36r127,-55r-127,-55r0,-36r176,76r0,30","w":216},"h":{"d":"6,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r1,96v25,-50,113,-37,113,32r0,80r23,0r0,32r-93,0r0,-32r22,0v0,-37,8,-112,-27,-107v-53,6,-36,58,-39,107r22,0r0,32r-93,0","w":219},"-":{"d":"18,-79r0,-36r84,0r0,36r-84,0","w":119},"i":{"d":"13,0r0,-32r23,0r0,-104r-23,0r0,-32r71,0r0,136r23,0r0,32r-94,0xm84,-240r0,47r-50,0r0,-47r50,0","w":119},"j":{"d":"77,-168r0,172v5,53,-27,69,-77,60r0,-32v23,2,29,-5,29,-29r0,-139r-23,0r0,-32r71,0xm77,-240r0,47r-50,0r0,-47r50,0","w":100},"k":{"d":"9,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,143v16,-13,35,-24,50,-39r-23,0r0,-32r95,0r0,32v-32,-2,-39,20,-58,30r48,74r20,0r0,32r-92,0r0,-32r20,0r-30,-47r-30,24r0,23r20,0r0,32r-91,0","w":220},"l":{"d":"13,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,208r23,0r0,32r-94,0","w":119},"<":{"d":"196,-182r0,36r-127,55r127,55r0,36r-176,-76r0,-30","w":216},"m":{"d":"9,0r0,-32r23,0r0,-104r-23,0r0,-32r67,0v1,9,-2,21,1,28v22,-43,91,-48,113,-2v23,-50,118,-42,118,23r0,87r23,0r0,32r-93,0r0,-32r22,0v-5,-42,17,-107,-29,-107v-49,0,-35,61,-37,107r22,0r0,32r-91,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":340},"n":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r67,0v1,9,-2,21,1,28v12,-22,33,-34,57,-34v74,0,59,75,60,142r24,0r0,32r-93,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":240},"9":{"d":"98,-208v-49,2,-50,97,1,96v50,-2,53,-95,-1,-96xm17,-57r50,0v0,19,9,30,27,30v37,0,40,-51,42,-78v-14,19,-29,25,-54,25v-44,0,-68,-40,-68,-81v0,-56,34,-79,87,-79v71,0,85,51,85,115v0,66,-18,130,-94,130v-43,0,-72,-18,-75,-62"},"#":{"d":"37,0r9,-68r-28,0r4,-28r28,0r7,-43r-29,0r4,-29r28,0r10,-67r29,0r-10,67r36,0r9,-67r29,0r-9,67r29,0r-5,29r-28,0r-6,43r28,0r-4,28r-28,0r-10,68r-28,0r9,-68r-36,0r-9,68r-29,0xm85,-139r-6,43r36,0r6,-43r-36,0"},"o":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90"},"\u00f6":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"1":{"d":"53,0r0,-34r36,0r0,-159v-16,14,-34,27,-52,39r0,-45v18,-12,34,-23,50,-36r50,0r0,201r36,0r0,34r-120,0"},"\u00f8":{"d":"177,-183r13,13r-22,23v46,53,16,152,-68,152v-22,0,-41,-6,-56,-18r-26,28r-13,-12r26,-28v-47,-53,-10,-149,69,-149v21,0,39,6,54,16xm63,-60r63,-69v-38,-32,-82,18,-63,69xm136,-112r-64,70v6,8,15,13,28,13v41,-1,45,-48,36,-83"},"p":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm10,61r0,-32r23,0r0,-165r-23,0r0,-32r67,0v1,9,-2,22,1,29v38,-66,132,-36,132,57v0,45,-24,87,-73,87v-26,1,-39,-8,-56,-28r0,52r26,0r0,32r-97,0","w":219},"(":{"d":"74,-260r36,0v-58,92,-60,214,0,303r-36,0v-66,-89,-63,-212,0,-303","w":119},")":{"d":"46,43r-36,0v58,-92,60,-214,0,-303r36,0v66,89,63,212,0,303","w":119},"%":{"d":"177,-57v0,-37,19,-62,58,-62v39,0,59,25,59,62v0,36,-21,62,-59,62v-39,0,-58,-26,-58,-62xm211,-57v0,16,3,37,24,37v34,0,37,-74,0,-74v-21,0,-24,21,-24,37xm26,-179v0,-37,20,-61,59,-61v39,0,58,24,58,61v0,36,-20,62,-58,62v-39,0,-59,-26,-59,-62xm56,7r178,-250r31,0r-179,250r-30,0xm85,-215v-36,2,-35,70,0,73v33,-2,36,-72,0,-73","w":320},".":{"d":"24,0r0,-53r52,0r0,53r-52,0","w":100},"+":{"d":"17,-73r0,-36r73,0r0,-73r36,0r0,73r73,0r0,36r-73,0r0,73r-36,0r0,-73r-73,0","w":216},"q":{"d":"95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55xm210,29r0,32r-97,0r0,-32r26,0v-1,-17,2,-37,-1,-52v-15,22,-30,28,-55,28v-49,0,-73,-42,-73,-87v0,-94,93,-121,133,-57r0,-29r67,0r0,32r-24,0r0,165r24,0","w":219},"?":{"d":"167,-180v0,53,-63,56,-58,112r-45,0r0,-12v-12,-37,54,-73,54,-104v0,-15,-11,-24,-27,-24v-24,0,-28,16,-29,40r-49,0v0,-52,29,-72,80,-72v39,0,74,19,74,60xm60,0r0,-48r53,0r0,48r-53,0","w":180},"\"":{"d":"148,-235r0,99r-36,0r0,-99r36,0xm52,-136r0,-99r36,0r0,99r-36,0"},"'":{"d":"32,-136r0,-99r36,0r0,99r-36,0","w":100},"r":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r68,0v1,10,-2,24,1,32v12,-28,38,-45,72,-35r0,39v-61,-14,-77,36,-70,100r29,0r0,32r-100,0","w":159},"s":{"d":"17,0r0,-59r38,0v0,21,17,32,36,32v10,0,25,-4,25,-20v0,-35,-100,0,-100,-75v0,-55,80,-69,107,-29r0,-17r36,0r0,55r-38,0v0,-20,-13,-28,-31,-28v-10,0,-26,2,-26,18v0,34,100,0,100,74v0,54,-86,71,-111,31r0,18r-36,0","w":180},";":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0xm76,-168r0,52r-52,0r0,-52r52,0","w":100},"7":{"d":"185,-235r0,39v-35,65,-60,127,-84,196r-53,0v27,-68,57,-136,93,-201r-81,0r0,41r-43,0r0,-75r168,0"},"6":{"d":"102,-27v48,-2,51,-97,0,-96v-51,1,-54,95,0,96xm183,-178r-49,0v0,-19,-10,-30,-28,-30v-37,0,-40,50,-42,77v14,-19,29,-25,54,-25v44,0,68,40,68,81v0,56,-34,80,-87,80v-71,0,-85,-51,-85,-115v0,-66,18,-130,94,-130v43,0,72,18,75,62"},"\/":{"d":"6,5r92,-245r36,0r-92,245r-36,0","w":140},"t":{"d":"123,-168r0,32r-45,0r0,81v0,12,1,26,15,26v14,0,14,-17,14,-25r29,0v1,39,-13,59,-53,59v-69,0,-50,-78,-52,-141r-27,0r0,-32r27,0r0,-33r47,-17r0,50r45,0","w":140},"3":{"d":"82,-103r0,-36v26,2,50,-5,50,-35v0,-22,-13,-32,-34,-32v-23,0,-32,16,-32,37r-50,0v-1,-50,41,-71,85,-71v44,0,80,17,80,65v0,32,-20,48,-49,54v30,3,52,24,52,55v0,48,-37,71,-88,71v-45,0,-83,-16,-83,-72r50,0v0,23,10,38,34,38v22,0,37,-14,37,-36v0,-35,-24,-38,-52,-38"},"2":{"d":"13,-46v26,-28,115,-83,116,-131v0,-18,-12,-29,-30,-29v-26,0,-33,20,-34,42r-50,0v1,-63,39,-76,88,-76v44,0,76,23,76,69v0,49,-85,108,-113,137r73,0r0,-31r44,0r0,65r-170,0r0,-46"},"u":{"d":"191,-168r0,136r23,0r0,32r-67,0r0,-28v-12,22,-34,33,-58,33v-74,0,-59,-74,-60,-141r-23,0r0,-32r71,0v7,50,-21,139,30,139v47,0,34,-61,36,-107r-22,0r0,-32r70,0","w":219},"_":{"d":"0,45r0,-18r180,0r0,18r-180,0","w":180},"v":{"d":"214,-168r0,32r-18,0r-57,136r-58,0r-57,-136r-18,0r0,-32r94,0r0,32r-25,0r37,97r37,-97r-25,0r0,-32r90,0","w":220},"w":{"d":"315,-168r0,32r-16,0r-42,136r-63,0r-34,-135r-35,135r-63,0r-41,-136r-16,0r0,-32r88,0r0,32r-24,0r27,98r33,-130r66,0r34,130r26,-98r-24,0r0,-32r84,0","w":320},"x":{"d":"10,0r0,-32r16,0r54,-55r-49,-49r-16,0r0,-32r88,0r0,32r-17,0r28,29r26,-29r-16,0r0,-32r82,0r0,32r-16,0r-49,49r53,55r16,0r0,32r-92,0r0,-32r21,0r-32,-35r-32,35r21,0r0,32r-86,0","w":220},"y":{"d":"215,-168r0,32r-17,0r-80,164v-14,37,-41,42,-84,36r0,-34v28,7,48,-1,53,-29r-65,-137r-17,0r0,-32r95,0r0,32r-25,0r37,86r38,-86r-25,0r0,-32r90,0","w":219},"z":{"d":"20,0r0,-38r98,-98r-56,0r0,25r-40,0r0,-57r157,0r0,36r-100,100r62,0r0,-29r40,0r0,61r-161,0"},"0":{"d":"63,-118v0,48,5,89,37,89v32,0,37,-41,37,-89v0,-48,-5,-88,-37,-88v-32,0,-37,40,-37,88xm13,-118v0,-59,18,-122,87,-122v69,0,87,63,87,122v0,59,-18,123,-87,123v-69,0,-87,-64,-87,-123"},"\u00a0":{}}});
Cufon.registerFont({"w":200,"face":{"font-family":"Serifa","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 8 3 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"5","bbox":"-5 -329 352 66.3642","underline-thickness":"18","underline-position":"-36","unicode-range":"U+0021-U+00F8"},"glyphs":{" ":{},"A":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91","w":280},"\u00c6":{"d":"170,-106r-12,-101r-49,101r61,0xm7,0r0,-34r19,0r101,-201r217,0r0,70r-42,0r0,-36r-96,0r7,64r32,0r0,-32r38,0r0,96r-38,0r0,-32r-28,0r9,71r76,0r0,-43r42,0r0,77r-198,0r0,-34r33,0r-5,-38r-81,0r-19,38r30,0r0,34r-97,0","w":360},"\u00c4":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00c5":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm102,-291v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm120,-291v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20","w":280},"B":{"d":"89,-105r0,71v41,-1,87,7,85,-37v-2,-47,-46,-31,-85,-34xm89,-201r0,64v37,0,78,6,78,-34v0,-39,-43,-28,-78,-30xm10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0v43,0,93,0,93,57v0,32,-18,48,-48,55v30,1,56,23,56,54v0,71,-66,69,-103,69r-111,0","w":240},"C":{"d":"128,-240v29,-1,52,8,68,32r0,-27r45,0r0,87r-45,0v0,-36,-24,-58,-59,-58v-53,0,-69,47,-69,94v0,45,22,83,72,83v29,0,53,-21,54,-52r48,0v-1,66,-57,86,-103,86v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124","w":259},"D":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r129,0v23,0,120,3,120,117v0,78,-50,118,-126,118r-123,0xm89,-201r0,167v72,7,117,-17,117,-84v0,-67,-44,-90,-117,-83","w":280},"E":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r214,0r0,70r-41,0r0,-36r-94,0r0,64r36,0r0,-32r38,0r0,96r-38,0r0,-32r-36,0r0,71r94,0r0,-43r41,0r0,77r-214,0","w":240},"F":{"d":"10,-235r214,0r0,78r-41,0r0,-44r-94,0r0,69r33,0r0,-32r38,0r0,96r-38,0r0,-32r-33,0r0,66r35,0r0,34r-114,0r0,-34r30,0r0,-167r-30,0r0,-34","w":240},"G":{"d":"246,-235r0,82r-45,0v-2,-37,-29,-53,-64,-53v-53,0,-69,47,-69,94v0,45,22,83,72,83v33,0,60,-21,61,-57r-36,0r0,-35r106,0r0,35r-23,0r0,86r-45,0v-1,-8,2,-21,-1,-27v-13,23,-39,32,-63,32v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124v31,-1,56,9,73,28r0,-23r45,0","w":280},"H":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0r0,34r-34,0r0,64r102,0r0,-64r-34,0r0,-34r113,0r0,34r-30,0r0,167r30,0r0,34r-113,0r0,-34r34,0r0,-69r-102,0r0,69r34,0r0,34r-113,0","w":280},"I":{"d":"15,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-29,0r0,167r29,0r0,34r-109,0","w":139},"J":{"d":"190,-235r0,34r-27,0r0,130v0,32,-4,76,-80,76v-60,0,-72,-34,-71,-84r50,0v0,25,-2,49,27,50v14,0,24,-11,24,-34r0,-138r-37,0r0,-34r114,0"},"K":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-30,0r0,74r74,-74r-21,0r0,-34r102,0r0,34r-22,0r-75,76r82,91r21,0r0,34r-110,0r0,-34r27,0r-78,-86r0,86r30,0r0,34r-109,0","w":260},"L":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r117,0r0,34r-38,0r0,167r78,0r0,-49r43,0r0,83r-200,0","w":219},"M":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r110,0r50,174r49,-174r110,0r0,34r-29,0r0,167r29,0r0,34r-104,0r0,-34r27,0r-1,-167r-59,201r-51,0r-60,-201r0,167r27,0r0,34r-98,0","w":339},"N":{"d":"7,0r0,-34r30,0r0,-167r-30,0r0,-34r100,0r92,175r0,-141r-30,0r0,-34r104,0r0,34r-29,0r0,201r-66,0r-96,-182r0,148r29,0r0,34r-104,0","w":280},"O":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89","w":280},"\u00d6":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00d8":{"d":"240,-249r16,14r-25,28v67,71,29,212,-91,212v-32,0,-58,-8,-78,-23r-26,29r-17,-13r27,-30v-63,-75,-24,-208,94,-208v30,0,55,7,75,20xm78,-68r109,-122v-11,-10,-26,-16,-47,-16v-70,0,-85,82,-62,138xm200,-172r-110,123v12,13,28,20,50,20v71,0,86,-88,60,-143","w":280},"P":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r127,0v37,0,84,7,84,72v0,78,-58,77,-129,75r0,54r38,0r0,34r-120,0xm92,-201r0,79v40,0,79,5,79,-39v0,-51,-39,-38,-79,-40","w":240},"Q":{"d":"274,-34r0,34v-46,0,-95,5,-134,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,26,-11,69,-53,86v18,-5,41,-1,63,-2xm68,-118v0,50,21,89,72,89v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88","w":280},"R":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r135,0v42,0,81,6,81,66v1,33,-25,50,-54,56v42,3,45,45,56,79r24,0r0,34r-66,0v-16,-35,-8,-96,-57,-98r-37,0r0,64r30,0r0,34r-112,0xm92,-201r0,69v40,-1,86,9,86,-35v0,-46,-46,-32,-86,-34","w":259},"S":{"d":"19,0r0,-79r43,0v0,37,15,52,51,52v17,0,39,-12,39,-31v0,-72,-132,-18,-132,-114v0,-71,94,-89,134,-44r0,-19r41,0r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,71,-97,94,-141,47r0,19r-41,0","w":220},"T":{"d":"13,-235r214,0r0,81r-41,0r0,-47r-41,0r0,167r34,0r0,34r-118,0r0,-34r34,0r0,-167r-41,0r0,47r-41,0r0,-81","w":239},"U":{"d":"254,-235r0,34r-25,0r0,119v0,48,-40,87,-97,87v-142,0,-91,-97,-101,-206r-25,0r0,-34r107,0r0,34r-32,0r0,103v0,20,-3,69,51,69v57,0,52,-51,52,-69r0,-103r-32,0r0,-34r102,0","w":259},"V":{"d":"273,-235r0,34r-21,0r-84,201r-57,0r-83,-201r-21,0r0,-34r107,0r0,34r-32,0r60,152r59,-152r-32,0r0,-34r104,0","w":280},"W":{"d":"352,-235r0,34r-16,0r-50,201r-62,0r-45,-186r-46,186r-62,0r-47,-201r-16,0r0,-34r97,0r0,34r-32,0r32,148r45,-182r65,0r43,182r34,-148r-32,0r0,-34r92,0","w":359},"X":{"d":"6,0r0,-34r16,0r77,-87r-72,-80r-17,0r0,-34r106,0r0,34r-27,0r43,50r45,-50r-27,0r0,-34r99,0r0,34r-16,0r-72,80r77,87r16,0r0,34r-109,0r0,-34r31,0r-49,-57r-49,57r31,0r0,34r-103,0","w":259},"Y":{"d":"71,0r0,-34r34,0r0,-50r-79,-117r-20,0r0,-34r108,0r0,34r-30,0r48,74r49,-74r-30,0r0,-34r104,0r0,34r-20,0r-80,117r0,50r34,0r0,34r-118,0","w":260},"Z":{"d":"16,0r0,-44r145,-157r-100,0r0,43r-41,0r0,-77r201,0r0,43r-147,158r109,0r0,-48r42,0r0,82r-209,0","w":240},"a":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50"},"\u00e4":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"\u00e6":{"d":"171,-101r71,0v-1,-22,-9,-40,-35,-40v-23,0,-35,19,-36,40xm66,-119r-45,0v1,-64,107,-76,130,-23v12,-25,37,-32,63,-32v61,0,76,50,73,103r-116,0v-8,44,60,63,69,19r45,0v-5,70,-118,78,-144,19v-17,55,-130,52,-128,-12v3,-62,64,-55,113,-56v2,-25,-4,-40,-31,-40v-15,0,-28,7,-29,22xm126,-71v-29,0,-68,-3,-68,23v0,16,14,21,29,21v27,0,39,-23,39,-44","w":300},"&":{"d":"263,-143r0,35r-26,0v-3,23,-13,44,-29,61r13,13r42,0r0,34r-69,0r-18,-18v-55,43,-161,32,-162,-48v0,-36,17,-56,48,-70v-13,-14,-23,-28,-23,-48v0,-41,37,-56,73,-56v37,0,65,17,65,57v0,28,-21,45,-45,58r49,50v8,-9,14,-21,15,-33r-20,0r0,-35r87,0xm151,-45r-59,-60v-42,13,-33,78,15,78v17,0,31,-8,44,-18xm107,-208v-33,1,-24,42,-4,55v26,-7,45,-53,4,-55","w":280},"\u00e5":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm62,-224v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm80,-224v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20"},"^":{"d":"92,-235r33,0r63,131r-34,0r-46,-95r-46,95r-34,0","w":216},"~":{"d":"72,-119v24,0,53,23,73,23v14,0,22,-13,30,-25r12,28v-10,14,-22,30,-43,30v-35,0,-85,-49,-103,1r-12,-28v8,-14,20,-29,43,-29","w":216},"*":{"d":"79,-168r-41,-10r10,-33r39,17r-3,-41r34,0r-4,41r38,-17r10,33r-41,10r28,30r-27,20r-22,-35r-22,35r-27,-20"},"@":{"d":"148,-152v-41,-3,-58,73,-12,75v38,4,55,-73,12,-75xm188,-178r28,0r-18,83v-2,7,-5,20,3,20v18,0,37,-22,37,-58v0,-54,-38,-82,-89,-82v-57,0,-94,41,-94,98v0,89,111,126,166,70r29,0v-59,96,-225,48,-225,-71v0,-70,56,-122,124,-122v59,0,114,39,114,99v0,70,-60,95,-82,95v-10,0,-17,-7,-19,-17v-29,36,-86,7,-86,-39v0,-58,71,-113,108,-59","w":288},"b":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm81,-144v38,-57,129,-29,129,62v0,45,-24,87,-73,87v-30,1,-44,-11,-60,-33r0,28r-67,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,96","w":219},"\\":{"d":"98,5r-92,-245r36,0r92,245r-36,0","w":140},"|":{"d":"22,5r0,-245r36,0r0,245r-36,0","w":79},"{":{"d":"116,-260r0,27v-24,-3,-39,5,-39,26r0,56v0,37,-26,39,-35,43v10,1,35,7,35,42v0,37,-19,91,39,82r0,27v-42,3,-75,-1,-75,-48r0,-56v0,-24,-22,-32,-34,-32r0,-31v12,0,34,-8,34,-32r0,-55v6,-46,33,-52,75,-49","w":119},"}":{"d":"4,43r0,-27v24,3,39,-5,39,-26r0,-56v0,-37,26,-39,35,-43v-10,-1,-35,-7,-35,-42v0,-37,19,-91,-39,-82r0,-27v43,-3,75,2,75,49r0,55v0,24,22,33,34,33r0,30v-12,0,-34,9,-34,33r0,55v-6,46,-33,51,-75,48","w":119},"[":{"d":"105,-260r0,27r-38,0r0,249r38,0r0,27r-75,0r0,-303r75,0","w":119},"]":{"d":"15,43r0,-27r38,0r0,-249r-38,0r0,-27r75,0r0,303r-75,0","w":119},"c":{"d":"170,-168r0,65r-38,0v-1,-24,-10,-38,-35,-38v-52,1,-52,111,1,112v17,0,31,-12,32,-30r43,0v-4,43,-36,64,-75,64v-67,0,-88,-49,-88,-86v0,-53,22,-93,77,-93v20,-1,36,11,47,25r0,-19r36,0","w":180},":":{"d":"76,0r-52,0r0,-53r52,0r0,53xm76,-168r0,52r-52,0r0,-52r52,0","w":100},",":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0","w":100},"d":{"d":"186,-240r0,208r24,0r0,32r-67,0r0,-28v-15,24,-30,33,-60,33v-49,0,-73,-42,-73,-87v0,-93,94,-117,129,-62r0,-64r-24,0r0,-32r71,0xm95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55","w":219},"$":{"d":"185,-235r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,44,-32,70,-74,71r0,27r-35,0r0,-31v-13,-2,-22,-10,-32,-20r0,19r-41,0r0,-79r43,0v0,37,15,52,51,52v17,0,38,-12,38,-31v0,-72,-131,-18,-131,-114v0,-44,31,-67,72,-68r0,-29r35,0r0,33v11,2,17,12,27,20r0,-19r41,0"},"e":{"d":"64,-101r74,0v0,-24,-12,-40,-37,-40v-24,0,-37,17,-37,40xm186,-71r-122,0v-6,45,64,63,75,19r45,0v-8,41,-41,57,-80,57v-59,0,-90,-35,-90,-91v0,-102,157,-120,170,-23v2,13,2,26,2,38"},"8":{"d":"66,-172v0,23,11,34,34,34v23,0,35,-11,35,-34v0,-23,-12,-36,-35,-36v-23,0,-34,12,-34,36xm21,-172v0,-48,35,-68,79,-68v44,0,80,20,80,68v1,31,-20,43,-46,51v30,5,50,23,50,55v0,53,-35,71,-84,71v-50,0,-84,-16,-84,-71v-1,-30,24,-50,50,-56v-28,-5,-45,-20,-45,-50xm64,-67v0,24,12,40,36,40v23,0,36,-17,36,-40v0,-23,-12,-38,-36,-38v-24,0,-36,15,-36,38"},"=":{"d":"17,-112r0,-36r182,0r0,36r-182,0xm17,-34r0,-36r182,0r0,36r-182,0","w":216},"!":{"d":"97,-235r-11,167r-32,0r-11,-167r54,0xm44,0r0,-48r52,0r0,48r-52,0","w":140},"f":{"d":"15,0r0,-32r31,0r0,-104r-31,0r0,-32r31,0v-2,-45,3,-74,66,-78v10,0,22,3,32,4r0,35v-28,-9,-57,-2,-50,39r38,0r0,32r-38,0r0,104r31,0r0,32r-110,0","w":140},"5":{"d":"176,-235r0,34r-105,0r0,64v12,-15,29,-22,48,-22v46,0,68,39,68,82v0,40,-19,82,-88,82v-41,0,-79,-21,-78,-66r50,0v1,21,10,32,32,32v26,0,35,-23,35,-47v0,-24,-9,-49,-36,-49v-18,0,-31,14,-31,32r-48,0r0,-142r153,0"},"4":{"d":"115,-92r-1,-96r-70,96r71,0xm82,0r0,-34r33,0r0,-24r-107,0r0,-44r97,-133r58,0r0,143r29,0r0,34r-29,0r0,24r27,0r0,34r-108,0"},"g":{"d":"210,-168r0,32r-24,0v-5,99,30,202,-89,202v-50,0,-75,-16,-78,-56r52,0v1,21,16,24,31,24v28,-2,41,-28,37,-61v-16,17,-28,24,-57,24v-45,0,-72,-38,-72,-81v0,-50,23,-89,77,-89v28,-1,42,14,56,30r0,-25r67,0xm60,-86v0,26,13,49,40,49v30,0,41,-24,41,-51v0,-26,-10,-51,-40,-51v-30,0,-41,26,-41,53","w":219},"`":{"d":"45,-243r30,52r-31,0r-49,-52r50,0","w":100},">":{"d":"20,0r0,-36r127,-55r-127,-55r0,-36r176,76r0,30","w":216},"h":{"d":"6,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r1,96v25,-50,113,-37,113,32r0,80r23,0r0,32r-93,0r0,-32r22,0v0,-37,8,-112,-27,-107v-53,6,-36,58,-39,107r22,0r0,32r-93,0","w":219},"-":{"d":"18,-79r0,-36r84,0r0,36r-84,0","w":119},"i":{"d":"13,0r0,-32r23,0r0,-104r-23,0r0,-32r71,0r0,136r23,0r0,32r-94,0xm84,-240r0,47r-50,0r0,-47r50,0","w":119},"j":{"d":"77,-168r0,172v5,53,-27,69,-77,60r0,-32v23,2,29,-5,29,-29r0,-139r-23,0r0,-32r71,0xm77,-240r0,47r-50,0r0,-47r50,0","w":100},"k":{"d":"9,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,143v16,-13,35,-24,50,-39r-23,0r0,-32r95,0r0,32v-32,-2,-39,20,-58,30r48,74r20,0r0,32r-92,0r0,-32r20,0r-30,-47r-30,24r0,23r20,0r0,32r-91,0","w":220},"l":{"d":"13,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,208r23,0r0,32r-94,0","w":119},"<":{"d":"196,-182r0,36r-127,55r127,55r0,36r-176,-76r0,-30","w":216},"m":{"d":"9,0r0,-32r23,0r0,-104r-23,0r0,-32r67,0v1,9,-2,21,1,28v22,-43,91,-48,113,-2v23,-50,118,-42,118,23r0,87r23,0r0,32r-93,0r0,-32r22,0v-5,-42,17,-107,-29,-107v-49,0,-35,61,-37,107r22,0r0,32r-91,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":340},"n":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r67,0v1,9,-2,21,1,28v12,-22,33,-34,57,-34v74,0,59,75,60,142r24,0r0,32r-93,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":240},"9":{"d":"98,-208v-49,2,-50,97,1,96v50,-2,53,-95,-1,-96xm17,-57r50,0v0,19,9,30,27,30v37,0,40,-51,42,-78v-14,19,-29,25,-54,25v-44,0,-68,-40,-68,-81v0,-56,34,-79,87,-79v71,0,85,51,85,115v0,66,-18,130,-94,130v-43,0,-72,-18,-75,-62"},"#":{"d":"37,0r9,-68r-28,0r4,-28r28,0r7,-43r-29,0r4,-29r28,0r10,-67r29,0r-10,67r36,0r9,-67r29,0r-9,67r29,0r-5,29r-28,0r-6,43r28,0r-4,28r-28,0r-10,68r-28,0r9,-68r-36,0r-9,68r-29,0xm85,-139r-6,43r36,0r6,-43r-36,0"},"o":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90"},"\u00f6":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"1":{"d":"53,0r0,-34r36,0r0,-159v-16,14,-34,27,-52,39r0,-45v18,-12,34,-23,50,-36r50,0r0,201r36,0r0,34r-120,0"},"\u00f8":{"d":"177,-183r13,13r-22,23v46,53,16,152,-68,152v-22,0,-41,-6,-56,-18r-26,28r-13,-12r26,-28v-47,-53,-10,-149,69,-149v21,0,39,6,54,16xm63,-60r63,-69v-38,-32,-82,18,-63,69xm136,-112r-64,70v6,8,15,13,28,13v41,-1,45,-48,36,-83"},"p":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm10,61r0,-32r23,0r0,-165r-23,0r0,-32r67,0v1,9,-2,22,1,29v38,-66,132,-36,132,57v0,45,-24,87,-73,87v-26,1,-39,-8,-56,-28r0,52r26,0r0,32r-97,0","w":219},"(":{"d":"74,-260r36,0v-58,92,-60,214,0,303r-36,0v-66,-89,-63,-212,0,-303","w":119},")":{"d":"46,43r-36,0v58,-92,60,-214,0,-303r36,0v66,89,63,212,0,303","w":119},"%":{"d":"177,-57v0,-37,19,-62,58,-62v39,0,59,25,59,62v0,36,-21,62,-59,62v-39,0,-58,-26,-58,-62xm211,-57v0,16,3,37,24,37v34,0,37,-74,0,-74v-21,0,-24,21,-24,37xm26,-179v0,-37,20,-61,59,-61v39,0,58,24,58,61v0,36,-20,62,-58,62v-39,0,-59,-26,-59,-62xm56,7r178,-250r31,0r-179,250r-30,0xm85,-215v-36,2,-35,70,0,73v33,-2,36,-72,0,-73","w":320},".":{"d":"24,0r0,-53r52,0r0,53r-52,0","w":100},"+":{"d":"17,-73r0,-36r73,0r0,-73r36,0r0,73r73,0r0,36r-73,0r0,73r-36,0r0,-73r-73,0","w":216},"q":{"d":"95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55xm210,29r0,32r-97,0r0,-32r26,0v-1,-17,2,-37,-1,-52v-15,22,-30,28,-55,28v-49,0,-73,-42,-73,-87v0,-94,93,-121,133,-57r0,-29r67,0r0,32r-24,0r0,165r24,0","w":219},"?":{"d":"167,-180v0,53,-63,56,-58,112r-45,0r0,-12v-12,-37,54,-73,54,-104v0,-15,-11,-24,-27,-24v-24,0,-28,16,-29,40r-49,0v0,-52,29,-72,80,-72v39,0,74,19,74,60xm60,0r0,-48r53,0r0,48r-53,0","w":180},"\"":{"d":"148,-235r0,99r-36,0r0,-99r36,0xm52,-136r0,-99r36,0r0,99r-36,0"},"'":{"d":"32,-136r0,-99r36,0r0,99r-36,0","w":100},"r":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r68,0v1,10,-2,24,1,32v12,-28,38,-45,72,-35r0,39v-61,-14,-77,36,-70,100r29,0r0,32r-100,0","w":159},"s":{"d":"17,0r0,-59r38,0v0,21,17,32,36,32v10,0,25,-4,25,-20v0,-35,-100,0,-100,-75v0,-55,80,-69,107,-29r0,-17r36,0r0,55r-38,0v0,-20,-13,-28,-31,-28v-10,0,-26,2,-26,18v0,34,100,0,100,74v0,54,-86,71,-111,31r0,18r-36,0","w":180},";":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0xm76,-168r0,52r-52,0r0,-52r52,0","w":100},"7":{"d":"185,-235r0,39v-35,65,-60,127,-84,196r-53,0v27,-68,57,-136,93,-201r-81,0r0,41r-43,0r0,-75r168,0"},"6":{"d":"102,-27v48,-2,51,-97,0,-96v-51,1,-54,95,0,96xm183,-178r-49,0v0,-19,-10,-30,-28,-30v-37,0,-40,50,-42,77v14,-19,29,-25,54,-25v44,0,68,40,68,81v0,56,-34,80,-87,80v-71,0,-85,-51,-85,-115v0,-66,18,-130,94,-130v43,0,72,18,75,62"},"\/":{"d":"6,5r92,-245r36,0r-92,245r-36,0","w":140},"t":{"d":"123,-168r0,32r-45,0r0,81v0,12,1,26,15,26v14,0,14,-17,14,-25r29,0v1,39,-13,59,-53,59v-69,0,-50,-78,-52,-141r-27,0r0,-32r27,0r0,-33r47,-17r0,50r45,0","w":140},"3":{"d":"82,-103r0,-36v26,2,50,-5,50,-35v0,-22,-13,-32,-34,-32v-23,0,-32,16,-32,37r-50,0v-1,-50,41,-71,85,-71v44,0,80,17,80,65v0,32,-20,48,-49,54v30,3,52,24,52,55v0,48,-37,71,-88,71v-45,0,-83,-16,-83,-72r50,0v0,23,10,38,34,38v22,0,37,-14,37,-36v0,-35,-24,-38,-52,-38"},"2":{"d":"13,-46v26,-28,115,-83,116,-131v0,-18,-12,-29,-30,-29v-26,0,-33,20,-34,42r-50,0v1,-63,39,-76,88,-76v44,0,76,23,76,69v0,49,-85,108,-113,137r73,0r0,-31r44,0r0,65r-170,0r0,-46"},"u":{"d":"191,-168r0,136r23,0r0,32r-67,0r0,-28v-12,22,-34,33,-58,33v-74,0,-59,-74,-60,-141r-23,0r0,-32r71,0v7,50,-21,139,30,139v47,0,34,-61,36,-107r-22,0r0,-32r70,0","w":219},"_":{"d":"0,45r0,-18r180,0r0,18r-180,0","w":180},"v":{"d":"214,-168r0,32r-18,0r-57,136r-58,0r-57,-136r-18,0r0,-32r94,0r0,32r-25,0r37,97r37,-97r-25,0r0,-32r90,0","w":220},"w":{"d":"315,-168r0,32r-16,0r-42,136r-63,0r-34,-135r-35,135r-63,0r-41,-136r-16,0r0,-32r88,0r0,32r-24,0r27,98r33,-130r66,0r34,130r26,-98r-24,0r0,-32r84,0","w":320},"x":{"d":"10,0r0,-32r16,0r54,-55r-49,-49r-16,0r0,-32r88,0r0,32r-17,0r28,29r26,-29r-16,0r0,-32r82,0r0,32r-16,0r-49,49r53,55r16,0r0,32r-92,0r0,-32r21,0r-32,-35r-32,35r21,0r0,32r-86,0","w":220},"y":{"d":"215,-168r0,32r-17,0r-80,164v-14,37,-41,42,-84,36r0,-34v28,7,48,-1,53,-29r-65,-137r-17,0r0,-32r95,0r0,32r-25,0r37,86r38,-86r-25,0r0,-32r90,0","w":219},"z":{"d":"20,0r0,-38r98,-98r-56,0r0,25r-40,0r0,-57r157,0r0,36r-100,100r62,0r0,-29r40,0r0,61r-161,0"},"0":{"d":"63,-118v0,48,5,89,37,89v32,0,37,-41,37,-89v0,-48,-5,-88,-37,-88v-32,0,-37,40,-37,88xm13,-118v0,-59,18,-122,87,-122v69,0,87,63,87,122v0,59,-18,123,-87,123v-69,0,-87,-64,-87,-123"},"\u00a0":{}}});
Cufon.registerFont({"w":200,"face":{"font-family":"Serifa","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 8 3 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"5","bbox":"-5 -329 352 66.3642","underline-thickness":"18","underline-position":"-36","unicode-range":"U+0021-U+00F8"},"glyphs":{" ":{},"A":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91","w":280},"\u00c6":{"d":"170,-106r-12,-101r-49,101r61,0xm7,0r0,-34r19,0r101,-201r217,0r0,70r-42,0r0,-36r-96,0r7,64r32,0r0,-32r38,0r0,96r-38,0r0,-32r-28,0r9,71r76,0r0,-43r42,0r0,77r-198,0r0,-34r33,0r-5,-38r-81,0r-19,38r30,0r0,34r-97,0","w":360},"\u00c4":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00c5":{"d":"7,0r0,-34r20,0r83,-201r61,0r82,201r20,0r0,34r-101,0r0,-34r30,0r-16,-38r-97,0r-15,38r29,0r0,34r-96,0xm102,-106r71,0r-35,-91xm102,-291v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm120,-291v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20","w":280},"B":{"d":"89,-105r0,71v41,-1,87,7,85,-37v-2,-47,-46,-31,-85,-34xm89,-201r0,64v37,0,78,6,78,-34v0,-39,-43,-28,-78,-30xm10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0v43,0,93,0,93,57v0,32,-18,48,-48,55v30,1,56,23,56,54v0,71,-66,69,-103,69r-111,0","w":240},"C":{"d":"128,-240v29,-1,52,8,68,32r0,-27r45,0r0,87r-45,0v0,-36,-24,-58,-59,-58v-53,0,-69,47,-69,94v0,45,22,83,72,83v29,0,53,-21,54,-52r48,0v-1,66,-57,86,-103,86v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124","w":259},"D":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r129,0v23,0,120,3,120,117v0,78,-50,118,-126,118r-123,0xm89,-201r0,167v72,7,117,-17,117,-84v0,-67,-44,-90,-117,-83","w":280},"E":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r214,0r0,70r-41,0r0,-36r-94,0r0,64r36,0r0,-32r38,0r0,96r-38,0r0,-32r-36,0r0,71r94,0r0,-43r41,0r0,77r-214,0","w":240},"F":{"d":"10,-235r214,0r0,78r-41,0r0,-44r-94,0r0,69r33,0r0,-32r38,0r0,96r-38,0r0,-32r-33,0r0,66r35,0r0,34r-114,0r0,-34r30,0r0,-167r-30,0r0,-34","w":240},"G":{"d":"246,-235r0,82r-45,0v-2,-37,-29,-53,-64,-53v-53,0,-69,47,-69,94v0,45,22,83,72,83v33,0,60,-21,61,-57r-36,0r0,-35r106,0r0,35r-23,0r0,86r-45,0v-1,-8,2,-21,-1,-27v-13,23,-39,32,-63,32v-83,0,-123,-53,-123,-121v0,-72,37,-124,112,-124v31,-1,56,9,73,28r0,-23r45,0","w":280},"H":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r113,0r0,34r-34,0r0,64r102,0r0,-64r-34,0r0,-34r113,0r0,34r-30,0r0,167r30,0r0,34r-113,0r0,-34r34,0r0,-69r-102,0r0,69r34,0r0,34r-113,0","w":280},"I":{"d":"15,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-29,0r0,167r29,0r0,34r-109,0","w":139},"J":{"d":"190,-235r0,34r-27,0r0,130v0,32,-4,76,-80,76v-60,0,-72,-34,-71,-84r50,0v0,25,-2,49,27,50v14,0,24,-11,24,-34r0,-138r-37,0r0,-34r114,0"},"K":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r109,0r0,34r-30,0r0,74r74,-74r-21,0r0,-34r102,0r0,34r-22,0r-75,76r82,91r21,0r0,34r-110,0r0,-34r27,0r-78,-86r0,86r30,0r0,34r-109,0","w":260},"L":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r117,0r0,34r-38,0r0,167r78,0r0,-49r43,0r0,83r-200,0","w":219},"M":{"d":"10,0r0,-34r30,0r0,-167r-30,0r0,-34r110,0r50,174r49,-174r110,0r0,34r-29,0r0,167r29,0r0,34r-104,0r0,-34r27,0r-1,-167r-59,201r-51,0r-60,-201r0,167r27,0r0,34r-98,0","w":339},"N":{"d":"7,0r0,-34r30,0r0,-167r-30,0r0,-34r100,0r92,175r0,-141r-30,0r0,-34r104,0r0,34r-29,0r0,201r-66,0r-96,-182r0,148r29,0r0,34r-104,0","w":280},"O":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89","w":280},"\u00d6":{"d":"140,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,71,-44,123,-124,123xm140,-29v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88v0,50,21,89,72,89xm197,-307r0,42r-40,0r0,-42r40,0xm123,-307r0,42r-39,0r0,-42r39,0","w":280},"\u00d8":{"d":"240,-249r16,14r-25,28v67,71,29,212,-91,212v-32,0,-58,-8,-78,-23r-26,29r-17,-13r27,-30v-63,-75,-24,-208,94,-208v30,0,55,7,75,20xm78,-68r109,-122v-11,-10,-26,-16,-47,-16v-70,0,-85,82,-62,138xm200,-172r-110,123v12,13,28,20,50,20v71,0,86,-88,60,-143","w":280},"P":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r127,0v37,0,84,7,84,72v0,78,-58,77,-129,75r0,54r38,0r0,34r-120,0xm92,-201r0,79v40,0,79,5,79,-39v0,-51,-39,-38,-79,-40","w":240},"Q":{"d":"274,-34r0,34v-46,0,-95,5,-134,5v-80,0,-124,-52,-124,-123v0,-71,44,-122,124,-122v80,0,124,51,124,122v0,26,-11,69,-53,86v18,-5,41,-1,63,-2xm68,-118v0,50,21,89,72,89v51,0,72,-39,72,-89v0,-50,-21,-88,-72,-88v-51,0,-72,38,-72,88","w":280},"R":{"d":"10,0r0,-34r32,0r0,-167r-32,0r0,-34r135,0v42,0,81,6,81,66v1,33,-25,50,-54,56v42,3,45,45,56,79r24,0r0,34r-66,0v-16,-35,-8,-96,-57,-98r-37,0r0,64r30,0r0,34r-112,0xm92,-201r0,69v40,-1,86,9,86,-35v0,-46,-46,-32,-86,-34","w":259},"S":{"d":"19,0r0,-79r43,0v0,37,15,52,51,52v17,0,39,-12,39,-31v0,-72,-132,-18,-132,-114v0,-71,94,-89,134,-44r0,-19r41,0r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,71,-97,94,-141,47r0,19r-41,0","w":220},"T":{"d":"13,-235r214,0r0,81r-41,0r0,-47r-41,0r0,167r34,0r0,34r-118,0r0,-34r34,0r0,-167r-41,0r0,47r-41,0r0,-81","w":239},"U":{"d":"254,-235r0,34r-25,0r0,119v0,48,-40,87,-97,87v-142,0,-91,-97,-101,-206r-25,0r0,-34r107,0r0,34r-32,0r0,103v0,20,-3,69,51,69v57,0,52,-51,52,-69r0,-103r-32,0r0,-34r102,0","w":259},"V":{"d":"273,-235r0,34r-21,0r-84,201r-57,0r-83,-201r-21,0r0,-34r107,0r0,34r-32,0r60,152r59,-152r-32,0r0,-34r104,0","w":280},"W":{"d":"352,-235r0,34r-16,0r-50,201r-62,0r-45,-186r-46,186r-62,0r-47,-201r-16,0r0,-34r97,0r0,34r-32,0r32,148r45,-182r65,0r43,182r34,-148r-32,0r0,-34r92,0","w":359},"X":{"d":"6,0r0,-34r16,0r77,-87r-72,-80r-17,0r0,-34r106,0r0,34r-27,0r43,50r45,-50r-27,0r0,-34r99,0r0,34r-16,0r-72,80r77,87r16,0r0,34r-109,0r0,-34r31,0r-49,-57r-49,57r31,0r0,34r-103,0","w":259},"Y":{"d":"71,0r0,-34r34,0r0,-50r-79,-117r-20,0r0,-34r108,0r0,34r-30,0r48,74r49,-74r-30,0r0,-34r104,0r0,34r-20,0r-80,117r0,50r34,0r0,34r-118,0","w":260},"Z":{"d":"16,0r0,-44r145,-157r-100,0r0,43r-41,0r0,-77r201,0r0,43r-147,158r109,0r0,-48r42,0r0,82r-209,0","w":240},"a":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50"},"\u00e4":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"\u00e6":{"d":"171,-101r71,0v-1,-22,-9,-40,-35,-40v-23,0,-35,19,-36,40xm66,-119r-45,0v1,-64,107,-76,130,-23v12,-25,37,-32,63,-32v61,0,76,50,73,103r-116,0v-8,44,60,63,69,19r45,0v-5,70,-118,78,-144,19v-17,55,-130,52,-128,-12v3,-62,64,-55,113,-56v2,-25,-4,-40,-31,-40v-15,0,-28,7,-29,22xm126,-71v-29,0,-68,-3,-68,23v0,16,14,21,29,21v27,0,39,-23,39,-44","w":300},"&":{"d":"263,-143r0,35r-26,0v-3,23,-13,44,-29,61r13,13r42,0r0,34r-69,0r-18,-18v-55,43,-161,32,-162,-48v0,-36,17,-56,48,-70v-13,-14,-23,-28,-23,-48v0,-41,37,-56,73,-56v37,0,65,17,65,57v0,28,-21,45,-45,58r49,50v8,-9,14,-21,15,-33r-20,0r0,-35r87,0xm151,-45r-59,-60v-42,13,-33,78,15,78v17,0,31,-8,44,-18xm107,-208v-33,1,-24,42,-4,55v26,-7,45,-53,4,-55","w":280},"\u00e5":{"d":"129,0v-1,-7,2,-18,-1,-24v-26,48,-115,36,-115,-25v0,-61,64,-57,115,-57v3,-27,-9,-39,-33,-39v-19,0,-30,9,-31,28r-45,0v3,-48,42,-57,82,-57v82,0,73,67,72,142r21,0r0,32r-65,0xm128,-77v-32,0,-70,-3,-70,27v0,16,11,23,26,23v28,0,45,-21,44,-50xm62,-224v0,-21,17,-38,38,-38v22,0,39,17,39,38v0,22,-17,39,-39,39v-21,0,-38,-17,-38,-39xm80,-224v0,11,9,21,20,21v12,0,21,-10,21,-21v0,-11,-9,-20,-21,-20v-11,0,-20,9,-20,20"},"^":{"d":"92,-235r33,0r63,131r-34,0r-46,-95r-46,95r-34,0","w":216},"~":{"d":"72,-119v24,0,53,23,73,23v14,0,22,-13,30,-25r12,28v-10,14,-22,30,-43,30v-35,0,-85,-49,-103,1r-12,-28v8,-14,20,-29,43,-29","w":216},"*":{"d":"79,-168r-41,-10r10,-33r39,17r-3,-41r34,0r-4,41r38,-17r10,33r-41,10r28,30r-27,20r-22,-35r-22,35r-27,-20"},"@":{"d":"148,-152v-41,-3,-58,73,-12,75v38,4,55,-73,12,-75xm188,-178r28,0r-18,83v-2,7,-5,20,3,20v18,0,37,-22,37,-58v0,-54,-38,-82,-89,-82v-57,0,-94,41,-94,98v0,89,111,126,166,70r29,0v-59,96,-225,48,-225,-71v0,-70,56,-122,124,-122v59,0,114,39,114,99v0,70,-60,95,-82,95v-10,0,-17,-7,-19,-17v-29,36,-86,7,-86,-39v0,-58,71,-113,108,-59","w":288},"b":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm81,-144v38,-57,129,-29,129,62v0,45,-24,87,-73,87v-30,1,-44,-11,-60,-33r0,28r-67,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,96","w":219},"\\":{"d":"98,5r-92,-245r36,0r92,245r-36,0","w":140},"|":{"d":"22,5r0,-245r36,0r0,245r-36,0","w":79},"{":{"d":"116,-260r0,27v-24,-3,-39,5,-39,26r0,56v0,37,-26,39,-35,43v10,1,35,7,35,42v0,37,-19,91,39,82r0,27v-42,3,-75,-1,-75,-48r0,-56v0,-24,-22,-32,-34,-32r0,-31v12,0,34,-8,34,-32r0,-55v6,-46,33,-52,75,-49","w":119},"}":{"d":"4,43r0,-27v24,3,39,-5,39,-26r0,-56v0,-37,26,-39,35,-43v-10,-1,-35,-7,-35,-42v0,-37,19,-91,-39,-82r0,-27v43,-3,75,2,75,49r0,55v0,24,22,33,34,33r0,30v-12,0,-34,9,-34,33r0,55v-6,46,-33,51,-75,48","w":119},"[":{"d":"105,-260r0,27r-38,0r0,249r38,0r0,27r-75,0r0,-303r75,0","w":119},"]":{"d":"15,43r0,-27r38,0r0,-249r-38,0r0,-27r75,0r0,303r-75,0","w":119},"c":{"d":"170,-168r0,65r-38,0v-1,-24,-10,-38,-35,-38v-52,1,-52,111,1,112v17,0,31,-12,32,-30r43,0v-4,43,-36,64,-75,64v-67,0,-88,-49,-88,-86v0,-53,22,-93,77,-93v20,-1,36,11,47,25r0,-19r36,0","w":180},":":{"d":"76,0r-52,0r0,-53r52,0r0,53xm76,-168r0,52r-52,0r0,-52r52,0","w":100},",":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0","w":100},"d":{"d":"186,-240r0,208r24,0r0,32r-67,0r0,-28v-15,24,-30,33,-60,33v-49,0,-73,-42,-73,-87v0,-93,94,-117,129,-62r0,-64r-24,0r0,-32r71,0xm95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55","w":219},"$":{"d":"185,-235r0,73r-43,0v-2,-32,-15,-46,-47,-46v-20,0,-37,9,-37,31v0,55,133,14,133,111v0,44,-32,70,-74,71r0,27r-35,0r0,-31v-13,-2,-22,-10,-32,-20r0,19r-41,0r0,-79r43,0v0,37,15,52,51,52v17,0,38,-12,38,-31v0,-72,-131,-18,-131,-114v0,-44,31,-67,72,-68r0,-29r35,0r0,33v11,2,17,12,27,20r0,-19r41,0"},"e":{"d":"64,-101r74,0v0,-24,-12,-40,-37,-40v-24,0,-37,17,-37,40xm186,-71r-122,0v-6,45,64,63,75,19r45,0v-8,41,-41,57,-80,57v-59,0,-90,-35,-90,-91v0,-102,157,-120,170,-23v2,13,2,26,2,38"},"8":{"d":"66,-172v0,23,11,34,34,34v23,0,35,-11,35,-34v0,-23,-12,-36,-35,-36v-23,0,-34,12,-34,36xm21,-172v0,-48,35,-68,79,-68v44,0,80,20,80,68v1,31,-20,43,-46,51v30,5,50,23,50,55v0,53,-35,71,-84,71v-50,0,-84,-16,-84,-71v-1,-30,24,-50,50,-56v-28,-5,-45,-20,-45,-50xm64,-67v0,24,12,40,36,40v23,0,36,-17,36,-40v0,-23,-12,-38,-36,-38v-24,0,-36,15,-36,38"},"=":{"d":"17,-112r0,-36r182,0r0,36r-182,0xm17,-34r0,-36r182,0r0,36r-182,0","w":216},"!":{"d":"97,-235r-11,167r-32,0r-11,-167r54,0xm44,0r0,-48r52,0r0,48r-52,0","w":140},"f":{"d":"15,0r0,-32r31,0r0,-104r-31,0r0,-32r31,0v-2,-45,3,-74,66,-78v10,0,22,3,32,4r0,35v-28,-9,-57,-2,-50,39r38,0r0,32r-38,0r0,104r31,0r0,32r-110,0","w":140},"5":{"d":"176,-235r0,34r-105,0r0,64v12,-15,29,-22,48,-22v46,0,68,39,68,82v0,40,-19,82,-88,82v-41,0,-79,-21,-78,-66r50,0v1,21,10,32,32,32v26,0,35,-23,35,-47v0,-24,-9,-49,-36,-49v-18,0,-31,14,-31,32r-48,0r0,-142r153,0"},"4":{"d":"115,-92r-1,-96r-70,96r71,0xm82,0r0,-34r33,0r0,-24r-107,0r0,-44r97,-133r58,0r0,143r29,0r0,34r-29,0r0,24r27,0r0,34r-108,0"},"g":{"d":"210,-168r0,32r-24,0v-5,99,30,202,-89,202v-50,0,-75,-16,-78,-56r52,0v1,21,16,24,31,24v28,-2,41,-28,37,-61v-16,17,-28,24,-57,24v-45,0,-72,-38,-72,-81v0,-50,23,-89,77,-89v28,-1,42,14,56,30r0,-25r67,0xm60,-86v0,26,13,49,40,49v30,0,41,-24,41,-51v0,-26,-10,-51,-40,-51v-30,0,-41,26,-41,53","w":219},"`":{"d":"45,-243r30,52r-31,0r-49,-52r50,0","w":100},">":{"d":"20,0r0,-36r127,-55r-127,-55r0,-36r176,76r0,30","w":216},"h":{"d":"6,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r1,96v25,-50,113,-37,113,32r0,80r23,0r0,32r-93,0r0,-32r22,0v0,-37,8,-112,-27,-107v-53,6,-36,58,-39,107r22,0r0,32r-93,0","w":219},"-":{"d":"18,-79r0,-36r84,0r0,36r-84,0","w":119},"i":{"d":"13,0r0,-32r23,0r0,-104r-23,0r0,-32r71,0r0,136r23,0r0,32r-94,0xm84,-240r0,47r-50,0r0,-47r50,0","w":119},"j":{"d":"77,-168r0,172v5,53,-27,69,-77,60r0,-32v23,2,29,-5,29,-29r0,-139r-23,0r0,-32r71,0xm77,-240r0,47r-50,0r0,-47r50,0","w":100},"k":{"d":"9,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,143v16,-13,35,-24,50,-39r-23,0r0,-32r95,0r0,32v-32,-2,-39,20,-58,30r48,74r20,0r0,32r-92,0r0,-32r20,0r-30,-47r-30,24r0,23r20,0r0,32r-91,0","w":220},"l":{"d":"13,0r0,-32r23,0r0,-176r-23,0r0,-32r71,0r0,208r23,0r0,32r-94,0","w":119},"<":{"d":"196,-182r0,36r-127,55r127,55r0,36r-176,-76r0,-30","w":216},"m":{"d":"9,0r0,-32r23,0r0,-104r-23,0r0,-32r67,0v1,9,-2,21,1,28v22,-43,91,-48,113,-2v23,-50,118,-42,118,23r0,87r23,0r0,32r-93,0r0,-32r22,0v-5,-42,17,-107,-29,-107v-49,0,-35,61,-37,107r22,0r0,32r-91,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":340},"n":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r67,0v1,9,-2,21,1,28v12,-22,33,-34,57,-34v74,0,59,75,60,142r24,0r0,32r-93,0r0,-32r21,0v-4,-42,15,-107,-29,-107v-48,0,-35,60,-37,107r22,0r0,32r-93,0","w":240},"9":{"d":"98,-208v-49,2,-50,97,1,96v50,-2,53,-95,-1,-96xm17,-57r50,0v0,19,9,30,27,30v37,0,40,-51,42,-78v-14,19,-29,25,-54,25v-44,0,-68,-40,-68,-81v0,-56,34,-79,87,-79v71,0,85,51,85,115v0,66,-18,130,-94,130v-43,0,-72,-18,-75,-62"},"#":{"d":"37,0r9,-68r-28,0r4,-28r28,0r7,-43r-29,0r4,-29r28,0r10,-67r29,0r-10,67r36,0r9,-67r29,0r-9,67r29,0r-5,29r-28,0r-6,43r28,0r-4,28r-28,0r-10,68r-28,0r9,-68r-36,0r-9,68r-29,0xm85,-139r-6,43r36,0r6,-43r-36,0"},"o":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90"},"\u00f6":{"d":"100,-139v-56,1,-55,109,0,110v56,-1,55,-109,0,-110xm100,-174v53,0,90,34,90,90v0,56,-37,89,-90,89v-53,0,-90,-33,-90,-89v0,-56,37,-90,90,-90xm157,-240r0,42r-40,0r0,-42r40,0xm83,-240r0,42r-39,0r0,-42r39,0"},"1":{"d":"53,0r0,-34r36,0r0,-159v-16,14,-34,27,-52,39r0,-45v18,-12,34,-23,50,-36r50,0r0,201r36,0r0,34r-120,0"},"\u00f8":{"d":"177,-183r13,13r-22,23v46,53,16,152,-68,152v-22,0,-41,-6,-56,-18r-26,28r-13,-12r26,-28v-47,-53,-10,-149,69,-149v21,0,39,6,54,16xm63,-60r63,-69v-38,-32,-82,18,-63,69xm136,-112r-64,70v6,8,15,13,28,13v41,-1,45,-48,36,-83"},"p":{"d":"125,-29v21,0,35,-19,35,-55v0,-28,-9,-55,-40,-55v-30,0,-42,24,-42,52v0,36,11,58,47,58xm10,61r0,-32r23,0r0,-165r-23,0r0,-32r67,0v1,9,-2,22,1,29v38,-66,132,-36,132,57v0,45,-24,87,-73,87v-26,1,-39,-8,-56,-28r0,52r26,0r0,32r-97,0","w":219},"(":{"d":"74,-260r36,0v-58,92,-60,214,0,303r-36,0v-66,-89,-63,-212,0,-303","w":119},")":{"d":"46,43r-36,0v58,-92,60,-214,0,-303r36,0v66,89,63,212,0,303","w":119},"%":{"d":"177,-57v0,-37,19,-62,58,-62v39,0,59,25,59,62v0,36,-21,62,-59,62v-39,0,-58,-26,-58,-62xm211,-57v0,16,3,37,24,37v34,0,37,-74,0,-74v-21,0,-24,21,-24,37xm26,-179v0,-37,20,-61,59,-61v39,0,58,24,58,61v0,36,-20,62,-58,62v-39,0,-59,-26,-59,-62xm56,7r178,-250r31,0r-179,250r-30,0xm85,-215v-36,2,-35,70,0,73v33,-2,36,-72,0,-73","w":320},".":{"d":"24,0r0,-53r52,0r0,53r-52,0","w":100},"+":{"d":"17,-73r0,-36r73,0r0,-73r36,0r0,73r73,0r0,36r-73,0r0,73r-36,0r0,-73r-73,0","w":216},"q":{"d":"95,-29v36,0,46,-22,46,-58v0,-28,-11,-52,-41,-52v-31,0,-40,27,-40,55v0,36,14,55,35,55xm210,29r0,32r-97,0r0,-32r26,0v-1,-17,2,-37,-1,-52v-15,22,-30,28,-55,28v-49,0,-73,-42,-73,-87v0,-94,93,-121,133,-57r0,-29r67,0r0,32r-24,0r0,165r24,0","w":219},"?":{"d":"167,-180v0,53,-63,56,-58,112r-45,0r0,-12v-12,-37,54,-73,54,-104v0,-15,-11,-24,-27,-24v-24,0,-28,16,-29,40r-49,0v0,-52,29,-72,80,-72v39,0,74,19,74,60xm60,0r0,-48r53,0r0,48r-53,0","w":180},"\"":{"d":"148,-235r0,99r-36,0r0,-99r36,0xm52,-136r0,-99r36,0r0,99r-36,0"},"'":{"d":"32,-136r0,-99r36,0r0,99r-36,0","w":100},"r":{"d":"16,0r0,-32r24,0r0,-104r-24,0r0,-32r68,0v1,10,-2,24,1,32v12,-28,38,-45,72,-35r0,39v-61,-14,-77,36,-70,100r29,0r0,32r-100,0","w":159},"s":{"d":"17,0r0,-59r38,0v0,21,17,32,36,32v10,0,25,-4,25,-20v0,-35,-100,0,-100,-75v0,-55,80,-69,107,-29r0,-17r36,0r0,55r-38,0v0,-20,-13,-28,-31,-28v-10,0,-26,2,-26,18v0,34,100,0,100,74v0,54,-86,71,-111,31r0,18r-36,0","w":180},";":{"d":"24,0r0,-53r52,0r0,53r-18,47r-32,0r18,-47r-20,0xm76,-168r0,52r-52,0r0,-52r52,0","w":100},"7":{"d":"185,-235r0,39v-35,65,-60,127,-84,196r-53,0v27,-68,57,-136,93,-201r-81,0r0,41r-43,0r0,-75r168,0"},"6":{"d":"102,-27v48,-2,51,-97,0,-96v-51,1,-54,95,0,96xm183,-178r-49,0v0,-19,-10,-30,-28,-30v-37,0,-40,50,-42,77v14,-19,29,-25,54,-25v44,0,68,40,68,81v0,56,-34,80,-87,80v-71,0,-85,-51,-85,-115v0,-66,18,-130,94,-130v43,0,72,18,75,62"},"\/":{"d":"6,5r92,-245r36,0r-92,245r-36,0","w":140},"t":{"d":"123,-168r0,32r-45,0r0,81v0,12,1,26,15,26v14,0,14,-17,14,-25r29,0v1,39,-13,59,-53,59v-69,0,-50,-78,-52,-141r-27,0r0,-32r27,0r0,-33r47,-17r0,50r45,0","w":140},"3":{"d":"82,-103r0,-36v26,2,50,-5,50,-35v0,-22,-13,-32,-34,-32v-23,0,-32,16,-32,37r-50,0v-1,-50,41,-71,85,-71v44,0,80,17,80,65v0,32,-20,48,-49,54v30,3,52,24,52,55v0,48,-37,71,-88,71v-45,0,-83,-16,-83,-72r50,0v0,23,10,38,34,38v22,0,37,-14,37,-36v0,-35,-24,-38,-52,-38"},"2":{"d":"13,-46v26,-28,115,-83,116,-131v0,-18,-12,-29,-30,-29v-26,0,-33,20,-34,42r-50,0v1,-63,39,-76,88,-76v44,0,76,23,76,69v0,49,-85,108,-113,137r73,0r0,-31r44,0r0,65r-170,0r0,-46"},"u":{"d":"191,-168r0,136r23,0r0,32r-67,0r0,-28v-12,22,-34,33,-58,33v-74,0,-59,-74,-60,-141r-23,0r0,-32r71,0v7,50,-21,139,30,139v47,0,34,-61,36,-107r-22,0r0,-32r70,0","w":219},"_":{"d":"0,45r0,-18r180,0r0,18r-180,0","w":180},"v":{"d":"214,-168r0,32r-18,0r-57,136r-58,0r-57,-136r-18,0r0,-32r94,0r0,32r-25,0r37,97r37,-97r-25,0r0,-32r90,0","w":220},"w":{"d":"315,-168r0,32r-16,0r-42,136r-63,0r-34,-135r-35,135r-63,0r-41,-136r-16,0r0,-32r88,0r0,32r-24,0r27,98r33,-130r66,0r34,130r26,-98r-24,0r0,-32r84,0","w":320},"x":{"d":"10,0r0,-32r16,0r54,-55r-49,-49r-16,0r0,-32r88,0r0,32r-17,0r28,29r26,-29r-16,0r0,-32r82,0r0,32r-16,0r-49,49r53,55r16,0r0,32r-92,0r0,-32r21,0r-32,-35r-32,35r21,0r0,32r-86,0","w":220},"y":{"d":"215,-168r0,32r-17,0r-80,164v-14,37,-41,42,-84,36r0,-34v28,7,48,-1,53,-29r-65,-137r-17,0r0,-32r95,0r0,32r-25,0r37,86r38,-86r-25,0r0,-32r90,0","w":219},"z":{"d":"20,0r0,-38r98,-98r-56,0r0,25r-40,0r0,-57r157,0r0,36r-100,100r62,0r0,-29r40,0r0,61r-161,0"},"0":{"d":"63,-118v0,48,5,89,37,89v32,0,37,-41,37,-89v0,-48,-5,-88,-37,-88v-32,0,-37,40,-37,88xm13,-118v0,-59,18,-122,87,-122v69,0,87,63,87,122v0,59,-18,123,-87,123v-69,0,-87,-64,-87,-123"},"\u00a0":{}}});
var html5elmeents = "address|article|aside|audio|canvas|command|datalist|details|dialog|figure|figcaption|footer|header|hgroup|keygen|mark|meter|menu|nav|progress|ruby|section|time|video".split('|');
for(var i = 0; i < html5elmeents.length; i++)
{
document.createElement(html5elmeents[i]);
}
$(document).ready( function(){
var dates = $( 'div.dates').find( 'input[type=checkbox]' );
$.ajax( {
url: '/skibuss/getServerTime',
dataType: 'script',
success:
function( data )
{
var dataFromServer = data.split('-');
var dayOfWeek;
$.each( dates,
function( index, value )
{
dayOfWeek = new Date( parseInt( $( value ).attr( 'rel' ) ) * 1000 ).getDate();
if( ( dataFromServer[0] === '5' ) &&
( parseInt( dataFromServer[1] ) > 1500 ) &&
( parseInt( dataFromServer[2] ) + 1 ) == dayOfWeek )
{
$( value ).parent('label').remove();
}
if( ( dataFromServer[0] === '6' ) &&
( parseInt( dataFromServer[1] ) > 1300 ) &&
( parseInt( dataFromServer[2] ) + 1 ) == dayOfWeek )
{
$( value ).parent('label').remove();
}
});
}
} );
});

