/*
 * $Id: JS-Utils.js 30 2009-09-15 20:35:45Z terence $
 *
 * Copyright (c) 2008 Terence Honles (terence.honles.com)
 * see: terence.honles.com/js/ for usage and src
 */
function $JSUtils(p){var s;var U=window;var h=U.document;var ab=Array.prototype.slice;var L=Math.abs;var E=Math.max;var ad=Math.min;var K=Math.pow;function af(ag){this.message=ag}af.prototype=t(new Error(),{name:"UnsupportedBrowserError"});function y(ag){this.message="Could not import file at uri: ("+ag+")";this.uri=ag}y.prototype=t(new Error(),{name:"ImportError"});var e={Backspace:8,Tab:9,Enter:13,Escape:27,Space:32,Left:37,Right:39,Up:38,Down:40};var z="Handler must be or contain a callback function";function I(ah){if(!ah){throw TypeError(z)}var ag=function(){return ag.callback.apply(ag.scope,arguments)};if(ah.callback){ag.scope=ah.scope;ag.callback=ah.callback}else{if(ah[1]){ag.scope=ah[0];ag.callback=ah[1]}else{ag.callback=ah}}if(typeof ag.callback!="function"){throw TypeError(z)}if(!ag.scope){ag.scope=U}t(ag,I.prototype,{destroy:function(){ag=null}});return ag}I.prototype={equals:function(ag){return(this.callback==ag.callback)&&(this.scope==ag.scope)},apply:function(ai,ah){var ag=arguments.length;if(ag==1){return this.callback.apply(this.scope,ai)}else{if(ag==2){return this.callback.apply(this.scope,ah)}else{throw new TypeError("Wrong number of arguments for apply")}}}};function m(ag,ah){if(!ag||typeof(ag)!="object"){throw new TypeError("Flags must be a flag object")}this.init=function(){this.event={};this.fireOnce=ah;for(var aj in ag){var ai=ag[aj];this.event[ai]={name:aj,handlers:[],fired:false}}this.init=null}}m.prototype={addEventListener:function(aj,ah){var ag=s;for(var ai in this.event){if(aj&ai){ai=this.event[ai];ag=I(ah);ai.handlers.push(ag);if(this.fireOnce&&ai.fired){ag.apply(ai.cache)}}}return ag},removeEventListener:function(ak,ai){var al=false;ai=I(ai);for(var aj in this.event){if(ak&aj){var ag=this.event[aj].handlers;for(var ah in ag){if(ag[ah].equals(_handler)){al=true;ag.splice(ah,1)[0].destroy();break}}}}ai.destroy();return al},dispatchEvent:function(ah){if(!(ah in this.event)){throw new TypeError("Event not supported!")}var ai=this.event[ah];ai.fired=true;ai.cache=ab.call(arguments,1);for(var ag in ai.handlers){ai.handlers[ag].apply(ai.cache)}return this},destroy:function(){for(var ah in this.event){for(var ag in this.event[ah].handlers){this.event[ah].handlers[ag].destroy()}}}};function C(ak,ai){if(!C.div){C.div=h.createElement("div")}C.div.innerHTML=ak;var aj=ab.call(C.div.childNodes,0);for(var ah in ai){if(ah.slice(0,2)=="on"){for(var ag in aj){A(aj[ag],ah,ai[ah])}}}return aj}function A(ah,ai,aj,ag){if(ah.attachEvent){ah.attachEvent(ai,aj)}else{ah.addEventListener(ai.slice(2),aj,ag)}}function Q(aj){try{var al=aj.split(".")}catch(ak){}if(!al||al.length<1){throw new TypeError("Namespace must be a string of length greater than one")}var ai=U;for(var ah in al){var ag=al[ah];if(!ai[ag]){ai[ag]={}}ai=ai[ag]}return ai}function t(aj){if(typeof aj=="string"){aj=Q(aj)}var ah=ab.call(arguments,1);for(var ai in ah){for(var ag in ah[ai]){aj[ag]=ah[ai][ag]}}return aj}var Y={Success:1,Failure:2};var d={};var X={};function g(ag,ai,ah){if(arguments.length==1){if(!(ai in X)){h.body.appendChild(C('<script type="text/javascript" language="javascript" src="'+ag+'"><\/script>')[0]);X[ai]=true}}else{return new k(ag,ai,ah)}}function k(aj,am,al){var ag=null;if(typeof aj=="string"){aj=Q(aj)}if(am in d){ag=d[am];var ai=false;for(var ah in ag.namespaces){if(ag.namespaces[ah]==aj){ai=true}}if(!ai){ag.namespaces.push(aj);if(ag.request.loaded){ag.include(aj)}}}else{ag=d[am]=this;ag.init();ag.namespaces=[aj];ag.load(am)}if(al){for(var ak in Y){var an=al["On"+ak];if(an){ag.addEventListener(Y[ak],an)}}}return ag}k.prototype=t(new m(Y,true),{load:function(ag){this.uri=ag;if(this.requestor){this.requestor.destroy()}this.requestor=new v(ag,"get","",{OnSuccess:[this,function(ai){try{this.imported=eval(ai.responseText)||{}}catch(aj){this.imported={}}for(var ah in this.namespaces){this.include(this.namespaces[ah])}this.dispatchEvent(Y.Success,ag,this.namespaces)}],OnFailure:[this,function(){this.dispatchEvent(Y.Failure,ag)}]});this.request=this.requestor.requests[0]},reload:function(){this.load(this.uri)},include:function(ag){var ah=this.imported;if(typeof ah.__import__=="function"){ah.__import__(ag)}else{t(ag,ah)}},destroy:function(){if(this.requestor){this.requestor.destroy()}m.prototype.destroy.call(this)}});function N(){var ah=s;for(var ag in arguments){ah=arguments[ag];if(ah){return ah}}return ah}function B(){var ah=s;for(var ag in arguments){ah=arguments[ag];if(!ah){return ah}}return ah}function J(ak){var ai=[];var aj=null;if(ak===null){aj=I([{},function(){return ab.call(arguments,0)}])}else{aj=I(ak)}var ag=ab.call(arguments,1);var am=ag.length;if(!am){throw new TypeError("Map must be called with at least 2 arguments")}if(am==1){am=ag[0].length;var al=ag[0];for(var ah=0;ah<am;ah++){ai.push(aj(al[ah]))}}else{am=E.apply({},J(j,ag));for(var ah=0;ah<am;ah++){ai.push(aj.apply(J([{},P(ah)],ag)))}}aj.destroy();return ai}function j(ag){return ag.length}function P(ag){return function(ah){return ah[ag]}}function S(ah){var ag=ab.call(arguments,1);return J(ah,ag)}function O(ak){var ai=[];var aj=null;if(ak===null){aj=I([{},function(ao){return ao||false}])}else{aj=I(ak)}var ag=ab.call(arguments,1);var an=ag.length;if(!an){throw new TypeError("Filter must be called with at least 2 arguments")}if(an==1){an=ag[0].length;var am=ag[0];for(var ah=0;ah<an;ah++){var al=am[ah];if(aj(al)){ai.push(al)}}}else{an=E.apply({},J(j,ag));for(var ah=0;ah<an;ah++){var al=J([{},P(ah)],ag);if(aj.apply(al)){ai.push(al)}}}aj.destroy();return ai}function a(){var ag=ab.call(arguments,1);return O(arguments[0],ag)}var G="Reduce sequence must be at least length 1";function w(ak){var ag=null;var aj=I(ak);var ah=ab.call(arguments,1);var am=ah.length;if(!am){throw new TypeError("Reduce must be called with at least 2 arguments")}if(am==1){am=ah[0].length;var al=ah[0];if(!am){throw new TypeError(G)}ag=al[0];for(var ai=1;ai<am;ai++){ag=aj(ag,al[ai])}}else{am=E.apply({},J(j,ah));if(!am){throw new TypeError(G)}ag=J([{},P(0)],ah);for(var ai=1;ai<am;ai++){ag=aj(ag,J([{},P(ai)],ah))}}aj.destroy();return ag}function q(ak,ah,aj){var ai=arguments.length;if(!ai){throw new TypeError("Range requires at least one argument")}else{if(ai==1){ah=ak;ak=0}}if(!aj){aj=1}var ag=[];for(;ak<ah;ak+=aj){ag.push(ak)}return ag}function x(){return w([{},c],[0].concat(ab.call(arguments,0)))}function c(ah,ag){return ah+ag}function M(ag){ag.abs=L;ag.any=N;ag.all=B;ag.filter=O;ag.filterAll=a;ag.map=J;ag.mapAll=S;ag.max=E;ag.min=ad;ag.pow=K;ag.range=q;ag.reduce=w;ag.sum=x;ag.namespace={define:Q,extend:t,ImportEvent:Y,include:g};ag.exposeUtils=M}var ae={XMLHttpRequest:1,MSXML2:2,XMLHTTP:4,None:8};var D={1:function(){return new XMLHttpRequest()},2:function(){return new ActiveXObject("Msxml2.XMLHTTP")},4:function(){return new ActiveXObject("Microsoft.XMLHTTP")},8:function(){throw new af("Your browser does not support AJAX!")}};var o=[ae.XMLHttpRequest,ae.MSXML2,ae.XMLHTTP,ae.None];var V={Open:1,Sending:2,Receiving:4,Loaded:8,Success:16,Failure:32,FailureClient:64,FailureServer:128};var W={Uninitialized:0,Open:1,Sent:2,Receiving:3,Loaded:4};var ac={GET:0,POST:1};function F(ag,ah){switch(ah.readyState){case W.Open:ag.dispatchEvent(V.Open,ah);break;case W.Sent:ag.dispatchEvent(V.Sending,ah);break;case W.Receiving:ag.dispatchEvent(V.Receiving,ah);break;case W.Loaded:ag.dispatchEvent(V.Loaded,ah);if((ah.status>=200&&ah.status<400)||ah.status==0){ag.dispatchEvent(V.Success,ah)}else{if(ah.status>=400&&ah.status<600){ag.dispatchEvent(V.Failure,ah);if(ah.status<500){ag.dispatchEvent(V.FailureClient,ah)}else{ag.dispatchEvent(V.FailureServer,ah)}}}}}function v(ag,aj,ai,ah){this.init();this.requests=[this.createRequestObject(ag,aj,ai)];if(!ah){ah={}}this.async=ah.async!=false;if(ah.OnOpen){this.addEventListener(V.Open,ah.OnOpen)}if(ah.OnSend){this.addEventListener(V.Sending,ah.OnSend)}if(ah.OnReceive){this.addEventListener(V.Receiving,ah.OnReceive)}if(ah.OnLoad){this.addEventListener(V.Loaded,ah.OnLoad)}if(ah.OnSuccess){this.addEventListener(V.Success,ah.OnSuccess)}if(ah.OnFailure){this.addEventListener(V.Failure,ah.OnFailure)}if(ah.OnFailureClient){this.addEventListener(V.FailureClient,ah.OnFailureClient)}if(ah.OnFailureServer){this.addEventListener(V.FailureServer,ah.OnFailureServer)}if(ah.send!==false){this.sendRequests()}return this}v.prototype=t(new m(V),{addRequest:function(ag,ai,ah){return this.requests.push(this.createRequestObject(ag,ai,ah))},addAndSendRequest:function(ag,ai,ah){this.sendRequest(this.addRequest(ag,ai,ah))},createRequestObject:function(ag,am,ak){if(arguments.length<2){throw new TypeError("url and method are required parameters!")}var aj={opened:false,sent:false,loaded:false,url:ag};aj.content=ak?ak:"";if(am.toLowerCase()=="post"){aj.method=ac.POST}else{aj.method=ac.GET}if(!v.AJAXType){for(var ah in o){try{v.AJAXType=o[ah];aj.request=D[v.AJAXType]();break}catch(al){if(v.AJAXType==ae.None){throw al}}}}else{aj.request=D[v.AJAXType]()}var ai=this;aj.request.onreadystatechange=function(){if(aj.request.readyState==W.Loaded){aj.loaded=true;aj.request.onreadystatechange=s}F(ai,aj.request)};return aj},openRequest:function(ah){if(ah>=this.requests.length){return}var ag=this.requests[ah];if(!ag.opened){try{ag.opened=true;var aj=ag.method==ac.POST?"POST":"GET";ag.request.open(aj,ag.url,this.async)}catch(ai){ag.opened=false;throw ai}}},sendRequests:function(){for(var ag in this.requests){this.sendRequest(ag)}},sendRequest:function(ah){if(!(ah in this.requests)){return}var ag=this.requests[ah];if(!ag.opened){this.openRequest(ah)}if(!ag.sent){if(this.method==ac.POST){ag.request.setRequestHeader("Content-type","application/x-www-form-urlencoded")}try{ag.sent=true;ag.request.send(ag.content)}catch(ai){ag.sent=false;throw ai}}},clearFinishedRequests:function(){var ai=this.requests;this.requests=[];for(var ag in ai){var ah=ai[ag];if(!ah.loaded){this.requests.push(ah)}}},destroy:function(){m.prototype.destroy.call(this)}});var n={};var aa=0;function f(ah,aj,ag){if(!ah){ah="filter"+aa++}var ai=n[ah];if(!ai){ai=n[ah]=this}if(!ai.delay&&(!ag||isNaN(ag))){ai.delay=300}else{if(ag){ai.delay=Number(ag)}}ai.name=ah;if(aj){ai.func=I(aj)}return ai}f.Expose=function(ag){ag.CallFilter=f};f.prototype={setDelay:function(ag){if(!isNaN(ag)){this.delay=Number(ag)}return this},setFn:function(ag){if(ag){if(this.func){this.func.destroy()}this.func=I(ag)}return this},tryCall:function(){if(this.timer!==null&&this.timer!==s){clearTimeout(this.timer)}if(!this.func){throw new ReferenceError("Call function is not set! Use: <obj>.setFn")}var ag=this;var ah=arguments;this.timer=setTimeout(function(){ag.func.apply(ah)},this.delay);return this},destroy:function(){if(this.timer!==null&&this.timer!==s){clearTimeout(this.timer)}if(this.func){this.func.destroy()}}};var T=[];var l={};function R(ai,ak){if(ai.constructor==String||typeof ai=="string"){ai=h.getElementById(ai)}if(!ai){throw TypeError("Offset object must be either an HTML element or a string specifying ones id")}var aj=ai.id;if(!ak){var ag=null;if(aj&&(ag=l[aj])){return ag}for(var ah in T){ag=T[ah];if(ai==ag.offsetParent){return ag}}}this.offsetParent=ai;this.enableCache=ak!=true;this.$={};if(!ak){if(aj){l[aj]=this}else{T.push(this)}}return this}R.Expose=function(ag){ag.AbsoluteAsRelative=R};R.prototype={offsetTop:function(){if(this.enableCache&&this.$.offsetTop){return this.$.offsetTop}var ag=this.offsetParent;var ah=0;while(ag!=null){ah+=ag.offsetTop;ag=ag.offsetParent}return this.$.offsetTop=ah},offsetLeft:function(){if(this.enableCache&&this.$.offsetLeft){return this.$.offsetLeft}var ag=this.offsetParent;var ah=0;while(ag!=null){ah+=ag.offsetLeft;ag=ag.offsetParent}return this.$.offsetLeft=ah},offsetHeight:function(){return this.offsetTop()+this.offsetParent.offsetHeight},offsetWidth:function(){return this.offsetLeft()+this.offsetParent.offsetWidth},clear:function(){this.$={};return this}};var H=[];var Z={Initialize:1,Show:2,Hide:4};function i(ag,aj){if(!ag||!ag.appendChild){throw new TypeError("You should be able to append the modal object to the destination")}this.init();this.visible=false;this.id=H.length;this.container=C('<div id="modal'+this.id+'" class="modal-container" style="display:none;"><div class="modal-mask"></div><div class="modal-page"><div class="modal-dialog-outer"><div class="modal-dialog-inner"></div></div></div></div>')[0];ag.appendChild(this.container);this.mask=this.container.firstChild;this.page=this.container.lastChild;this.dialog=this.page.firstChild;this.inner=this.dialog.firstChild;var ah=this;this.closeButton=C('<a class="modal-close">close</a>',{onclick:function(){ah.hide()}})[0];this.paddingTop=250;if(aj){this.closeButton=aj.closeButton||this.closeButton;this.paddingTop=aj.paddingTop||this.paddingTop;for(var ai in Z){var ak=aj["On"+ai];if(ak){this.addEventListener(Z[ai],ak)}}}this.content=C('<div class="modal-contents"></div>')[0];this.inner.appendChild(this.closeButton);this.inner.appendChild(this.content);H.push(this);return this}i.Expose=function(ag){ag.Modal=i;ag.ModalEvent=Z};i.Get=function(ag){return H[ag]};i.Hide=function(ag){return H[ag].hide()};i.Show=function(ag){return H[ag].show()};i.prototype=t(new m(Z),{hide:function(){if(this.visible){this.container.style.display="none";this.visible=false;this.dispatchEvent(Z.Hide,this)}return this},show:function(){if(!this.visible){this.container.style.display="";this.visible=true;this.dispatchEvent(Z.Show,this)}return this},setContent:function(ag){this.content.innerHTML="";this.content.appendChild(ag);return this},resize:function(){var ah=(U.innerHeight||h.body.clientHeight||h.documentElement.clientHeight||0);var ag=(U.scrollMaxY||h.body.scrollHeight||h.body.offsetHeight||0);this.container.style.height=(ah+ag)+"px";return this},reposition:function(){var ag=(U.scrollY||h.body.scrollTop||h.documentElement.scrollTop||0);this.dialog.style.marginTop=(ag+this.paddingTop)+"px";return this},destroy:function(){m.prototype.destroy.call(this)}});var r={Initialize:1,Position:2,KeyPress:4,NextItem:8,PreviousItem:16,Show:32,Hide:64,Select:128,Cancel:256};function u(ag,ai){this.init();this.container=ag;this.selected=null;if(!ai){ai={}}this.nextKeys=ai.nextKeys||u.NextKeys;this.previousKeys=ai.previousKeys||u.PreviousKeys;this.selectKeys=ai.selectKeys||u.SelectKeys;this.cancelKeys=ai.cancelKeys||u.CancelKeys;this.selectedColor=ai.selectedColor||u.SelectedColor;this.onKeyDown=I([this,u.prototype.onKeyDown]);this.onKeyUp=I([this,u.prototype.onKeyUp]);for(var ah in r){var aj=ai["On"+ah];if(aj){this.addEventListener(r[ah],aj)}}this.dispatchEvent(r.Initialize,this.container);return this}u.NextKeys=[e.Down,e.Right];u.PreviousKeys=[e.Up,e.Left];u.SelectKeys=[e.Tab,e.Enter,e.Space];u.CancelKeys=[e.Escape];u.SelectedColor="#BBDDFF";u.Expose=function(ag){ag.DropDown=u;ag.DropDownEvent=r};u.prototype=t(new m(r),{setContents:function(ag){this.selected=null;this.container.innerHTML="";this.container.appendChild(ag);return this},selectNext:function(){var ag=true;if(this.selected){this.selected.style.backgroundColor="";if(this.selected.nextSibling){this.selected=this.selected.nextSibling}else{ag=false}}else{this.selected=this.container.firstChild.firstChild}if(ag){this.selected.style.backgroundColor=this.selectedColor;this.dispatchEvent(r.NextItem,this.selected)}},selectPrevious:function(){if(this.selected){this.selected.style.backgroundColor="";this.selected=this.selected.previousSibling;if(this.selected){this.selected.style.backgroundColor=this.selectedColor}this.dispatchEvent(r.PreviousItem,this.selected)}},onKeyDown:function(ai){var ah=ai.which;if(this.visible){if(this.selected){for(var ag in this.previousKeys){if(ah==this.previousKeys[ag]){this.selectPrevious();return false}}}for(var ag in this.nextKeys){if(ah==this.nextKeys[ag]){this.selectNext();return false}}for(var ag in this.selectKeys){if(ah==this.selectKeys[ag]){this.dispatchEvent(r.Select,this.selected);return false}}for(var ag in this.cancelKeys){if(ah==this.cancelKeys[ag]){this.dispatchEvent(r.Cancel,this.selected);this.hide();return false}}}return true},onKeyUp:function(ai){var ah=ai.which;if(ah<32&&ah!=e.Backspace){return true}for(var ag in this.previousKeys){if(ah==this.previousKeys[ag]){return true}}for(var ag in this.nextKeys){if(ah==this.nextKeys[ag]){return true}}for(var ag in this.selectKeys){if(ah==this.selectKeys[ag]){return true}}for(var ag in this.cancelKeys){if(ah==this.cancelKeys[ag]){return true}}this.dispatchEvent(r.KeyPress,ai);return true},show:function(){if(!this.visible){this.dispatchEvent(r.Position,this.container);this.visible=true;this.container.style.display="";this.dispatchEvent(r.Show,this.container)}return this},hide:function(){if(this.visible){this.visible=false;this.container.style.display="none";this.dispatchEvent(r.Hide,this.container)}return this},destroy:function(){this.onKeyDown.destroy();this.onKeyUp.destroy();m.prototype.destroy.call(this)}});function b(ag){ag.JSUtils={errors:{ImportError:y,UnsupportedBrowserError:af},ui:{},Key:e,};u.Expose(ag.JSUtils.ui);i.Expose(ag.JSUtils.ui);R.Expose(ag.JSUtils);f.Expose(ag.JSUtils);M(ag.JSUtils);ag.AJAXRequestor=v;ag.AJAXEvent=V;ag.exposeJSUtils=b;ag.h=I}b(p);return b}({__import__:$JSUtils(window),__init__:$JSUtils});