/** * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * */ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;/* SWFObject v2.2 is released under the MIT License */ var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab -1, Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, MobileSafari: /Apple.*Mobile.*Safari/.test(ua) } })(), BrowserFeatures: { XPath: !!document.evaluate, SelectorsAPI: !!document.querySelector, ElementExtensions: (function() { var constructor = window.Element || window.HTMLElement; return !!(constructor && constructor.prototype); })(), SpecificElementExtensions: (function() { if (typeof window.HTMLDivElement !== 'undefined') return true; var div = document.createElement('div'); var form = document.createElement('form'); var isSupported = false; if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { isSupported = true; } div = form = null; return isSupported; })() }, ScriptFragment: ']*>([\\S\\s]*?)<\/script>', JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction: function() { }, K: function(x) { return x } }; if (Prototype.Browser.MobileSafari) Prototype.BrowserFeatures.SpecificElementExtensions = false; var Abstract = { }; var Try = { these: function() { var returnValue; for (var i = 0, length = arguments.length; i < length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) { } } return returnValue; } }; /* Based on Alex Arnell's inheritance implementation. */ var Class = (function() { function subclass() {}; function create() { var parent = null, properties = $A(arguments); if (Object.isFunction(properties[0])) parent = properties.shift(); function klass() { this.initialize.apply(this, arguments); } Object.extend(klass, Class.Methods); klass.superclass = parent; klass.subclasses = []; if (parent) { subclass.prototype = parent.prototype; klass.prototype = new subclass; parent.subclasses.push(klass); } for (var i = 0; i < properties.length; i++) klass.addMethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = Prototype.emptyFunction; klass.prototype.constructor = klass; return klass; } function addMethods(source) { var ancestor = this.superclass && this.superclass.prototype; var properties = Object.keys(source); if (!Object.keys({ toString: true }).length) { if (source.toString != Object.prototype.toString) properties.push("toString"); if (source.valueOf != Object.prototype.valueOf) properties.push("valueOf"); } for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i], value = source[property]; if (ancestor && Object.isFunction(value) && value.argumentNames().first() == "$super") { var method = value; value = (function(m) { return function() { return ancestor[m].apply(this, arguments); }; })(property).wrap(method); value.valueOf = method.valueOf.bind(method); value.toString = method.toString.bind(method); } this.prototype[property] = value; } return this; } return { create: create, Methods: { addMethods: addMethods } }; })(); (function() { var _toString = Object.prototype.toString; function extend(destination, source) { for (var property in source) destination[property] = source[property]; return destination; } function inspect(object) { try { if (isUndefined(object)) return 'undefined'; if (object === null) return 'null'; return object.inspect ? object.inspect() : String(object); } catch (e) { if (e instanceof RangeError) return '...'; throw e; } } function toJSON(object) { var type = typeof object; switch (type) { case 'undefined': case 'function': case 'unknown': return; case 'boolean': return object.toString(); } if (object === null) return 'null'; if (object.toJSON) return object.toJSON(); if (isElement(object)) return; var results = []; for (var property in object) { var value = toJSON(object[property]); if (!isUndefined(value)) results.push(property.toJSON() + ': ' + value); } return '{' + results.join(', ') + '}'; } function toQueryString(object) { return $H(object).toQueryString(); } function toHTML(object) { return object && object.toHTML ? object.toHTML() : String.interpret(object); } function keys(object) { var results = []; for (var property in object) results.push(property); return results; } function values(object) { var results = []; for (var property in object) results.push(object[property]); return results; } function clone(object) { return extend({ }, object); } function isElement(object) { return !!(object && object.nodeType == 1); } function isArray(object) { return _toString.call(object) == "[object Array]"; } function isHash(object) { return object instanceof Hash; } function isFunction(object) { return typeof object === "function"; } function isString(object) { return _toString.call(object) == "[object String]"; } function isNumber(object) { return _toString.call(object) == "[object Number]"; } function isUndefined(object) { return typeof object === "undefined"; } extend(Object, { extend: extend, inspect: inspect, toJSON: toJSON, toQueryString: toQueryString, toHTML: toHTML, keys: keys, values: values, clone: clone, isElement: isElement, isArray: isArray, isHash: isHash, isFunction: isFunction, isString: isString, isNumber: isNumber, isUndefined: isUndefined }); })(); Object.extend(Function.prototype, (function() { var slice = Array.prototype.slice; function update(array, args) { var arrayLength = array.length, length = args.length; while (length--) array[arrayLength + length] = args[length]; return array; } function merge(array, args) { array = slice.call(array, 0); return update(array, args); } function argumentNames() { var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') .replace(/\s+/g, '').split(','); return names.length == 1 && !names[0] ? [] : names; } function bind(context) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; var __method = this, args = slice.call(arguments, 1); return function() { var a = merge(args, arguments); return __method.apply(context, a); } } function bindAsEventListener(context) { var __method = this, args = slice.call(arguments, 1); return function(event) { var a = update([event || window.event], args); return __method.apply(context, a); } } function curry() { if (!arguments.length) return this; var __method = this, args = slice.call(arguments, 0); return function() { var a = merge(args, arguments); return __method.apply(this, a); } } function delay(timeout) { var __method = this, args = slice.call(arguments, 1); timeout = timeout * 1000 return window.setTimeout(function() { return __method.apply(__method, args); }, timeout); } function defer() { var args = update([0.01], arguments); return this.delay.apply(this, args); } function wrap(wrapper) { var __method = this; return function() { var a = update([__method.bind(this)], arguments); return wrapper.apply(this, a); } } function methodize() { if (this._methodized) return this._methodized; var __method = this; return this._methodized = function() { var a = update([this], arguments); return __method.apply(null, a); }; } return { argumentNames: argumentNames, bind: bind, bindAsEventListener: bindAsEventListener, curry: curry, delay: delay, defer: defer, wrap: wrap, methodize: methodize } })()); Date.prototype.toJSON = function() { return '"' + this.getUTCFullYear() + '-' + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + this.getUTCDate().toPaddedString(2) + 'T' + this.getUTCHours().toPaddedString(2) + ':' + this.getUTCMinutes().toPaddedString(2) + ':' + this.getUTCSeconds().toPaddedString(2) + 'Z"'; }; RegExp.prototype.match = RegExp.prototype.test; RegExp.escape = function(str) { return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); }; var PeriodicalExecuter = Class.create({ initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, execute: function() { this.callback(this); }, stop: function() { if (!this.timer) return; clearInterval(this.timer); this.timer = null; }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.execute(); this.currentlyExecuting = false; } catch(e) { this.currentlyExecuting = false; throw e; } } } }); Object.extend(String, { interpret: function(value) { return value == null ? '' : String(value); }, specialChar: { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\\': '\\\\' } }); Object.extend(String.prototype, (function() { function prepareReplacement(replacement) { if (Object.isFunction(replacement)) return replacement; var template = new Template(replacement); return function(match) { return template.evaluate(match) }; } function gsub(pattern, replacement) { var result = '', source = this, match; replacement = prepareReplacement(replacement); if (Object.isString(pattern)) pattern = RegExp.escape(pattern); if (!(pattern.length || pattern.source)) { replacement = replacement(''); return replacement + source.split('').join(replacement) + replacement; } while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += String.interpret(replacement(match)); source = source.slice(match.index + match[0].length); } else { result += source, source = ''; } } return result; } function sub(pattern, replacement, count) { replacement = prepareReplacement(replacement); count = Object.isUndefined(count) ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); } function scan(pattern, iterator) { this.gsub(pattern, iterator); return String(this); } function truncate(length, truncation) { length = length || 30; truncation = Object.isUndefined(truncation) ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : String(this); } function strip() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); } function stripTags() { return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); } function stripScripts() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); } function extractScripts() { var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); } function evalScripts() { return this.extractScripts().map(function(script) { return eval(script) }); } function escapeHTML() { return this.replace(/&/g,'&').replace(//g,'>'); } function unescapeHTML() { return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); } function toQueryParams(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) return { }; return match[1].split(separator || '&').inject({ }, function(hash, pair) { if ((pair = pair.split('='))[0]) { var key = decodeURIComponent(pair.shift()); var value = pair.length > 1 ? pair.join('=') : pair[0]; if (value != undefined) value = decodeURIComponent(value); if (key in hash) { if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; hash[key].push(value); } else hash[key] = value; } return hash; }); } function toArray() { return this.split(''); } function succ() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); } function times(count) { return count < 1 ? '' : new Array(count + 1).join(this); } function camelize() { var parts = this.split('-'), len = parts.length; if (len == 1) return parts[0]; var camelized = this.charAt(0) == '-' ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) : parts[0]; for (var i = 1; i < len; i++) camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); return camelized; } function capitalize() { return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); } function underscore() { return this.replace(/::/g, '/') .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') .replace(/([a-z\d])([A-Z])/g, '$1_$2') .replace(/-/g, '_') .toLowerCase(); } function dasherize() { return this.replace(/_/g, '-'); } function inspect(useDoubleQuotes) { var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { if (character in String.specialChar) { return String.specialChar[character]; } return '\\u00' + character.charCodeAt().toPaddedString(2, 16); }); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; return "'" + escapedString.replace(/'/g, '\\\'') + "'"; } function toJSON() { return this.inspect(true); } function unfilterJSON(filter) { return this.replace(filter || Prototype.JSONFilter, '$1'); } function isJSON() { var str = this; if (str.blank()) return false; str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); } function evalJSON(sanitize) { var json = this.unfilterJSON(); try { if (!sanitize || json.isJSON()) return eval('(' + json + ')'); } catch (e) { } throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); } function include(pattern) { return this.indexOf(pattern) > -1; } function startsWith(pattern) { return this.indexOf(pattern) === 0; } function endsWith(pattern) { var d = this.length - pattern.length; return d >= 0 && this.lastIndexOf(pattern) === d; } function empty() { return this == ''; } function blank() { return /^\s*$/.test(this); } function interpolate(object, pattern) { return new Template(this, pattern).evaluate(object); } return { gsub: gsub, sub: sub, scan: scan, truncate: truncate, strip: String.prototype.trim ? String.prototype.trim : strip, stripTags: stripTags, stripScripts: stripScripts, extractScripts: extractScripts, evalScripts: evalScripts, escapeHTML: escapeHTML, unescapeHTML: unescapeHTML, toQueryParams: toQueryParams, parseQuery: toQueryParams, toArray: toArray, succ: succ, times: times, camelize: camelize, capitalize: capitalize, underscore: underscore, dasherize: dasherize, inspect: inspect, toJSON: toJSON, unfilterJSON: unfilterJSON, isJSON: isJSON, evalJSON: evalJSON, include: include, startsWith: startsWith, endsWith: endsWith, empty: empty, blank: blank, interpolate: interpolate }; })()); var Template = Class.create({ initialize: function(template, pattern) { this.template = template.toString(); this.pattern = pattern || Template.Pattern; }, evaluate: function(object) { if (object && Object.isFunction(object.toTemplateReplacements)) object = object.toTemplateReplacements(); return this.template.gsub(this.pattern, function(match) { if (object == null) return (match[1] + ''); var before = match[1] || ''; if (before == '\\') return match[2]; var ctx = object, expr = match[3]; var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; match = pattern.exec(expr); if (match == null) return before; while (match != null) { var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; ctx = ctx[comp]; if (null == ctx || '' == match[3]) break; expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); match = pattern.exec(expr); } return before + String.interpret(ctx); }); } }); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; var $break = { }; var Enumerable = (function() { function each(iterator, context) { var index = 0; try { this._each(function(value) { iterator.call(context, value, index++); }); } catch (e) { if (e != $break) throw e; } return this; } function eachSlice(number, iterator, context) { var index = -number, slices = [], array = this.toArray(); if (number < 1) return array; while ((index += number) < array.length) slices.push(array.slice(index, index+number)); return slices.collect(iterator, context); } function all(iterator, context) { iterator = iterator || Prototype.K; var result = true; this.each(function(value, index) { result = result && !!iterator.call(context, value, index); if (!result) throw $break; }); return result; } function any(iterator, context) { iterator = iterator || Prototype.K; var result = false; this.each(function(value, index) { if (result = !!iterator.call(context, value, index)) throw $break; }); return result; } function collect(iterator, context) { iterator = iterator || Prototype.K; var results = []; this.each(function(value, index) { results.push(iterator.call(context, value, index)); }); return results; } function detect(iterator, context) { var result; this.each(function(value, index) { if (iterator.call(context, value, index)) { result = value; throw $break; } }); return result; } function findAll(iterator, context) { var results = []; this.each(function(value, index) { if (iterator.call(context, value, index)) results.push(value); }); return results; } function grep(filter, iterator, context) { iterator = iterator || Prototype.K; var results = []; if (Object.isString(filter)) filter = new RegExp(RegExp.escape(filter)); this.each(function(value, index) { if (filter.match(value)) results.push(iterator.call(context, value, index)); }); return results; } function include(object) { if (Object.isFunction(this.indexOf)) if (this.indexOf(object) != -1) return true; var found = false; this.each(function(value) { if (value == object) { found = true; throw $break; } }); return found; } function inGroupsOf(number, fillWith) { fillWith = Object.isUndefined(fillWith) ? null : fillWith; return this.eachSlice(number, function(slice) { while(slice.length < number) slice.push(fillWith); return slice; }); } function inject(memo, iterator, context) { this.each(function(value, index) { memo = iterator.call(context, memo, value, index); }); return memo; } function invoke(method) { var args = $A(arguments).slice(1); return this.map(function(value) { return value[method].apply(value, args); }); } function max(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { value = iterator.call(context, value, index); if (result == null || value >= result) result = value; }); return result; } function min(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { value = iterator.call(context, value, index); if (result == null || value < result) result = value; }); return result; } function partition(iterator, context) { iterator = iterator || Prototype.K; var trues = [], falses = []; this.each(function(value, index) { (iterator.call(context, value, index) ? trues : falses).push(value); }); return [trues, falses]; } function pluck(property) { var results = []; this.each(function(value) { results.push(value[property]); }); return results; } function reject(iterator, context) { var results = []; this.each(function(value, index) { if (!iterator.call(context, value, index)) results.push(value); }); return results; } function sortBy(iterator, context) { return this.map(function(value, index) { return { value: value, criteria: iterator.call(context, value, index) }; }).sort(function(left, right) { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); } function toArray() { return this.map(); } function zip() { var iterator = Prototype.K, args = $A(arguments); if (Object.isFunction(args.last())) iterator = args.pop(); var collections = [this].concat(args).map($A); return this.map(function(value, index) { return iterator(collections.pluck(index)); }); } function size() { return this.toArray().length; } function inspect() { return '#'; } return { each: each, eachSlice: eachSlice, all: all, every: all, any: any, some: any, collect: collect, map: collect, detect: detect, findAll: findAll, select: findAll, filter: findAll, grep: grep, include: include, member: include, inGroupsOf: inGroupsOf, inject: inject, invoke: invoke, max: max, min: min, partition: partition, pluck: pluck, reject: reject, sortBy: sortBy, toArray: toArray, entries: toArray, zip: zip, size: size, inspect: inspect, find: detect }; })(); function $A(iterable) { if (!iterable) return []; if ('toArray' in Object(iterable)) return iterable.toArray(); var length = iterable.length || 0, results = new Array(length); while (length--) results[length] = iterable[length]; return results; } function $w(string) { if (!Object.isString(string)) return []; string = string.strip(); return string ? string.split(/\s+/) : []; } Array.from = $A; (function() { var arrayProto = Array.prototype, slice = arrayProto.slice, _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available function each(iterator) { for (var i = 0, length = this.length; i < length; i++) iterator(this[i]); } if (!_each) _each = each; function clear() { this.length = 0; return this; } function first() { return this[0]; } function last() { return this[this.length - 1]; } function compact() { return this.select(function(value) { return value != null; }); } function flatten() { return this.inject([], function(array, value) { if (Object.isArray(value)) return array.concat(value.flatten()); array.push(value); return array; }); } function without() { var values = slice.call(arguments, 0); return this.select(function(value) { return !values.include(value); }); } function reverse(inline) { return (inline !== false ? this : this.toArray())._reverse(); } function uniq(sorted) { return this.inject([], function(array, value, index) { if (0 == index || (sorted ? array.last() != value : !array.include(value))) array.push(value); return array; }); } function intersect(array) { return this.uniq().findAll(function(item) { return array.detect(function(value) { return item === value }); }); } function clone() { return slice.call(this, 0); } function size() { return this.length; } function inspect() { return '[' + this.map(Object.inspect).join(', ') + ']'; } function toJSON() { var results = []; this.each(function(object) { var value = Object.toJSON(object); if (!Object.isUndefined(value)) results.push(value); }); return '[' + results.join(', ') + ']'; } function indexOf(item, i) { i || (i = 0); var length = this.length; if (i < 0) i = length + i; for (; i < length; i++) if (this[i] === item) return i; return -1; } function lastIndexOf(item, i) { i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; var n = this.slice(0, i).reverse().indexOf(item); return (n < 0) ? n : i - n - 1; } function concat() { var array = slice.call(this, 0), item; for (var i = 0, length = arguments.length; i < length; i++) { item = arguments[i]; if (Object.isArray(item) && !('callee' in item)) { for (var j = 0, arrayLength = item.length; j < arrayLength; j++) array.push(item[j]); } else { array.push(item); } } return array; } Object.extend(arrayProto, Enumerable); if (!arrayProto._reverse) arrayProto._reverse = arrayProto.reverse; Object.extend(arrayProto, { _each: _each, clear: clear, first: first, last: last, compact: compact, flatten: flatten, without: without, reverse: reverse, uniq: uniq, intersect: intersect, clone: clone, toArray: clone, size: size, inspect: inspect, toJSON: toJSON }); var CONCAT_ARGUMENTS_BUGGY = (function() { return [].concat(arguments)[0][0] !== 1; })(1,2) if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; })(); function $H(object) { return new Hash(object); }; var Hash = Class.create(Enumerable, (function() { function initialize(object) { this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); } function _each(iterator) { for (var key in this._object) { var value = this._object[key], pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } } function set(key, value) { return this._object[key] = value; } function get(key) { if (this._object[key] !== Object.prototype[key]) return this._object[key]; } function unset(key) { var value = this._object[key]; delete this._object[key]; return value; } function toObject() { return Object.clone(this._object); } function keys() { return this.pluck('key'); } function values() { return this.pluck('value'); } function index(value) { var match = this.detect(function(pair) { return pair.value === value; }); return match && match.key; } function merge(object) { return this.clone().update(object); } function update(object) { return new Hash(object).inject(this, function(result, pair) { result.set(pair.key, pair.value); return result; }); } function toQueryPair(key, value) { if (Object.isUndefined(value)) return key; return key + '=' + encodeURIComponent(String.interpret(value)); } function toQueryString() { return this.inject([], function(results, pair) { var key = encodeURIComponent(pair.key), values = pair.value; if (values && typeof values == 'object') { if (Object.isArray(values)) return results.concat(values.map(toQueryPair.curry(key))); } else results.push(toQueryPair(key, values)); return results; }).join('&'); } function inspect() { return '#'; } function toJSON() { return Object.toJSON(this.toObject()); } function clone() { return new Hash(this); } return { initialize: initialize, _each: _each, set: set, get: get, unset: unset, toObject: toObject, toTemplateReplacements: toObject, keys: keys, values: values, index: index, merge: merge, update: update, toQueryString: toQueryString, inspect: inspect, toJSON: toJSON, clone: clone }; })()); Hash.from = $H; Object.extend(Number.prototype, (function() { function toColorPart() { return this.toPaddedString(2, 16); } function succ() { return this + 1; } function times(iterator, context) { $R(0, this, true).each(iterator, context); return this; } function toPaddedString(length, radix) { var string = this.toString(radix || 10); return '0'.times(length - string.length) + string; } function toJSON() { return isFinite(this) ? this.toString() : 'null'; } function abs() { return Math.abs(this); } function round() { return Math.round(this); } function ceil() { return Math.ceil(this); } function floor() { return Math.floor(this); } return { toColorPart: toColorPart, succ: succ, times: times, toPaddedString: toPaddedString, toJSON: toJSON, abs: abs, round: round, ceil: ceil, floor: floor }; })()); function $R(start, end, exclusive) { return new ObjectRange(start, end, exclusive); } var ObjectRange = Class.create(Enumerable, (function() { function initialize(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; } function _each(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } } function include(value) { if (value < this.start) return false; if (this.exclusive) return value < this.end; return value <= this.end; } return { initialize: initialize, _each: _each, include: include }; })()); var Ajax = { getTransport: function() { return Try.these( function() {return new XMLHttpRequest()}, function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')} ) || false; }, activeRequestCount: 0 }; Ajax.Responders = { responders: [], _each: function(iterator) { this.responders._each(iterator); }, register: function(responder) { if (!this.include(responder)) this.responders.push(responder); }, unregister: function(responder) { this.responders = this.responders.without(responder); }, dispatch: function(callback, request, transport, json) { this.each(function(responder) { if (Object.isFunction(responder[callback])) { try { responder[callback].apply(responder, [request, transport, json]); } catch (e) { } } }); } }; Object.extend(Ajax.Responders, Enumerable); Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++ }, onComplete: function() { Ajax.activeRequestCount-- } }); Ajax.Base = Class.create({ initialize: function(options) { this.options = { method: 'post', asynchronous: true, contentType: 'application/x-www-form-urlencoded', encoding: 'UTF-8', parameters: '', evalJSON: true, evalJS: true }; Object.extend(this.options, options || { }); this.options.method = this.options.method.toLowerCase(); if (Object.isString(this.options.parameters)) this.options.parameters = this.options.parameters.toQueryParams(); else if (Object.isHash(this.options.parameters)) this.options.parameters = this.options.parameters.toObject(); } }); Ajax.Request = Class.create(Ajax.Base, { _complete: false, initialize: function($super, url, options) { $super(options); this.transport = Ajax.getTransport(); this.request(url); }, request: function(url) { this.url = url; this.method = this.options.method; var params = Object.clone(this.options.parameters); if (!['get', 'post'].include(this.method)) { params['_method'] = this.method; this.method = 'post'; } this.parameters = params; if (params = Object.toQueryString(params)) { if (this.method == 'get') this.url += (this.url.include('?') ? '&' : '?') + params; else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='; } try { var response = new Ajax.Response(this); if (this.options.onCreate) this.options.onCreate(response); Ajax.Responders.dispatch('onCreate', this, response); this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); this.body = this.method == 'post' ? (this.options.postBody || params) : null; this.transport.send(this.body); /* Force Firefox to handle ready state 4 for synchronous requests */ if (!this.options.asynchronous && this.transport.overrideMimeType) this.onStateChange(); } catch (e) { this.dispatchException(e); } }, onStateChange: function() { var readyState = this.transport.readyState; if (readyState > 1 && !((readyState == 4) && this._complete)) this.respondToReadyState(this.transport.readyState); }, setRequestHeaders: function() { var headers = { 'X-Requested-With': 'XMLHttpRequest', 'X-Prototype-Version': Prototype.Version, 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' }; if (this.method == 'post') { headers['Content-type'] = this.options.contentType + (this.options.encoding ? '; charset=' + this.options.encoding : ''); /* Force "Connection: close" for older Mozilla browsers to work * around a bug where XMLHttpRequest sends an incorrect * Content-length header. See Mozilla Bugzilla #246651. */ if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) headers['Connection'] = 'close'; } if (typeof this.options.requestHeaders == 'object') { var extras = this.options.requestHeaders; if (Object.isFunction(extras.push)) for (var i = 0, length = extras.length; i < length; i += 2) headers[extras[i]] = extras[i+1]; else $H(extras).each(function(pair) { headers[pair.key] = pair.value }); } for (var name in headers) this.transport.setRequestHeader(name, headers[name]); }, success: function() { var status = this.getStatus(); return !status || (status >= 200 && status < 300); }, getStatus: function() { try { return this.transport.status || 0; } catch (e) { return 0 } }, respondToReadyState: function(readyState) { var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); if (state == 'Complete') { try { this._complete = true; (this.options['on' + response.status] || this.options['on' + (this.success() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(response, response.headerJSON); } catch (e) { this.dispatchException(e); } var contentType = response.getHeader('Content-type'); if (this.options.evalJS == 'force' || (this.options.evalJS && this.isSameOrigin() && contentType && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) this.evalResponse(); } try { (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); } catch (e) { this.dispatchException(e); } if (state == 'Complete') { this.transport.onreadystatechange = Prototype.emptyFunction; } }, isSameOrigin: function() { var m = this.url.match(/^\s*https?:\/\/[^\/]*/); return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ protocol: location.protocol, domain: document.domain, port: location.port ? ':' + location.port : '' })); }, getHeader: function(name) { try { return this.transport.getResponseHeader(name) || null; } catch (e) { return null; } }, evalResponse: function() { try { return eval((this.transport.responseText || '').unfilterJSON()); } catch (e) { this.dispatchException(e); } }, dispatchException: function(exception) { (this.options.onException || Prototype.emptyFunction)(this, exception); Ajax.Responders.dispatch('onException', this, exception); } }); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Response = Class.create({ initialize: function(request){ this.request = request; var transport = this.transport = request.transport, readyState = this.readyState = transport.readyState; if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { this.status = this.getStatus(); this.statusText = this.getStatusText(); this.responseText = String.interpret(transport.responseText); this.headerJSON = this._getHeaderJSON(); } if(readyState == 4) { var xml = transport.responseXML; this.responseXML = Object.isUndefined(xml) ? null : xml; this.responseJSON = this._getResponseJSON(); } }, status: 0, statusText: '', getStatus: Ajax.Request.prototype.getStatus, getStatusText: function() { try { return this.transport.statusText || ''; } catch (e) { return '' } }, getHeader: Ajax.Request.prototype.getHeader, getAllHeaders: function() { try { return this.getAllResponseHeaders(); } catch (e) { return null } }, getResponseHeader: function(name) { return this.transport.getResponseHeader(name); }, getAllResponseHeaders: function() { return this.transport.getAllResponseHeaders(); }, _getHeaderJSON: function() { var json = this.getHeader('X-JSON'); if (!json) return null; json = decodeURIComponent(escape(json)); try { return json.evalJSON(this.request.options.sanitizeJSON || !this.request.isSameOrigin()); } catch (e) { this.request.dispatchException(e); } }, _getResponseJSON: function() { var options = this.request.options; if (!options.evalJSON || (options.evalJSON != 'force' && !(this.getHeader('Content-type') || '').include('application/json')) || this.responseText.blank()) return null; try { return this.responseText.evalJSON(options.sanitizeJSON || !this.request.isSameOrigin()); } catch (e) { this.request.dispatchException(e); } } }); Ajax.Updater = Class.create(Ajax.Request, { initialize: function($super, container, url, options) { this.container = { success: (container.success || container), failure: (container.failure || (container.success ? null : container)) }; options = Object.clone(options); var onComplete = options.onComplete; options.onComplete = (function(response, json) { this.updateContent(response.responseText); if (Object.isFunction(onComplete)) onComplete(response, json); }).bind(this); $super(url, options); }, updateContent: function(responseText) { var receiver = this.container[this.success() ? 'success' : 'failure'], options = this.options; if (!options.evalScripts) responseText = responseText.stripScripts(); if (receiver = $(receiver)) { if (options.insertion) { if (Object.isString(options.insertion)) { var insertion = { }; insertion[options.insertion] = responseText; receiver.insert(insertion); } else options.insertion(receiver, responseText); } else receiver.update(responseText); } } }); Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { initialize: function($super, container, url, options) { $super(options); this.onComplete = this.options.onComplete; this.frequency = (this.options.frequency || 2); this.decay = (this.options.decay || 1); this.updater = { }; this.container = container; this.url = url; this.start(); }, start: function() { this.options.onComplete = this.updateComplete.bind(this); this.onTimerEvent(); }, stop: function() { this.updater.options.onComplete = undefined; clearTimeout(this.timer); (this.onComplete || Prototype.emptyFunction).apply(this, arguments); }, updateComplete: function(response) { if (this.options.decay) { this.decay = (response.responseText == this.lastText ? this.decay * this.options.decay : 1); this.lastText = response.responseText; } this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); }, onTimerEvent: function() { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); function $(element) { if (arguments.length > 1) { for (var i = 0, elements = [], length = arguments.length; i < length; i++) elements.push($(arguments[i])); return elements; } if (Object.isString(element)) element = document.getElementById(element); return Element.extend(element); } if (Prototype.BrowserFeatures.XPath) { document._getElementsByXPath = function(expression, parentElement) { var results = []; var query = document.evaluate(expression, $(parentElement) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0, length = query.snapshotLength; i < length; i++) results.push(Element.extend(query.snapshotItem(i))); return results; }; } /*--------------------------------------------------------------------------*/ if (!window.Node) var Node = { }; if (!Node.ELEMENT_NODE) { Object.extend(Node, { ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12 }); } (function(global) { var SETATTRIBUTE_IGNORES_NAME = (function(){ var elForm = document.createElement("form"); var elInput = document.createElement("input"); var root = document.documentElement; elInput.setAttribute("name", "test"); elForm.appendChild(elInput); root.appendChild(elForm); var isBuggy = elForm.elements ? (typeof elForm.elements.test == "undefined") : null; root.removeChild(elForm); elForm = elInput = null; return isBuggy; })(); var element = global.Element; global.Element = function(tagName, attributes) { attributes = attributes || { }; tagName = tagName.toLowerCase(); var cache = Element.cache; if (SETATTRIBUTE_IGNORES_NAME && attributes.name) { tagName = '<' + tagName + ' name="' + attributes.name + '">'; delete attributes.name; return Element.writeAttribute(document.createElement(tagName), attributes); } if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); }; Object.extend(global.Element, element || { }); if (element) global.Element.prototype = element.prototype; })(this); Element.cache = { }; Element.idCounter = 1; Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; }, toggle: function(element) { element = $(element); Element[Element.visible(element) ? 'hide' : 'show'](element); return element; }, hide: function(element) { element = $(element); element.style.display = 'none'; return element; }, show: function(element) { element = $(element); element.style.display = ''; return element; }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); return element; }, update: (function(){ var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ var el = document.createElement("select"), isBuggy = true; el.innerHTML = ""; if (el.options && el.options[0]) { isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; } el = null; return isBuggy; })(); var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ try { var el = document.createElement("table"); if (el && el.tBodies) { el.innerHTML = "test"; var isBuggy = typeof el.tBodies[0] == "undefined"; el = null; return isBuggy; } } catch (e) { return true; } })(); var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { var s = document.createElement("script"), isBuggy = false; try { s.appendChild(document.createTextNode("")); isBuggy = !s.firstChild || s.firstChild && s.firstChild.nodeType !== 3; } catch (e) { isBuggy = true; } s = null; return isBuggy; })(); function update(element, content) { element = $(element); if (content && content.toElement) content = content.toElement(); if (Object.isElement(content)) return element.update().insert(content); content = Object.toHTML(content); var tagName = element.tagName.toUpperCase(); if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { element.text = content; return element; } if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { if (tagName in Element._insertionTranslations.tags) { while (element.firstChild) { element.removeChild(element.firstChild); } Element._getContentFromAnonymousElement(tagName, content.stripScripts()) .each(function(node) { element.appendChild(node) }); } else { element.innerHTML = content.stripScripts(); } } else { element.innerHTML = content.stripScripts(); } content.evalScripts.bind(content).defer(); return element; } return update; })(), replace: function(element, content) { element = $(element); if (content && content.toElement) content = content.toElement(); else if (!Object.isElement(content)) { content = Object.toHTML(content); var range = element.ownerDocument.createRange(); range.selectNode(element); content.evalScripts.bind(content).defer(); content = range.createContextualFragment(content.stripScripts()); } element.parentNode.replaceChild(content, element); return element; }, insert: function(element, insertions) { element = $(element); if (Object.isString(insertions) || Object.isNumber(insertions) || Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) insertions = {bottom:insertions}; var content, insert, tagName, childNodes; for (var position in insertions) { content = insertions[position]; position = position.toLowerCase(); insert = Element._insertionTranslations[position]; if (content && content.toElement) content = content.toElement(); if (Object.isElement(content)) { insert(element, content); continue; } content = Object.toHTML(content); tagName = ((position == 'before' || position == 'after') ? element.parentNode : element).tagName.toUpperCase(); childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); if (position == 'top' || position == 'after') childNodes.reverse(); childNodes.each(insert.curry(element)); content.evalScripts.bind(content).defer(); } return element; }, wrap: function(element, wrapper, attributes) { element = $(element); if (Object.isElement(wrapper)) $(wrapper).writeAttribute(attributes || { }); else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); else wrapper = new Element('div', wrapper); if (element.parentNode) element.parentNode.replaceChild(wrapper, element); wrapper.appendChild(element); return wrapper; }, inspect: function(element) { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { var property = pair.first(), attribute = pair.last(); var value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, recursivelyCollect: function(element, property) { element = $(element); var elements = []; while (element = element[property]) if (element.nodeType == 1) elements.push(Element.extend(element)); return elements; }, ancestors: function(element) { return Element.recursivelyCollect(element, 'parentNode'); }, descendants: function(element) { return Element.select(element, "*"); }, firstDescendant: function(element) { element = $(element).firstChild; while (element && element.nodeType != 1) element = element.nextSibling; return $(element); }, immediateDescendants: function(element) { if (!(element = $(element).firstChild)) return []; while (element && element.nodeType != 1) element = element.nextSibling; if (element) return [element].concat($(element).nextSiblings()); return []; }, previousSiblings: function(element) { return Element.recursivelyCollect(element, 'previousSibling'); }, nextSiblings: function(element) { return Element.recursivelyCollect(element, 'nextSibling'); }, siblings: function(element) { element = $(element); return Element.previousSiblings(element).reverse() .concat(Element.nextSiblings(element)); }, match: function(element, selector) { if (Object.isString(selector)) selector = new Selector(selector); return selector.match($(element)); }, up: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(element.parentNode); var ancestors = Element.ancestors(element); return Object.isNumber(expression) ? ancestors[expression] : Selector.findElement(ancestors, expression, index); }, down: function(element, expression, index) { element = $(element); if (arguments.length == 1) return Element.firstDescendant(element); return Object.isNumber(expression) ? Element.descendants(element)[expression] : Element.select(element, expression)[index || 0]; }, previous: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); var previousSiblings = Element.previousSiblings(element); return Object.isNumber(expression) ? previousSiblings[expression] : Selector.findElement(previousSiblings, expression, index); }, next: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); var nextSiblings = Element.nextSiblings(element); return Object.isNumber(expression) ? nextSiblings[expression] : Selector.findElement(nextSiblings, expression, index); }, select: function(element) { var args = Array.prototype.slice.call(arguments, 1); return Selector.findChildElements(element, args); }, adjacent: function(element) { var args = Array.prototype.slice.call(arguments, 1); return Selector.findChildElements(element.parentNode, args).without(element); }, identify: function(element) { element = $(element); var id = Element.readAttribute(element, 'id'); if (id) return id; do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); Element.writeAttribute(element, 'id', id); return id; }, readAttribute: function(element, name) { element = $(element); if (Prototype.Browser.IE) { var t = Element._attributeTranslations.read; if (t.values[name]) return t.values[name](element, name); if (t.names[name]) name = t.names[name]; if (name.include(':')) { return (!element.attributes || !element.attributes[name]) ? null : element.attributes[name].value; } } return element.getAttribute(name); }, writeAttribute: function(element, name, value) { element = $(element); var attributes = { }, t = Element._attributeTranslations.write; if (typeof name == 'object') attributes = name; else attributes[name] = Object.isUndefined(value) ? true : value; for (var attr in attributes) { name = t.names[attr] || attr; value = attributes[attr]; if (t.values[attr]) name = t.values[attr](element, value); if (value === false || value === null) element.removeAttribute(name); else if (value === true) element.setAttribute(name, name); else element.setAttribute(name, value); } return element; }, getHeight: function(element) { return Element.getDimensions(element).height; }, getWidth: function(element) { return Element.getDimensions(element).width; }, classNames: function(element) { return new Element.ClassNames(element); }, hasClassName: function(element, className) { if (!(element = $(element))) return; var elementClassName = element.className; return (elementClassName.length > 0 && (elementClassName == className || new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); }, addClassName: function(element, className) { if (!(element = $(element))) return; if (!Element.hasClassName(element, className)) element.className += (element.className ? ' ' : '') + className; return element; }, removeClassName: function(element, className) { if (!(element = $(element))) return; element.className = element.className.replace( new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); return element; }, toggleClassName: function(element, className) { if (!(element = $(element))) return; return Element[Element.hasClassName(element, className) ? 'removeClassName' : 'addClassName'](element, className); }, cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; while (node) { var nextNode = node.nextSibling; if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) element.removeChild(node); node = nextNode; } return element; }, empty: function(element) { return $(element).innerHTML.blank(); }, descendantOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); if (element.compareDocumentPosition) return (element.compareDocumentPosition(ancestor) & 8) === 8; if (ancestor.contains) return ancestor.contains(element) && ancestor !== element; while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var pos = Element.cumulativeOffset(element); window.scrollTo(pos[0], pos[1]); return element; }, getStyle: function(element, style) { element = $(element); style = style == 'float' ? 'cssFloat' : style.camelize(); var value = element.style[style]; if (!value || value == 'auto') { var css = document.defaultView.getComputedStyle(element, null); value = css ? css[style] : null; } if (style == 'opacity') return value ? parseFloat(value) : 1.0; return value == 'auto' ? null : value; }, getOpacity: function(element) { return $(element).getStyle('opacity'); }, setStyle: function(element, styles) { element = $(element); var elementStyle = element.style, match; if (Object.isString(styles)) { element.style.cssText += ';' + styles; return styles.include('opacity') ? element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; } for (var property in styles) if (property == 'opacity') element.setOpacity(styles[property]); else elementStyle[(property == 'float' || property == 'cssFloat') ? (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : property] = styles[property]; return element; }, setOpacity: function(element, value) { element = $(element); element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value; return element; }, getDimensions: function(element) { element = $(element); var display = Element.getStyle(element, 'display'); if (display != 'none' && display != null) // Safari bug return {width: element.offsetWidth, height: element.offsetHeight}; var els = element.style; var originalVisibility = els.visibility; var originalPosition = els.position; var originalDisplay = els.display; els.visibility = 'hidden'; if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari els.position = 'absolute'; els.display = 'block'; var originalWidth = element.clientWidth; var originalHeight = element.clientHeight; els.display = originalDisplay; els.position = originalPosition; els.visibility = originalVisibility; return {width: originalWidth, height: originalHeight}; }, makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; if (Prototype.Browser.Opera) { element.style.top = 0; element.style.left = 0; } } return element; }, undoPositioned: function(element) { element = $(element); if (element._madePositioned) { element._madePositioned = undefined; element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; } return element; }, makeClipping: function(element) { element = $(element); if (element._overflow) return element; element._overflow = Element.getStyle(element, 'overflow') || 'auto'; if (element._overflow !== 'hidden') element.style.overflow = 'hidden'; return element; }, undoClipping: function(element) { element = $(element); if (!element._overflow) return element; element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; element._overflow = null; return element; }, cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return Element._returnOffset(valueL, valueT); }, positionedOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { if (element.tagName.toUpperCase() == 'BODY') break; var p = Element.getStyle(element, 'position'); if (p !== 'static') break; } } while (element); return Element._returnOffset(valueL, valueT); }, absolutize: function(element) { element = $(element); if (Element.getStyle(element, 'position') == 'absolute') return element; var offsets = Element.positionedOffset(element); var top = offsets[1]; var left = offsets[0]; var width = element.clientWidth; var height = element.clientHeight; element._originalLeft = left - parseFloat(element.style.left || 0); element._originalTop = top - parseFloat(element.style.top || 0); element._originalWidth = element.style.width; element._originalHeight = element.style.height; element.style.position = 'absolute'; element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.width = width + 'px'; element.style.height = height + 'px'; return element; }, relativize: function(element) { element = $(element); if (Element.getStyle(element, 'position') == 'relative') return element; element.style.position = 'relative'; var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.height = element._originalHeight; element.style.width = element._originalWidth; return element; }, cumulativeScrollOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.scrollTop || 0; valueL += element.scrollLeft || 0; element = element.parentNode; } while (element); return Element._returnOffset(valueL, valueT); }, getOffsetParent: function(element) { if (element.offsetParent) return $(element.offsetParent); if (element == document.body) return $(element); while ((element = element.parentNode) && element != document.body) if (Element.getStyle(element, 'position') != 'static') return $(element); return $(document.body); }, viewportOffset: function(forElement) { var valueT = 0, valueL = 0; var element = forElement; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body && Element.getStyle(element, 'position') == 'absolute') break; } while (element = element.offsetParent); element = forElement; do { if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { valueT -= element.scrollTop || 0; valueL -= element.scrollLeft || 0; } } while (element = element.parentNode); return Element._returnOffset(valueL, valueT); }, clonePosition: function(element, source) { var options = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || { }); source = $(source); var p = Element.viewportOffset(source); element = $(element); var delta = [0, 0]; var parent = null; if (Element.getStyle(element, 'position') == 'absolute') { parent = Element.getOffsetParent(element); delta = Element.viewportOffset(parent); } if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if (options.setWidth) element.style.width = source.offsetWidth + 'px'; if (options.setHeight) element.style.height = source.offsetHeight + 'px'; return element; } }; Object.extend(Element.Methods, { getElementsBySelector: Element.Methods.select, childElements: Element.Methods.immediateDescendants }); Element._attributeTranslations = { write: { names: { className: 'class', htmlFor: 'for' }, values: { } } }; if (Prototype.Browser.Opera) { Element.Methods.getStyle = Element.Methods.getStyle.wrap( function(proceed, element, style) { switch (style) { case 'left': case 'top': case 'right': case 'bottom': if (proceed(element, 'position') === 'static') return null; case 'height': case 'width': if (!Element.visible(element)) return null; var dim = parseInt(proceed(element, style), 10); if (dim !== element['offset' + style.capitalize()]) return dim + 'px'; var properties; if (style === 'height') { properties = ['border-top-width', 'padding-top', 'padding-bottom', 'border-bottom-width']; } else { properties = ['border-left-width', 'padding-left', 'padding-right', 'border-right-width']; } return properties.inject(dim, function(memo, property) { var val = proceed(element, property); return val === null ? memo : memo - parseInt(val, 10); }) + 'px'; default: return proceed(element, style); } } ); Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( function(proceed, element, attribute) { if (attribute === 'title') return element.title; return proceed(element, attribute); } ); } else if (Prototype.Browser.IE) { Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( function(proceed, element) { element = $(element); try { element.offsetParent } catch(e) { return $(document.body) } var position = element.getStyle('position'); if (position !== 'static') return proceed(element); element.setStyle({ position: 'relative' }); var value = proceed(element); element.setStyle({ position: position }); return value; } ); $w('positionedOffset viewportOffset').each(function(method) { Element.Methods[method] = Element.Methods[method].wrap( function(proceed, element) { element = $(element); try { element.offsetParent } catch(e) { return Element._returnOffset(0,0) } var position = element.getStyle('position'); if (position !== 'static') return proceed(element); var offsetParent = element.getOffsetParent(); if (offsetParent && offsetParent.getStyle('position') === 'fixed') offsetParent.setStyle({ zoom: 1 }); element.setStyle({ position: 'relative' }); var value = proceed(element); element.setStyle({ position: position }); return value; } ); }); Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( function(proceed, element) { try { element.offsetParent } catch(e) { return Element._returnOffset(0,0) } return proceed(element); } ); Element.Methods.getStyle = function(element, style) { element = $(element); style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); var value = element.style[style]; if (!value && element.currentStyle) value = element.currentStyle[style]; if (style == 'opacity') { if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) if (value[1]) return parseFloat(value[1]) / 100; return 1.0; } if (value == 'auto') { if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) return element['offset' + style.capitalize()] + 'px'; return null; } return value; }; Element.Methods.setOpacity = function(element, value) { function stripAlpha(filter){ return filter.replace(/alpha\([^\)]*\)/gi,''); } element = $(element); var currentStyle = element.currentStyle; if ((currentStyle && !currentStyle.hasLayout) || (!currentStyle && element.style.zoom == 'normal')) element.style.zoom = 1; var filter = element.getStyle('filter'), style = element.style; if (value == 1 || value === '') { (filter = stripAlpha(filter)) ? style.filter = filter : style.removeAttribute('filter'); return element; } else if (value < 0.00001) value = 0; style.filter = stripAlpha(filter) + 'alpha(opacity=' + (value * 100) + ')'; return element; }; Element._attributeTranslations = (function(){ var classProp = 'className'; var forProp = 'for'; var el = document.createElement('div'); el.setAttribute(classProp, 'x'); if (el.className !== 'x') { el.setAttribute('class', 'x'); if (el.className === 'x') { classProp = 'class'; } } el = null; el = document.createElement('label'); el.setAttribute(forProp, 'x'); if (el.htmlFor !== 'x') { el.setAttribute('htmlFor', 'x'); if (el.htmlFor === 'x') { forProp = 'htmlFor'; } } el = null; return { read: { names: { 'class': classProp, 'className': classProp, 'for': forProp, 'htmlFor': forProp }, values: { _getAttr: function(element, attribute) { return element.getAttribute(attribute); }, _getAttr2: function(element, attribute) { return element.getAttribute(attribute, 2); }, _getAttrNode: function(element, attribute) { var node = element.getAttributeNode(attribute); return node ? node.value : ""; }, _getEv: (function(){ var el = document.createElement('div'); el.onclick = Prototype.emptyFunction; var value = el.getAttribute('onclick'); var f; if (String(value).indexOf('{') > -1) { f = function(element, attribute) { attribute = element.getAttribute(attribute); if (!attribute) return null; attribute = attribute.toString(); attribute = attribute.split('{')[1]; attribute = attribute.split('}')[0]; return attribute.strip(); }; } else if (value === '') { f = function(element, attribute) { attribute = element.getAttribute(attribute); if (!attribute) return null; return attribute.strip(); }; } el = null; return f; })(), _flag: function(element, attribute) { return $(element).hasAttribute(attribute) ? attribute : null; }, style: function(element) { return element.style.cssText.toLowerCase(); }, title: function(element) { return element.title; } } } } })(); Element._attributeTranslations.write = { names: Object.extend({ cellpadding: 'cellPadding', cellspacing: 'cellSpacing' }, Element._attributeTranslations.read.names), values: { checked: function(element, value) { element.checked = !!value; }, style: function(element, value) { element.style.cssText = value ? value : ''; } } }; Element._attributeTranslations.has = {}; $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; Element._attributeTranslations.has[attr.toLowerCase()] = attr; }); (function(v) { Object.extend(v, { href: v._getAttr2, src: v._getAttr2, type: v._getAttr, action: v._getAttrNode, disabled: v._flag, checked: v._flag, readonly: v._flag, multiple: v._flag, onload: v._getEv, onunload: v._getEv, onclick: v._getEv, ondblclick: v._getEv, onmousedown: v._getEv, onmouseup: v._getEv, onmouseover: v._getEv, onmousemove: v._getEv, onmouseout: v._getEv, onfocus: v._getEv, onblur: v._getEv, onkeypress: v._getEv, onkeydown: v._getEv, onkeyup: v._getEv, onsubmit: v._getEv, onreset: v._getEv, onselect: v._getEv, onchange: v._getEv }); })(Element._attributeTranslations.read.values); if (Prototype.BrowserFeatures.ElementExtensions) { (function() { function _descendants(element) { var nodes = element.getElementsByTagName('*'), results = []; for (var i = 0, node; node = nodes[i]; i++) if (node.tagName !== "!") // Filter out comment nodes. results.push(node); return results; } Element.Methods.down = function(element, expression, index) { element = $(element); if (arguments.length == 1) return element.firstDescendant(); return Object.isNumber(expression) ? _descendants(element)[expression] : Element.select(element, expression)[index || 0]; } })(); } } else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { Element.Methods.setOpacity = function(element, value) { element = $(element); element.style.opacity = (value == 1) ? 0.999999 : (value === '') ? '' : (value < 0.00001) ? 0 : value; return element; }; } else if (Prototype.Browser.WebKit) { Element.Methods.setOpacity = function(element, value) { element = $(element); element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value; if (value == 1) if(element.tagName.toUpperCase() == 'IMG' && element.width) { element.width++; element.width--; } else try { var n = document.createTextNode(' '); element.appendChild(n); element.removeChild(n); } catch (e) { } return element; }; Element.Methods.cumulativeOffset = function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body) if (Element.getStyle(element, 'position') == 'absolute') break; element = element.offsetParent; } while (element); return Element._returnOffset(valueL, valueT); }; } if ('outerHTML' in document.documentElement) { Element.Methods.replace = function(element, content) { element = $(element); if (content && content.toElement) content = content.toElement(); if (Object.isElement(content)) { element.parentNode.replaceChild(content, element); return element; } content = Object.toHTML(content); var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); if (Element._insertionTranslations.tags[tagName]) { var nextSibling = element.next(); var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); parent.removeChild(element); if (nextSibling) fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); else fragments.each(function(node) { parent.appendChild(node) }); } else element.outerHTML = content.stripScripts(); content.evalScripts.bind(content).defer(); return element; }; } Element._returnOffset = function(l, t) { var result = [l, t]; result.left = l; result.top = t; return result; }; Element._getContentFromAnonymousElement = function(tagName, html) { var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; if (t) { div.innerHTML = t[0] + html + t[1]; t[2].times(function() { div = div.firstChild }); } else div.innerHTML = html; return $A(div.childNodes); }; Element._insertionTranslations = { before: function(element, node) { element.parentNode.insertBefore(node, element); }, top: function(element, node) { element.insertBefore(node, element.firstChild); }, bottom: function(element, node) { element.appendChild(node); }, after: function(element, node) { element.parentNode.insertBefore(node, element.nextSibling); }, tags: { TABLE: ['', '
', 1], TBODY: ['', '
', 2], TR: ['', '
', 3], TD: ['
', '
', 4], SELECT: ['', 1] } }; (function() { var tags = Element._insertionTranslations.tags; Object.extend(tags, { THEAD: tags.TBODY, TFOOT: tags.TBODY, TH: tags.TD }); })(); Element.Methods.Simulated = { hasAttribute: function(element, attribute) { attribute = Element._attributeTranslations.has[attribute] || attribute; var node = $(element).getAttributeNode(attribute); return !!(node && node.specified); } }; Element.Methods.ByTag = { }; Object.extend(Element, Element.Methods); (function(div) { if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { window.HTMLElement = { }; window.HTMLElement.prototype = div['__proto__']; Prototype.BrowserFeatures.ElementExtensions = true; } div = null; })(document.createElement('div')) Element.extend = (function() { function checkDeficiency(tagName) { if (typeof window.Element != 'undefined') { var proto = window.Element.prototype; if (proto) { var id = '_' + (Math.random()+'').slice(2); var el = document.createElement(tagName); proto[id] = 'x'; var isBuggy = (el[id] !== 'x'); delete proto[id]; el = null; return isBuggy; } } return false; } function extendElementWith(element, methods) { for (var property in methods) { var value = methods[property]; if (Object.isFunction(value) && !(property in element)) element[property] = value.methodize(); } } var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); if (Prototype.BrowserFeatures.SpecificElementExtensions) { if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { return function(element) { if (element && typeof element._extendedByPrototype == 'undefined') { var t = element.tagName; if (t && (/^(?:object|applet|embed)$/i.test(t))) { extendElementWith(element, Element.Methods); extendElementWith(element, Element.Methods.Simulated); extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); } } return element; } } return Prototype.K; } var Methods = { }, ByTag = Element.Methods.ByTag; var extend = Object.extend(function(element) { if (!element || typeof element._extendedByPrototype != 'undefined' || element.nodeType != 1 || element == window) return element; var methods = Object.clone(Methods), tagName = element.tagName.toUpperCase(); if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); extendElementWith(element, methods); element._extendedByPrototype = Prototype.emptyFunction; return element; }, { refresh: function() { if (!Prototype.BrowserFeatures.ElementExtensions) { Object.extend(Methods, Element.Methods); Object.extend(Methods, Element.Methods.Simulated); } } }); extend.refresh(); return extend; })(); Element.hasAttribute = function(element, attribute) { if (element.hasAttribute) return element.hasAttribute(attribute); return Element.Methods.Simulated.hasAttribute(element, attribute); }; Element.addMethods = function(methods) { var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; if (!methods) { Object.extend(Form, Form.Methods); Object.extend(Form.Element, Form.Element.Methods); Object.extend(Element.Methods.ByTag, { "FORM": Object.clone(Form.Methods), "INPUT": Object.clone(Form.Element.Methods), "SELECT": Object.clone(Form.Element.Methods), "TEXTAREA": Object.clone(Form.Element.Methods) }); } if (arguments.length == 2) { var tagName = methods; methods = arguments[1]; } if (!tagName) Object.extend(Element.Methods, methods || { }); else { if (Object.isArray(tagName)) tagName.each(extend); else extend(tagName); } function extend(tagName) { tagName = tagName.toUpperCase(); if (!Element.Methods.ByTag[tagName]) Element.Methods.ByTag[tagName] = { }; Object.extend(Element.Methods.ByTag[tagName], methods); } function copy(methods, destination, onlyIfAbsent) { onlyIfAbsent = onlyIfAbsent || false; for (var property in methods) { var value = methods[property]; if (!Object.isFunction(value)) continue; if (!onlyIfAbsent || !(property in destination)) destination[property] = value.methodize(); } } function findDOMClass(tagName) { var klass; var trans = { "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": "FrameSet", "IFRAME": "IFrame" }; if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; if (window[klass]) return window[klass]; klass = 'HTML' + tagName + 'Element'; if (window[klass]) return window[klass]; klass = 'HTML' + tagName.capitalize() + 'Element'; if (window[klass]) return window[klass]; var element = document.createElement(tagName); var proto = element['__proto__'] || element.constructor.prototype; element = null; return proto; } var elementPrototype = window.HTMLElement ? HTMLElement.prototype : Element.prototype; if (F.ElementExtensions) { copy(Element.Methods, elementPrototype); copy(Element.Methods.Simulated, elementPrototype, true); } if (F.SpecificElementExtensions) { for (var tag in Element.Methods.ByTag) { var klass = findDOMClass(tag); if (Object.isUndefined(klass)) continue; copy(T[tag], klass.prototype); } } Object.extend(Element, Element.Methods); delete Element.ByTag; if (Element.extend.refresh) Element.extend.refresh(); Element.cache = { }; }; document.viewport = { getDimensions: function() { return { width: this.getWidth(), height: this.getHeight() }; }, getScrollOffsets: function() { return Element._returnOffset( window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); } }; (function(viewport) { var B = Prototype.Browser, doc = document, element, property = {}; function getRootElement() { if (B.WebKit && !doc.evaluate) return document; if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) return document.body; return document.documentElement; } function define(D) { if (!element) element = getRootElement(); property[D] = 'client' + D; viewport['get' + D] = function() { return element[property[D]] }; return viewport['get' + D](); } viewport.getWidth = define.curry('Width'); viewport.getHeight = define.curry('Height'); })(document.viewport); Element.Storage = { UID: 1 }; Element.addMethods({ getStorage: function(element) { if (!(element = $(element))) return; var uid; if (element === window) { uid = 0; } else { if (typeof element._prototypeUID === "undefined") element._prototypeUID = [Element.Storage.UID++]; uid = element._prototypeUID[0]; } if (!Element.Storage[uid]) Element.Storage[uid] = $H(); return Element.Storage[uid]; }, store: function(element, key, value) { if (!(element = $(element))) return; if (arguments.length === 2) { Element.getStorage(element).update(key); } else { Element.getStorage(element).set(key, value); } return element; }, retrieve: function(element, key, defaultValue) { if (!(element = $(element))) return; var hash = Element.getStorage(element), value = hash.get(key); if (Object.isUndefined(value)) { hash.set(key, defaultValue); value = defaultValue; } return value; }, clone: function(element, deep) { if (!(element = $(element))) return; var clone = element.cloneNode(deep); clone._prototypeUID = void 0; if (deep) { var descendants = Element.select(clone, '*'), i = descendants.length; while (i--) { descendants[i]._prototypeUID = void 0; } } return Element.extend(clone); } }); /* Portions of the Selector class are derived from Jack Slocum's DomQuery, * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style * license. Please see http://www.yui-ext.com/ for more information. */ var Selector = Class.create({ initialize: function(expression) { this.expression = expression.strip(); if (this.shouldUseSelectorsAPI()) { this.mode = 'selectorsAPI'; } else if (this.shouldUseXPath()) { this.mode = 'xpath'; this.compileXPathMatcher(); } else { this.mode = "normal"; this.compileMatcher(); } }, shouldUseXPath: (function() { var IS_DESCENDANT_SELECTOR_BUGGY = (function(){ var isBuggy = false; if (document.evaluate && window.XPathResult) { var el = document.createElement('div'); el.innerHTML = '
'; var xpath = ".//*[local-name()='ul' or local-name()='UL']" + "//*[local-name()='li' or local-name()='LI']"; var result = document.evaluate(xpath, el, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); isBuggy = (result.snapshotLength !== 2); el = null; } return isBuggy; })(); return function() { if (!Prototype.BrowserFeatures.XPath) return false; var e = this.expression; if (Prototype.Browser.WebKit && (e.include("-of-type") || e.include(":empty"))) return false; if ((/(\[[\w-]*?:|:checked)/).test(e)) return false; if (IS_DESCENDANT_SELECTOR_BUGGY) return false; return true; } })(), shouldUseSelectorsAPI: function() { if (!Prototype.BrowserFeatures.SelectorsAPI) return false; if (Selector.CASE_INSENSITIVE_CLASS_NAMES) return false; if (!Selector._div) Selector._div = new Element('div'); try { Selector._div.querySelector(this.expression); } catch(e) { return false; } return true; }, compileMatcher: function() { var e = this.expression, ps = Selector.patterns, h = Selector.handlers, c = Selector.criteria, le, p, m, len = ps.length, name; if (Selector._cache[e]) { this.matcher = Selector._cache[e]; return; } this.matcher = ["this.matcher = function(root) {", "var r = root, h = Selector.handlers, c = false, n;"]; while (e && le != e && (/\S/).test(e)) { le = e; for (var i = 0; i"; } }); if (Prototype.BrowserFeatures.SelectorsAPI && document.compatMode === 'BackCompat') { Selector.CASE_INSENSITIVE_CLASS_NAMES = (function(){ var div = document.createElement('div'), span = document.createElement('span'); div.id = "prototype_test_id"; span.className = 'Test'; div.appendChild(span); var isIgnored = (div.querySelector('#prototype_test_id .test') !== null); div = span = null; return isIgnored; })(); } Object.extend(Selector, { _cache: { }, xpath: { descendant: "//*", child: "/*", adjacent: "/following-sibling::*[1]", laterSibling: '/following-sibling::*', tagName: function(m) { if (m[1] == '*') return ''; return "[local-name()='" + m[1].toLowerCase() + "' or local-name()='" + m[1].toUpperCase() + "']"; }, className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", id: "[@id='#{1}']", attrPresence: function(m) { m[1] = m[1].toLowerCase(); return new Template("[@#{1}]").evaluate(m); }, attr: function(m) { m[1] = m[1].toLowerCase(); m[3] = m[5] || m[6]; return new Template(Selector.xpath.operators[m[2]]).evaluate(m); }, pseudo: function(m) { var h = Selector.xpath.pseudos[m[1]]; if (!h) return ''; if (Object.isFunction(h)) return h(m); return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); }, operators: { '=': "[@#{1}='#{3}']", '!=': "[@#{1}!='#{3}']", '^=': "[starts-with(@#{1}, '#{3}')]", '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", '*=': "[contains(@#{1}, '#{3}')]", '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" }, pseudos: { 'first-child': '[not(preceding-sibling::*)]', 'last-child': '[not(following-sibling::*)]', 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', 'empty': "[count(*) = 0 and (count(text()) = 0)]", 'checked': "[@checked]", 'disabled': "[(@disabled) and (@type!='hidden')]", 'enabled': "[not(@disabled) and (@type!='hidden')]", 'not': function(m) { var e = m[6], p = Selector.patterns, x = Selector.xpath, le, v, len = p.length, name; var exclusion = []; while (e && le != e && (/\S/).test(e)) { le = e; for (var i = 0; i= 0)]"; return new Template(predicate).evaluate({ fragment: fragment, a: a, b: b }); } } } }, criteria: { tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', className: 'n = h.className(n, r, "#{1}", c); c = false;', id: 'n = h.id(n, r, "#{1}", c); c = false;', attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', attr: function(m) { m[3] = (m[5] || m[6]); return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); }, pseudo: function(m) { if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); }, descendant: 'c = "descendant";', child: 'c = "child";', adjacent: 'c = "adjacent";', laterSibling: 'c = "laterSibling";' }, patterns: [ { name: 'laterSibling', re: /^\s*~\s*/ }, { name: 'child', re: /^\s*>\s*/ }, { name: 'adjacent', re: /^\s*\+\s*/ }, { name: 'descendant', re: /^\s/ }, { name: 'tagName', re: /^\s*(\*|[\w\-]+)(\b|$)?/ }, { name: 'id', re: /^#([\w\-\*]+)(\b|$)/ }, { name: 'className', re: /^\.([\w\-\*]+)(\b|$)/ }, { name: 'pseudo', re: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/ }, { name: 'attrPresence', re: /^\[((?:[\w-]+:)?[\w-]+)\]/ }, { name: 'attr', re: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ } ], assertions: { tagName: function(element, matches) { return matches[1].toUpperCase() == element.tagName.toUpperCase(); }, className: function(element, matches) { return Element.hasClassName(element, matches[1]); }, id: function(element, matches) { return element.id === matches[1]; }, attrPresence: function(element, matches) { return Element.hasAttribute(element, matches[1]); }, attr: function(element, matches) { var nodeValue = Element.readAttribute(element, matches[1]); return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); } }, handlers: { concat: function(a, b) { for (var i = 0, node; node = b[i]; i++) a.push(node); return a; }, mark: function(nodes) { var _true = Prototype.emptyFunction; for (var i = 0, node; node = nodes[i]; i++) node._countedByPrototype = _true; return nodes; }, unmark: (function(){ var PROPERTIES_ATTRIBUTES_MAP = (function(){ var el = document.createElement('div'), isBuggy = false, propName = '_countedByPrototype', value = 'x' el[propName] = value; isBuggy = (el.getAttribute(propName) === value); el = null; return isBuggy; })(); return PROPERTIES_ATTRIBUTES_MAP ? function(nodes) { for (var i = 0, node; node = nodes[i]; i++) node.removeAttribute('_countedByPrototype'); return nodes; } : function(nodes) { for (var i = 0, node; node = nodes[i]; i++) node._countedByPrototype = void 0; return nodes; } })(), index: function(parentNode, reverse, ofType) { parentNode._countedByPrototype = Prototype.emptyFunction; if (reverse) { for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { var node = nodes[i]; if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; } } else { for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; } }, unique: function(nodes) { if (nodes.length == 0) return nodes; var results = [], n; for (var i = 0, l = nodes.length; i < l; i++) if (typeof (n = nodes[i])._countedByPrototype == 'undefined') { n._countedByPrototype = Prototype.emptyFunction; results.push(Element.extend(n)); } return Selector.handlers.unmark(results); }, descendant: function(nodes) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) h.concat(results, node.getElementsByTagName('*')); return results; }, child: function(nodes) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) { for (var j = 0, child; child = node.childNodes[j]; j++) if (child.nodeType == 1 && child.tagName != '!') results.push(child); } return results; }, adjacent: function(nodes) { for (var i = 0, results = [], node; node = nodes[i]; i++) { var next = this.nextElementSibling(node); if (next) results.push(next); } return results; }, laterSibling: function(nodes) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) h.concat(results, Element.nextSiblings(node)); return results; }, nextElementSibling: function(node) { while (node = node.nextSibling) if (node.nodeType == 1) return node; return null; }, previousElementSibling: function(node) { while (node = node.previousSibling) if (node.nodeType == 1) return node; return null; }, tagName: function(nodes, root, tagName, combinator) { var uTagName = tagName.toUpperCase(); var results = [], h = Selector.handlers; if (nodes) { if (combinator) { if (combinator == "descendant") { for (var i = 0, node; node = nodes[i]; i++) h.concat(results, node.getElementsByTagName(tagName)); return results; } else nodes = this[combinator](nodes); if (tagName == "*") return nodes; } for (var i = 0, node; node = nodes[i]; i++) if (node.tagName.toUpperCase() === uTagName) results.push(node); return results; } else return root.getElementsByTagName(tagName); }, id: function(nodes, root, id, combinator) { var targetNode = $(id), h = Selector.handlers; if (root == document) { if (!targetNode) return []; if (!nodes) return [targetNode]; } else { if (!root.sourceIndex || root.sourceIndex < 1) { var nodes = root.getElementsByTagName('*'); for (var j = 0, node; node = nodes[j]; j++) { if (node.id === id) return [node]; } } } if (nodes) { if (combinator) { if (combinator == 'child') { for (var i = 0, node; node = nodes[i]; i++) if (targetNode.parentNode == node) return [targetNode]; } else if (combinator == 'descendant') { for (var i = 0, node; node = nodes[i]; i++) if (Element.descendantOf(targetNode, node)) return [targetNode]; } else if (combinator == 'adjacent') { for (var i = 0, node; node = nodes[i]; i++) if (Selector.handlers.previousElementSibling(targetNode) == node) return [targetNode]; } else nodes = h[combinator](nodes); } for (var i = 0, node; node = nodes[i]; i++) if (node == targetNode) return [targetNode]; return []; } return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; }, className: function(nodes, root, className, combinator) { if (nodes && combinator) nodes = this[combinator](nodes); return Selector.handlers.byClassName(nodes, root, className); }, byClassName: function(nodes, root, className) { if (!nodes) nodes = Selector.handlers.descendant([root]); var needle = ' ' + className + ' '; for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { nodeClassName = node.className; if (nodeClassName.length == 0) continue; if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) results.push(node); } return results; }, attrPresence: function(nodes, root, attr, combinator) { if (!nodes) nodes = root.getElementsByTagName("*"); if (nodes && combinator) nodes = this[combinator](nodes); var results = []; for (var i = 0, node; node = nodes[i]; i++) if (Element.hasAttribute(node, attr)) results.push(node); return results; }, attr: function(nodes, root, attr, value, operator, combinator) { if (!nodes) nodes = root.getElementsByTagName("*"); if (nodes && combinator) nodes = this[combinator](nodes); var handler = Selector.operators[operator], results = []; for (var i = 0, node; node = nodes[i]; i++) { var nodeValue = Element.readAttribute(node, attr); if (nodeValue === null) continue; if (handler(nodeValue, value)) results.push(node); } return results; }, pseudo: function(nodes, name, value, root, combinator) { if (nodes && combinator) nodes = this[combinator](nodes); if (!nodes) nodes = root.getElementsByTagName("*"); return Selector.pseudos[name](nodes, value, root); } }, pseudos: { 'first-child': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) { if (Selector.handlers.previousElementSibling(node)) continue; results.push(node); } return results; }, 'last-child': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) { if (Selector.handlers.nextElementSibling(node)) continue; results.push(node); } return results; }, 'only-child': function(nodes, value, root) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) results.push(node); return results; }, 'nth-child': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root); }, 'nth-last-child': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root, true); }, 'nth-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root, false, true); }, 'nth-last-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root, true, true); }, 'first-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, "1", root, false, true); }, 'last-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, "1", root, true, true); }, 'only-of-type': function(nodes, formula, root) { var p = Selector.pseudos; return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); }, getIndices: function(a, b, total) { if (a == 0) return b > 0 ? [b] : []; return $R(1, total).inject([], function(memo, i) { if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); return memo; }); }, nth: function(nodes, formula, root, reverse, ofType) { if (nodes.length == 0) return []; if (formula == 'even') formula = '2n+0'; if (formula == 'odd') formula = '2n+1'; var h = Selector.handlers, results = [], indexed = [], m; h.mark(nodes); for (var i = 0, node; node = nodes[i]; i++) { if (!node.parentNode._countedByPrototype) { h.index(node.parentNode, reverse, ofType); indexed.push(node.parentNode); } } if (formula.match(/^\d+$/)) { // just a number formula = Number(formula); for (var i = 0, node; node = nodes[i]; i++) if (node.nodeIndex == formula) results.push(node); } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b if (m[1] == "-") m[1] = -1; var a = m[1] ? Number(m[1]) : 1; var b = m[2] ? Number(m[2]) : 0; var indices = Selector.pseudos.getIndices(a, b, nodes.length); for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { for (var j = 0; j < l; j++) if (node.nodeIndex == indices[j]) results.push(node); } } h.unmark(nodes); h.unmark(indexed); return results; }, 'empty': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) { if (node.tagName == '!' || node.firstChild) continue; results.push(node); } return results; }, 'not': function(nodes, selector, root) { var h = Selector.handlers, selectorType, m; var exclusions = new Selector(selector).findElements(root); h.mark(exclusions); for (var i = 0, results = [], node; node = nodes[i]; i++) if (!node._countedByPrototype) results.push(node); h.unmark(exclusions); return results; }, 'enabled': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) if (!node.disabled && (!node.type || node.type !== 'hidden')) results.push(node); return results; }, 'disabled': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) if (node.disabled) results.push(node); return results; }, 'checked': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) if (node.checked) results.push(node); return results; } }, operators: { '=': function(nv, v) { return nv == v; }, '!=': function(nv, v) { return nv != v; }, '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + '-').include('-' + (v || "").toUpperCase() + '-'); } }, split: function(expression) { var expressions = []; expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { expressions.push(m[1].strip()); }); return expressions; }, matchElements: function(elements, expression) { var matches = $$(expression), h = Selector.handlers; h.mark(matches); for (var i = 0, results = [], element; element = elements[i]; i++) if (element._countedByPrototype) results.push(element); h.unmark(matches); return results; }, findElement: function(elements, expression, index) { if (Object.isNumber(expression)) { index = expression; expression = false; } return Selector.matchElements(elements, expression || '*')[index || 0]; }, findChildElements: function(element, expressions) { expressions = Selector.split(expressions.join(',')); var results = [], h = Selector.handlers; for (var i = 0, l = expressions.length, selector; i < l; i++) { selector = new Selector(expressions[i].strip()); h.concat(results, selector.findElements(element)); } return (l > 1) ? h.unique(results) : results; } }); if (Prototype.Browser.IE) { Object.extend(Selector.handlers, { concat: function(a, b) { for (var i = 0, node; node = b[i]; i++) if (node.tagName !== "!") a.push(node); return a; } }); } function $$() { return Selector.findChildElements(document, $A(arguments)); } var Form = { reset: function(form) { form = $(form); form.reset(); return form; }, serializeElements: function(elements, options) { if (typeof options != 'object') options = { hash: !!options }; else if (Object.isUndefined(options.hash)) options.hash = true; var key, value, submitted = false, submit = options.submit; var data = elements.inject({ }, function(result, element) { if (!element.disabled && element.name) { key = element.name; value = $(element).getValue(); if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && submit !== false && (!submit || key == submit) && (submitted = true)))) { if (key in result) { if (!Object.isArray(result[key])) result[key] = [result[key]]; result[key].push(value); } else result[key] = value; } } return result; }); return options.hash ? data : Object.toQueryString(data); } }; Form.Methods = { serialize: function(form, options) { return Form.serializeElements(Form.getElements(form), options); }, getElements: function(form) { var elements = $(form).getElementsByTagName('*'), element, arr = [ ], serializers = Form.Element.Serializers; for (var i = 0; element = elements[i]; i++) { arr.push(element); } return arr.inject([], function(elements, child) { if (serializers[child.tagName.toLowerCase()]) elements.push(Element.extend(child)); return elements; }) }, getInputs: function(form, typeName, name) { form = $(form); var inputs = form.getElementsByTagName('input'); if (!typeName && !name) return $A(inputs).map(Element.extend); for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { var input = inputs[i]; if ((typeName && input.type != typeName) || (name && input.name != name)) continue; matchingInputs.push(Element.extend(input)); } return matchingInputs; }, disable: function(form) { form = $(form); Form.getElements(form).invoke('disable'); return form; }, enable: function(form) { form = $(form); Form.getElements(form).invoke('enable'); return form; }, findFirstElement: function(form) { var elements = $(form).getElements().findAll(function(element) { return 'hidden' != element.type && !element.disabled; }); var firstByIndex = elements.findAll(function(element) { return element.hasAttribute('tabIndex') && element.tabIndex >= 0; }).sortBy(function(element) { return element.tabIndex }).first(); return firstByIndex ? firstByIndex : elements.find(function(element) { return /^(?:input|select|textarea)$/i.test(element.tagName); }); }, focusFirstElement: function(form) { form = $(form); form.findFirstElement().activate(); return form; }, request: function(form, options) { form = $(form), options = Object.clone(options || { }); var params = options.parameters, action = form.readAttribute('action') || ''; if (action.blank()) action = window.location.href; options.parameters = form.serialize(true); if (params) { if (Object.isString(params)) params = params.toQueryParams(); Object.extend(options.parameters, params); } if (form.hasAttribute('method') && !options.method) options.method = form.method; return new Ajax.Request(action, options); } }; /*--------------------------------------------------------------------------*/ Form.Element = { focus: function(element) { $(element).focus(); return element; }, select: function(element) { $(element).select(); return element; } }; Form.Element.Methods = { serialize: function(element) { element = $(element); if (!element.disabled && element.name) { var value = element.getValue(); if (value != undefined) { var pair = { }; pair[element.name] = value; return Object.toQueryString(pair); } } return ''; }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); return Form.Element.Serializers[method](element); }, setValue: function(element, value) { element = $(element); var method = element.tagName.toLowerCase(); Form.Element.Serializers[method](element, value); return element; }, clear: function(element) { $(element).value = ''; return element; }, present: function(element) { return $(element).value != ''; }, activate: function(element) { element = $(element); try { element.focus(); if (element.select && (element.tagName.toLowerCase() != 'input' || !(/^(?:button|reset|submit)$/i.test(element.type)))) element.select(); } catch (e) { } return element; }, disable: function(element) { element = $(element); element.disabled = true; return element; }, enable: function(element) { element = $(element); element.disabled = false; return element; } }; /*--------------------------------------------------------------------------*/ var Field = Form.Element; var $F = Form.Element.Methods.getValue; /*--------------------------------------------------------------------------*/ Form.Element.Serializers = { input: function(element, value) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': return Form.Element.Serializers.inputSelector(element, value); default: return Form.Element.Serializers.textarea(element, value); } }, inputSelector: function(element, value) { if (Object.isUndefined(value)) return element.checked ? element.value : null; else element.checked = !!value; }, textarea: function(element, value) { if (Object.isUndefined(value)) return element.value; else element.value = value; }, select: function(element, value) { if (Object.isUndefined(value)) return this[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element); else { var opt, currentValue, single = !Object.isArray(value); for (var i = 0, length = element.length; i < length; i++) { opt = element.options[i]; currentValue = this.optionValue(opt); if (single) { if (currentValue == value) { opt.selected = true; return; } } else opt.selected = value.include(currentValue); } } }, selectOne: function(element) { var index = element.selectedIndex; return index >= 0 ? this.optionValue(element.options[index]) : null; }, selectMany: function(element) { var values, length = element.length; if (!length) return null; for (var i = 0, values = []; i < length; i++) { var opt = element.options[i]; if (opt.selected) values.push(this.optionValue(opt)); } return values; }, optionValue: function(opt) { return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; } }; /*--------------------------------------------------------------------------*/ Abstract.TimedObserver = Class.create(PeriodicalExecuter, { initialize: function($super, element, frequency, callback) { $super(callback, frequency); this.element = $(element); this.lastValue = this.getValue(); }, execute: function() { var value = this.getValue(); if (Object.isString(this.lastValue) && Object.isString(value) ? this.lastValue != value : String(this.lastValue) != String(value)) { this.callback(this.element, value); this.lastValue = value; } } }); Form.Element.Observer = Class.create(Abstract.TimedObserver, { getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(Abstract.TimedObserver, { getValue: function() { return Form.serialize(this.element); } }); /*--------------------------------------------------------------------------*/ Abstract.EventObserver = Class.create({ initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); }, onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } }, registerFormCallbacks: function() { Form.getElements(this.element).each(this.registerCallback, this); }, registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; default: Event.observe(element, 'change', this.onElementEvent.bind(this)); break; } } } }); Form.Element.EventObserver = Class.create(Abstract.EventObserver, { getValue: function() { return Form.Element.getValue(this.element); } }); Form.EventObserver = Class.create(Abstract.EventObserver, { getValue: function() { return Form.serialize(this.element); } }); (function() { var Event = { KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, KEY_HOME: 36, KEY_END: 35, KEY_PAGEUP: 33, KEY_PAGEDOWN: 34, KEY_INSERT: 45, cache: {} }; var docEl = document.documentElement; var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl && 'onmouseleave' in docEl; var _isButton; if (Prototype.Browser.IE) { var buttonMap = { 0: 1, 1: 4, 2: 2 }; _isButton = function(event, code) { return event.button === buttonMap[code]; }; } else if (Prototype.Browser.WebKit) { _isButton = function(event, code) { switch (code) { case 0: return event.which == 1 && !event.metaKey; case 1: return event.which == 1 && event.metaKey; default: return false; } }; } else { _isButton = function(event, code) { return event.which ? (event.which === code + 1) : (event.button === code); }; } function isLeftClick(event) { return _isButton(event, 0) } function isMiddleClick(event) { return _isButton(event, 1) } function isRightClick(event) { return _isButton(event, 2) } function element(event) { event = Event.extend(event); var node = event.target, type = event.type, currentTarget = event.currentTarget; if (currentTarget && currentTarget.tagName) { if (type === 'load' || type === 'error' || (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' && currentTarget.type === 'radio')) node = currentTarget; } if (node.nodeType == Node.TEXT_NODE) node = node.parentNode; return Element.extend(node); } function findElement(event, expression) { var element = Event.element(event); if (!expression) return element; var elements = [element].concat(element.ancestors()); return Selector.findElement(elements, expression, 0); } function pointer(event) { return { x: pointerX(event), y: pointerY(event) }; } function pointerX(event) { var docElement = document.documentElement, body = document.body || { scrollLeft: 0 }; return event.pageX || (event.clientX + (docElement.scrollLeft || body.scrollLeft) - (docElement.clientLeft || 0)); } function pointerY(event) { var docElement = document.documentElement, body = document.body || { scrollTop: 0 }; return event.pageY || (event.clientY + (docElement.scrollTop || body.scrollTop) - (docElement.clientTop || 0)); } function stop(event) { Event.extend(event); event.preventDefault(); event.stopPropagation(); event.stopped = true; } Event.Methods = { isLeftClick: isLeftClick, isMiddleClick: isMiddleClick, isRightClick: isRightClick, element: element, findElement: findElement, pointer: pointer, pointerX: pointerX, pointerY: pointerY, stop: stop }; var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { m[name] = Event.Methods[name].methodize(); return m; }); if (Prototype.Browser.IE) { function _relatedTarget(event) { var element; switch (event.type) { case 'mouseover': element = event.fromElement; break; case 'mouseout': element = event.toElement; break; default: return null; } return Element.extend(element); } Object.extend(methods, { stopPropagation: function() { this.cancelBubble = true }, preventDefault: function() { this.returnValue = false }, inspect: function() { return '[object Event]' } }); Event.extend = function(event, element) { if (!event) return false; if (event._extendedByPrototype) return event; event._extendedByPrototype = Prototype.emptyFunction; var pointer = Event.pointer(event); Object.extend(event, { target: event.srcElement || element, relatedTarget: _relatedTarget(event), pageX: pointer.x, pageY: pointer.y }); return Object.extend(event, methods); }; } else { Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; Object.extend(Event.prototype, methods); Event.extend = Prototype.K; } function _createResponder(element, eventName, handler) { var registry = Element.retrieve(element, 'prototype_event_registry'); if (Object.isUndefined(registry)) { CACHE.push(element); registry = Element.retrieve(element, 'prototype_event_registry', $H()); } var respondersForEvent = registry.get(eventName); if (Object.isUndefined(respondersForEvent)) { respondersForEvent = []; registry.set(eventName, respondersForEvent); } if (respondersForEvent.pluck('handler').include(handler)) return false; var responder; if (eventName.include(":")) { responder = function(event) { if (Object.isUndefined(event.eventName)) return false; if (event.eventName !== eventName) return false; Event.extend(event, element); handler.call(element, event); }; } else { if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && (eventName === "mouseenter" || eventName === "mouseleave")) { if (eventName === "mouseenter" || eventName === "mouseleave") { responder = function(event) { Event.extend(event, element); var parent = event.relatedTarget; while (parent && parent !== element) { try { parent = parent.parentNode; } catch(e) { parent = element; } } if (parent === element) return; handler.call(element, event); }; } } else { responder = function(event) { Event.extend(event, element); handler.call(element, event); }; } } responder.handler = handler; respondersForEvent.push(responder); return responder; } function _destroyCache() { for (var i = 0, length = CACHE.length; i < length; i++) { Event.stopObserving(CACHE[i]); CACHE[i] = null; } } var CACHE = []; if (Prototype.Browser.IE) window.attachEvent('onunload', _destroyCache); if (Prototype.Browser.WebKit) window.addEventListener('unload', Prototype.emptyFunction, false); var _getDOMEventName = Prototype.K; if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { _getDOMEventName = function(eventName) { var translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; return eventName in translations ? translations[eventName] : eventName; }; } function observe(element, eventName, handler) { element = $(element); var responder = _createResponder(element, eventName, handler); if (!responder) return element; if (eventName.include(':')) { if (element.addEventListener) element.addEventListener("dataavailable", responder, false); else { element.attachEvent("ondataavailable", responder); element.attachEvent("onfilterchange", responder); } } else { var actualEventName = _getDOMEventName(eventName); if (element.addEventListener) element.addEventListener(actualEventName, responder, false); else element.attachEvent("on" + actualEventName, responder); } return element; } function stopObserving(element, eventName, handler) { element = $(element); var registry = Element.retrieve(element, 'prototype_event_registry'); if (Object.isUndefined(registry)) return element; if (eventName && !handler) { var responders = registry.get(eventName); if (Object.isUndefined(responders)) return element; responders.each( function(r) { Element.stopObserving(element, eventName, r.handler); }); return element; } else if (!eventName) { registry.each( function(pair) { var eventName = pair.key, responders = pair.value; responders.each( function(r) { Element.stopObserving(element, eventName, r.handler); }); }); return element; } var responders = registry.get(eventName); if (!responders) return; var responder = responders.find( function(r) { return r.handler === handler; }); if (!responder) return element; var actualEventName = _getDOMEventName(eventName); if (eventName.include(':')) { if (element.removeEventListener) element.removeEventListener("dataavailable", responder, false); else { element.detachEvent("ondataavailable", responder); element.detachEvent("onfilterchange", responder); } } else { if (element.removeEventListener) element.removeEventListener(actualEventName, responder, false); else element.detachEvent('on' + actualEventName, responder); } registry.set(eventName, responders.without(responder)); return element; } function fire(element, eventName, memo, bubble) { element = $(element); if (Object.isUndefined(bubble)) bubble = true; if (element == document && document.createEvent && !element.dispatchEvent) element = document.documentElement; var event; if (document.createEvent) { event = document.createEvent('HTMLEvents'); event.initEvent('dataavailable', true, true); } else { event = document.createEventObject(); event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; } event.eventName = eventName; event.memo = memo || { }; if (document.createEvent) element.dispatchEvent(event); else element.fireEvent(event.eventType, event); return Event.extend(event); } Object.extend(Event, Event.Methods); Object.extend(Event, { fire: fire, observe: observe, stopObserving: stopObserving }); Element.addMethods({ fire: fire, observe: observe, stopObserving: stopObserving }); Object.extend(document, { fire: fire.methodize(), observe: observe.methodize(), stopObserving: stopObserving.methodize(), loaded: false }); if (window.Event) Object.extend(window.Event, Event); else window.Event = Event; })(); (function() { /* Support for the DOMContentLoaded event is based on work by Dan Webb, Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ var timer; function fireContentLoadedEvent() { if (document.loaded) return; if (timer) window.clearTimeout(timer); document.loaded = true; document.fire('dom:loaded'); } function checkReadyState() { if (document.readyState === 'complete') { document.stopObserving('readystatechange', checkReadyState); fireContentLoadedEvent(); } } function pollDoScroll() { try { document.documentElement.doScroll('left'); } catch(e) { timer = pollDoScroll.defer(); return; } fireContentLoadedEvent(); } if (document.addEventListener) { document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); } else { document.observe('readystatechange', checkReadyState); if (window == top) timer = pollDoScroll.defer(); } Event.observe(window, 'load', fireContentLoadedEvent); })(); Element.addMethods(); /*------------------------------- DEPRECATED -------------------------------*/ Hash.toQueryString = Object.toQueryString; var Toggle = { display: Element.toggle }; Element.Methods.childOf = Element.Methods.descendantOf; var Insertion = { Before: function(element, content) { return Element.insert(element, {before:content}); }, Top: function(element, content) { return Element.insert(element, {top:content}); }, Bottom: function(element, content) { return Element.insert(element, {bottom:content}); }, After: function(element, content) { return Element.insert(element, {after:content}); } }; var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); var Position = { includeScrollOffsets: false, prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; }, within: function(element, x, y) { if (this.includeScrollOffsets) return this.withinIncludingScrolloffsets(element, x, y); this.xcomp = x; this.ycomp = y; this.offset = Element.cumulativeOffset(element); return (y >= this.offset[1] && y < this.offset[1] + element.offsetHeight && x >= this.offset[0] && x < this.offset[0] + element.offsetWidth); }, withinIncludingScrolloffsets: function(element, x, y) { var offsetcache = Element.cumulativeScrollOffset(element); this.xcomp = x + offsetcache[0] - this.deltaX; this.ycomp = y + offsetcache[1] - this.deltaY; this.offset = Element.cumulativeOffset(element); return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + element.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + element.offsetWidth); }, overlap: function(mode, element) { if (!mode) return 0; if (mode == 'vertical') return ((this.offset[1] + element.offsetHeight) - this.ycomp) / element.offsetHeight; if (mode == 'horizontal') return ((this.offset[0] + element.offsetWidth) - this.xcomp) / element.offsetWidth; }, cumulativeOffset: Element.Methods.cumulativeOffset, positionedOffset: Element.Methods.positionedOffset, absolutize: function(element) { Position.prepare(); return Element.absolutize(element); }, relativize: function(element) { Position.prepare(); return Element.relativize(element); }, realOffset: Element.Methods.cumulativeScrollOffset, offsetParent: Element.Methods.getOffsetParent, page: Element.Methods.viewportOffset, clone: function(source, target, options) { options = options || { }; return Element.clonePosition(target, source, options); } }; /*--------------------------------------------------------------------------*/ if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ function iter(name) { return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; } instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? function(element, className) { className = className.toString().strip(); var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); return cond ? document._getElementsByXPath('.//*' + cond, element) : []; } : function(element, className) { className = className.toString().strip(); var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); if (!classNames && !className) return elements; var nodes = $(element).getElementsByTagName('*'); className = ' ' + className + ' '; for (var i = 0, child, cn; child = nodes[i]; i++) { if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || (classNames && classNames.all(function(name) { return !name.toString().blank() && cn.include(' ' + name + ' '); })))) elements.push(Element.extend(child)); } return elements; }; return function(className, parentElement) { return $(parentElement || document.body).getElementsByClassName(className); }; }(Element.Methods); /*--------------------------------------------------------------------------*/ Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { this.element = $(element); }, _each: function(iterator) { this.element.className.split(/\s+/).select(function(name) { return name.length > 0; })._each(iterator); }, set: function(className) { this.element.className = className; }, add: function(classNameToAdd) { if (this.include(classNameToAdd)) return; this.set($A(this).concat(classNameToAdd).join(' ')); }, remove: function(classNameToRemove) { if (!this.include(classNameToRemove)) return; this.set($A(this).without(classNameToRemove).join(' ')); }, toString: function() { return $A(this).join(' '); } }; Object.extend(Element.ClassNames.prototype, Enumerable); /*--------------------------------------------------------------------------*/ // ----------------------------------------------------------------------------------- // // Lightbox v2.03.2 // by Lokesh Dhakar - http://www.huddletogether.com // 4/30/06 // // For more information on this script, visit: // http://huddletogether.com/projects/lightbox2/ // // Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ // // Credit also due to those who have helped, inspired, and made their code available to the public. // Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.org), Thomas Fuchs(mir.aculo.us), and others. // // // ----------------------------------------------------------------------------------- /* Table of Contents ----------------- Configuration Global Variables Extending Built-in Objects - Object.extend(Element) - Array.prototype.removeDuplicates() - Array.prototype.empty() Lightbox Class Declaration - initialize() - start() - changeImage() - resizeImageContainer() - showImage() - updateDetails() - updateNav() - enableKeyboardNav() - disableKeyboardNav() - keyboardAction() - preloadNeighborImages() - end() Miscellaneous Functions - getPageScroll() - getPageSize() - getKey() - listenKey() - showSelectBoxes() - hideSelectBoxes() - showFlash() - hideFlash() - pause() - initLightbox() Function Calls - addLoadEvent(initLightbox) */ // ----------------------------------------------------------------------------------- // // Configuration // var fileLoadingImage = "/fend/images/loading.gif"; var fileBottomNavCloseImage = "/fend/images/closelabel.gif"; var overlayOpacity = 0.8; // controls transparency of shadow overlay var animate = true; // toggles resizing animations var resizeSpeed = 7; // controls the speed of the image resizing animations (1=slowest and 10=fastest) var borderSize = 10; //if you adjust the padding in the CSS, you will need to update this variable // ----------------------------------------------------------------------------------- // // Global Variables // var imageArray = new Array; var activeImage; if(animate == true){ overlayDuration = 0.2; // shadow fade in/out duration if(resizeSpeed > 10){ resizeSpeed = 10;} if(resizeSpeed < 1){ resizeSpeed = 1;} resizeDuration = (11 - resizeSpeed) * 0.15; } else { overlayDuration = 0; resizeDuration = 0; } // ----------------------------------------------------------------------------------- // // Additional methods for Element added by SU, Couloir // - further additions by Lokesh Dhakar (huddletogether.com) // Object.extend(Element, { getWidth: function(element) { element = $(element); return element.offsetWidth; }, setWidth: function(element,w) { element = $(element); element.style.width = w +"px"; }, setHeight: function(element,h) { element = $(element); element.style.height = h +"px"; }, setTop: function(element,t) { element = $(element); element.style.top = t +"px"; }, setSrc: function(element,src) { element = $(element); element.src = src; }, setHref: function(element,href) { element = $(element); element.href = href; }, setInnerHTML: function(element,content) { element = $(element); element.innerHTML = content; } }); // ----------------------------------------------------------------------------------- // // Extending built-in Array object // - array.removeDuplicates() // - array.empty() // Array.prototype.removeDuplicates = function () { for(i = 0; i < this.length; i++){ for(j = this.length-1; j>i; j--){ if(this[i][0] == this[j][0]){ this.splice(j,1); } } } } // ----------------------------------------------------------------------------------- Array.prototype.empty = function () { for(i = 0; i <= this.length; i++){ this.shift(); } } // ----------------------------------------------------------------------------------- // // Lightbox Class Declaration // - initialize() // - start() // - changeImage() // - resizeImageContainer() // - showImage() // - updateDetails() // - updateNav() // - enableKeyboardNav() // - disableKeyboardNav() // - keyboardNavAction() // - preloadNeighborImages() // - end() // // Structuring of code inspired by Scott Upton (http://www.uptonic.com/) // var Lightbox = Class.create(); Lightbox.prototype = { // initialize() // Constructor runs on completion of the DOM loading. Loops through anchor tags looking for // 'lightbox' references and applies onclick events to appropriate links. The 2nd section of // the function inserts html at the bottom of the page which is used to display the shadow // overlay and the image container. // initialize: function() { if (!document.getElementsByTagName){ return; } var anchors = document.getElementsByTagName('a'); var areas = document.getElementsByTagName('area'); // loop through all anchor tags for (var i=0; i // var objBody = document.getElementsByTagName("body").item(0); var objOverlay = document.createElement("div"); objOverlay.setAttribute('id','overlay'); objOverlay.style.display = 'none'; objOverlay.onclick = function() { myLightbox.end(); } objBody.appendChild(objOverlay); var objLightbox = document.createElement("div"); objLightbox.setAttribute('id','lightbox'); objLightbox.style.display = 'none'; objLightbox.onclick = function(e) { // close Lightbox is user clicks shadow overlay if (!e) var e = window.event; var clickObj = Event.element(e).id; if ( clickObj == 'lightbox') { myLightbox.end(); } }; objBody.appendChild(objLightbox); var objOuterImageContainer = document.createElement("div"); objOuterImageContainer.setAttribute('id','outerImageContainer'); objLightbox.appendChild(objOuterImageContainer); // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension. // If animations are turned off, it will be hidden as to prevent a flicker of a // white 250 by 250 box. if(animate){ Element.setWidth('outerImageContainer', 250); Element.setHeight('outerImageContainer', 250); } else { Element.setWidth('outerImageContainer', 1); Element.setHeight('outerImageContainer', 1); } var objImageContainer = document.createElement("div"); objImageContainer.setAttribute('id','imageContainer'); objOuterImageContainer.appendChild(objImageContainer); var objLightboxImage = document.createElement("img"); objLightboxImage.setAttribute('id','lightboxImage'); objImageContainer.appendChild(objLightboxImage); var objHoverNav = document.createElement("div"); objHoverNav.setAttribute('id','hoverNav'); objImageContainer.appendChild(objHoverNav); var objPrevLink = document.createElement("a"); objPrevLink.setAttribute('id','prevLink'); objPrevLink.setAttribute('href','#'); objHoverNav.appendChild(objPrevLink); var objNextLink = document.createElement("a"); objNextLink.setAttribute('id','nextLink'); objNextLink.setAttribute('href','#'); objHoverNav.appendChild(objNextLink); var objLoading = document.createElement("div"); objLoading.setAttribute('id','loading'); objImageContainer.appendChild(objLoading); var objLoadingLink = document.createElement("a"); objLoadingLink.setAttribute('id','loadingLink'); objLoadingLink.setAttribute('href','#'); objLoadingLink.onclick = function() { myLightbox.end(); return false; } objLoading.appendChild(objLoadingLink); var objLoadingImage = document.createElement("img"); objLoadingImage.setAttribute('src', fileLoadingImage); objLoadingLink.appendChild(objLoadingImage); var objImageDataContainer = document.createElement("div"); objImageDataContainer.setAttribute('id','imageDataContainer'); objLightbox.appendChild(objImageDataContainer); var objImageData = document.createElement("div"); objImageData.setAttribute('id','imageData'); objImageDataContainer.appendChild(objImageData); var objImageDetails = document.createElement("div"); objImageDetails.setAttribute('id','imageDetails'); objImageData.appendChild(objImageDetails); var objCaption = document.createElement("span"); objCaption.setAttribute('id','caption'); objImageDetails.appendChild(objCaption); var objNumberDisplay = document.createElement("span"); objNumberDisplay.setAttribute('id','numberDisplay'); objImageDetails.appendChild(objNumberDisplay); var objBottomNav = document.createElement("div"); objBottomNav.setAttribute('id','bottomNav'); objImageData.appendChild(objBottomNav); var objBottomNavCloseLink = document.createElement("a"); objBottomNavCloseLink.setAttribute('id','bottomNavClose'); objBottomNavCloseLink.setAttribute('href','#'); objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; } objBottomNav.appendChild(objBottomNavCloseLink); var objBottomNavCloseImage = document.createElement("img"); objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage); objBottomNavCloseLink.appendChild(objBottomNavCloseImage); }, // // start() // Display overlay and lightbox. If image is part of a set, add siblings to imageArray. // start: function(imageLink) { hideSelectBoxes(); hideFlash(); // stretch overlay to fill page and fade in var arrayPageSize = getPageSize(); Element.setHeight('overlay', arrayPageSize[1]); new Effect.Appear('overlay', { duration: overlayDuration, from: 0.0, to: overlayOpacity }); imageArray = []; imageNum = 0; if (!document.getElementsByTagName){ return; } var anchors = document.getElementsByTagName( imageLink.tagName); // if image is NOT part of a set.. if((imageLink.getAttribute('rel') == 'lightbox')){ // add single image to imageArray imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'))); } else { // if image is part of a set.. // loop through anchors, find other images in set, and add them to imageArray for (var i=0; i 1){ Element.show('numberDisplay'); Element.setInnerHTML( 'numberDisplay', "Image " + eval(activeImage + 1) + " of " + imageArray.length); } new Effect.Parallel( [ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration, from: 0.0, to: 1.0 }), new Effect.Appear('imageDataContainer', { sync: true, duration: resizeDuration }) ], { duration: resizeDuration, afterFinish: function() { // update overlay size and update nav var arrayPageSize = getPageSize(); Element.setHeight('overlay', arrayPageSize[1]); myLightbox.updateNav(); } } ); }, // // updateNav() // Display appropriate previous and next hover navigation. // updateNav: function() { Element.show('hoverNav'); // if not first image in set, display prev image button if(activeImage != 0){ Element.show('prevLink'); document.getElementById('prevLink').onclick = function() { myLightbox.changeImage(activeImage - 1); return false; } } // if not last image in set, display next image button if(activeImage != (imageArray.length - 1)){ Element.show('nextLink'); document.getElementById('nextLink').onclick = function() { myLightbox.changeImage(activeImage + 1); return false; } } this.enableKeyboardNav(); }, // // enableKeyboardNav() // enableKeyboardNav: function() { document.onkeydown = this.keyboardAction; }, // // disableKeyboardNav() // disableKeyboardNav: function() { document.onkeydown = ''; }, // // keyboardAction() // keyboardAction: function(e) { if (e == null) { // ie keycode = event.keyCode; escapeKey = 27; } else { // mozilla keycode = e.keyCode; escapeKey = e.DOM_VK_ESCAPE; } key = String.fromCharCode(keycode).toLowerCase(); if((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)){ // close lightbox myLightbox.end(); } else if((key == 'p') || (keycode == 37)){ // display previous image if(activeImage != 0){ myLightbox.disableKeyboardNav(); myLightbox.changeImage(activeImage - 1); } } else if((key == 'n') || (keycode == 39)){ // display next image if(activeImage != (imageArray.length - 1)){ myLightbox.disableKeyboardNav(); myLightbox.changeImage(activeImage + 1); } } }, // // preloadNeighborImages() // Preload previous and next images. // preloadNeighborImages: function(){ if((imageArray.length - 1) > activeImage){ preloadNextImage = new Image(); preloadNextImage.src = imageArray[activeImage + 1][0]; } if(activeImage > 0){ preloadPrevImage = new Image(); preloadPrevImage.src = imageArray[activeImage - 1][0]; } }, // // end() // end: function() { this.disableKeyboardNav(); Element.hide('lightbox'); new Effect.Fade('overlay', { duration: overlayDuration}); showSelectBoxes(); showFlash(); } } // ----------------------------------------------------------------------------------- // // getPageScroll() // Returns array with x,y page scroll values. // Core code from - quirksmode.org // 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; } // ----------------------------------------------------------------------------------- // // getPageSize() // Returns array with page width, height and window width, height // Core code from - quirksmode.org // Edit for Firefox by pHaez // 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; } // for small pages with total height less then height of the viewport if(yScroll < windowHeight){ pageHeight = windowHeight; } else { pageHeight = yScroll; } // for small pages with total width less then width of the viewport if(xScroll < windowWidth){ pageWidth = windowWidth; } else { pageWidth = xScroll; } arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) return arrayPageSize; } // ----------------------------------------------------------------------------------- // // getKey(key) // Gets keycode. If 'x' is pressed then it hides the lightbox. // function getKey(e){ if (e == null) { // ie keycode = event.keyCode; } else { // mozilla keycode = e.which; } key = String.fromCharCode(keycode).toLowerCase(); if(key == 'x'){ } } // ----------------------------------------------------------------------------------- // // listenKey() // function listenKey () { document.onkeypress = getKey; } // --------------------------------------------------- function showSelectBoxes(){ var selects = document.getElementsByTagName("select"); for (i = 0; i != selects.length; i++) { selects[i].style.visibility = "visible"; } } // --------------------------------------------------- function hideSelectBoxes(){ var selects = document.getElementsByTagName("select"); for (i = 0; i != selects.length; i++) { selects[i].style.visibility = "hidden"; } } // --------------------------------------------------- function showFlash(){ var flashObjects = document.getElementsByTagName("object"); for (i = 0; i < flashObjects.length; i++) { flashObjects[i].style.visibility = "visible"; } var flashEmbeds = document.getElementsByTagName("embed"); for (i = 0; i < flashEmbeds.length; i++) { flashEmbeds[i].style.visibility = "visible"; } } // --------------------------------------------------- function hideFlash(){ var flashObjects = document.getElementsByTagName("object"); for (i = 0; i < flashObjects.length; i++) { flashObjects[i].style.visibility = "hidden"; } var flashEmbeds = document.getElementsByTagName("embed"); for (i = 0; i < flashEmbeds.length; i++) { flashEmbeds[i].style.visibility = "hidden"; } } // --------------------------------------------------- // // pause(numberMillis) // Pauses code execution for specified time. Uses busy code, not good. // Help from Ran Bar-On [ran2103@gmail.com] // function pause(ms){ var date = new Date(); curDate = null; do{var curDate = new Date();} while( curDate - date < ms); } /* function pause(numberMillis) { var curently = new Date().getTime() + sender; while (new Date().getTime(); } */ // --------------------------------------------------- function initLightbox() { myLightbox = new Lightbox(); } Event.observe(window, 'load', initLightbox, false);// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // Contributors: // Justin Palmer (http://encytemedia.com/) // Mark Pilgrim (http://diveintomark.org/) // Martin Bialasinki // // See scriptaculous.js for full license. /* ------------- element ext -------------- */ // converts rgb() and #xxx to #xxxxxx format, // returns self (or first argument) if not convertable String.prototype.parseColor = function() { var color = '#'; if(this.slice(0,4) == 'rgb(') { var cols = this.slice(4,this.length-1).split(','); var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); } else { if(this.slice(0,1) == '#') { if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); if(this.length==7) color = this.toLowerCase(); } } return(color.length==7 ? color : (arguments[0] || this)); } Element.collectTextNodes = function(element) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); }).flatten().join(''); } Element.collectTextNodesIgnoreClass = function(element, className) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? Element.collectTextNodes(node) : '')); }).flatten().join(''); } Element.setStyle = function(element, style) { element = $(element); for(k in style) element.style[k.camelize()] = style[k]; } Element.setContentZoom = function(element, percent) { Element.setStyle(element, {fontSize: (percent/100) + 'em'}); if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); } Element.getOpacity = function(element){ var opacity; if (opacity = Element.getStyle(element, 'opacity')) return parseFloat(opacity); if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) if(opacity[1]) return parseFloat(opacity[1]) / 100; return 1.0; } Element.setOpacity = function(element, value){ element= $(element); if (value == 1){ Element.setStyle(element, { opacity: (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : null }); if(/MSIE/.test(navigator.userAgent)) Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); } else { if(value < 0.00001) value = 0; Element.setStyle(element, {opacity: value}); if(/MSIE/.test(navigator.userAgent)) Element.setStyle(element, { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 'alpha(opacity='+value*100+')' }); } } Element.getInlineOpacity = function(element){ return $(element).style.opacity || ''; } Element.childrenWithClassName = function(element, className) { return $A($(element).getElementsByTagName('*')).select( function(c) { return Element.hasClassName(c, className) }); } Array.prototype.call = function() { var args = arguments; this.each(function(f){ f.apply(this, args) }); } /*--------------------------------------------------------------------------*/ var Effect = { tagifyText: function(element) { var tagifyStyle = 'position:relative'; if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; element = $(element); $A(element.childNodes).each( function(child) { if(child.nodeType==3) { child.nodeValue.toArray().each( function(character) { element.insertBefore( Builder.node('span',{style: tagifyStyle}, character == ' ' ? String.fromCharCode(160) : character), child); }); Element.remove(child); } }); }, multiple: function(element, effect) { var elements; if(((typeof element == 'object') || (typeof element == 'function')) && (element.length)) elements = element; else elements = $(element).childNodes; var options = Object.extend({ speed: 0.1, delay: 0.0 }, arguments[2] || {}); var masterDelay = options.delay; $A(elements).each( function(element, index) { new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); }); }, PAIRS: { 'slide': ['SlideDown','SlideUp'], 'blind': ['BlindDown','BlindUp'], 'appear': ['Appear','Fade'] }, toggle: function(element, effect) { element = $(element); effect = (effect || 'appear').toLowerCase(); var options = Object.extend({ queue: { position:'end', scope:(element.id || 'global') } }, arguments[2] || {}); Effect[Element.visible(element) ? Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); } }; var Effect2 = Effect; // deprecated /* ------------- transitions ------------- */ Effect.Transitions = {} Effect.Transitions.linear = function(pos) { return pos; } Effect.Transitions.sinoidal = function(pos) { return (-Math.cos(pos*Math.PI)/2) + 0.5; } Effect.Transitions.reverse = function(pos) { return 1-pos; } Effect.Transitions.flicker = function(pos) { return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; } Effect.Transitions.wobble = function(pos) { return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; } Effect.Transitions.pulse = function(pos) { return (Math.floor(pos*10) % 2 == 0 ? (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); } Effect.Transitions.none = function(pos) { return 0; } Effect.Transitions.full = function(pos) { return 1; } /* ------------- core effects ------------- */ Effect.ScopedQueue = Class.create(); Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { initialize: function() { this.effects = []; this.interval = null; }, _each: function(iterator) { this.effects._each(iterator); }, add: function(effect) { var timestamp = new Date().getTime(); var position = (typeof effect.options.queue == 'string') ? effect.options.queue : effect.options.queue.position; switch(position) { case 'front': // move unstarted effects after this effect this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { e.startOn += effect.finishOn; e.finishOn += effect.finishOn; }); break; case 'end': // start effect after last queued effect has finished timestamp = this.effects.pluck('finishOn').max() || timestamp; break; } effect.startOn += timestamp; effect.finishOn += timestamp; this.effects.push(effect); if(!this.interval) this.interval = setInterval(this.loop.bind(this), 40); }, remove: function(effect) { this.effects = this.effects.reject(function(e) { return e==effect }); if(this.effects.length == 0) { clearInterval(this.interval); this.interval = null; } }, loop: function() { var timePos = new Date().getTime(); this.effects.invoke('loop', timePos); } }); Effect.Queues = { instances: $H(), get: function(queueName) { if(typeof queueName != 'string') return queueName; if(!this.instances[queueName]) this.instances[queueName] = new Effect.ScopedQueue(); return this.instances[queueName]; } } Effect.Queue = Effect.Queues.get('global'); Effect.DefaultOptions = { transition: Effect.Transitions.sinoidal, duration: 1.0, // seconds fps: 25.0, // max. 25fps due to Effect.Queue implementation sync: false, // true for combining from: 0.0, to: 1.0, delay: 0.0, queue: 'parallel' } Effect.Base = function() {}; Effect.Base.prototype = { position: null, start: function(options) { this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {}); this.currentFrame = 0; this.state = 'idle'; this.startOn = this.options.delay*1000; this.finishOn = this.startOn + (this.options.duration*1000); this.event('beforeStart'); if(!this.options.sync) Effect.Queues.get(typeof this.options.queue == 'string' ? 'global' : this.options.queue.scope).add(this); }, loop: function(timePos) { if(timePos >= this.startOn) { if(timePos >= this.finishOn) { this.render(1.0); this.cancel(); this.event('beforeFinish'); if(this.finish) this.finish(); this.event('afterFinish'); return; } var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); var frame = Math.round(pos * this.options.fps * this.options.duration); if(frame > this.currentFrame) { this.render(pos); this.currentFrame = frame; } } }, render: function(pos) { if(this.state == 'idle') { this.state = 'running'; this.event('beforeSetup'); if(this.setup) this.setup(); this.event('afterSetup'); } if(this.state == 'running') { if(this.options.transition) pos = this.options.transition(pos); pos *= (this.options.to-this.options.from); pos += this.options.from; this.position = pos; this.event('beforeUpdate'); if(this.update) this.update(pos); this.event('afterUpdate'); } }, cancel: function() { if(!this.options.sync) Effect.Queues.get(typeof this.options.queue == 'string' ? 'global' : this.options.queue.scope).remove(this); this.state = 'finished'; }, event: function(eventName) { if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); if(this.options[eventName]) this.options[eventName](this); }, inspect: function() { return '#'; } } Effect.Parallel = Class.create(); Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { initialize: function(effects) { this.effects = effects || []; this.start(arguments[1]); }, update: function(position) { this.effects.invoke('render', position); }, finish: function(position) { this.effects.each( function(effect) { effect.render(1.0); effect.cancel(); effect.event('beforeFinish'); if(effect.finish) effect.finish(position); effect.event('afterFinish'); }); } }); Effect.Opacity = Class.create(); Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); // make this work on IE on elements without 'layout' if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) Element.setStyle(this.element, {zoom: 1}); var options = Object.extend({ from: Element.getOpacity(this.element) || 0.0, to: 1.0 }, arguments[1] || {}); this.start(options); }, update: function(position) { Element.setOpacity(this.element, position); } }); Effect.Move = Class.create(); Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); var options = Object.extend({ x: 0, y: 0, mode: 'relative' }, arguments[1] || {}); this.start(options); }, setup: function() { // Bug in Opera: Opera returns the "real" position of a static element or // relative element that does not have top/left explicitly set. // ==> Always set top and left for position relative elements in your stylesheets // (to 0 if you do not need them) Element.makePositioned(this.element); this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0'); this.originalTop = parseFloat(Element.getStyle(this.element,'top') || '0'); if(this.options.mode == 'absolute') { // absolute movement, so we need to calc deltaX and deltaY this.options.x = this.options.x - this.originalLeft; this.options.y = this.options.y - this.originalTop; } }, update: function(position) { Element.setStyle(this.element, { left: this.options.x * position + this.originalLeft + 'px', top: this.options.y * position + this.originalTop + 'px' }); } }); // for backwards compatibility Effect.MoveBy = function(element, toTop, toLeft) { return new Effect.Move(element, Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); }; Effect.Scale = Class.create(); Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { initialize: function(element, percent) { this.element = $(element) var options = Object.extend({ scaleX: true, scaleY: true, scaleContent: true, scaleFromCenter: false, scaleMode: 'box', // 'box' or 'contents' or {} with provided values scaleFrom: 100.0, scaleTo: percent }, arguments[2] || {}); this.start(options); }, setup: function() { this.restoreAfterFinish = this.options.restoreAfterFinish || false; this.elementPositioning = Element.getStyle(this.element,'position'); this.originalStyle = {}; ['top','left','width','height','fontSize'].each( function(k) { this.originalStyle[k] = this.element.style[k]; }.bind(this)); this.originalTop = this.element.offsetTop; this.originalLeft = this.element.offsetLeft; var fontSize = Element.getStyle(this.element,'font-size') || '100%'; ['em','px','%'].each( function(fontSizeType) { if(fontSize.indexOf(fontSizeType)>0) { this.fontSize = parseFloat(fontSize); this.fontSizeType = fontSizeType; } }.bind(this)); this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; this.dims = null; if(this.options.scaleMode=='box') this.dims = [this.element.offsetHeight, this.element.offsetWidth]; if(/^content/.test(this.options.scaleMode)) this.dims = [this.element.scrollHeight, this.element.scrollWidth]; if(!this.dims) this.dims = [this.options.scaleMode.originalHeight, this.options.scaleMode.originalWidth]; }, update: function(position) { var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); if(this.options.scaleContent && this.fontSize) Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType }); this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); }, finish: function(position) { if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle); }, setDimensions: function(height, width) { var d = {}; if(this.options.scaleX) d.width = width + 'px'; if(this.options.scaleY) d.height = height + 'px'; if(this.options.scaleFromCenter) { var topd = (height - this.dims[0])/2; var leftd = (width - this.dims[1])/2; if(this.elementPositioning == 'absolute') { if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; } else { if(this.options.scaleY) d.top = -topd + 'px'; if(this.options.scaleX) d.left = -leftd + 'px'; } } Element.setStyle(this.element, d); } }); Effect.Highlight = Class.create(); Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); this.start(options); }, setup: function() { // Prevent executing on elements not in the layout flow if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; } // Disable background image during the effect this.oldStyle = { backgroundImage: Element.getStyle(this.element, 'background-image') }; Element.setStyle(this.element, {backgroundImage: 'none'}); if(!this.options.endcolor) this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff'); if(!this.options.restorecolor) this.options.restorecolor = Element.getStyle(this.element, 'background-color'); // init color calculations this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); }, update: function(position) { Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); }, finish: function() { Element.setStyle(this.element, Object.extend(this.oldStyle, { backgroundColor: this.options.restorecolor })); } }); Effect.ScrollTo = Class.create(); Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); this.start(arguments[1] || {}); }, setup: function() { Position.prepare(); var offsets = Position.cumulativeOffset(this.element); if(this.options.offset) offsets[1] += this.options.offset; var max = window.innerHeight ? window.height - window.innerHeight : document.body.scrollHeight - (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight); this.scrollStart = Position.deltaY; this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; }, update: function(position) { Position.prepare(); window.scrollTo(Position.deltaX, this.scrollStart + (position*this.delta)); } }); /* ------------- combination effects ------------- */ Effect.Fade = function(element) { var oldOpacity = Element.getInlineOpacity(element); var options = Object.extend({ from: Element.getOpacity(element) || 1.0, to: 0.0, afterFinishInternal: function(effect) { with(Element) { if(effect.options.to!=0) return; hide(effect.element); setStyle(effect.element, {opacity: oldOpacity}); }} }, arguments[1] || {}); return new Effect.Opacity(element,options); } Effect.Appear = function(element) { var options = Object.extend({ from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0), to: 1.0, beforeSetup: function(effect) { with(Element) { setOpacity(effect.element, effect.options.from); show(effect.element); }} }, arguments[1] || {}); return new Effect.Opacity(element,options); } Effect.Puff = function(element) { element = $(element); var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') }; return new Effect.Parallel( [ new Effect.Scale(element, 200, { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], Object.extend({ duration: 1.0, beforeSetupInternal: function(effect) { with(Element) { setStyle(effect.effects[0].element, {position: 'absolute'}); }}, afterFinishInternal: function(effect) { with(Element) { hide(effect.effects[0].element); setStyle(effect.effects[0].element, oldStyle); }} }, arguments[1] || {}) ); } Effect.BlindUp = function(element) { element = $(element); Element.makeClipping(element); return new Effect.Scale(element, 0, Object.extend({ scaleContent: false, scaleX: false, restoreAfterFinish: true, afterFinishInternal: function(effect) { with(Element) { [hide, undoClipping].call(effect.element); }} }, arguments[1] || {}) ); } Effect.BlindDown = function(element) { element = $(element); var oldHeight = Element.getStyle(element, 'height'); var elementDimensions = Element.getDimensions(element); return new Effect.Scale(element, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: 0, scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, restoreAfterFinish: true, afterSetup: function(effect) { with(Element) { makeClipping(effect.element); setStyle(effect.element, {height: '0px'}); show(effect.element); }}, afterFinishInternal: function(effect) { with(Element) { undoClipping(effect.element); setStyle(effect.element, {height: oldHeight}); }} }, arguments[1] || {}) ); } Effect.SwitchOff = function(element) { element = $(element); var oldOpacity = Element.getInlineOpacity(element); return new Effect.Appear(element, { duration: 0.4, from: 0, transition: Effect.Transitions.flicker, afterFinishInternal: function(effect) { new Effect.Scale(effect.element, 1, { duration: 0.3, scaleFromCenter: true, scaleX: false, scaleContent: false, restoreAfterFinish: true, beforeSetup: function(effect) { with(Element) { [makePositioned,makeClipping].call(effect.element); }}, afterFinishInternal: function(effect) { with(Element) { [hide,undoClipping,undoPositioned].call(effect.element); setStyle(effect.element, {opacity: oldOpacity}); }} }) } }); } Effect.DropOut = function(element) { element = $(element); var oldStyle = { top: Element.getStyle(element, 'top'), left: Element.getStyle(element, 'left'), opacity: Element.getInlineOpacity(element) }; return new Effect.Parallel( [ new Effect.Move(element, {x: 0, y: 100, sync: true }), new Effect.Opacity(element, { sync: true, to: 0.0 }) ], Object.extend( { duration: 0.5, beforeSetup: function(effect) { with(Element) { makePositioned(effect.effects[0].element); }}, afterFinishInternal: function(effect) { with(Element) { [hide, undoPositioned].call(effect.effects[0].element); setStyle(effect.effects[0].element, oldStyle); }} }, arguments[1] || {})); } Effect.Shake = function(element) { element = $(element); var oldStyle = { top: Element.getStyle(element, 'top'), left: Element.getStyle(element, 'left') }; return new Effect.Move(element, { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { with(Element) { undoPositioned(effect.element); setStyle(effect.element, oldStyle); }}}) }}) }}) }}) }}) }}); } Effect.SlideDown = function(element) { element = $(element); Element.cleanWhitespace(element); // SlideDown need to have the content of the element wrapped in a container element with fixed height! var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); var elementDimensions = Element.getDimensions(element); return new Effect.Scale(element, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: 0, scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, restoreAfterFinish: true, afterSetup: function(effect) { with(Element) { makePositioned(effect.element); makePositioned(effect.element.firstChild); if(window.opera) setStyle(effect.element, {top: ''}); makeClipping(effect.element); setStyle(effect.element, {height: '0px'}); show(element); }}, afterUpdateInternal: function(effect) { with(Element) { setStyle(effect.element.firstChild, {bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, afterFinishInternal: function(effect) { with(Element) { undoClipping(effect.element); undoPositioned(effect.element.firstChild); undoPositioned(effect.element); setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} }, arguments[1] || {}) ); } Effect.SlideUp = function(element) { element = $(element); Element.cleanWhitespace(element); var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); return new Effect.Scale(element, 0, Object.extend({ scaleContent: false, scaleX: false, scaleMode: 'box', scaleFrom: 100, restoreAfterFinish: true, beforeStartInternal: function(effect) { with(Element) { makePositioned(effect.element); makePositioned(effect.element.firstChild); if(window.opera) setStyle(effect.element, {top: ''}); makeClipping(effect.element); show(element); }}, afterUpdateInternal: function(effect) { with(Element) { setStyle(effect.element.firstChild, {bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, afterFinishInternal: function(effect) { with(Element) { [hide, undoClipping].call(effect.element); undoPositioned(effect.element.firstChild); undoPositioned(effect.element); setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} }, arguments[1] || {}) ); } // Bug in opera makes the TD containing this element expand for a instance after finish Effect.Squish = function(element) { return new Effect.Scale(element, window.opera ? 1 : 0, { restoreAfterFinish: true, beforeSetup: function(effect) { with(Element) { makeClipping(effect.element); }}, afterFinishInternal: function(effect) { with(Element) { hide(effect.element); undoClipping(effect.element); }} }); } Effect.Grow = function(element) { element = $(element); var options = Object.extend({ direction: 'center', moveTransistion: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.full }, arguments[1] || {}); var oldStyle = { top: element.style.top, left: element.style.left, height: element.style.height, width: element.style.width, opacity: Element.getInlineOpacity(element) }; var dims = Element.getDimensions(element); var initialMoveX, initialMoveY; var moveX, moveY; switch (options.direction) { case 'top-left': initialMoveX = initialMoveY = moveX = moveY = 0; break; case 'top-right': initialMoveX = dims.width; initialMoveY = moveY = 0; moveX = -dims.width; break; case 'bottom-left': initialMoveX = moveX = 0; initialMoveY = dims.height; moveY = -dims.height; break; case 'bottom-right': initialMoveX = dims.width; initialMoveY = dims.height; moveX = -dims.width; moveY = -dims.height; break; case 'center': initialMoveX = dims.width / 2; initialMoveY = dims.height / 2; moveX = -dims.width / 2; moveY = -dims.height / 2; break; } return new Effect.Move(element, { x: initialMoveX, y: initialMoveY, duration: 0.01, beforeSetup: function(effect) { with(Element) { hide(effect.element); makeClipping(effect.element); makePositioned(effect.element); }}, afterFinishInternal: function(effect) { new Effect.Parallel( [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), new Effect.Scale(effect.element, 100, { scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) ], Object.extend({ beforeSetup: function(effect) { with(Element) { setStyle(effect.effects[0].element, {height: '0px'}); show(effect.effects[0].element); }}, afterFinishInternal: function(effect) { with(Element) { [undoClipping, undoPositioned].call(effect.effects[0].element); setStyle(effect.effects[0].element, oldStyle); }} }, options) ) } }); } Effect.Shrink = function(element) { element = $(element); var options = Object.extend({ direction: 'center', moveTransistion: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.none }, arguments[1] || {}); var oldStyle = { top: element.style.top, left: element.style.left, height: element.style.height, width: element.style.width, opacity: Element.getInlineOpacity(element) }; var dims = Element.getDimensions(element); var moveX, moveY; switch (options.direction) { case 'top-left': moveX = moveY = 0; break; case 'top-right': moveX = dims.width; moveY = 0; break; case 'bottom-left': moveX = 0; moveY = dims.height; break; case 'bottom-right': moveX = dims.width; moveY = dims.height; break; case 'center': moveX = dims.width / 2; moveY = dims.height / 2; break; } return new Effect.Parallel( [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) ], Object.extend({ beforeStartInternal: function(effect) { with(Element) { [makePositioned, makeClipping].call(effect.effects[0].element) }}, afterFinishInternal: function(effect) { with(Element) { [hide, undoClipping, undoPositioned].call(effect.effects[0].element); setStyle(effect.effects[0].element, oldStyle); }} }, options) ); } Effect.Pulsate = function(element) { element = $(element); var options = arguments[1] || {}; var oldOpacity = Element.getInlineOpacity(element); var transition = options.transition || Effect.Transitions.sinoidal; var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; reverser.bind(transition); return new Effect.Opacity(element, Object.extend(Object.extend({ duration: 3.0, from: 0, afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); } }, options), {transition: reverser})); } Effect.Fold = function(element) { element = $(element); var oldStyle = { top: element.style.top, left: element.style.left, width: element.style.width, height: element.style.height }; Element.makeClipping(element); return new Effect.Scale(element, 5, Object.extend({ scaleContent: false, scaleX: false, afterFinishInternal: function(effect) { new Effect.Scale(element, 1, { scaleContent: false, scaleY: false, afterFinishInternal: function(effect) { with(Element) { [hide, undoClipping].call(effect.element); setStyle(effect.element, oldStyle); }} }); }}, arguments[1] || {})); } Effect.divSwap = function(element,container){ var div = document.getElementById(container); var nodeList = div.childNodes; var queue = Effect.Queues.get('menuScope'); if(queue.toArray().length<1){ if(Element.visible(element)==false){ for(i=0;i'); }, load: function() { if((typeof Prototype=='undefined') || parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]) < 1.4) throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0"); $A(document.getElementsByTagName("script")).findAll( function(s) { return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) }).each( function(s) { var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); var includes = s.src.match(/\?.*load=([a-z,]*)/); (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( function(include) { Scriptaculous.require(path+include+'.js') }); }); } } Scriptaculous.load();function unscrambleMailto(sDom, sUser) { address = sUser + '@' + sDom.replace(/%23/g, '.'); return ('mail' + 'to:' + address); } function unscrambleEmail(sDom, sUser) { return (sUser + '@' + sDom.replace(/%23/g, '.')); } function displayWindow2(url, width, height) { var Win = window.open(url, "displayWindow", 'width=' + width + ',height=' + height + ',resizable=1,scrollbars=yes,menubar=no'); } function checkSearchForm(theform) { if ((!theform.search_string.value) || (theform.search_string.value == 'Enter Keyword') || (theform.search_string.value == 'Enter Search') || (theform.search_string.value == 'Search Here')) { alert('Please enter search criteria.'); theform.search_string.focus(); return false; } return true; } function checkSearchFormFrench(theform) { if ((!theform.search_string.value) || (theform.search_string.value == 'Recherche ici') || (theform.search_string.value == 'Enter Search')) { alert('Veuillez insérer un mot pour votre recherche!'); theform.search_string.focus(); return false; } return true; } function openPopup(url, name, widgets, openerUrl) { var host = location.hostname; var popupWin = window.open(url, name, widgets); if (popupWin && popupWin.opener) { if (openerUrl) { popupWin.opener.location = openerUrl; } popupWin.opener.top.name = 'opener'; } popupWin.focus(); } function insert_desc(thedesc) { document.getElementById('desc_div').innerHTML = thedesc; document.location = '#desc_div'; } function checkSubscribeForm(theform) { if (!theform.subscribe_email.value || theform.subscribe_email.value == 'Enter Email Here') { alert("Please enter an email address!"); theform.subscribe_email.focus(); return false; } if (theform.subscribe_email.value.indexOf('@', 0) == -1 || theform.subscribe_email.value.indexOf('.', 0) == -1 || theform.subscribe_email.value.length < 8 || theform.subscribe_email.value.length == (theform.subscribe_email.value.indexOf('.', 0) + 1)) { alert("Please enter a valid email address!"); theform.subscribe_email.focus(); return false; } return true; } function printit() { window.print(); } function Go() { return; } function submitPollCheck(form) { var blnchoice = ''; for (i = 0; i < form.poll_vote.length; i++) { if (form.poll_vote[i].checked) { blnchoice = true; return true; } } if (!blnchoice) { alert("Please click the radio button of choice before voting!"); } return false; } function submitForm(formId) { document.getElementById(formId).submit(); } function iGallery(theImage) { larger_image = new Image(); larger_image.src = theImage.src.replace('_thumb', ''); document.getElementById('main_image').src = larger_image.src; document.getElementById('main_image').width = larger_image.width; document.getElementById('main_image').height = larger_image.height; } function swapTabs(targetDiv, srcDiv, srcEl) { //alert(divId); $(targetDiv).innerHTML = $(srcDiv).innerHTML; $(activeTab).removeClassName('active'); //alert($('activetab').id); $(srcEl).toggleClassName('active'); activeTab = srcEl; } function playFLV(width, height, file, image, div) { var s1 = new SWFObject("/fend/images/mediaplayer.swf", "mediaplayer", width, height, "8"); s1.useExpressInstall('/modules/jslib/expressinstall.swf'); s1.addParam("allowfullscreen", "true"); s1.addVariable("width", width); s1.addVariable("height", height); s1.addVariable("file", file); s1.addVariable("autostart", "true"); s1.addVariable("image", image); var version = deconcept.SWFObjectUtil.getPlayerVersion(); if (version['major'] < 8) { document.getElementById(div).style.background = 'transparent none'; document.getElementById(div).innerHTML = '

This video requires Flash 8 or higher, please update Flash with the following button.

Get Flash
'; } else { s1.write(div); } } //Returns the result of appending two functions together so that multiple functions //can be called for a single event handler such as window.onload function appendFunction(function1, function2) { return function() { if (function1) function1(); if (function2) function2(); } } /* give anchors with attribute rel="external" a target attribute of "_blank" */ Event.observe(window, 'load', function() { a = $('body').getElementsBySelector('[rel="external"]') for (i in a) { a[i].target = '_blank'; } a = $('body').getElementsBySelector('[rel="nofollow external"]') for (i in a) { a[i].target = '_blank'; a[i].rel = 'nofollow'; } }); /* ------------- */ /* loads a font size css file */ function changeFontSize(size) { if ($('fontSizeCss')) { $('fontSizeCss').href = '/fend/include/font_' + size + '.css'; } else { var headID = document.getElementsByTagName("head")[0]; var cssNode = document.createElement('link'); cssNode.type = 'text/css'; cssNode.rel = 'stylesheet'; cssNode.href = '/fend/include/font_' + size + '.css'; cssNode.id = 'fontSizeCss'; headID.appendChild(cssNode); } new Ajax.Request('/fend/request/set-font-size.asp?fontSize=' + size + '&rndNum=' + Math.floor(Math.random() * 100000), {}); } /*----------------------------*/ var modalOffset = '20'; function showModal(article) { var objModalBody = $('body'); var objModalOverlay = document.createElement("div"); objModalOverlay.setAttribute('id', 'modaloverlay'); objModalOverlay.style.display = 'none'; objModalBody.appendChild(objModalOverlay); Event.observe('modaloverlay', 'click', function(event) { closeModal(); }); var objModal = document.createElement("div"); objModal.setAttribute('id', 'modalwindow'); objModal.style.display = 'none'; objModalBody.appendChild(objModal); modalTop = $('modalwindow').viewportOffset().top; modalTop = modalTop - modalOffset; //alert(modalTop); objModal.style.top = (modalTop+'px').replace('-',''); Event.observe('modalwindow', 'click', function(event) { var targ; if (!e) var e = event; if (e.target) targ = e.target; else if (e.srcElement) targ = e.srcElement; if (targ.nodeType == 3) // defeat Safari bug targ = targ.parentNode; if (targ.id == 'modalwindow') { closeModal(); } }); var objModalInner = document.createElement("div"); objModalInner.setAttribute('id', 'modalinner'); objModal.appendChild(objModalInner); if (isNaN(article)) { $('modalinner').innerHTML = article + ''; } else { var url = '/fend/request/reqArticle.asp'; new Ajax.Request(url, { parameters: { article_id: article }, onSuccess: function(transport) { var response = transport.responseText || "no response text"; $('modalinner').innerHTML = response; } }); } //set the height of the overlay to fill the container var bodyHeight = $('body').getHeight(); var viewHeight = document.viewport.getHeight(); if (bodyHeight > viewHeight) { overlayHeight = bodyHeight; } else { overlayHeight = viewHeight; } $('modaloverlay').setStyle({ height: overlayHeight + 'px' }); var selectElements = $('container').select('select'); for(var i=0;i' + address); } }); } }); Event.observe(window, 'unload', function() { if($('mapshell') != null){ GUnload(); } }); navHover = function() { try { var lis = document.getElementById("body").getElementsByTagName("LI"); for (var i=0; i0){d=" "+d}}else{if(a400}if(h==500){h=400}for(var i in f){if(!J(f,i)){continue}i=parseInt(i,10);if(!e||ic){c=i}j.push(i)}if(hc){h=c}j.sort(function(l,k){return(d?(l>h&&k>h)?lk:(lk:lv){v=q}if(o>t){t=o}if(q.cufon-vml-canvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}.cufon-vml-canvas{position:absolute;text-align:left;}.cufon-vml{display:inline-block;position:relative;vertical-align:middle;}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px;}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none;}.cufon-vml .cufon-alt{display:inline;}}').replace(/;/g,"!important;"));function C(F,G){return A(F,/(?:em|ex|%)$/i.test(G)?"1em":G)}function A(I,J){if(/px$/i.test(J)){return parseFloat(J)}var H=I.style.left,G=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;I.style.left=J;var F=I.style.pixelLeft;I.style.left=H;I.runtimeStyle.left=G;return F}var E={};function D(K){var L=K.id;if(!E[L]){var I=K.stops,J=document.createElement("cvml:fill"),F=[];J.type="gradient";J.angle=180;J.focus="0";J.method="sigma";J.color=I[0][1];for(var H=1,G=I.length-1;H":{"d":"15,-20r153,-71r-153,-71r0,-23r184,84r0,20r-184,84r0,-23"},"?":{"d":"149,-202v0,56,-76,64,-67,130r-23,0v-13,-42,50,-91,50,-134v0,-45,-37,-51,-57,-32v-10,10,-21,26,-33,10v-3,-10,9,-19,12,-28v44,-20,118,-6,118,54xm47,-19v0,-12,11,-23,23,-23v12,0,23,11,23,23v0,13,-10,23,-23,23v-12,0,-23,-10,-23,-23","w":166},"@":{"d":"190,-188r27,0r-25,99v-1,4,-4,23,17,23v34,0,42,-47,42,-77v0,-48,-30,-97,-103,-97v-49,0,-109,36,-109,120v0,59,41,108,107,108v33,0,56,-6,78,-15r6,13v-24,10,-53,18,-83,18v-101,0,-139,-74,-139,-123v0,-81,63,-137,139,-137v104,0,125,74,125,116v0,44,-22,90,-68,90v-28,0,-38,-24,-38,-31v-17,18,-81,54,-81,-22v0,-35,28,-89,72,-89v18,0,24,11,29,20xm157,-172v-18,0,-42,26,-42,67v0,20,10,26,19,26v17,0,45,-24,45,-71v0,-14,-5,-22,-22,-22","w":280},"A":{"d":"86,-96r84,0r-41,-109xm258,-17v10,3,4,9,1,14v-20,8,-54,1,-79,3v-8,1,-4,-8,-2,-12v3,-5,23,-2,15,-23r-15,-42r-99,0r-17,45v-7,19,26,14,14,26v-8,13,-42,3,-61,6v-11,2,-14,-2,-9,-11v12,-10,25,-5,34,-27r67,-166v14,-36,-37,-22,-25,-44v12,-10,41,-1,60,-4v5,0,7,5,9,10v24,72,55,145,79,204v7,18,8,16,28,21","w":266},"B":{"d":"76,-126v3,50,-18,113,43,113v31,0,52,-26,51,-58v-1,-46,-42,-59,-94,-55xm117,4v-29,0,-76,7,-76,-27r0,-191v0,-14,-8,-20,-23,-22v-9,-1,-6,-6,-4,-12v26,-11,71,-4,104,-4v37,0,72,13,74,56v2,26,-22,44,-51,56v52,7,69,44,69,68v0,55,-51,76,-93,76xm76,-233r0,88v44,5,80,-12,78,-46v-2,-45,-36,-43,-78,-42","w":226},"C":{"d":"243,-28v-14,32,-26,31,-80,32v-89,0,-146,-54,-146,-132v0,-71,59,-128,137,-128v43,0,75,11,84,18v9,6,7,37,-5,40v-5,4,-7,-39,-80,-39v-63,0,-96,47,-96,106v0,101,105,143,176,97v8,-5,14,-2,10,6","w":253},"D":{"d":"225,-132v0,-89,-59,-107,-149,-101r0,178v0,37,19,40,53,40v27,0,96,-7,96,-117xm117,4v-42,0,-76,8,-76,-27r0,-191v0,-14,-7,-20,-22,-22v-10,-1,-7,-7,-4,-12v1,-3,4,-4,6,-4r103,0v108,0,141,48,141,122v0,53,-36,134,-148,134","w":280},"E":{"d":"73,-233r0,86r83,0v11,1,2,10,0,15v-17,12,-57,2,-83,5v4,34,-13,112,22,108r32,0v47,0,36,-45,58,-23v-2,19,9,42,-17,42r-111,0v-11,0,-19,0,-19,-25r0,-189v0,-14,-8,-20,-23,-22v-10,-1,-6,-7,-3,-12v1,-3,4,-4,6,-4r140,0v18,-1,11,26,9,39v-14,19,-11,-19,-41,-20r-53,0","w":193},"F":{"d":"79,-233r0,101r83,0v12,0,2,9,0,14v-17,12,-57,2,-83,5v7,36,-20,95,23,98v8,3,4,14,-5,15r-75,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-179v0,-14,-7,-20,-22,-22v-10,-1,-7,-7,-4,-12v1,-3,4,-4,6,-4r141,0v18,-1,12,37,2,44v-5,3,-11,-25,-35,-25r-53,0","w":180,"k":{"A":11,",":36,".":36}},"G":{"d":"256,-104r0,84v3,21,-9,21,-27,20v-10,-1,-6,-15,-7,-25v-73,70,-205,3,-205,-103v0,-71,59,-128,137,-128v43,0,75,11,84,18v9,6,7,37,-5,40v-5,4,-7,-39,-80,-39v-63,0,-96,47,-96,106v0,72,49,116,95,116v63,0,85,-45,61,-76v-13,-10,-31,-5,-20,-19v11,-8,37,-3,55,-3v8,0,8,3,8,9","w":273},"H":{"d":"97,-236v-31,2,-16,55,-19,86r123,0v-6,-34,18,-85,-23,-87v-8,-3,-4,-14,5,-15r76,0v9,-2,4,7,2,11v-7,9,-26,6,-25,24r0,182v0,14,5,15,23,20v8,2,4,14,-5,15r-75,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-95r-123,0r0,95v0,14,6,15,24,20v7,2,3,15,-6,15r-75,0v-7,2,-5,-6,-3,-11v7,-9,27,-5,26,-24r0,-182v0,-14,-5,-15,-23,-20v-7,-2,-5,-15,5,-15r75,0v7,-2,5,6,3,11v-1,4,-4,4,-7,5","w":280},"I":{"d":"46,-35r0,-182v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r75,0v7,-2,5,6,3,11v-7,9,-26,5,-25,24r0,182v0,14,5,15,23,20v8,2,4,14,-5,15r-76,0v-9,2,-4,-7,-2,-11v7,-9,26,-6,25,-24","w":126},"J":{"d":"21,54v21,-6,25,-27,25,-54r0,-217v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r75,0v7,-2,5,6,3,11v-7,9,-26,5,-25,24r0,208v0,62,-32,78,-60,78r0,-15","w":126},"K":{"d":"97,-236v-31,5,-15,69,-17,100r95,-116r38,0v3,28,-15,9,-42,40r-62,71v36,42,90,105,103,118v9,9,20,8,17,23v-40,2,-46,-1,-70,-30r-80,-97r0,92v0,14,5,15,23,20v8,2,4,14,-5,15r-76,0v-3,0,-6,0,-4,-5v2,-17,27,-8,27,-30r0,-182v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r76,0v3,0,6,0,4,5v-1,5,-3,11,-9,11","w":233},"L":{"d":"18,-5v2,-17,27,-8,27,-30r0,-182v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r76,0v3,0,6,0,4,5v-2,17,-27,8,-27,30r0,164v-2,47,21,33,54,34v47,2,36,-45,58,-23v-2,19,9,42,-17,42r-153,0v-3,0,-6,0,-4,-5","w":200,"k":{"T":14,"V":20,"W":16,"y":9,"Y":18}},"M":{"d":"298,-214r0,179v0,14,5,15,23,20v8,2,4,14,-5,15r-76,0v-3,0,-6,0,-4,-5v2,-17,27,-8,27,-30r-1,-156r-87,183v-5,12,-16,10,-22,-4r-84,-179r0,156v0,14,5,15,23,20v8,2,4,14,-5,15r-63,0v-9,2,-4,-7,-2,-11v7,-9,26,-6,25,-24r0,-181v-12,-13,-25,-19,-32,-20v-14,-2,-6,-14,2,-16v27,4,57,-10,69,15r87,188r93,-191v9,-22,33,-8,57,-12v8,-1,5,8,2,12v-7,11,-27,4,-27,26","w":339},"N":{"d":"228,-55v4,-51,0,-109,1,-162v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r63,0v9,-2,4,7,2,11v-7,9,-26,6,-25,24r0,205v1,13,-9,13,-21,12r-162,-195r0,160v0,14,5,15,23,20v7,2,5,15,-5,15r-63,0v-3,0,-6,0,-4,-5v2,-17,27,-8,27,-30r0,-181v-12,-13,-25,-19,-33,-20v-10,-2,-6,-16,3,-16v27,0,55,-5,64,15","w":286},"O":{"d":"140,4v-56,0,-123,-44,-123,-125v0,-71,51,-135,136,-135v71,0,123,56,123,125v0,80,-60,135,-136,135xm150,-15v60,0,88,-61,88,-112v0,-68,-38,-110,-93,-110v-51,0,-90,40,-90,105v0,67,35,117,95,117","w":293},"P":{"d":"82,-233r0,198v0,14,5,15,23,20v8,2,4,14,-5,15r-76,0v-3,0,-6,0,-4,-5v2,-17,27,-8,27,-30r0,-179v0,-14,-8,-20,-23,-22v-10,-1,-6,-7,-3,-12v1,-3,4,-4,6,-4v79,2,171,-17,171,67v0,58,-48,80,-93,77v-1,-4,-10,-13,-2,-13v40,0,60,-24,60,-60v-1,-50,-34,-55,-81,-52","k":{"A":20,",":40,".":40}},"Q":{"d":"311,40r0,8v-16,2,-29,13,-47,5r-103,-50v-75,8,-144,-36,-144,-124v0,-71,51,-135,136,-135v71,0,123,56,123,125v0,67,-43,109,-83,126v35,18,80,35,118,45xm145,-237v-51,0,-90,40,-90,105v0,67,35,117,95,117v60,0,88,-61,88,-112v0,-68,-38,-110,-93,-110","w":293},"R":{"d":"81,-233r0,104v46,3,76,-6,76,-57v0,-50,-32,-48,-76,-47xm224,-10r0,10v-18,-2,-47,6,-51,-9r-55,-101r-37,0v7,36,-19,92,23,95v8,3,4,14,-5,15r-76,0v-3,0,-6,0,-4,-5v2,-17,27,-8,27,-30r0,-179v0,-14,-8,-20,-23,-22v-9,-1,-6,-6,-4,-12v25,-10,69,-1,101,-4v87,-9,90,105,28,132v34,58,60,102,76,110","w":226,"k":{"T":5,"V":7,"W":5,"Y":7}},"S":{"d":"98,-256v37,-1,68,12,54,51v-11,15,-16,1,-23,-15v-14,-32,-68,-23,-73,9v-4,26,14,41,44,61v39,26,62,44,63,84v1,46,-43,70,-84,70v-27,0,-65,-4,-65,-22v0,-20,-9,-48,12,-49v5,-1,6,14,14,30v19,40,91,22,89,-22v-3,-67,-108,-67,-108,-138v0,-25,29,-59,77,-59","w":180},"T":{"d":"124,-230r0,195v0,14,5,15,23,20v8,2,4,14,-5,15r-75,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-195r-80,0v-5,0,-10,-1,-5,-7v4,-7,8,-15,20,-15r181,0v5,0,10,2,5,8v-8,24,-55,11,-86,14","w":213,"k":{"w":20,"y":20,"A":25,",":33,".":33,"a":34,"c":32,"e":32,"i":7,"o":32,"r":23,"s":23,"u":23,":":26,"-":26,";":26}},"U":{"d":"73,-217v5,83,-25,191,61,197v91,7,61,-115,66,-197v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r63,0v7,-2,5,6,3,11v-7,9,-27,5,-26,24r0,120v0,77,-43,101,-89,101v-121,-1,-91,-114,-95,-221v0,-14,-5,-15,-23,-20v-8,-2,-4,-14,5,-15r76,0v3,0,6,0,4,5v-2,17,-28,8,-27,30","w":259},"V":{"d":"134,-14v-3,16,-23,22,-26,0r-78,-200v-5,-13,-12,-19,-24,-22v-6,-3,-4,-16,8,-16r70,0v9,-1,4,8,2,12v-4,8,-26,6,-19,24r61,158r62,-159v11,-27,-27,-14,-11,-31v10,-10,39,-1,56,-4v10,-2,14,2,9,10v-11,9,-29,18,-32,35","w":247,"k":{"y":7,"A":43,",":41,".":41,"a":34,"e":32,"i":7,"o":32,"r":18,"u":18,":":16,"-":20,";":16}},"W":{"d":"120,-11v-1,14,-23,17,-25,-1r-69,-202v-3,-25,-29,-16,-21,-35v19,-8,53,-1,77,-3v10,-1,6,5,4,10v-3,8,-30,7,-24,26r51,159r59,-184v0,-16,28,-16,29,-1r60,185r48,-155v12,-31,-39,-21,-14,-40r69,0v13,19,-30,15,-29,38r-65,202v-2,11,-8,13,-21,12v-5,0,-5,-4,-8,-12r-60,-182","w":369,"k":{"y":4,"A":41,",":34,".":34,"a":29,"e":27,"i":9,"o":27,"r":11,"u":11,":":9,"-":11,";":9}},"X":{"d":"225,-252v7,0,3,7,2,11v-13,9,-19,6,-32,25r-53,77r66,100v10,16,13,19,29,20v15,1,9,8,6,16v-21,8,-58,1,-85,3v-8,1,-5,-7,-3,-12v3,-5,27,-6,18,-18r-52,-83r-58,85v-12,18,29,10,5,28r-55,0v-10,1,-7,-8,-4,-13v10,-5,26,-8,34,-20r66,-98r-55,-84v-11,-17,-12,-18,-26,-19v-10,-1,-8,-9,-4,-15v22,-8,59,-1,86,-3v9,-1,4,6,2,10v-3,8,-30,8,-22,22r41,64r46,-64v15,-19,-37,-15,-10,-32r58,0","w":253},"Y":{"d":"31,-214v-8,-28,-29,-12,-23,-35v18,-8,49,-1,72,-3v15,13,-22,15,-13,36r44,94r51,-95v14,-20,-30,-19,-7,-34r56,0v9,18,-17,15,-29,37r-55,99v-12,25,-6,48,-6,80v0,14,5,15,23,20v8,2,4,14,-5,15r-75,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-65","w":219,"k":{"v":18,"A":32,",":38,".":38,"a":31,"e":31,"i":7,"o":31,"u":22,":":20,"-":29,";":20,"p":22,"q":31}},"Z":{"d":"198,-252r0,8r-144,226r103,0v41,0,29,-42,51,-21v-2,18,8,39,-16,39r-174,0r-6,-11r143,-223r-86,0v-31,1,-29,53,-43,21v2,-15,-7,-39,10,-39r162,0","w":219},"[":{"d":"42,-265r78,0r0,15v-22,1,-49,-7,-49,20r0,262v-4,30,25,22,49,23r0,14r-78,0r0,-334","w":119},"\\":{"d":"162,39r-23,0r-94,-304r23,0"},"]":{"d":"0,-265r78,0r0,334r-78,0r0,-14v24,-1,49,7,49,-23r0,-262v4,-27,-27,-19,-49,-20r0,-15","w":119},"^":{"d":"50,-121r-24,0r67,-131r22,0r66,131r-24,0r-54,-106"},"_":{"d":"180,45r-180,0r0,-18r180,0r0,18","w":180},"a":{"d":"111,-169v-40,0,-63,43,-63,83v0,39,16,69,42,69v27,0,60,-38,60,-91v0,-33,-3,-61,-39,-61xm112,-184v33,0,71,-2,71,40r0,106v-6,23,34,16,20,35v-6,8,-29,3,-43,3v-19,0,-5,-32,-11,-46v-12,31,-40,50,-67,50v-43,0,-68,-40,-68,-83v0,-57,43,-105,98,-105","w":217},"b":{"d":"100,4v-31,0,-72,0,-71,-40r0,-193v0,-14,-5,-17,-22,-20v-8,-1,-5,-8,-2,-13v10,-8,32,-3,47,-3v7,0,10,5,10,12r0,109v13,-24,41,-40,68,-40v45,0,69,35,69,83v0,62,-47,105,-99,105xm101,-11v40,0,63,-44,63,-87v0,-32,-14,-65,-47,-65v-28,0,-56,26,-56,91v0,36,8,61,40,61","w":213},"c":{"d":"107,-184v39,0,62,4,50,42v-8,11,-11,0,-18,-12v-37,-38,-99,8,-91,62v-5,58,61,100,105,59v14,1,3,16,-1,24v-7,11,-28,12,-46,13v-58,0,-92,-43,-92,-94v0,-55,37,-94,93,-94","w":166},"d":{"d":"111,-169v-74,0,-85,152,-16,152v35,0,55,-29,55,-81v0,-49,-7,-71,-39,-71xm150,-177v-4,-30,14,-71,-22,-72v-8,0,-5,-8,-2,-13v12,-4,57,-12,57,9r0,215v-6,23,34,16,20,35v-6,8,-29,1,-43,3v-16,1,-7,-22,-11,-32v-34,62,-135,39,-135,-52v0,-65,68,-120,136,-93","w":211},"e":{"d":"158,-89r-110,0v-6,55,58,96,101,56v17,6,-2,27,-8,31v-65,24,-127,-23,-127,-85v0,-62,37,-97,84,-97v44,0,68,33,68,81v0,6,-3,14,-8,14xm48,-105r70,0v12,0,17,-6,17,-16v0,-35,-20,-47,-38,-47v-30,0,-49,30,-49,63","w":180},"f":{"d":"121,-180v5,26,-28,16,-49,18r0,127v0,14,5,15,23,20v8,2,4,14,-5,15r-73,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-127r-24,0r0,-18r24,0v-6,-54,25,-72,62,-85v18,-6,55,16,35,32v-23,2,-63,-33,-64,15r0,38r49,0","w":118},"g":{"d":"112,-184v33,0,71,-2,71,40r0,128v0,77,-35,106,-91,106v-34,0,-50,-8,-66,-15v-16,-7,-5,-19,1,-29v3,-5,5,-9,9,-4v36,43,117,42,114,-48v-1,-13,2,-29,-1,-40v-12,31,-40,50,-67,50v-43,0,-68,-40,-68,-83v0,-57,43,-105,98,-105xm111,-169v-40,0,-63,43,-63,83v0,39,16,69,42,69v27,0,60,-38,60,-91v0,-33,-3,-61,-39,-61","w":204},"h":{"d":"72,-257r0,113v20,-34,50,-40,70,-40v65,0,51,86,52,149v0,14,5,15,23,20v7,2,5,15,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24v-3,-47,13,-132,-34,-126v-35,-8,-56,52,-56,126v0,14,5,16,22,20v8,3,4,14,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-194v0,-14,-5,-17,-22,-20v-8,-1,-5,-8,-2,-13v10,-8,33,-1,48,-3v4,0,9,0,9,8","w":233},"i":{"d":"39,-35r0,-110v0,-14,-5,-16,-22,-19v-8,-1,-5,-8,-2,-13v13,-8,39,-1,57,-3r0,145v0,14,5,15,23,20v8,2,4,14,-5,15r-73,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24xm33,-230v0,-12,9,-21,21,-21v11,0,21,9,21,21v0,11,-10,21,-21,21v-12,0,-21,-9,-21,-21","w":110},"j":{"d":"15,77v22,-5,25,-26,24,-57r0,-165v0,-14,-5,-16,-22,-19v-8,-1,-5,-8,-2,-13v13,-8,39,-1,57,-3r0,193v0,60,-31,77,-57,77r0,-13xm33,-230v0,-12,10,-21,21,-21v12,0,21,9,21,21v0,11,-10,21,-21,21v-12,0,-21,-9,-21,-21","w":105},"k":{"d":"103,-112v32,35,58,78,95,100r0,12r-45,0r-81,-102v6,33,-17,85,22,87v8,3,4,14,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-194v0,-14,-5,-17,-22,-20v-8,-1,-5,-8,-2,-13v10,-8,33,-1,48,-3v4,0,9,0,9,8r0,146v27,-26,49,-47,67,-69v14,3,42,-9,40,10v0,10,-27,9,-41,23","w":200},"l":{"d":"72,-254r0,219v0,14,5,16,22,20v8,3,4,14,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-194v0,-14,-5,-17,-22,-20v-8,-1,-5,-8,-2,-13v10,-8,32,-3,47,-3v7,0,10,4,10,11","w":110},"m":{"d":"123,-161v-28,-8,-51,57,-51,126v0,14,4,15,22,20v8,2,3,14,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-110v0,-14,-5,-16,-22,-19v-8,-1,-5,-8,-2,-13v10,-8,33,0,48,-3v15,-3,6,24,10,33v25,-54,109,-44,115,0v11,-20,31,-37,62,-37v70,0,52,84,54,149v0,14,5,15,23,20v8,2,4,14,-5,15r-73,0v-3,0,-6,0,-4,-5v2,-17,29,-8,27,-30v-4,-48,19,-126,-33,-126v-28,-8,-51,57,-51,126v0,14,6,16,23,20v8,3,4,14,-5,15r-73,0v-3,0,-6,0,-4,-5v2,-17,29,-8,27,-30v-4,-48,19,-126,-33,-126","w":343},"n":{"d":"63,-180v14,-3,8,24,9,36v20,-34,50,-40,70,-40v65,0,51,86,52,149v0,14,5,15,23,20v7,2,5,15,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24v-3,-47,13,-132,-34,-126v-35,-8,-56,52,-56,126v0,14,5,16,22,20v8,3,4,14,-5,15r-72,0v-7,2,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-110v0,-14,-5,-16,-22,-19v-8,-1,-5,-8,-2,-13v10,-8,33,-1,48,-3","w":233},"o":{"d":"108,-184v51,0,85,40,85,90v0,57,-41,98,-94,98v-55,0,-85,-47,-85,-90v0,-66,48,-98,94,-98xm103,-167v-34,0,-55,30,-55,67v0,58,29,87,56,87v40,0,54,-35,54,-76v0,-46,-22,-78,-55,-78"},"p":{"d":"124,-163v-28,0,-55,26,-55,91v0,36,8,61,40,61v40,0,62,-44,62,-87v0,-32,-14,-65,-47,-65xm69,-3v5,36,-18,78,30,78v11,0,3,8,1,12v-22,7,-59,0,-86,3v-7,1,-5,-6,-3,-11v7,-9,26,-5,25,-24r0,-200v0,-14,-5,-16,-22,-19v-9,-1,-5,-9,-1,-13v10,-7,31,-2,46,-3v17,-2,6,25,11,36v13,-24,40,-40,67,-40v45,0,69,35,69,83v0,75,-67,124,-137,98","w":219},"q":{"d":"111,-184v34,0,72,-1,72,40r0,199v0,14,5,15,23,20v8,2,4,14,-5,15r-81,0v-9,2,-7,-7,-3,-11v9,-10,34,-5,33,-24r-1,-87v-34,62,-135,39,-135,-52v0,-52,44,-100,97,-100xm111,-169v-74,0,-85,152,-16,152v35,0,55,-30,55,-81v0,-49,-7,-71,-39,-71","w":211},"r":{"d":"63,-180v13,-3,8,19,9,30v18,-21,35,-34,49,-34v17,1,31,34,14,43v-4,4,-19,-11,-33,-11v-34,0,-30,75,-30,117v0,29,45,10,28,32v-20,7,-54,0,-79,3v-10,1,-11,-3,-7,-11v4,-9,25,-2,25,-24r0,-110v0,-14,-5,-16,-22,-19v-8,-1,-5,-8,-2,-13v10,-8,33,0,48,-3","w":140,"k":{"v":-9,"w":-9,"y":-9,",":22,".":22,"f":-4,"m":-4,"n":-4,"x":-9}},"s":{"d":"69,4v-25,0,-50,-3,-57,-21v3,-15,-7,-41,8,-42v5,-2,6,10,11,23v15,35,72,34,73,-9v-8,-40,-86,-43,-87,-91v0,-33,36,-48,61,-48v20,0,44,-3,47,13v4,24,-6,48,-19,17v-10,-22,-63,-20,-59,9v3,26,100,56,88,94v0,41,-37,55,-66,55","w":146},"t":{"d":"122,-180v5,28,-31,16,-53,18r0,108v-2,38,19,39,43,30v13,16,-14,27,-34,28v-61,3,-36,-107,-41,-166r-31,0r0,-18r31,0r0,-36v8,-5,20,-26,32,-16r0,52r53,0","w":123},"u":{"d":"103,-18v47,-3,53,-66,53,-127v0,-14,-6,-16,-22,-19v-8,-1,-5,-8,-2,-13v10,-8,32,-1,47,-3v4,0,9,2,9,12r0,131v-2,31,41,10,27,34v-10,8,-34,0,-50,3v-12,3,-9,-17,-9,-28v-34,37,-119,55,-119,-29r0,-88v0,-14,-5,-16,-22,-19v-8,-1,-5,-8,-2,-13v10,-8,32,-1,47,-3v4,0,9,2,9,12v5,52,-18,152,34,150","w":226},"v":{"d":"104,-10v-3,13,-18,14,-22,3r-57,-135v-5,-23,-29,-15,-20,-34v16,-10,51,-1,75,-4v8,-1,4,8,2,12v-3,6,-30,6,-23,24r40,101r49,-103v9,-24,-46,-14,-16,-34r59,0v8,0,5,8,3,12v-5,6,-19,12,-26,26","w":198,"k":{",":29,".":29}},"w":{"d":"261,-157v-24,43,-39,102,-59,150v-1,10,-18,11,-19,0r-43,-118r-56,125v-8,0,-13,1,-14,-7r-47,-135v-5,-23,-27,-15,-18,-34v17,-10,53,-1,77,-4v8,-1,3,7,2,12v-3,6,-34,3,-26,25r29,86r48,-116v0,-9,19,-11,19,0r42,118r35,-88v8,-26,-50,-18,-17,-37r57,0v8,-1,6,7,4,12v-2,6,-6,3,-14,11","w":279,"k":{",":29,".":29}},"x":{"d":"143,-30r-41,-47r-39,47v-14,19,34,7,14,28v-17,5,-44,1,-65,2v-10,1,-4,-8,-3,-12v2,-6,16,-2,26,-14r56,-65r-57,-65v-19,-5,-27,-13,-10,-24v24,2,59,-4,76,3v0,17,-34,15,-22,29r33,36r33,-38v13,-19,-36,-12,-7,-30r57,0v8,0,4,8,2,12v-9,9,-22,9,-34,23r-40,47v23,24,42,56,70,75v6,3,24,2,20,9v-4,26,-52,11,-80,14v-8,1,-4,-7,-3,-12v2,-6,25,-6,14,-18","w":219},"y":{"d":"72,64v-4,27,-52,39,-59,11v-2,-9,16,-6,23,-9v17,-1,37,-54,46,-75r-57,-133v-5,-23,-29,-15,-20,-34v16,-10,51,-1,75,-4v8,-1,4,8,2,12v-3,6,-30,6,-23,24r40,101r49,-103v9,-24,-46,-14,-16,-34r59,0v8,0,5,8,3,12v-5,6,-19,12,-26,26","w":198,"k":{",":29,".":29}},"z":{"d":"40,-180r114,0r0,17r-104,145r58,0v41,0,29,-40,51,-21v-2,19,8,39,-17,39r-127,0r-6,-13r112,-150r-48,0v-31,1,-29,46,-43,18v2,-14,-7,-35,10,-35","w":166},"{":{"d":"50,-96v43,12,29,70,29,119v0,28,9,43,30,49v-67,12,-57,-61,-57,-122v0,-27,-5,-37,-27,-46v66,-11,-19,-187,84,-168v-44,8,-30,71,-30,118v0,28,-4,43,-29,50","w":119},"|":{"d":"35,90r0,-360r23,0r0,360r-23,0","w":93},"}":{"d":"70,-96v-42,-12,-29,-71,-29,-120v0,-28,-9,-43,-30,-49v67,-12,57,61,57,122v0,27,5,38,27,47v-65,11,19,186,-84,167v67,-9,-9,-147,59,-167","w":119},"~":{"d":"67,-115v22,0,56,22,76,22v15,0,23,-11,31,-23r15,13v-12,17,-24,33,-46,33v-37,0,-91,-46,-111,3r-14,-13v12,-19,25,-35,49,-35"},"'":{"d":"51,-235r-8,73v0,3,0,11,-6,11v-6,0,-6,-8,-6,-11r-9,-73v-1,-9,-2,-30,15,-30v17,0,15,21,14,30","w":73},"`":{"d":"27,-238v-13,-6,-27,-28,-3,-31v24,11,44,36,61,55v-2,5,-6,9,-11,4","w":126},"\u00a0":{"w":103}}}); /*! * The following copyright notice may not be removed under any circumstances. * * Copyright: * © 1987, 1990, 1992, 2001, 2002 Adobe Systems Incorporated. All rights reserved. * * Trademark: * ITC Stone is a trademark of International Typeface Corporation registered in * the U.S. Patent and Trademark Office and may be registered in certain other * jurisdictions. * * Full name: * StoneInformalStd-Semibold * * Designer: * Sumner Stone * * Vendor URL: * http://www.adobe.com/type * * License information: * http://www.adobe.com/type/legal.html */ Cufon.registerFont({"w":206,"face":{"font-family":"ITC Stone Informal Std","font-weight":600,"font-stretch":"normal","units-per-em":"360","panose-1":"2 4 7 2 5 5 5 2 4 4","ascent":"265","descent":"-95","x-height":"4","bbox":"-0.448111 -275 378.442 91.3843","underline-thickness":"18","underline-position":"-18","stemh":"19","stemv":"48","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":103},"!":{"d":"64,-75r-21,0v-4,-55,-9,-128,-16,-174v-2,-11,10,-16,27,-16v17,0,28,5,26,16v-7,46,-12,119,-16,174xm27,-23v0,-15,13,-27,27,-27v15,0,27,13,27,27v0,14,-12,27,-27,27v-14,0,-27,-12,-27,-27","w":113},"\"":{"d":"57,-235r-10,73v0,3,0,11,-7,11v-6,0,-6,-8,-6,-11r-10,-73v-1,-9,-2,-30,16,-30v19,0,18,21,17,30xm122,-235r-9,73v0,3,0,11,-7,11v-6,0,-7,-8,-7,-11r-9,-73v-1,-9,-2,-30,16,-30v19,0,17,21,16,30","w":146},"#":{"d":"183,-105r0,28r-38,0r-10,77r-24,0r10,-77r-46,0r-11,77r-24,0r11,-77r-36,0r0,-28r40,0r7,-47r-37,0r0,-28r41,0r10,-72r24,0r-10,72r46,0r10,-72r24,0r-10,72r32,0r0,28r-36,0r-6,47r33,0xm132,-152r-46,0r-7,47r47,0"},"$":{"d":"111,-101r0,77v9,-4,23,-16,24,-36v1,-21,-15,-35,-24,-41xm91,4v-27,-1,-71,-3,-69,-22v2,-21,-8,-48,13,-50v9,9,17,55,56,49r0,-97v-47,-31,-65,-44,-65,-77v0,-31,25,-59,70,-63r0,-12r20,0r0,12v42,0,65,11,54,51v-24,26,-21,-39,-54,-33r0,81v46,30,68,56,69,84v1,45,-38,74,-74,76r0,33r-20,0r0,-32xm96,-173r0,-62v-6,1,-17,10,-19,24v-3,20,7,31,19,38"},"%":{"d":"73,-242v-11,0,-28,3,-28,60v0,65,17,68,28,68v11,0,28,-3,28,-68v0,-57,-17,-60,-28,-60xm73,-100v-39,0,-66,-31,-66,-83v0,-32,20,-73,66,-73v46,0,66,41,66,73v0,52,-27,83,-66,83xm255,-138v-11,0,-28,3,-28,61v0,64,17,67,28,67v11,0,28,-3,28,-67v0,-58,-17,-61,-28,-61xm255,4v-39,0,-66,-31,-66,-82v0,-32,20,-74,66,-74v46,0,66,42,66,74v0,51,-27,82,-66,82xm100,0r-25,0r151,-252r25,0","w":339},"&":{"d":"177,-45r-81,-78v-55,29,-31,106,25,106v24,0,44,-12,56,-28xm39,-199v-11,-52,93,-76,124,-39v0,14,2,36,-13,32v-2,-31,-68,-47,-68,-5v0,17,13,34,34,54r83,81v9,-21,11,-61,-2,-77v-14,-2,-50,6,-43,-7v16,-29,84,-10,127,-15v5,0,10,2,5,7v-9,17,-34,16,-62,15v6,19,5,61,-10,90v19,18,45,36,61,55r0,8v-23,-2,-49,4,-62,-9r-20,-20v-15,15,-40,33,-81,33v-103,0,-133,-116,-34,-142v-15,-16,-39,-33,-39,-61","w":293},"(":{"d":"27,-100v0,-69,32,-126,96,-165v6,-2,12,10,7,13v-48,30,-61,87,-61,150v0,64,11,126,63,161v5,4,-3,16,-10,15v-54,-35,-95,-90,-95,-174","w":133},")":{"d":"107,-91v0,69,-33,126,-97,165v-6,2,-12,-9,-7,-12v48,-30,61,-88,61,-151v0,-64,-11,-125,-63,-160v-5,-4,4,-17,11,-16v54,35,95,90,95,174","w":133},"*":{"d":"91,-252r-3,47r44,-17r9,27r-46,12r31,36r-24,17r-25,-40r-26,40r-23,-17r30,-36r-46,-12r10,-27r43,17r-3,-47r29,0","w":153},"+":{"d":"89,-105r0,-77r28,0r0,77r77,0r0,28r-77,0r0,77r-28,0r0,-77r-76,0r0,-28r76,0"},",":{"d":"51,-53v55,15,-12,88,-26,110v-11,5,-15,0,-15,-10v21,-19,23,-49,18,-77v-2,-14,10,-23,23,-23","w":103},"-":{"d":"105,-70r-90,0r0,-31r90,0r0,31","w":120},".":{"d":"24,-23v0,-15,13,-27,27,-27v15,0,27,13,27,27v0,14,-12,27,-27,27v-14,0,-27,-12,-27,-27","w":103},"\/":{"d":"39,39r-27,0r115,-304r27,0","w":166},"0":{"d":"103,4v-54,0,-92,-53,-92,-138v0,-54,28,-122,92,-122v64,0,93,68,93,122v0,85,-39,138,-93,138xm103,-234v-13,0,-40,20,-40,104v0,73,21,112,40,112v19,0,41,-39,41,-112v0,-84,-28,-104,-41,-104"},"1":{"d":"136,-256r0,214v-5,36,59,10,41,36v-4,6,-10,6,-17,6r-103,0v-17,2,-21,-4,-13,-14v12,-13,43,0,43,-28r0,-160v1,-31,-27,-9,-45,-5v-7,2,-13,-17,-5,-19"},"2":{"d":"30,-185v-15,-52,25,-71,74,-71v44,0,82,19,82,62v0,80,-86,112,-128,158r83,0v32,-1,35,-57,55,-35v4,19,-13,42,-18,62v-2,8,-8,9,-19,9r-149,0r0,-28v45,-39,124,-88,124,-159v0,-60,-71,-40,-81,-12v-4,11,-11,26,-23,14"},"3":{"d":"27,-226v21,-40,151,-46,151,25v0,32,-33,56,-62,66v41,1,74,26,74,64v0,47,-46,75,-103,75v-31,0,-56,-9,-63,-14v-10,-17,-17,-46,7,-47v15,17,25,41,56,42v28,0,48,-20,48,-52v0,-49,-52,-53,-76,-54r0,-19v35,-5,64,-23,64,-58v0,-30,-20,-36,-31,-36v-38,0,-41,27,-51,45v-3,6,-12,-2,-14,-6r0,-31"},"4":{"d":"160,-252r0,149v13,2,41,-6,38,7r-11,23r-27,0v0,18,-3,43,9,48v17,10,44,-1,30,19v-3,6,-6,6,-13,6r-110,0v-17,2,-18,-4,-12,-14v13,-13,48,2,48,-28r0,-31v-33,-2,-75,4,-103,-3r-8,-14r120,-162r39,0xm41,-103r71,0r0,-98v-29,34,-52,68,-71,98"},"5":{"d":"70,-252r100,0v6,0,13,1,11,6r-14,31r-78,0r-13,45v77,1,111,48,111,89v1,83,-108,103,-166,68v-7,-16,-19,-37,-1,-48v27,4,25,46,67,46v28,0,52,-19,52,-52v0,-33,-30,-67,-104,-65"},"6":{"d":"172,-255v15,0,3,15,0,23v-62,1,-97,51,-106,91v51,-33,128,-8,128,63v0,50,-41,82,-89,82v-52,0,-93,-35,-92,-102v1,-63,48,-157,159,-157xm60,-86v-2,46,18,69,47,69v28,0,41,-27,41,-53v0,-71,-86,-87,-88,-16"},"7":{"d":"145,-214r-68,0v-30,1,-29,43,-42,15v4,-18,-10,-53,10,-53r144,0r0,19r-112,233r-45,0v32,-56,92,-163,113,-214"},"8":{"d":"104,-17v16,0,47,-11,47,-40v0,-32,-34,-49,-65,-62v-19,11,-33,29,-33,55v0,30,24,47,51,47xm103,4v-58,0,-94,-28,-94,-70v0,-41,33,-56,54,-68v-25,-13,-47,-32,-47,-60v0,-39,41,-62,86,-62v43,0,80,17,80,56v0,33,-34,52,-50,58v30,14,66,32,66,75v0,44,-41,71,-95,71xm102,-236v-70,9,-37,69,8,82v37,-11,50,-82,-8,-82"},"9":{"d":"35,3v-16,0,-2,-16,0,-25v47,-1,96,-48,105,-88v-47,31,-127,13,-127,-65v0,-44,34,-81,92,-81v61,0,89,44,89,92v-1,60,-44,167,-159,167xm105,-235v-32,0,-46,32,-46,58v0,36,15,58,45,58v23,0,42,-16,42,-53v0,-39,-17,-63,-41,-63"},":":{"d":"24,-23v0,-15,13,-27,27,-27v15,0,27,13,27,27v0,14,-12,27,-27,27v-14,0,-27,-12,-27,-27xm24,-151v0,-15,13,-27,27,-27v15,0,27,13,27,27v0,14,-12,27,-27,27v-14,0,-27,-12,-27,-27","w":103},";":{"d":"51,-53v54,15,-11,88,-25,110v-11,5,-16,0,-16,-10v22,-19,24,-49,18,-77v-3,-14,10,-23,23,-23xm24,-151v0,-15,13,-27,27,-27v15,0,27,13,27,27v0,14,-12,27,-27,27v-14,0,-27,-12,-27,-27","w":103},"<":{"d":"195,-24r0,27r-183,-84r0,-20r183,-84r0,27r-145,67"},"=":{"d":"194,-140r0,28r-181,0r0,-28r181,0xm194,-70r0,28r-181,0r0,-28r181,0"},">":{"d":"12,-24r144,-67r-144,-67r0,-27r183,84r0,20r-183,84r0,-27"},"?":{"d":"155,-203v0,52,-73,69,-68,125r-26,0v-11,-36,42,-94,42,-131v0,-37,-33,-51,-51,-26v-7,10,-19,22,-31,8v-8,-9,7,-20,9,-29v44,-20,125,-6,125,53xm74,-50v15,0,27,13,27,27v0,14,-12,27,-27,27v-14,0,-27,-12,-27,-27v0,-15,13,-27,27,-27","w":173},"@":{"d":"194,-188r31,0r-24,91v-3,12,-5,28,14,28v36,0,41,-44,41,-77v0,-44,-33,-92,-103,-92v-61,0,-107,42,-107,114v0,48,32,109,105,109v32,0,60,-10,78,-18r9,16v-24,10,-54,21,-86,21v-108,0,-140,-75,-140,-122v0,-81,64,-138,142,-138v104,0,127,75,127,110v0,30,-10,93,-71,93v-23,0,-36,-21,-36,-28v-19,20,-85,53,-88,-24v-3,-65,74,-116,104,-67xm165,-172v-15,0,-40,21,-40,68v0,21,8,26,19,26v12,0,38,-24,38,-74v0,-14,-8,-20,-17,-20","w":293},"A":{"d":"85,-97r75,0r-37,-97xm261,-18v8,3,3,18,-8,18r-85,0v-9,1,-4,-9,-2,-13v3,-7,24,-4,16,-26r-14,-36r-91,0r-16,41v-7,21,27,12,15,28v-10,13,-44,3,-63,6v-11,2,-14,-4,-9,-12v14,-10,25,-6,34,-29r62,-159v15,-39,-37,-24,-25,-48v16,-10,48,-1,71,-4v5,0,7,5,9,10v24,72,56,146,79,201v7,18,9,17,27,23","w":266},"B":{"d":"90,-125v4,44,-17,110,35,110v30,0,46,-22,45,-56v-1,-41,-32,-59,-80,-54xm19,-252v77,6,183,-25,190,54v2,27,-22,46,-51,59v52,6,69,43,69,67v2,83,-112,85,-178,68v-6,-2,-9,-8,-9,-19r0,-188v0,-15,-8,-20,-23,-23v-10,-1,-7,-8,-4,-14v1,-3,4,-4,6,-4xm90,-233r0,89v41,5,68,-13,68,-46v0,-43,-28,-44,-68,-43","w":246},"C":{"d":"243,-39v-7,11,-10,25,-19,34v-9,5,-37,9,-70,9v-82,0,-138,-54,-138,-132v0,-71,59,-128,137,-128v43,0,73,15,84,22v8,10,4,38,-9,40v-5,4,-17,-39,-75,-39v-54,0,-83,43,-83,102v-1,107,93,141,163,87v5,-5,13,0,10,5","w":253},"D":{"d":"91,-230r0,179v0,27,18,34,45,34v56,0,83,-50,83,-114v1,-89,-46,-104,-128,-99xm40,-23r0,-188v0,-15,-8,-20,-23,-23v-10,-1,-7,-8,-4,-14v1,-3,4,-4,6,-4r119,0v103,0,135,47,135,120v0,75,-57,136,-136,136v-46,0,-68,-2,-87,-8v-6,-2,-10,-8,-10,-19","w":293},"E":{"d":"93,-230r0,83r83,0v12,1,1,12,-1,17v-18,12,-56,2,-82,5v4,37,-16,108,27,103r29,0v45,0,34,-44,57,-22v-2,20,9,44,-17,44r-111,0v-27,0,-36,0,-36,-25r0,-186v0,-15,-7,-20,-22,-23v-10,-1,-7,-8,-4,-14v1,-3,4,-4,6,-4r157,0v18,0,9,26,9,41v-15,18,-11,-19,-42,-19r-53,0","w":219},"F":{"d":"99,-230r0,98r83,0v12,2,0,11,-2,16v-17,12,-56,2,-81,5v6,36,-18,91,23,94v8,3,4,17,-5,17r-92,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-172v0,-15,-8,-20,-23,-23v-10,-1,-7,-8,-4,-14v1,-3,4,-4,6,-4r157,0v18,-1,11,28,9,41v-15,18,-10,-19,-41,-19r-53,0","w":202,"k":{"A":11,",":36,".":36}},"G":{"d":"258,-20v4,27,-21,19,-42,20v-9,-1,-5,-11,-6,-19v-78,61,-194,-8,-194,-109v0,-71,59,-128,137,-128v43,0,73,15,84,22v8,10,4,38,-9,40v-5,4,-17,-39,-75,-39v-53,0,-83,43,-83,103v0,71,40,111,83,111v57,0,76,-55,41,-74v-12,-6,-20,-5,-12,-16v15,-10,45,-4,67,-4v8,0,9,3,9,9r0,84","w":280},"H":{"d":"115,-235v-28,4,-15,56,-18,86r106,0v-5,-34,17,-84,-23,-86v-8,-3,-4,-17,5,-17r92,0v7,-1,5,8,2,12v-7,10,-26,7,-25,27r0,174v0,15,5,18,23,22v8,3,4,17,-5,17r-91,0v-7,1,-5,-7,-3,-12v8,-10,26,-6,25,-27r0,-88r-106,0r0,88v0,15,5,18,23,22v8,3,4,17,-5,17r-92,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-174v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r92,0v8,-1,3,8,2,12v-1,4,-4,4,-7,5","w":299},"I":{"d":"46,-39r0,-174v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r91,0v7,-1,5,7,3,12v-8,10,-27,6,-26,27r0,174v0,15,6,18,24,22v7,2,3,18,-6,17r-91,0v-7,1,-5,-8,-2,-12v7,-10,26,-7,25,-27","w":142},"J":{"d":"21,51v20,-8,25,-28,25,-56r0,-208v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r91,0v7,-1,5,7,3,12v-8,10,-27,6,-26,27r0,197v0,68,-47,85,-75,85r0,-18","w":141},"K":{"d":"136,-142v45,56,83,108,115,134r0,8v-45,0,-58,3,-83,-30r-72,-94v7,39,-20,103,24,107v7,2,3,18,-6,17r-91,0v-7,1,-5,-8,-2,-12v7,-10,26,-7,25,-27r0,-174v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r91,0v7,-1,5,7,3,12v-8,10,-27,6,-26,27v1,25,-2,54,1,77r96,-116r40,0v3,29,-13,10,-40,42","w":255},"L":{"d":"96,-213r0,158v-3,44,22,36,56,37v44,1,34,-49,56,-26v-3,19,10,44,-16,44r-169,0v-7,1,-5,-8,-2,-12v7,-10,26,-7,25,-27r0,-174v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r91,0v7,-1,5,7,3,12v-8,10,-27,6,-26,27","w":215,"k":{"T":14,"V":20,"W":16,"y":9,"Y":18}},"M":{"d":"311,-211r0,172v0,15,5,18,23,22v8,3,4,17,-5,17r-92,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r-1,-144r-85,175v-5,13,-22,11,-25,-4r-81,-171r0,144v0,15,5,18,23,22v7,2,5,18,-5,17r-65,0v-7,1,-5,-7,-3,-12v8,-10,27,-6,26,-27r0,-171v-10,-15,-23,-23,-30,-24v-12,-3,-6,-17,3,-18v29,5,65,-11,77,15r81,171r88,-174v11,-24,45,-7,72,-12v8,-2,5,8,3,13v-8,11,-27,6,-27,28","w":353},"N":{"d":"10,-234v-13,-4,-5,-16,3,-18v31,3,71,-9,82,15r134,168r0,-144v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r66,0v7,-1,5,8,2,12v-7,10,-26,7,-25,27r0,201v2,18,-19,11,-33,12v-52,-57,-102,-129,-152,-190r0,151v0,15,5,18,23,22v8,3,4,17,-5,17r-66,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-174v-10,-11,-24,-18,-34,-21","w":286},"O":{"d":"154,-256v72,0,124,57,124,125v0,71,-52,135,-137,135v-64,0,-126,-47,-126,-126v0,-81,64,-134,139,-134xm147,-233v-60,0,-77,62,-77,98v0,80,34,116,78,116v54,0,76,-60,76,-107v0,-75,-37,-107,-77,-107","w":293},"P":{"d":"99,-230r0,191v0,15,5,18,23,22v8,3,4,17,-5,17r-92,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-172v0,-15,-8,-20,-23,-23v-10,-1,-7,-8,-4,-14v1,-3,4,-4,6,-4v85,3,196,-20,196,67v0,58,-54,80,-104,78v-1,-5,-11,-17,-1,-18v30,-1,51,-19,51,-55v-1,-43,-28,-54,-70,-50","w":236,"k":{"A":23,",":40,".":40}},"Q":{"d":"157,4v-84,4,-141,-48,-142,-126v0,-81,64,-134,139,-134v72,0,124,57,124,125v0,67,-43,110,-81,124v33,16,82,34,118,42r0,11v-18,3,-34,17,-53,8xm148,-19v54,0,76,-60,76,-107v0,-75,-37,-107,-77,-107v-60,0,-77,62,-77,98v0,80,34,116,78,116","w":293},"R":{"d":"99,-233r0,105v43,4,68,-8,68,-58v0,-49,-27,-48,-68,-47xm246,-12r0,12v-21,-3,-55,7,-64,-9r-56,-100r-27,0v6,35,-18,89,23,92v8,3,4,17,-5,17r-92,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-172v0,-15,-8,-20,-23,-23v-10,-1,-7,-8,-4,-14v1,-3,4,-4,6,-4v82,6,193,-27,193,62v0,29,-16,58,-50,73v32,56,62,97,76,105","w":255,"k":{"T":9,"V":7,"W":5,"Y":9}},"S":{"d":"106,-256v41,-1,70,10,57,51v-21,27,-25,-45,-58,-34v-14,0,-32,10,-35,28v-4,26,14,39,44,59v39,26,64,47,65,80v2,53,-44,76,-94,76v-29,-1,-71,-2,-70,-22v1,-21,-8,-48,13,-50v7,6,24,60,52,51v27,0,46,-17,47,-42v1,-62,-108,-63,-108,-134v0,-33,30,-63,87,-63","w":193},"T":{"d":"144,-227r0,188v0,15,5,18,23,22v8,3,4,17,-5,17r-91,0v-7,1,-5,-7,-3,-12v8,-10,26,-6,25,-27r0,-188r-83,0v-5,0,-10,-1,-5,-7v5,-7,7,-19,20,-18r203,0v5,0,10,2,5,8v-6,28,-56,14,-89,17","w":237,"k":{"w":23,"y":23,"A":25,",":33,".":33,"a":36,"c":34,"e":34,"i":9,"o":34,"r":25,"s":25,"u":25,":":26,"-":26,";":26}},"U":{"d":"91,-213v6,79,-28,184,57,191v76,6,57,-115,59,-191v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r67,0v7,-1,5,8,2,12v-7,10,-26,7,-25,27r0,116v0,82,-51,101,-90,101v-129,-1,-98,-107,-102,-217v0,-15,-5,-18,-23,-22v-8,-3,-4,-17,5,-17r91,0v7,-1,5,7,3,12v-8,10,-28,6,-26,27","w":273},"V":{"d":"9,-235v-7,-1,-5,-8,-2,-13v22,-11,65,-1,95,-4v9,-1,4,9,2,13v-4,9,-23,6,-15,27r54,152r63,-153v10,-30,-31,-17,-15,-34v10,-11,40,-2,58,-5v10,-2,14,3,9,11v-12,9,-29,18,-32,37r-77,190v-1,19,-40,23,-42,0r-72,-197v-6,-17,-9,-20,-26,-24","w":259,"k":{"y":9,"A":40,",":41,".":41,"a":34,"e":32,"i":7,"o":32,"r":20,"u":20,":":16,"-":20,";":16}},"W":{"d":"213,-252v27,57,39,131,64,190r45,-151v11,-25,-26,-19,-14,-35v12,-10,43,-1,63,-4v10,-2,8,7,5,13v-12,9,-24,8,-30,28r-59,197v-1,21,-44,20,-50,0r-51,-162r-53,162v-2,21,-42,20,-48,0r-58,-197v-2,-27,-30,-16,-22,-38v21,-8,57,0,84,-3v8,-1,4,9,2,13v-3,9,-20,6,-14,27r47,152r60,-178v3,-19,12,-13,29,-14","w":380,"k":{"y":5,"A":38,",":34,".":34,"a":29,"e":27,"i":9,"o":27,"r":13,"u":13,":":9,"-":11,";":9}},"X":{"d":"234,-252v8,0,4,8,2,12v-35,20,-55,64,-81,95r69,103v10,15,16,22,31,22v16,0,9,9,5,16v-1,3,-4,4,-9,4r-97,0v-8,2,-5,-8,-3,-13v4,-5,27,-7,18,-20r-48,-76r-54,78v-14,20,29,12,4,31r-59,0v-10,2,-6,-9,-4,-14v11,-7,28,-8,34,-22r66,-93r-56,-82v-14,-20,-19,-21,-27,-22v-11,-2,-7,-10,-3,-16v27,-8,71,0,104,-3v8,-1,3,7,2,11v-3,9,-32,7,-20,25r34,52r41,-53v13,-19,-36,-16,-11,-35r62,0","w":266},"Y":{"d":"127,-121r52,-94v15,-23,-32,-19,-8,-37r60,0v8,-1,3,8,2,12v-12,12,-21,5,-32,29v-24,53,-61,87,-61,172v0,15,5,18,23,22v8,3,4,17,-5,17r-91,0v-7,1,-5,-7,-3,-12v8,-10,26,-6,25,-27r0,-58r-56,-114v-9,-29,-31,-15,-24,-38v22,-8,60,0,88,-3v15,15,-23,16,-13,40","w":240,"k":{"v":20,"A":32,",":38,".":38,"a":32,"e":31,"i":9,"o":31,"u":23,":":20,"-":29,";":20,"p":23,"q":31}},"Z":{"d":"209,-252r0,13r-138,217r96,0v41,0,29,-50,51,-25v-3,19,10,47,-16,47r-185,0r-8,-14r139,-217r-75,0v-31,2,-28,59,-43,24v2,-17,-7,-44,11,-45r168,0","w":226},"[":{"d":"27,-265r89,0r0,16v-24,0,-57,-4,-52,20r0,260v-4,27,26,23,52,23r0,15r-89,0r0,-334","w":126},"\\":{"d":"174,39r-27,0r-115,-304r27,0"},"]":{"d":"100,69r-89,0r0,-15v23,0,56,4,51,-20r0,-260v4,-27,-26,-23,-51,-23r0,-16r89,0r0,334","w":126},"^":{"d":"50,-121r-28,0r66,-131r31,0r66,131r-28,0r-54,-106"},"_":{"d":"180,45r-180,0r0,-18r180,0r0,18","w":180},"a":{"d":"119,-184v41,0,78,-3,78,40r0,104v-4,27,31,15,20,37v-13,7,-39,2,-58,3v-18,1,-6,-29,-11,-42v-12,27,-40,46,-67,46v-43,0,-69,-40,-69,-83v0,-57,44,-105,107,-105xm114,-166v-60,0,-71,140,-16,140v21,0,51,-32,51,-83v0,-31,-5,-57,-35,-57","w":226},"b":{"d":"121,-156v-31,0,-46,41,-46,85v0,35,7,57,34,57v34,0,53,-40,53,-77v0,-30,-12,-65,-41,-65xm105,4v-38,0,-77,2,-77,-40r0,-190v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v15,-8,42,-1,62,-3v7,0,10,5,10,12r0,106v14,-23,41,-37,68,-37v43,0,69,40,69,83v0,60,-45,105,-108,105","w":224},"c":{"d":"115,-184v24,1,53,-1,56,16v-1,15,4,34,-10,37v-9,-5,-20,-39,-45,-34v-33,0,-54,33,-54,73v0,62,66,95,102,50v4,-3,14,1,11,7v-7,11,-10,24,-19,32v-70,26,-144,-22,-144,-87v0,-55,40,-94,103,-94","w":184},"d":{"d":"159,0v-15,1,-9,-21,-10,-35v-11,21,-36,39,-63,39v-41,0,-74,-36,-74,-86v-1,-63,62,-118,137,-98v-3,-30,12,-66,-22,-68v-9,-1,-5,-9,-2,-14v14,-8,42,-1,62,-3v7,0,10,5,10,12r0,213v-4,26,32,15,21,37v-14,8,-40,2,-59,3xm115,-166v-61,0,-72,140,-14,140v26,0,48,-23,48,-78v0,-39,-6,-62,-34,-62","w":224},"e":{"d":"169,-89r-107,0v0,35,18,68,54,68v21,0,33,-8,46,-21v4,-4,14,1,11,7v-7,11,-10,24,-19,32v-69,26,-142,-22,-142,-85v0,-60,39,-96,92,-96v49,0,73,33,73,81v0,6,-3,14,-8,14xm62,-108v25,-4,72,13,73,-16v0,-32,-17,-43,-32,-43v-26,0,-41,29,-41,59","w":189},"f":{"d":"37,-180v-5,-57,37,-78,81,-85v24,-4,28,18,37,30v-10,32,-40,-5,-58,-5v-20,0,-10,40,-12,60r50,0v6,28,-27,20,-50,21r0,120v0,15,5,18,23,22v8,3,4,17,-5,17r-88,0v-7,1,-5,-7,-3,-12v8,-10,26,-6,25,-27r0,-120r-24,0r0,-21r24,0","w":133},"g":{"d":"122,-184v40,0,77,-3,77,40r0,125v0,70,-34,109,-101,109v-38,0,-55,-8,-71,-15v-16,-7,-4,-20,1,-29v14,-25,18,18,68,18v48,0,63,-51,55,-106v-12,27,-40,46,-67,46v-43,0,-70,-40,-70,-83v0,-57,45,-105,108,-105xm117,-166v-59,0,-71,140,-17,140v21,0,52,-32,52,-83v0,-31,-5,-57,-35,-57","w":219},"h":{"d":"15,-248v-9,-1,-5,-9,-2,-14v15,-8,43,-1,63,-3v4,0,9,0,9,8r1,112v33,-51,123,-62,122,22r0,84v0,15,5,18,23,22v8,3,4,17,-5,17r-87,0v-7,1,-4,-8,-2,-12v8,-10,23,-7,23,-27v-1,-40,8,-122,-28,-114v-29,-6,-47,48,-47,114v0,15,5,18,21,22v7,3,3,17,-5,17r-87,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-187v0,-15,-5,-18,-22,-22","w":244},"i":{"d":"37,-39r0,-102v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v18,-8,49,-1,72,-3r0,141v0,15,5,18,23,22v8,3,4,17,-5,17r-89,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27xm35,-233v0,-15,12,-26,26,-26v14,0,27,12,27,26v0,14,-12,27,-26,27v-15,0,-27,-12,-27,-27","w":122},"j":{"d":"10,72v21,-10,25,-28,25,-62r0,-151v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v18,-8,49,-1,72,-3r0,193v0,60,-47,77,-73,77r0,-18xm32,-233v0,-15,13,-26,27,-26v14,0,27,12,27,26v0,14,-13,27,-27,27v-15,0,-27,-12,-27,-27","w":112},"k":{"d":"128,-112v31,37,54,79,91,100r0,12r-61,0r-73,-99v5,32,-15,79,21,82v7,3,3,17,-5,17r-87,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-187v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v15,-8,43,-1,63,-3v4,0,9,0,9,8r0,146v28,-24,51,-47,68,-69v17,3,51,-9,50,11v0,10,-26,9,-41,24","w":225},"l":{"d":"15,-248v-9,-1,-5,-9,-2,-14v15,-8,43,-1,63,-3v6,0,9,2,9,9r0,217v0,15,5,18,23,22v8,3,4,17,-5,17r-89,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-187v0,-15,-5,-18,-22,-22","w":122},"m":{"d":"77,-180v14,-3,5,24,9,33v27,-48,105,-49,117,-3v29,-45,118,-52,118,23r0,88v0,15,5,18,23,22v8,3,4,17,-5,17r-87,0v-8,1,-3,-8,-2,-12v8,-10,25,-7,23,-27v-4,-42,16,-108,-27,-114v-26,-4,-43,53,-43,114v0,15,5,18,21,22v9,3,3,17,-5,17r-85,0v-8,1,-3,-8,-2,-12v8,-10,25,-7,23,-27v-4,-42,16,-108,-27,-114v-26,-4,-43,53,-43,114v0,15,5,18,21,22v7,3,3,17,-5,17r-87,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-102v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v15,-8,44,1,64,-3","w":358},"n":{"d":"76,-180v15,-3,6,25,10,35v33,-51,123,-62,122,22r0,84v0,15,5,18,23,22v8,3,4,17,-5,17r-87,0v-7,1,-4,-8,-2,-12v8,-10,23,-7,23,-27v-1,-40,8,-122,-28,-114v-29,-6,-47,48,-47,114v0,15,5,18,21,22v7,3,3,17,-5,17r-87,0v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-102v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v15,-8,43,1,63,-3","w":244},"o":{"d":"112,-184v58,0,92,44,92,90v0,51,-39,98,-101,98v-59,0,-91,-47,-91,-90v0,-57,42,-98,100,-98xm109,-15v36,0,44,-39,44,-73v0,-47,-19,-77,-45,-77v-31,0,-46,34,-46,66v0,55,24,84,47,84","w":215},"p":{"d":"127,-156v-31,0,-46,41,-46,85v0,31,6,57,35,57v35,0,52,-40,52,-77v0,-30,-12,-65,-41,-65xm81,0v4,36,-15,71,30,73v12,0,5,9,2,14v-27,8,-70,1,-103,3v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-192v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v15,-8,43,-1,63,-3v16,-1,5,23,10,33v14,-23,40,-37,67,-37v43,0,70,40,70,83v0,69,-63,120,-138,101","w":230},"q":{"d":"118,-184v42,0,79,-2,79,40r0,195v0,15,5,18,23,22v8,3,4,17,-5,17r-96,0v-9,1,-6,-7,-3,-12v10,-10,34,-6,33,-27r-1,-86v-11,21,-36,39,-63,39v-41,0,-73,-36,-73,-86v0,-54,44,-102,106,-102xm114,-166v-60,0,-71,140,-14,140v25,0,49,-27,49,-78v0,-39,-7,-62,-35,-62","w":217},"r":{"d":"77,-180v14,-3,5,23,9,32v18,-26,44,-48,66,-28v1,10,8,21,6,31v-12,10,-17,18,-35,6v-53,-12,-38,53,-38,100v0,15,7,18,30,22v11,2,5,9,2,14v-27,8,-70,1,-103,3v-8,1,-3,-8,-2,-12v8,-10,26,-6,25,-27r0,-102v0,-15,-5,-18,-22,-22v-9,-1,-5,-9,-2,-14v15,-8,44,1,64,-3","w":158,"k":{"v":-9,"w":-9,"y":-9,",":22,".":22,"f":-4,"m":-4,"n":-4,"x":-9}},"s":{"d":"143,-49v0,61,-98,66,-132,35v3,-16,-8,-43,9,-46v7,9,18,53,45,47v19,0,31,-12,31,-27v-8,-39,-83,-49,-83,-96v0,-25,21,-48,69,-48v21,0,47,-2,51,14v-1,14,4,31,-8,35v-8,-3,-18,-39,-42,-32v-43,12,-14,35,16,57v36,26,44,40,44,61","w":153},"t":{"d":"137,-180v1,11,-2,17,-7,21r-48,0r0,105v-2,34,23,38,47,32v13,19,-18,25,-35,26v-81,5,-55,-93,-59,-163r-31,0r0,-21r31,0r0,-36v13,-5,32,-25,47,-16r0,52r55,0","w":139},"u":{"d":"112,-26v39,-4,46,-62,42,-115v0,-12,-4,-18,-20,-22v-9,-1,-5,-9,-2,-14v14,-8,42,-1,62,-3v4,0,8,1,8,10r0,133v-2,31,41,10,27,34v-14,8,-45,1,-66,3v-12,4,-9,-16,-9,-27v-33,37,-123,52,-119,-30v-7,-38,19,-101,-22,-106v-9,-1,-4,-9,-1,-14v15,-8,43,-1,63,-3v4,0,8,1,8,10v4,47,-14,148,29,144","w":240},"v":{"d":"114,-5v-1,8,-26,9,-28,-1r-60,-133v-7,-28,-28,-14,-21,-37v20,-10,59,-1,86,-4v10,-1,5,8,3,13v-3,7,-26,6,-18,26r36,86r43,-90v9,-23,-45,-14,-17,-35r56,0v10,-1,12,4,9,13v-7,10,-17,12,-25,28","w":207,"k":{",":29,".":29}},"w":{"d":"102,-6v-1,9,-25,9,-28,0r-49,-133v-6,-26,-28,-15,-20,-37v20,-10,58,-1,85,-4v13,-1,10,7,6,13v-4,7,-30,3,-22,25r27,78r46,-110v2,-7,25,-9,28,0r43,114r31,-89v6,-22,-49,-9,-15,-31r57,0v11,-2,9,7,5,13v-5,8,-17,8,-24,28r-47,133v-1,9,-24,10,-28,0r-44,-119","w":300,"k":{",":29,".":29}},"x":{"d":"220,-15v-3,6,-4,16,-13,15r-76,0v-10,1,-7,-5,-6,-12v2,-6,21,-4,12,-16r-35,-45r-35,42v-15,19,30,11,14,26v-11,11,-47,2,-67,5v-12,1,-6,-7,-5,-12v34,-14,55,-51,79,-77r-57,-67v-9,-5,-20,-9,-12,-20v19,-10,54,-1,79,-4v14,-1,10,5,7,12v-2,6,-21,7,-11,20r25,31r30,-34v15,-20,-34,-10,-5,-29r52,0v11,-3,12,3,8,12v-8,9,-24,8,-33,23r-39,43v23,25,43,60,69,80v6,3,22,0,19,7","w":226},"y":{"d":"81,64v-4,29,-56,39,-62,10v-2,-9,16,-7,23,-12v18,-3,34,-46,43,-66r-59,-135v-7,-27,-29,-14,-21,-37v20,-10,59,-1,86,-4v10,-1,5,8,3,13v-3,7,-26,6,-18,26r36,88r42,-92v9,-23,-44,-14,-16,-35r56,0v11,-2,12,5,8,13v-7,10,-20,10,-24,28","k":{",":29,".":29}},"z":{"d":"43,-180r128,0r0,17r-102,142r56,0v41,0,29,-41,51,-20v-2,19,9,41,-17,41r-142,0r-6,-13r111,-148r-46,0v-31,2,-28,45,-44,19v2,-16,-7,-38,11,-38","w":186},"{":{"d":"57,-96v43,12,29,70,29,119v0,28,9,43,30,49v-77,12,-65,-56,-65,-122v0,-27,-5,-37,-27,-46v42,-9,27,-69,27,-114v0,-46,23,-57,65,-54v-44,8,-30,71,-30,118v0,28,-4,43,-29,50","w":126},"|":{"d":"46,90r0,-360r28,0r0,360r-28,0","w":119},"}":{"d":"11,72v65,-11,-6,-147,59,-168v-66,-12,9,-146,-59,-169v45,0,65,8,65,55v0,46,-13,104,27,115v-43,8,-27,64,-27,108v0,49,-15,60,-65,59","w":126},"~":{"d":"67,-116v35,0,88,44,105,0r18,12v-13,20,-25,36,-47,36v-27,0,-46,-22,-75,-22v-19,0,-27,15,-33,24r-19,-13v13,-22,27,-37,51,-37"},"'":{"d":"56,-235r-10,73v0,3,1,11,-6,11v-6,0,-7,-8,-7,-11r-10,-73v-1,-9,-1,-30,17,-30v19,0,17,21,16,30","w":79},"`":{"d":"23,-275v29,7,47,38,68,55v1,7,-2,10,-12,10v-22,-15,-60,-25,-71,-49v0,-10,7,-16,15,-16","w":133},"\u00a0":{"w":103}}}); Cufon.replace('h1, h2, h3, h4, h5, ul#navmenu a.menu-lvl1'); Cufon.replace('div#pagetitle h2', { textShadow: '#000 1px 1px' }); Cufon.replace('ul#navmenu a.menu-lvl1', { textShadow: '#272727 1px 1px' }); Cufon.replace('div.latest h4', { textShadow: '#000 1px 1px' });