var Prototype={Version:"1.6.0.3",Browser:{IE:!!(window.attachEvent&&navigator.userAgent.indexOf("Opera")===-1),Opera:navigator.userAgent.indexOf("Opera")>-1,WebKit:navigator.userAgent.indexOf("AppleWebKit/")>-1,Gecko:navigator.userAgent.indexOf("Gecko")>-1&&navigator.userAgent.indexOf("KHTML")===-1,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,SelectorsAPI:!!document.querySelector,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement("div")["__proto__"]&&document.createElement("div")["__proto__"]!==document.createElement("form")["__proto__"]},ScriptFragment:"<script[^>]*>([\\S\\s]*?)<\/script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(A){return A;}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false;}var Class={create:function(){var E=null,D=$A(arguments);if(Object.isFunction(D[0])){E=D.shift();}function A(){this.initialize.apply(this,arguments);}Object.extend(A,Class.Methods);A.superclass=E;A.subclasses=[];if(E){var B=function(){};B.prototype=E.prototype;A.prototype=new B;E.subclasses.push(A);}for(var C=0;C<D.length;C++){A.addMethods(D[C]);}if(!A.prototype.initialize){A.prototype.initialize=Prototype.emptyFunction;}A.prototype.constructor=A;return A;}};Class.Methods={addMethods:function(G){var C=this.superclass&&this.superclass.prototype;var B=Object.keys(G);if(!Object.keys({toString:true}).length){B.push("toString","valueOf");}for(var A=0,D=B.length;A<D;A++){var F=B[A],E=G[F];if(C&&Object.isFunction(E)&&E.argumentNames().first()=="$super"){var H=E;E=(function(I){return function(){return C[I].apply(this,arguments);};})(F).wrap(H);E.valueOf=H.valueOf.bind(H);E.toString=H.toString.bind(H);}this.prototype[F]=E;}return this;}};var Abstract={};Object.extend=function(A,C){for(var B in C){A[B]=C[B];}return A;};Object.extend(Object,{inspect:function(A){try{if(Object.isUndefined(A)){return"undefined";}if(A===null){return"null";}return A.inspect?A.inspect():String(A);}catch(B){if(B instanceof RangeError){return"...";}throw B;}},toJSON:function(A){var C=typeof A;switch(C){case"undefined":case"function":case"unknown":return ;case"boolean":return A.toString();}if(A===null){return"null";}if(A.toJSON){return A.toJSON();}if(Object.isElement(A)){return ;}var B=[];for(var E in A){var D=Object.toJSON(A[E]);if(!Object.isUndefined(D)){B.push(E.toJSON()+": "+D);}}return"{"+B.join(", ")+"}";},toQueryString:function(A){return $H(A).toQueryString();},toHTML:function(A){return A&&A.toHTML?A.toHTML():String.interpret(A);},keys:function(A){var B=[];for(var C in A){B.push(C);}return B;},values:function(B){var A=[];for(var C in B){A.push(B[C]);}return A;},clone:function(A){return Object.extend({},A);},isElement:function(A){return !!(A&&A.nodeType==1);},isArray:function(A){return A!=null&&typeof A=="object"&&"splice" in A&&"join" in A;},isHash:function(A){return A instanceof Hash;},isFunction:function(A){return typeof A=="function";},isString:function(A){return typeof A=="string";},isNumber:function(A){return typeof A=="number";},isUndefined:function(A){return typeof A=="undefined";}});Object.extend(Function.prototype,{argumentNames:function(){var A=this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1].replace(/\s+/g,"").split(",");return A.length==1&&!A[0]?[]:A;},bind:function(){if(arguments.length<2&&Object.isUndefined(arguments[0])){return this;}var A=this,C=$A(arguments),B=C.shift();return function(){return A.apply(B,C.concat($A(arguments)));};},bindAsEventListener:function(){var A=this,C=$A(arguments),B=C.shift();return function(D){return A.apply(B,[D||window.event].concat(C));};},curry:function(){if(!arguments.length){return this;}var A=this,B=$A(arguments);return function(){return A.apply(this,B.concat($A(arguments)));};},delay:function(){var A=this,B=$A(arguments),C=B.shift()*1000;return window.setTimeout(function(){return A.apply(A,B);},C);},defer:function(){var A=[0.01].concat($A(arguments));return this.delay.apply(this,A);},wrap:function(B){var A=this;return function(){return B.apply(this,[A.bind(this)].concat($A(arguments)));};},methodize:function(){if(this._methodized){return this._methodized;}var A=this;return this._methodized=function(){return A.apply(null,[this].concat($A(arguments)));};}});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"';};var Try={these:function(){var C;for(var B=0,D=arguments.length;B<D;B++){var A=arguments[B];try{C=A();break;}catch(E){}}return C;}};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(A){return String(A).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1");};var PeriodicalExecuter=Class.create({initialize:function(B,A){this.callback=B;this.frequency=A;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();}finally{this.currentlyExecuting=false;}}}});Object.extend(String,{interpret:function(A){return A==null?"":String(A);},specialChar:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"}});Object.extend(String.prototype,{gsub:function(E,C){var A="",D=this,B;C=arguments.callee.prepareReplacement(C);while(D.length>0){if(B=D.match(E)){A+=D.slice(0,B.index);A+=String.interpret(C(B));D=D.slice(B.index+B[0].length);}else{A+=D,D="";}}return A;},sub:function(C,A,B){A=this.gsub.prepareReplacement(A);B=Object.isUndefined(B)?1:B;return this.gsub(C,function(D){if(--B<0){return D[0];}return A(D);});},scan:function(B,A){this.gsub(B,A);return String(this);},truncate:function(B,A){B=B||30;A=Object.isUndefined(A)?"...":A;return this.length>B?this.slice(0,B-A.length)+A:String(this);},strip:function(){return this.replace(/^\s+/,"").replace(/\s+$/,"");},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,"");},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"");},extractScripts:function(){var B=new RegExp(Prototype.ScriptFragment,"img");var A=new RegExp(Prototype.ScriptFragment,"im");return(this.match(B)||[]).map(function(C){return(C.match(A)||["",""])[1];});},evalScripts:function(){return this.extractScripts().map(function(script){return eval(script);});},escapeHTML:function(){var A=arguments.callee;A.text.data=this;return A.div.innerHTML;},unescapeHTML:function(){var A=new Element("div");A.innerHTML=this.stripTags();return A.childNodes[0]?(A.childNodes.length>1?$A(A.childNodes).inject("",function(B,C){return B+C.nodeValue;}):A.childNodes[0].nodeValue):"";},toQueryParams:function(B){var A=this.strip().match(/([^?#]*)(#.*)?$/);if(!A){return{};}return A[1].split(B||"&").inject({},function(E,F){if((F=F.split("="))[0]){var C=decodeURIComponent(F.shift());var D=F.length>1?F.join("="):F[0];if(D!=undefined){D=decodeURIComponent(D);}if(C in E){if(!Object.isArray(E[C])){E[C]=[E[C]];}E[C].push(D);}else{E[C]=D;}}return E;});},toArray:function(){return this.split("");},succ:function(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1);},times:function(A){return A<1?"":new Array(A+1).join(this);},camelize:function(){var D=this.split("-"),A=D.length;if(A==1){return D[0];}var C=this.charAt(0)=="-"?D[0].charAt(0).toUpperCase()+D[0].substring(1):D[0];for(var B=1;B<A;B++){C+=D[B].charAt(0).toUpperCase()+D[B].substring(1);}return C;},capitalize:function(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase();},underscore:function(){return this.gsub(/::/,"/").gsub(/([A-Z]+)([A-Z][a-z])/,"#{1}_#{2}").gsub(/([a-z\d])([A-Z])/,"#{1}_#{2}").gsub(/-/,"_").toLowerCase();},dasherize:function(){return this.gsub(/_/,"-");},inspect:function(B){var A=this.gsub(/[\x00-\x1f\\]/,function(C){var D=String.specialChar[C[0]];return D?D:"\\u00"+C[0].charCodeAt().toPaddedString(2,16);});if(B){return'"'+A.replace(/"/g,'\\"')+'"';}return"'"+A.replace(/'/g,"\\'")+"'";},toJSON:function(){return this.inspect(true);},unfilterJSON:function(A){return this.sub(A||Prototype.JSONFilter,"#{1}");},isJSON:function(){var A=this;if(A.blank()){return false;}A=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(A);},evalJSON:function(sanitize){var json=this.unfilterJSON();try{if(!sanitize||json.isJSON()){return eval("("+json+")");}}catch(e){}throw new SyntaxError("Badly formed JSON string: "+this.inspect());},include:function(A){return this.indexOf(A)>-1;},startsWith:function(A){return this.indexOf(A)===0;},endsWith:function(A){var B=this.length-A.length;return B>=0&&this.lastIndexOf(A)===B;},empty:function(){return this=="";},blank:function(){return/^\s*$/.test(this);},interpolate:function(A,B){return new Template(this,B).evaluate(A);}});if(Prototype.Browser.WebKit||Prototype.Browser.IE){Object.extend(String.prototype,{escapeHTML:function(){return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");},unescapeHTML:function(){return this.stripTags().replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">");}});}String.prototype.gsub.prepareReplacement=function(B){if(Object.isFunction(B)){return B;}var A=new Template(B);return function(C){return A.evaluate(C);};};String.prototype.parseQuery=String.prototype.toQueryParams;Object.extend(String.prototype.escapeHTML,{div:document.createElement("div"),text:document.createTextNode("")});String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);var Template=Class.create({initialize:function(A,B){this.template=A.toString();this.pattern=B||Template.Pattern;},evaluate:function(A){if(Object.isFunction(A.toTemplateReplacements)){A=A.toTemplateReplacements();}return this.template.gsub(this.pattern,function(D){if(A==null){return"";}var F=D[1]||"";if(F=="\\"){return D[2];}var B=A,G=D[3];var E=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;D=E.exec(G);if(D==null){return F;}while(D!=null){var C=D[1].startsWith("[")?D[2].gsub("\\\\]","]"):D[1];B=B[C];if(null==B||""==D[3]){break;}G=G.substring("["==D[3]?D[1].length:D[0].length);D=E.exec(G);}return F+String.interpret(B);});}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable={each:function(C,B){var A=0;try{this._each(function(E){C.call(B,E,A++);});}catch(D){if(D!=$break){throw D;}}return this;},eachSlice:function(D,C,B){var A=-D,E=[],F=this.toArray();if(D<1){return F;}while((A+=D)<F.length){E.push(F.slice(A,A+D));}return E.collect(C,B);},all:function(C,B){C=C||Prototype.K;var A=true;this.each(function(E,D){A=A&&!!C.call(B,E,D);if(!A){throw $break;}});return A;},any:function(C,B){C=C||Prototype.K;var A=false;this.each(function(E,D){if(A=!!C.call(B,E,D)){throw $break;}});return A;},collect:function(C,B){C=C||Prototype.K;var A=[];this.each(function(E,D){A.push(C.call(B,E,D));});return A;},detect:function(C,B){var A;this.each(function(E,D){if(C.call(B,E,D)){A=E;throw $break;}});return A;},findAll:function(C,B){var A=[];this.each(function(E,D){if(C.call(B,E,D)){A.push(E);}});return A;},grep:function(D,C,B){C=C||Prototype.K;var A=[];if(Object.isString(D)){D=new RegExp(D);}this.each(function(F,E){if(D.match(F)){A.push(C.call(B,F,E));}});return A;},include:function(A){if(Object.isFunction(this.indexOf)){if(this.indexOf(A)!=-1){return true;}}var B=false;this.each(function(C){if(C==A){B=true;throw $break;}});return B;},inGroupsOf:function(B,A){A=Object.isUndefined(A)?null:A;return this.eachSlice(B,function(C){while(C.length<B){C.push(A);}return C;});},inject:function(A,C,B){this.each(function(E,D){A=C.call(B,A,E,D);});return A;},invoke:function(B){var A=$A(arguments).slice(1);return this.map(function(C){return C[B].apply(C,A);});},max:function(C,B){C=C||Prototype.K;var A;this.each(function(E,D){E=C.call(B,E,D);if(A==null||E>=A){A=E;}});return A;},min:function(C,B){C=C||Prototype.K;var A;this.each(function(E,D){E=C.call(B,E,D);if(A==null||E<A){A=E;}});return A;},partition:function(D,B){D=D||Prototype.K;var C=[],A=[];this.each(function(F,E){(D.call(B,F,E)?C:A).push(F);});return[C,A];},pluck:function(B){var A=[];this.each(function(C){A.push(C[B]);});return A;},reject:function(C,B){var A=[];this.each(function(E,D){if(!C.call(B,E,D)){A.push(E);}});return A;},sortBy:function(B,A){return this.map(function(D,C){return{value:D,criteria:B.call(A,D,C)};}).sort(function(F,E){var D=F.criteria,C=E.criteria;return D<C?-1:D>C?1:0;}).pluck("value");},toArray:function(){return this.map();},zip:function(){var B=Prototype.K,A=$A(arguments);if(Object.isFunction(A.last())){B=A.pop();}var C=[this].concat(A).map($A);return this.map(function(E,D){return B(C.pluck(D));});},size:function(){return this.toArray().length;},inspect:function(){return"#<Enumerable:"+this.toArray().inspect()+">";}};Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,filter:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray,every:Enumerable.all,some:Enumerable.any});function $A(C){if(!C){return[];}if(C.toArray){return C.toArray();}var B=C.length||0,A=new Array(B);while(B--){A[B]=C[B];}return A;}if(Prototype.Browser.WebKit){$A=function(C){if(!C){return[];}if(!(typeof C==="function"&&typeof C.length==="number"&&typeof C.item==="function")&&C.toArray){return C.toArray();}var B=C.length||0,A=new Array(B);while(B--){A[B]=C[B];}return A;};}Array.from=$A;Object.extend(Array.prototype,Enumerable);if(!Array.prototype._reverse){Array.prototype._reverse=Array.prototype.reverse;}Object.extend(Array.prototype,{_each:function(B){for(var A=0,C=this.length;A<C;A++){B(this[A]);}},clear:function(){this.length=0;return this;},first:function(){return this[0];},last:function(){return this[this.length-1];},compact:function(){return this.select(function(A){return A!=null;});},flatten:function(){return this.inject([],function(B,A){return B.concat(Object.isArray(A)?A.flatten():[A]);});},without:function(){var A=$A(arguments);return this.select(function(B){return !A.include(B);});},reverse:function(A){return(A!==false?this:this.toArray())._reverse();},reduce:function(){return this.length>1?this:this[0];},uniq:function(A){return this.inject([],function(D,C,B){if(0==B||(A?D.last()!=C:!D.include(C))){D.push(C);}return D;});},intersect:function(A){return this.uniq().findAll(function(B){return A.detect(function(C){return B===C;});});},clone:function(){return[].concat(this);},size:function(){return this.length;},inspect:function(){return"["+this.map(Object.inspect).join(", ")+"]";},toJSON:function(){var A=[];this.each(function(B){var C=Object.toJSON(B);if(!Object.isUndefined(C)){A.push(C);}});return"["+A.join(", ")+"]";}});if(Object.isFunction(Array.prototype.forEach)){Array.prototype._each=Array.prototype.forEach;}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(C,A){A||(A=0);var B=this.length;if(A<0){A=B+A;}for(;A<B;A++){if(this[A]===C){return A;}}return -1;};}if(!Array.prototype.lastIndexOf){Array.prototype.lastIndexOf=function(B,A){A=isNaN(A)?this.length:(A<0?this.length+A:A)+1;var C=this.slice(0,A).reverse().indexOf(B);return(C<0)?C:A-C-1;};}Array.prototype.toArray=Array.prototype.clone;function $w(A){if(!Object.isString(A)){return[];}A=A.strip();return A?A.split(/\s+/):[];}if(Prototype.Browser.Opera){Array.prototype.concat=function(){var E=[];for(var B=0,C=this.length;B<C;B++){E.push(this[B]);}for(var B=0,C=arguments.length;B<C;B++){if(Object.isArray(arguments[B])){for(var A=0,D=arguments[B].length;A<D;A++){E.push(arguments[B][A]);}}else{E.push(arguments[B]);}}return E;};}Object.extend(Number.prototype,{toColorPart:function(){return this.toPaddedString(2,16);},succ:function(){return this+1;},times:function(B,A){$R(0,this,true).each(B,A);return this;},toPaddedString:function(C,B){var A=this.toString(B||10);return"0".times(C-A.length)+A;},toJSON:function(){return isFinite(this)?this.toString():"null";}});$w("abs round ceil floor").each(function(A){Number.prototype[A]=Math[A].methodize();});function $H(A){return new Hash(A);}var Hash=Class.create(Enumerable,(function(){function A(B,C){if(Object.isUndefined(C)){return B;}return B+"="+encodeURIComponent(String.interpret(C));}return{initialize:function(B){this._object=Object.isHash(B)?B.toObject():Object.clone(B);},_each:function(C){for(var B in this._object){var D=this._object[B],E=[B,D];E.key=B;E.value=D;C(E);}},set:function(B,C){return this._object[B]=C;},get:function(B){if(this._object[B]!==Object.prototype[B]){return this._object[B];}},unset:function(B){var C=this._object[B];delete this._object[B];return C;},toObject:function(){return Object.clone(this._object);},keys:function(){return this.pluck("key");},values:function(){return this.pluck("value");},index:function(C){var B=this.detect(function(D){return D.value===C;});return B&&B.key;},merge:function(B){return this.clone().update(B);},update:function(B){return new Hash(B).inject(this,function(C,D){C.set(D.key,D.value);return C;});},toQueryString:function(){return this.inject([],function(D,E){var C=encodeURIComponent(E.key),B=E.value;if(B&&typeof B=="object"){if(Object.isArray(B)){return D.concat(B.map(A.curry(C)));}}else{D.push(A(C,B));}return D;}).join("&");},inspect:function(){return"#<Hash:{"+this.map(function(B){return B.map(Object.inspect).join(": ");}).join(", ")+"}>";},toJSON:function(){return Object.toJSON(this.toObject());},clone:function(){return new Hash(this);}};})());Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;Hash.from=$H;var ObjectRange=Class.create(Enumerable,{initialize:function(C,A,B){this.start=C;this.end=A;this.exclusive=B;},_each:function(A){var B=this.start;while(this.include(B)){A(B);B=B.succ();}},include:function(A){if(A<this.start){return false;}if(this.exclusive){return A<this.end;}return A<=this.end;}});var $R=function(C,A,B){return new ObjectRange(C,A,B);};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(A){this.responders._each(A);},register:function(A){if(!this.include(A)){this.responders.push(A);}},unregister:function(A){this.responders=this.responders.without(A);},dispatch:function(D,B,C,A){this.each(function(E){if(Object.isFunction(E[D])){try{E[D].apply(E,[B,C,A]);}catch(F){}}});}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++;},onComplete:function(){Ajax.activeRequestCount--;}});Ajax.Base=Class.create({initialize:function(A){this.options={method:"post",asynchronous:true,contentType:"application/x-www-form-urlencoded",encoding:"UTF-8",parameters:"",evalJSON:true,evalJS:true};Object.extend(this.options,A||{});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,B,A){$super(A);this.transport=Ajax.getTransport();this.request(B);},request:function(B){this.url=B;this.method=this.options.method;var D=Object.clone(this.options.parameters);if(!["get","post"].include(this.method)){D._method=this.method;this.method="post";}this.parameters=D;if(D=Object.toQueryString(D)){if(this.method=="get"){this.url+=(this.url.include("?")?"&":"?")+D;}else{if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){D+="&_=";}}}try{var A=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(A);}Ajax.Responders.dispatch("onCreate",this,A);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||D):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange();}}catch(C){this.dispatchException(C);}},onStateChange:function(){var A=this.transport.readyState;if(A>1&&!((A==4)&&this._complete)){this.respondToReadyState(this.transport.readyState);}},setRequestHeaders:function(){var E={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,Accept:"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){E["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){E.Connection="close";}}if(typeof this.options.requestHeaders=="object"){var C=this.options.requestHeaders;if(Object.isFunction(C.push)){for(var B=0,D=C.length;B<D;B+=2){E[C[B]]=C[B+1];}}else{$H(C).each(function(F){E[F.key]=F.value;});}}for(var A in E){this.transport.setRequestHeader(A,E[A]);}},success:function(){var A=this.getStatus();return !A||(A>=200&&A<300);},getStatus:function(){try{return this.transport.status||0;}catch(A){return 0;}},respondToReadyState:function(A){var C=Ajax.Request.Events[A],B=new Ajax.Response(this);if(C=="Complete"){try{this._complete=true;(this.options["on"+B.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(B,B.headerJSON);}catch(D){this.dispatchException(D);}var E=B.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&E&&E.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse();}}try{(this.options["on"+C]||Prototype.emptyFunction)(B,B.headerJSON);Ajax.Responders.dispatch("on"+C,this,B,B.headerJSON);}catch(D){this.dispatchException(D);}if(C=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction;}},isSameOrigin:function(){var A=this.url.match(/^\s*https?:\/\/[^\/]*/);return !A||(A[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}));},getHeader:function(A){try{return this.transport.getResponseHeader(A)||null;}catch(B){return null;}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON());}catch(e){this.dispatchException(e);}},dispatchException:function(A){(this.options.onException||Prototype.emptyFunction)(this,A);Ajax.Responders.dispatch("onException",this,A);}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(C){this.request=C;var D=this.transport=C.transport,A=this.readyState=D.readyState;if((A>2&&!Prototype.Browser.IE)||A==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(D.responseText);this.headerJSON=this._getHeaderJSON();}if(A==4){var B=D.responseXML;this.responseXML=Object.isUndefined(B)?null:B;this.responseJSON=this._getResponseJSON();}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||"";}catch(A){return"";}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders();}catch(A){return null;}},getResponseHeader:function(A){return this.transport.getResponseHeader(A);},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders();},_getHeaderJSON:function(){var A=this.getHeader("X-JSON");if(!A){return null;}A=decodeURIComponent(escape(A));try{return A.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin());}catch(B){this.request.dispatchException(B);}},_getResponseJSON:function(){var A=this.request.options;if(!A.evalJSON||(A.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null;}try{return this.responseText.evalJSON(A.sanitizeJSON||!this.request.isSameOrigin());}catch(B){this.request.dispatchException(B);}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,A,C,B){this.container={success:(A.success||A),failure:(A.failure||(A.success?null:A))};B=Object.clone(B);var D=B.onComplete;B.onComplete=(function(E,F){this.updateContent(E.responseText);if(Object.isFunction(D)){D(E,F);}}).bind(this);$super(C,B);},updateContent:function(D){var C=this.container[this.success()?"success":"failure"],A=this.options;if(!A.evalScripts){D=D.stripScripts();}if(C=$(C)){if(A.insertion){if(Object.isString(A.insertion)){var B={};B[A.insertion]=D;C.insert(B);}else{A.insertion(C,D);}}else{C.update(D);}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,A,C,B){$super(B);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=A;this.url=C;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(A){if(this.options.decay){this.decay=(A.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=A.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 $(B){if(arguments.length>1){for(var A=0,D=[],C=arguments.length;A<C;A++){D.push($(arguments[A]));}return D;}if(Object.isString(B)){B=document.getElementById(B);}return Element.extend(B);}if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(F,A){var C=[];var E=document.evaluate(F,$(A)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var B=0,D=E.snapshotLength;B<D;B++){C.push(Element.extend(E.snapshotItem(B)));}return C;};}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(){var A=this.Element;this.Element=function(D,C){C=C||{};D=D.toLowerCase();var B=Element.cache;if(Prototype.Browser.IE&&C.name){D="<"+D+' name="'+C.name+'">';delete C.name;return Element.writeAttribute(document.createElement(D),C);}if(!B[D]){B[D]=Element.extend(document.createElement(D));}return Element.writeAttribute(B[D].cloneNode(false),C);};Object.extend(this.Element,A||{});if(A){this.Element.prototype=A.prototype;}}).call(window);Element.cache={};Element.Methods={visible:function(A){return $(A).style.display!="none";},toggle:function(A){A=$(A);Element[Element.visible(A)?"hide":"show"](A);return A;},hide:function(A){A=$(A);A.style.display="none";return A;},show:function(A){A=$(A);A.style.display="";return A;},remove:function(A){A=$(A);A.parentNode.removeChild(A);return A;},update:function(A,B){A=$(A);if(B&&B.toElement){B=B.toElement();}if(Object.isElement(B)){return A.update().insert(B);}B=Object.toHTML(B);A.innerHTML=B.stripScripts();B.evalScripts.bind(B).defer();return A;},replace:function(B,C){B=$(B);if(C&&C.toElement){C=C.toElement();}else{if(!Object.isElement(C)){C=Object.toHTML(C);var A=B.ownerDocument.createRange();A.selectNode(B);C.evalScripts.bind(C).defer();C=A.createContextualFragment(C.stripScripts());}}B.parentNode.replaceChild(C,B);return B;},insert:function(C,E){C=$(C);if(Object.isString(E)||Object.isNumber(E)||Object.isElement(E)||(E&&(E.toElement||E.toHTML))){E={bottom:E};}var D,F,B,G;for(var A in E){D=E[A];A=A.toLowerCase();F=Element._insertionTranslations[A];if(D&&D.toElement){D=D.toElement();}if(Object.isElement(D)){F(C,D);continue;}D=Object.toHTML(D);B=((A=="before"||A=="after")?C.parentNode:C).tagName.toUpperCase();G=Element._getContentFromAnonymousElement(B,D.stripScripts());if(A=="top"||A=="after"){G.reverse();}G.each(F.curry(C));D.evalScripts.bind(D).defer();}return C;},wrap:function(B,C,A){B=$(B);if(Object.isElement(C)){$(C).writeAttribute(A||{});}else{if(Object.isString(C)){C=new Element(C,A);}else{C=new Element("div",C);}}if(B.parentNode){B.parentNode.replaceChild(C,B);}C.appendChild(B);return C;},inspect:function(B){B=$(B);var A="<"+B.tagName.toLowerCase();$H({id:"id",className:"class"}).each(function(F){var E=F.first(),C=F.last();var D=(B[E]||"").toString();if(D){A+=" "+C+"="+D.inspect(true);}});return A+">";},recursivelyCollect:function(A,C){A=$(A);var B=[];while(A=A[C]){if(A.nodeType==1){B.push(Element.extend(A));}}return B;},ancestors:function(A){return $(A).recursivelyCollect("parentNode");},descendants:function(A){return $(A).select("*");},firstDescendant:function(A){A=$(A).firstChild;while(A&&A.nodeType!=1){A=A.nextSibling;}return $(A);},immediateDescendants:function(A){if(!(A=$(A).firstChild)){return[];}while(A&&A.nodeType!=1){A=A.nextSibling;}if(A){return[A].concat($(A).nextSiblings());}return[];},previousSiblings:function(A){return $(A).recursivelyCollect("previousSibling");},nextSiblings:function(A){return $(A).recursivelyCollect("nextSibling");},siblings:function(A){A=$(A);return A.previousSiblings().reverse().concat(A.nextSiblings());},match:function(B,A){if(Object.isString(A)){A=new Selector(A);}return A.match($(B));},up:function(B,D,A){B=$(B);if(arguments.length==1){return $(B.parentNode);}var C=B.ancestors();return Object.isNumber(D)?C[D]:Selector.findElement(C,D,A);},down:function(B,C,A){B=$(B);if(arguments.length==1){return B.firstDescendant();}return Object.isNumber(C)?B.descendants()[C]:Element.select(B,C)[A||0];},previous:function(B,D,A){B=$(B);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(B));}var C=B.previousSiblings();return Object.isNumber(D)?C[D]:Selector.findElement(C,D,A);},next:function(C,D,B){C=$(C);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(C));}var A=C.nextSiblings();return Object.isNumber(D)?A[D]:Selector.findElement(A,D,B);},select:function(){var A=$A(arguments),B=$(A.shift());return Selector.findChildElements(B,A);},adjacent:function(){var A=$A(arguments),B=$(A.shift());return Selector.findChildElements(B.parentNode,A).without(B);},identify:function(B){B=$(B);var C=B.readAttribute("id"),A=arguments.callee;if(C){return C;}do{C="anonymous_element_"+A.counter++;}while($(C));B.writeAttribute("id",C);return C;},readAttribute:function(C,A){C=$(C);if(Prototype.Browser.IE){var B=Element._attributeTranslations.read;if(B.values[A]){return B.values[A](C,A);}if(B.names[A]){A=B.names[A];}if(A.include(":")){return(!C.attributes||!C.attributes[A])?null:C.attributes[A].value;}}return C.getAttribute(A);},writeAttribute:function(E,C,F){E=$(E);var B={},D=Element._attributeTranslations.write;if(typeof C=="object"){B=C;}else{B[C]=Object.isUndefined(F)?true:F;}for(var A in B){C=D.names[A]||A;F=B[A];if(D.values[A]){C=D.values[A](E,F);}if(F===false||F===null){E.removeAttribute(C);}else{if(F===true){E.setAttribute(C,C);}else{E.setAttribute(C,F);}}}return E;},getHeight:function(A){return $(A).getDimensions().height;},getWidth:function(A){return $(A).getDimensions().width;},classNames:function(A){return new Element.ClassNames(A);},hasClassName:function(A,B){if(!(A=$(A))){return ;}var C=A.className;return(C.length>0&&(C==B||new RegExp("(^|\\s)"+B+"(\\s|$)").test(C)));},addClassName:function(A,B){if(!(A=$(A))){return ;}if(!A.hasClassName(B)){A.className+=(A.className?" ":"")+B;}return A;},removeClassName:function(A,B){if(!(A=$(A))){return ;}A.className=A.className.replace(new RegExp("(^|\\s+)"+B+"(\\s+|$)")," ").strip();return A;},toggleClassName:function(A,B){if(!(A=$(A))){return ;}return A[A.hasClassName(B)?"removeClassName":"addClassName"](B);},cleanWhitespace:function(B){B=$(B);var C=B.firstChild;while(C){var A=C.nextSibling;if(C.nodeType==3&&!/\S/.test(C.nodeValue)){B.removeChild(C);}C=A;}return B;},empty:function(A){return $(A).innerHTML.blank();},descendantOf:function(B,A){B=$(B),A=$(A);if(B.compareDocumentPosition){return(B.compareDocumentPosition(A)&8)===8;}if(A.contains){return A.contains(B)&&A!==B;}while(B=B.parentNode){if(B==A){return true;}}return false;},scrollTo:function(A){A=$(A);var B=A.cumulativeOffset();window.scrollTo(B[0],B[1]);return A;},getStyle:function(B,C){B=$(B);C=C=="float"?"cssFloat":C.camelize();var D=B.style[C];if(!D||D=="auto"){var A=document.defaultView.getComputedStyle(B,null);D=A?A[C]:null;}if(C=="opacity"){return D?parseFloat(D):1;}return D=="auto"?null:D;},getOpacity:function(A){return $(A).getStyle("opacity");},setStyle:function(B,C){B=$(B);var E=B.style,A;if(Object.isString(C)){B.style.cssText+=";"+C;return C.include("opacity")?B.setOpacity(C.match(/opacity:\s*(\d?\.?\d*)/)[1]):B;}for(var D in C){if(D=="opacity"){B.setOpacity(C[D]);}else{E[(D=="float"||D=="cssFloat")?(Object.isUndefined(E.styleFloat)?"cssFloat":"styleFloat"):D]=C[D];}}return B;},setOpacity:function(A,B){A=$(A);A.style.opacity=(B==1||B==="")?"":(B<0.00001)?0:B;return A;},getDimensions:function(C){C=$(C);var G=C.getStyle("display");if(G!="none"&&G!=null){return{width:C.offsetWidth,height:C.offsetHeight};}var B=C.style;var F=B.visibility;var D=B.position;var A=B.display;B.visibility="hidden";B.position="absolute";B.display="block";var H=C.clientWidth;var E=C.clientHeight;B.display=A;B.position=D;B.visibility=F;return{width:H,height:E};},makePositioned:function(A){A=$(A);var B=Element.getStyle(A,"position");if(B=="static"||!B){A._madePositioned=true;A.style.position="relative";if(Prototype.Browser.Opera){A.style.top=0;A.style.left=0;}}return A;},undoPositioned:function(A){A=$(A);if(A._madePositioned){A._madePositioned=undefined;A.style.position=A.style.top=A.style.left=A.style.bottom=A.style.right="";}return A;},makeClipping:function(A){A=$(A);if(A._overflow){return A;}A._overflow=Element.getStyle(A,"overflow")||"auto";if(A._overflow!=="hidden"){A.style.overflow="hidden";}return A;},undoClipping:function(A){A=$(A);if(!A._overflow){return A;}A.style.overflow=A._overflow=="auto"?"":A._overflow;A._overflow=null;return A;},cumulativeOffset:function(B){var A=0,C=0;do{A+=B.offsetTop||0;C+=B.offsetLeft||0;B=B.offsetParent;}while(B);return Element._returnOffset(C,A);},positionedOffset:function(B){var A=0,D=0;do{A+=B.offsetTop||0;D+=B.offsetLeft||0;B=B.offsetParent;if(B){if(B.tagName.toUpperCase()=="BODY"){break;}var C=Element.getStyle(B,"position");if(C!=="static"){break;}}}while(B);return Element._returnOffset(D,A);},absolutize:function(B){B=$(B);if(B.getStyle("position")=="absolute"){return B;}var D=B.positionedOffset();var F=D[1];var E=D[0];var C=B.clientWidth;var A=B.clientHeight;B._originalLeft=E-parseFloat(B.style.left||0);B._originalTop=F-parseFloat(B.style.top||0);B._originalWidth=B.style.width;B._originalHeight=B.style.height;B.style.position="absolute";B.style.top=F+"px";B.style.left=E+"px";B.style.width=C+"px";B.style.height=A+"px";return B;},relativize:function(A){A=$(A);if(A.getStyle("position")=="relative"){return A;}A.style.position="relative";var C=parseFloat(A.style.top||0)-(A._originalTop||0);var B=parseFloat(A.style.left||0)-(A._originalLeft||0);A.style.top=C+"px";A.style.left=B+"px";A.style.height=A._originalHeight;A.style.width=A._originalWidth;return A;},cumulativeScrollOffset:function(B){var A=0,C=0;do{A+=B.scrollTop||0;C+=B.scrollLeft||0;B=B.parentNode;}while(B);return Element._returnOffset(C,A);},getOffsetParent:function(A){if(A.offsetParent){return $(A.offsetParent);}if(A==document.body){return $(A);}while((A=A.parentNode)&&A!=document.body){if(Element.getStyle(A,"position")!="static"){return $(A);}}return $(document.body);},viewportOffset:function(D){var A=0,C=0;var B=D;do{A+=B.offsetTop||0;C+=B.offsetLeft||0;if(B.offsetParent==document.body&&Element.getStyle(B,"position")=="absolute"){break;}}while(B=B.offsetParent);B=D;do{if(!Prototype.Browser.Opera||(B.tagName&&(B.tagName.toUpperCase()=="BODY"))){A-=B.scrollTop||0;C-=B.scrollLeft||0;}}while(B=B.parentNode);return Element._returnOffset(C,A);},clonePosition:function(B,D){var A=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});D=$(D);var E=D.viewportOffset();B=$(B);var F=[0,0];var C=null;if(Element.getStyle(B,"position")=="absolute"){C=B.getOffsetParent();F=C.viewportOffset();}if(C==document.body){F[0]-=document.body.offsetLeft;F[1]-=document.body.offsetTop;}if(A.setLeft){B.style.left=(E[0]-F[0]+A.offsetLeft)+"px";}if(A.setTop){B.style.top=(E[1]-F[1]+A.offsetTop)+"px";}if(A.setWidth){B.style.width=D.offsetWidth+"px";}if(A.setHeight){B.style.height=D.offsetHeight+"px";}return B;}};Element.Methods.identify.counter=1;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(D,B,C){switch(C){case"left":case"top":case"right":case"bottom":if(D(B,"position")==="static"){return null;}case"height":case"width":if(!Element.visible(B)){return null;}var E=parseInt(D(B,C),10);if(E!==B["offset"+C.capitalize()]){return E+"px";}var A;if(C==="height"){A=["border-top-width","padding-top","padding-bottom","border-bottom-width"];}else{A=["border-left-width","padding-left","padding-right","border-right-width"];}return A.inject(E,function(F,G){var H=D(B,G);return H===null?F:F-parseInt(H,10);})+"px";default:return D(B,C);}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(C,A,B){if(B==="title"){return A.title;}return C(A,B);});}else{if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(C,B){B=$(B);try{B.offsetParent;}catch(E){return $(document.body);}var A=B.getStyle("position");if(A!=="static"){return C(B);}B.setStyle({position:"relative"});var D=C(B);B.setStyle({position:A});return D;});$w("positionedOffset viewportOffset").each(function(A){Element.Methods[A]=Element.Methods[A].wrap(function(E,C){C=$(C);try{C.offsetParent;}catch(G){return Element._returnOffset(0,0);}var B=C.getStyle("position");if(B!=="static"){return E(C);}var D=C.getOffsetParent();if(D&&D.getStyle("position")==="fixed"){D.setStyle({zoom:1});}C.setStyle({position:"relative"});var F=E(C);C.setStyle({position:B});return F;});});Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap(function(B,A){try{A.offsetParent;}catch(C){return Element._returnOffset(0,0);}return B(A);});Element.Methods.getStyle=function(A,B){A=$(A);B=(B=="float"||B=="cssFloat")?"styleFloat":B.camelize();var C=A.style[B];if(!C&&A.currentStyle){C=A.currentStyle[B];}if(B=="opacity"){if(C=(A.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){if(C[1]){return parseFloat(C[1])/100;}}return 1;}if(C=="auto"){if((B=="width"||B=="height")&&(A.getStyle("display")!="none")){return A["offset"+B.capitalize()]+"px";}return null;}return C;};Element.Methods.setOpacity=function(B,E){function F(G){return G.replace(/alpha\([^\)]*\)/gi,"");}B=$(B);var A=B.currentStyle;if((A&&!A.hasLayout)||(!A&&B.style.zoom=="normal")){B.style.zoom=1;}var D=B.getStyle("filter"),C=B.style;if(E==1||E===""){(D=F(D))?C.filter=D:C.removeAttribute("filter");return B;}else{if(E<0.00001){E=0;}}C.filter=F(D)+"alpha(opacity="+(E*100)+")";return B;};Element._attributeTranslations={read:{names:{"class":"className","for":"htmlFor"},values:{_getAttr:function(A,B){return A.getAttribute(B,2);},_getAttrNode:function(A,C){var B=A.getAttributeNode(C);return B?B.value:"";},_getEv:function(A,B){B=A.getAttribute(B);return B?B.toString().slice(23,-2):null;},_flag:function(A,B){return $(A).hasAttribute(B)?B:null;},style:function(A){return A.style.cssText.toLowerCase();},title:function(A){return A.title;}}}};Element._attributeTranslations.write={names:Object.extend({cellpadding:"cellPadding",cellspacing:"cellSpacing"},Element._attributeTranslations.read.names),values:{checked:function(A,B){A.checked=!!B;},style:function(A,B){A.style.cssText=B?B:"";}}};Element._attributeTranslations.has={};$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder").each(function(A){Element._attributeTranslations.write.names[A.toLowerCase()]=A;Element._attributeTranslations.has[A.toLowerCase()]=A;});(function(A){Object.extend(A,{href:A._getAttr,src:A._getAttr,type:A._getAttr,action:A._getAttrNode,disabled:A._flag,checked:A._flag,readonly:A._flag,multiple:A._flag,onload:A._getEv,onunload:A._getEv,onclick:A._getEv,ondblclick:A._getEv,onmousedown:A._getEv,onmouseup:A._getEv,onmouseover:A._getEv,onmousemove:A._getEv,onmouseout:A._getEv,onfocus:A._getEv,onblur:A._getEv,onkeypress:A._getEv,onkeydown:A._getEv,onkeyup:A._getEv,onsubmit:A._getEv,onreset:A._getEv,onselect:A._getEv,onchange:A._getEv});})(Element._attributeTranslations.read.values);}else{if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(A,B){A=$(A);A.style.opacity=(B==1)?0.999999:(B==="")?"":(B<0.00001)?0:B;return A;};}else{if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(A,B){A=$(A);A.style.opacity=(B==1||B==="")?"":(B<0.00001)?0:B;if(B==1){if(A.tagName.toUpperCase()=="IMG"&&A.width){A.width++;A.width--;}else{try{var D=document.createTextNode(" ");A.appendChild(D);A.removeChild(D);}catch(C){}}}return A;};Element.Methods.cumulativeOffset=function(B){var A=0,C=0;do{A+=B.offsetTop||0;C+=B.offsetLeft||0;if(B.offsetParent==document.body){if(Element.getStyle(B,"position")=="absolute"){break;}}B=B.offsetParent;}while(B);return Element._returnOffset(C,A);};}}}}if(Prototype.Browser.IE||Prototype.Browser.Opera){Element.Methods.update=function(B,C){B=$(B);if(C&&C.toElement){C=C.toElement();}if(Object.isElement(C)){return B.update().insert(C);}C=Object.toHTML(C);var A=B.tagName.toUpperCase();if(A in Element._insertionTranslations.tags){$A(B.childNodes).each(function(D){B.removeChild(D);});Element._getContentFromAnonymousElement(A,C.stripScripts()).each(function(D){B.appendChild(D);});}else{B.innerHTML=C.stripScripts();}C.evalScripts.bind(C).defer();return B;};}if("outerHTML" in document.createElement("div")){Element.Methods.replace=function(C,E){C=$(C);if(E&&E.toElement){E=E.toElement();}if(Object.isElement(E)){C.parentNode.replaceChild(E,C);return C;}E=Object.toHTML(E);var D=C.parentNode,B=D.tagName.toUpperCase();if(Element._insertionTranslations.tags[B]){var F=C.next();var A=Element._getContentFromAnonymousElement(B,E.stripScripts());D.removeChild(C);if(F){A.each(function(G){D.insertBefore(G,F);});}else{A.each(function(G){D.appendChild(G);});}}else{C.outerHTML=E.stripScripts();}E.evalScripts.bind(E).defer();return C;};}Element._returnOffset=function(B,C){var A=[B,C];A.left=B;A.top=C;return A;};Element._getContentFromAnonymousElement=function(C,B){var D=new Element("div"),A=Element._insertionTranslations.tags[C];if(A){D.innerHTML=A[0]+B+A[1];A[2].times(function(){D=D.firstChild;});}else{D.innerHTML=B;}return $A(D.childNodes);};Element._insertionTranslations={before:function(A,B){A.parentNode.insertBefore(B,A);},top:function(A,B){A.insertBefore(B,A.firstChild);},bottom:function(A,B){A.appendChild(B);},after:function(A,B){A.parentNode.insertBefore(B,A.nextSibling);},tags:{TABLE:["<table>","</table>",1],TBODY:["<table><tbody>","</tbody></table>",2],TR:["<table><tbody><tr>","</tr></tbody></table>",3],TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],SELECT:["<select>","</select>",1]}};(function(){Object.extend(this.tags,{THEAD:this.tags.TBODY,TFOOT:this.tags.TBODY,TH:this.tags.TD});}).call(Element._insertionTranslations);Element.Methods.Simulated={hasAttribute:function(A,C){C=Element._attributeTranslations.has[C]||C;var B=$(A).getAttributeNode(C);return !!(B&&B.specified);}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement("div")["__proto__"]){window.HTMLElement={};window.HTMLElement.prototype=document.createElement("div")["__proto__"];Prototype.BrowserFeatures.ElementExtensions=true;}Element.extend=(function(){if(Prototype.BrowserFeatures.SpecificElementExtensions){return Prototype.K;}var A={},B=Element.Methods.ByTag;var C=Object.extend(function(F){if(!F||F._extendedByPrototype||F.nodeType!=1||F==window){return F;}var D=Object.clone(A),E=F.tagName.toUpperCase(),H,G;if(B[E]){Object.extend(D,B[E]);}for(H in D){G=D[H];if(Object.isFunction(G)&&!(H in F)){F[H]=G.methodize();}}F._extendedByPrototype=Prototype.emptyFunction;return F;},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(A,Element.Methods);Object.extend(A,Element.Methods.Simulated);}}});C.refresh();return C;})();Element.hasAttribute=function(A,B){if(A.hasAttribute){return A.hasAttribute(B);}return Element.Methods.Simulated.hasAttribute(A,B);};Element.addMethods=function(C){var I=Prototype.BrowserFeatures,D=Element.Methods.ByTag;if(!C){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 B=C;C=arguments[1];}if(!B){Object.extend(Element.Methods,C||{});}else{if(Object.isArray(B)){B.each(H);}else{H(B);}}function H(F){F=F.toUpperCase();if(!Element.Methods.ByTag[F]){Element.Methods.ByTag[F]={};}Object.extend(Element.Methods.ByTag[F],C);}function A(L,K,F){F=F||false;for(var N in L){var M=L[N];if(!Object.isFunction(M)){continue;}if(!F||!(N in K)){K[N]=M.methodize();}}}function E(L){var F;var K={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(K[L]){F="HTML"+K[L]+"Element";}if(window[F]){return window[F];}F="HTML"+L+"Element";if(window[F]){return window[F];}F="HTML"+L.capitalize()+"Element";if(window[F]){return window[F];}window[F]={};window[F].prototype=document.createElement(L)["__proto__"];return window[F];}if(I.ElementExtensions){A(Element.Methods,HTMLElement.prototype);A(Element.Methods.Simulated,HTMLElement.prototype,true);}if(I.SpecificElementExtensions){for(var J in Element.Methods.ByTag){var G=E(J);if(Object.isUndefined(G)){continue;}A(D[J],G.prototype);}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh();}Element.cache={};};document.viewport={getDimensions:function(){var A={},C=Prototype.Browser;$w("width height").each(function(E){var B=E.capitalize();if(C.WebKit&&!document.evaluate){A[E]=self["inner"+B];}else{if(C.Opera&&parseFloat(window.opera.version())<9.5){A[E]=document.body["client"+B];}else{A[E]=document.documentElement["client"+B];}}});return A;},getWidth:function(){return this.getDimensions().width;},getHeight:function(){return this.getDimensions().height;},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop);}};var Selector=Class.create({initialize:function(A){this.expression=A.strip();if(this.shouldUseSelectorsAPI()){this.mode="selectorsAPI";}else{if(this.shouldUseXPath()){this.mode="xpath";this.compileXPathMatcher();}else{this.mode="normal";this.compileMatcher();}}},shouldUseXPath:function(){if(!Prototype.BrowserFeatures.XPath){return false;}var A=this.expression;if(Prototype.Browser.WebKit&&(A.include("-of-type")||A.include(":empty"))){return false;}if((/(\[[\w-]*?:|:checked)/).test(A)){return false;}return true;},shouldUseSelectorsAPI:function(){if(!Prototype.BrowserFeatures.SelectorsAPI){return false;}if(!Selector._div){Selector._div=new Element("div");}try{Selector._div.querySelector(this.expression);}catch(A){return false;}return true;},compileMatcher:function(){var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m;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 in ps){p=ps[i];if(m=e.match(p)){this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m));e=e.replace(m[0],"");break;}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher;},compileXPathMatcher:function(){var E=this.expression,F=Selector.patterns,B=Selector.xpath,D,A;if(Selector._cache[E]){this.xpath=Selector._cache[E];return ;}this.matcher=[".//*"];while(E&&D!=E&&(/\S/).test(E)){D=E;for(var C in F){if(A=E.match(F[C])){this.matcher.push(Object.isFunction(B[C])?B[C](A):new Template(B[C]).evaluate(A));E=E.replace(A[0],"");break;}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath;},findElements:function(A){A=A||document;var C=this.expression,B;switch(this.mode){case"selectorsAPI":if(A!==document){var D=A.id,E=$(A).identify();C="#"+E+" "+C;}B=$A(A.querySelectorAll(C)).map(Element.extend);A.id=D;return B;case"xpath":return document._getElementsByXPath(this.xpath,A);default:return this.matcher(A);}},match:function(H){this.tokens=[];var L=this.expression,A=Selector.patterns,E=Selector.assertions;var B,D,F;while(L&&B!==L&&(/\S/).test(L)){B=L;for(var I in A){D=A[I];if(F=L.match(D)){if(E[I]){this.tokens.push([I,Object.clone(F)]);L=L.replace(F[0],"");}else{return this.findElements(document).include(H);}}}}var K=true,C,J;for(var I=0,G;G=this.tokens[I];I++){C=G[0],J=G[1];if(!Selector.assertions[C](H,J)){K=false;break;}}return K;},toString:function(){return this.expression;},inspect:function(){return"#<Selector:"+this.expression.inspect()+">";}});Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(A){if(A[1]=="*"){return"";}return"[local-name()='"+A[1].toLowerCase()+"' or local-name()='"+A[1].toUpperCase()+"']";},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(A){A[1]=A[1].toLowerCase();return new Template("[@#{1}]").evaluate(A);},attr:function(A){A[1]=A[1].toLowerCase();A[3]=A[5]||A[6];return new Template(Selector.xpath.operators[A[2]]).evaluate(A);},pseudo:function(A){var B=Selector.xpath.pseudos[A[1]];if(!B){return"";}if(Object.isFunction(B)){return B(A);}return new Template(Selector.xpath.pseudos[A[1]]).evaluate(A);},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(B){var H=B[6],G=Selector.patterns,A=Selector.xpath,E,C;var F=[];while(H&&E!=H&&(/\S/).test(H)){E=H;for(var D in G){if(B=H.match(G[D])){C=Object.isFunction(A[D])?A[D](B):new Template(A[D]).evaluate(B);F.push("("+C.substring(1,C.length-1)+")");H=H.replace(B[0],"");break;}}}return"[not("+F.join(" and ")+")]";},"nth-child":function(A){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",A);},"nth-last-child":function(A){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",A);},"nth-of-type":function(A){return Selector.xpath.pseudos.nth("position() ",A);},"nth-last-of-type":function(A){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",A);},"first-of-type":function(A){A[6]="1";return Selector.xpath.pseudos["nth-of-type"](A);},"last-of-type":function(A){A[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](A);},"only-of-type":function(A){var B=Selector.xpath.pseudos;return B["first-of-type"](A)+B["last-of-type"](A);},nth:function(E,C){var F,G=C[6],B;if(G=="even"){G="2n+0";}if(G=="odd"){G="2n+1";}if(F=G.match(/^(\d+)$/)){return"["+E+"= "+F[1]+"]";}if(F=G.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(F[1]=="-"){F[1]=-1;}var D=F[1]?Number(F[1]):1;var A=F[2]?Number(F[2]):0;B="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(B).evaluate({fragment:E,a:D,b:A});}}}},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(A){A[3]=(A[5]||A[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(A);},pseudo:function(A){if(A[6]){A[6]=A[6].replace(/"/g,'\\"');}return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(A);},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:{laterSibling:/^\s*~\s*/,child:/^\s*>\s*/,adjacent:/^\s*\+\s*/,descendant:/^\s/,tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,id:/^#([\w\-\*]+)(\b|$)/,className:/^\.([\w\-\*]+)(\b|$)/,pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,attrPresence:/^\[((?:[\w]+:)?[\w]+)\]/,attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/},assertions:{tagName:function(A,B){return B[1].toUpperCase()==A.tagName.toUpperCase();},className:function(A,B){return Element.hasClassName(A,B[1]);},id:function(A,B){return A.id===B[1];},attrPresence:function(A,B){return Element.hasAttribute(A,B[1]);},attr:function(B,C){var A=Element.readAttribute(B,C[1]);return A&&Selector.operators[C[2]](A,C[5]||C[6]);}},handlers:{concat:function(B,A){for(var C=0,D;D=A[C];C++){B.push(D);}return B;},mark:function(A){var D=Prototype.emptyFunction;for(var B=0,C;C=A[B];B++){C._countedByPrototype=D;}return A;},unmark:function(A){for(var B=0,C;C=A[B];B++){C._countedByPrototype=undefined;}return A;},index:function(A,D,G){A._countedByPrototype=Prototype.emptyFunction;if(D){for(var B=A.childNodes,E=B.length-1,C=1;E>=0;E--){var F=B[E];if(F.nodeType==1&&(!G||F._countedByPrototype)){F.nodeIndex=C++;}}}else{for(var E=0,C=1,B=A.childNodes;F=B[E];E++){if(F.nodeType==1&&(!G||F._countedByPrototype)){F.nodeIndex=C++;}}}},unique:function(B){if(B.length==0){return B;}var D=[],E;for(var C=0,A=B.length;C<A;C++){if(!(E=B[C])._countedByPrototype){E._countedByPrototype=Prototype.emptyFunction;D.push(Element.extend(E));}}return Selector.handlers.unmark(D);},descendant:function(A){var D=Selector.handlers;for(var C=0,B=[],E;E=A[C];C++){D.concat(B,E.getElementsByTagName("*"));}return B;},child:function(A){var E=Selector.handlers;for(var D=0,C=[],F;F=A[D];D++){for(var B=0,G;G=F.childNodes[B];B++){if(G.nodeType==1&&G.tagName!="!"){C.push(G);}}}return C;},adjacent:function(A){for(var C=0,B=[],E;E=A[C];C++){var D=this.nextElementSibling(E);if(D){B.push(D);}}return B;},laterSibling:function(A){var D=Selector.handlers;for(var C=0,B=[],E;E=A[C];C++){D.concat(B,Element.nextSiblings(E));}return B;},nextElementSibling:function(A){while(A=A.nextSibling){if(A.nodeType==1){return A;}}return null;},previousElementSibling:function(A){while(A=A.previousSibling){if(A.nodeType==1){return A;}}return null;},tagName:function(A,H,C,B){var I=C.toUpperCase();var E=[],G=Selector.handlers;if(A){if(B){if(B=="descendant"){for(var F=0,D;D=A[F];F++){G.concat(E,D.getElementsByTagName(C));}return E;}else{A=this[B](A);}if(C=="*"){return A;}}for(var F=0,D;D=A[F];F++){if(D.tagName.toUpperCase()===I){E.push(D);}}return E;}else{return H.getElementsByTagName(C);}},id:function(B,A,H,F){var G=$(H),D=Selector.handlers;if(!G){return[];}if(!B&&A==document){return[G];}if(B){if(F){if(F=="child"){for(var C=0,E;E=B[C];C++){if(G.parentNode==E){return[G];}}}else{if(F=="descendant"){for(var C=0,E;E=B[C];C++){if(Element.descendantOf(G,E)){return[G];}}}else{if(F=="adjacent"){for(var C=0,E;E=B[C];C++){if(Selector.handlers.previousElementSibling(G)==E){return[G];}}}else{B=D[F](B);}}}}for(var C=0,E;E=B[C];C++){if(E==G){return[G];}}return[];}return(G&&Element.descendantOf(G,A))?[G]:[];},className:function(B,A,C,D){if(B&&D){B=this[D](B);}return Selector.handlers.byClassName(B,A,C);},byClassName:function(C,B,F){if(!C){C=Selector.handlers.descendant([B]);}var H=" "+F+" ";for(var E=0,D=[],G,A;G=C[E];E++){A=G.className;if(A.length==0){continue;}if(A==F||(" "+A+" ").include(H)){D.push(G);}}return D;},attrPresence:function(C,B,A,G){if(!C){C=B.getElementsByTagName("*");}if(C&&G){C=this[G](C);}var E=[];for(var D=0,F;F=C[D];D++){if(Element.hasAttribute(F,A)){E.push(F);}}return E;},attr:function(A,I,H,J,C,B){if(!A){A=I.getElementsByTagName("*");}if(A&&B){A=this[B](A);}var K=Selector.operators[C],F=[];for(var E=0,D;D=A[E];E++){var G=Element.readAttribute(D,H);if(G===null){continue;}if(K(G,J)){F.push(D);}}return F;},pseudo:function(B,C,E,A,D){if(B&&D){B=this[D](B);}if(!B){B=A.getElementsByTagName("*");}return Selector.pseudos[C](B,E,A);}},pseudos:{"first-child":function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(Selector.handlers.previousElementSibling(E)){continue;}C.push(E);}return C;},"last-child":function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(Selector.handlers.nextElementSibling(E)){continue;}C.push(E);}return C;},"only-child":function(B,G,A){var E=Selector.handlers;for(var D=0,C=[],F;F=B[D];D++){if(!E.previousElementSibling(F)&&!E.nextElementSibling(F)){C.push(F);}}return C;},"nth-child":function(B,C,A){return Selector.pseudos.nth(B,C,A);},"nth-last-child":function(B,C,A){return Selector.pseudos.nth(B,C,A,true);},"nth-of-type":function(B,C,A){return Selector.pseudos.nth(B,C,A,false,true);},"nth-last-of-type":function(B,C,A){return Selector.pseudos.nth(B,C,A,true,true);},"first-of-type":function(B,C,A){return Selector.pseudos.nth(B,"1",A,false,true);},"last-of-type":function(B,C,A){return Selector.pseudos.nth(B,"1",A,true,true);},"only-of-type":function(B,D,A){var C=Selector.pseudos;return C["last-of-type"](C["first-of-type"](B,D,A),D,A);},getIndices:function(B,A,C){if(B==0){return A>0?[A]:[];}return $R(1,C).inject([],function(D,E){if(0==(E-A)%B&&(E-A)/B>=0){D.push(E);}return D;});},nth:function(A,L,N,K,C){if(A.length==0){return[];}if(L=="even"){L="2n+0";}if(L=="odd"){L="2n+1";}var J=Selector.handlers,I=[],B=[],E;J.mark(A);for(var H=0,D;D=A[H];H++){if(!D.parentNode._countedByPrototype){J.index(D.parentNode,K,C);B.push(D.parentNode);}}if(L.match(/^\d+$/)){L=Number(L);for(var H=0,D;D=A[H];H++){if(D.nodeIndex==L){I.push(D);}}}else{if(E=L.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(E[1]=="-"){E[1]=-1;}var O=E[1]?Number(E[1]):1;var M=E[2]?Number(E[2]):0;var P=Selector.pseudos.getIndices(O,M,A.length);for(var H=0,D,F=P.length;D=A[H];H++){for(var G=0;G<F;G++){if(D.nodeIndex==P[G]){I.push(D);}}}}}J.unmark(A);J.unmark(B);return I;},empty:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(E.tagName=="!"||E.firstChild){continue;}C.push(E);}return C;},not:function(A,D,I){var G=Selector.handlers,J,C;var H=new Selector(D).findElements(I);G.mark(H);for(var F=0,E=[],B;B=A[F];F++){if(!B._countedByPrototype){E.push(B);}}G.unmark(H);return E;},enabled:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(!E.disabled&&(!E.type||E.type!=="hidden")){C.push(E);}}return C;},disabled:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(E.disabled){C.push(E);}}return C;},checked:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(E.checked){C.push(E);}}return C;}},operators:{"=":function(B,A){return B==A;},"!=":function(B,A){return B!=A;},"^=":function(B,A){return B==A||B&&B.startsWith(A);},"$=":function(B,A){return B==A||B&&B.endsWith(A);},"*=":function(B,A){return B==A||B&&B.include(A);},"$=":function(B,A){return B.endsWith(A);},"*=":function(B,A){return B.include(A);},"~=":function(B,A){return(" "+B+" ").include(" "+A+" ");},"|=":function(B,A){return("-"+(B||"").toUpperCase()+"-").include("-"+(A||"").toUpperCase()+"-");}},split:function(B){var A=[];B.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(C){A.push(C[1].strip());});return A;},matchElements:function(F,G){var E=$$(G),D=Selector.handlers;D.mark(E);for(var C=0,B=[],A;A=F[C];C++){if(A._countedByPrototype){B.push(A);}}D.unmark(E);return B;},findElement:function(B,C,A){if(Object.isNumber(C)){A=C;C=false;}return Selector.matchElements(B,C||"*")[A||0];},findChildElements:function(E,G){G=Selector.split(G.join(","));var D=[],F=Selector.handlers;for(var C=0,B=G.length,A;C<B;C++){A=new Selector(G[C].strip());F.concat(D,A.findElements(E));}return(B>1)?F.unique(D):D;}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(B,A){for(var C=0,D;D=A[C];C++){if(D.tagName!=="!"){B.push(D);}}return B;},unmark:function(A){for(var B=0,C;C=A[B];B++){C.removeAttribute("_countedByPrototype");}return A;}});}function $$(){return Selector.findChildElements(document,$A(arguments));}var Form={reset:function(A){$(A).reset();return A;},serializeElements:function(G,B){if(typeof B!="object"){B={hash:!!B};}else{if(Object.isUndefined(B.hash)){B.hash=true;}}var C,F,A=false,E=B.submit;var D=G.inject({},function(H,I){if(!I.disabled&&I.name){C=I.name;F=$(I).getValue();if(F!=null&&I.type!="file"&&(I.type!="submit"||(!A&&E!==false&&(!E||C==E)&&(A=true)))){if(C in H){if(!Object.isArray(H[C])){H[C]=[H[C]];}H[C].push(F);}else{H[C]=F;}}}return H;});return B.hash?D:Object.toQueryString(D);}};Form.Methods={serialize:function(B,A){return Form.serializeElements(Form.getElements(B),A);},getElements:function(A){return $A($(A).getElementsByTagName("*")).inject([],function(B,C){if(Form.Element.Serializers[C.tagName.toLowerCase()]){B.push(Element.extend(C));}return B;});},getInputs:function(G,C,D){G=$(G);var A=G.getElementsByTagName("input");if(!C&&!D){return $A(A).map(Element.extend);}for(var E=0,H=[],F=A.length;E<F;E++){var B=A[E];if((C&&B.type!=C)||(D&&B.name!=D)){continue;}H.push(Element.extend(B));}return H;},disable:function(A){A=$(A);Form.getElements(A).invoke("disable");return A;},enable:function(A){A=$(A);Form.getElements(A).invoke("enable");return A;},findFirstElement:function(B){var C=$(B).getElements().findAll(function(D){return"hidden"!=D.type&&!D.disabled;});var A=C.findAll(function(D){return D.hasAttribute("tabIndex")&&D.tabIndex>=0;}).sortBy(function(D){return D.tabIndex;}).first();return A?A:C.find(function(D){return["input","select","textarea"].include(D.tagName.toLowerCase());});},focusFirstElement:function(A){A=$(A);A.findFirstElement().activate();return A;},request:function(B,A){B=$(B),A=Object.clone(A||{});var D=A.parameters,C=B.readAttribute("action")||"";if(C.blank()){C=window.location.href;}A.parameters=B.serialize(true);if(D){if(Object.isString(D)){D=D.toQueryParams();}Object.extend(A.parameters,D);}if(B.hasAttribute("method")&&!A.method){A.method=B.method;}return new Ajax.Request(C,A);}};Form.Element={focus:function(A){$(A).focus();return A;},select:function(A){$(A).select();return A;}};Form.Element.Methods={serialize:function(A){A=$(A);if(!A.disabled&&A.name){var B=A.getValue();if(B!=undefined){var C={};C[A.name]=B;return Object.toQueryString(C);}}return"";},getValue:function(A){A=$(A);var B=A.tagName.toLowerCase();return Form.Element.Serializers[B](A);},setValue:function(A,B){A=$(A);var C=A.tagName.toLowerCase();Form.Element.Serializers[C](A,B);return A;},clear:function(A){$(A).value="";return A;},present:function(A){return $(A).value!="";},activate:function(A){A=$(A);try{A.focus();if(A.select&&(A.tagName.toLowerCase()!="input"||!["button","reset","submit"].include(A.type))){A.select();}}catch(B){}return A;},disable:function(A){A=$(A);A.disabled=true;return A;},enable:function(A){A=$(A);A.disabled=false;return A;}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(A,B){switch(A.type.toLowerCase()){case"checkbox":case"radio":return Form.Element.Serializers.inputSelector(A,B);default:return Form.Element.Serializers.textarea(A,B);}},inputSelector:function(A,B){if(Object.isUndefined(B)){return A.checked?A.value:null;}else{A.checked=!!B;}},textarea:function(A,B){if(Object.isUndefined(B)){return A.value;}else{A.value=B;}},select:function(C,F){if(Object.isUndefined(F)){return this[C.type=="select-one"?"selectOne":"selectMany"](C);}else{var B,D,G=!Object.isArray(F);for(var A=0,E=C.length;A<E;A++){B=C.options[A];D=this.optionValue(B);if(G){if(D==F){B.selected=true;return ;}}else{B.selected=F.include(D);}}}},selectOne:function(B){var A=B.selectedIndex;return A>=0?this.optionValue(B.options[A]):null;},selectMany:function(D){var A,E=D.length;if(!E){return null;}for(var C=0,A=[];C<E;C++){var B=D.options[C];if(B.selected){A.push(this.optionValue(B));}}return A;},optionValue:function(A){return Element.extend(A).hasAttribute("value")?A.value:A.text;}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,A,B,C){$super(C,B);this.element=$(A);this.lastValue=this.getValue();},execute:function(){var A=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(A)?this.lastValue!=A:String(this.lastValue)!=String(A)){this.callback(this.element,A);this.lastValue=A;}}});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(A,B){this.element=$(A);this.callback=B;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks();}else{this.registerCallback(this.element);}},onElementEvent:function(){var A=this.getValue();if(this.lastValue!=A){this.callback(this.element,A);this.lastValue=A;}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this);},registerCallback:function(A){if(A.type){switch(A.type.toLowerCase()){case"checkbox":case"radio":Event.observe(A,"click",this.onElementEvent.bind(this));break;default:Event.observe(A,"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);}});if(!window.Event){var Event={};}Object.extend(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:{},relatedTarget:function(B){var A;switch(B.type){case"mouseover":A=B.fromElement;break;case"mouseout":A=B.toElement;break;default:return null;}return Element.extend(A);}});Event.Methods=(function(){var A;if(Prototype.Browser.IE){var B={0:1,1:4,2:2};A=function(D,C){return D.button==B[C];};}else{if(Prototype.Browser.WebKit){A=function(D,C){switch(C){case 0:return D.which==1&&!D.metaKey;case 1:return D.which==1&&D.metaKey;default:return false;}};}else{A=function(D,C){return D.which?(D.which===C+1):(D.button===C);};}}return{isLeftClick:function(C){return A(C,0);},isMiddleClick:function(C){return A(C,1);},isRightClick:function(C){return A(C,2);},element:function(E){E=Event.extend(E);var D=E.target,C=E.type,F=E.currentTarget;if(F&&F.tagName){if(C==="load"||C==="error"||(C==="click"&&F.tagName.toLowerCase()==="input"&&F.type==="radio")){D=F;}}if(D.nodeType==Node.TEXT_NODE){D=D.parentNode;}return Element.extend(D);},findElement:function(D,F){var C=Event.element(D);if(!F){return C;}var E=[C].concat(C.ancestors());return Selector.findElement(E,F,0);},pointer:function(E){var D=document.documentElement,C=document.body||{scrollLeft:0,scrollTop:0};return{x:E.pageX||(E.clientX+(D.scrollLeft||C.scrollLeft)-(D.clientLeft||0)),y:E.pageY||(E.clientY+(D.scrollTop||C.scrollTop)-(D.clientTop||0))};},pointerX:function(C){return Event.pointer(C).x;},pointerY:function(C){return Event.pointer(C).y;},stop:function(C){Event.extend(C);C.preventDefault();C.stopPropagation();C.stopped=true;}};})();Event.extend=(function(){var A=Object.keys(Event.Methods).inject({},function(B,C){B[C]=Event.Methods[C].methodize();return B;});if(Prototype.Browser.IE){Object.extend(A,{stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.returnValue=false;},inspect:function(){return"[object Event]";}});return function(B){if(!B){return false;}if(B._extendedByPrototype){return B;}B._extendedByPrototype=Prototype.emptyFunction;var C=Event.pointer(B);Object.extend(B,{target:B.srcElement,relatedTarget:Event.relatedTarget(B),pageX:C.x,pageY:C.y});return Object.extend(B,A);};}else{Event.prototype=Event.prototype||document.createEvent("HTMLEvents")["__proto__"];Object.extend(Event.prototype,A);return Prototype.K;}})();Object.extend(Event,(function(){var B=Event.cache;function C(J){if(J._prototypeEventID){return J._prototypeEventID[0];}arguments.callee.id=arguments.callee.id||1;return J._prototypeEventID=[++arguments.callee.id];}function G(J){if(J&&J.include(":")){return"dataavailable";}return J;}function A(J){return B[J]=B[J]||{};}function F(L,J){var K=A(L);return K[J]=K[J]||[];}function H(K,J,L){var O=C(K);var N=F(O,J);if(N.pluck("handler").include(L)){return false;}var M=function(P){if(!Event||!Event.extend||(P.eventName&&P.eventName!=J)){return false;}Event.extend(P);L.call(K,P);};M.handler=L;N.push(M);return M;}function I(M,J,K){var L=F(M,J);return L.find(function(N){return N.handler==K;});}function D(M,J,K){var L=A(M);if(!L[J]){return false;}L[J]=L[J].without(I(M,J,K));}function E(){for(var K in B){for(var J in B[K]){B[K][J]=null;}}}if(window.attachEvent){window.attachEvent("onunload",E);}if(Prototype.Browser.WebKit){window.addEventListener("unload",Prototype.emptyFunction,false);}return{observe:function(L,J,M){L=$(L);var K=G(J);var N=H(L,J,M);if(!N){return L;}if(L.addEventListener){L.addEventListener(K,N,false);}else{L.attachEvent("on"+K,N);}return L;},stopObserving:function(L,J,M){L=$(L);var O=C(L),K=G(J);if(!M&&J){F(O,J).each(function(P){L.stopObserving(J,P.handler);});return L;}else{if(!J){Object.keys(A(O)).each(function(P){L.stopObserving(P);});return L;}}var N=I(O,J,M);if(!N){return L;}if(L.removeEventListener){L.removeEventListener(K,N,false);}else{L.detachEvent("on"+K,N);}D(O,J,M);return L;},fire:function(L,K,J){L=$(L);if(L==document&&document.createEvent&&!L.dispatchEvent){L=document.documentElement;}var M;if(document.createEvent){M=document.createEvent("HTMLEvents");M.initEvent("dataavailable",true,true);}else{M=document.createEventObject();M.eventType="ondataavailable";}M.eventName=K;M.memo=J||{};if(document.createEvent){L.dispatchEvent(M);}else{L.fireEvent(M.eventType,M);}return Event.extend(M);}};})());Object.extend(Event,Event.Methods);Element.addMethods({fire:Event.fire,observe:Event.observe,stopObserving:Event.stopObserving});Object.extend(document,{fire:Element.Methods.fire.methodize(),observe:Element.Methods.observe.methodize(),stopObserving:Element.Methods.stopObserving.methodize(),loaded:false});(function(){var B;function A(){if(document.loaded){return ;}if(B){window.clearInterval(B);}document.fire("dom:loaded");document.loaded=true;}if(document.addEventListener){if(Prototype.Browser.WebKit){B=window.setInterval(function(){if(/loaded|complete/.test(document.readyState)){A();}},0);Event.observe(window,"load",A);}else{document.addEventListener("DOMContentLoaded",A,false);}}else{document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");$("__onDOMContentLoaded").onreadystatechange=function(){if(this.readyState=="complete"){this.onreadystatechange=null;A();}};}})();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(A,B){return Element.insert(A,{before:B});},Top:function(A,B){return Element.insert(A,{top:B});},Bottom:function(A,B){return Element.insert(A,{bottom:B});},After:function(A,B){return Element.insert(A,{after:B});}};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(B,A,C){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(B,A,C);}this.xcomp=A;this.ycomp=C;this.offset=Element.cumulativeOffset(B);return(C>=this.offset[1]&&C<this.offset[1]+B.offsetHeight&&A>=this.offset[0]&&A<this.offset[0]+B.offsetWidth);},withinIncludingScrolloffsets:function(B,A,D){var C=Element.cumulativeScrollOffset(B);this.xcomp=A+C[0]-this.deltaX;this.ycomp=D+C[1]-this.deltaY;this.offset=Element.cumulativeOffset(B);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+B.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+B.offsetWidth);},overlap:function(B,A){if(!B){return 0;}if(B=="vertical"){return((this.offset[1]+A.offsetHeight)-this.ycomp)/A.offsetHeight;}if(B=="horizontal"){return((this.offset[0]+A.offsetWidth)-this.xcomp)/A.offsetWidth;}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(A){Position.prepare();return Element.absolutize(A);},relativize:function(A){Position.prepare();return Element.relativize(A);},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(B,C,A){A=A||{};return Element.clonePosition(C,B,A);}};if(!document.getElementsByClassName){document.getElementsByClassName=function(B){function A(C){return C.blank()?null:"[contains(concat(' ', @class, ' '), ' "+C+" ')]";}B.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(C,E){E=E.toString().strip();var D=/\s/.test(E)?$w(E).map(A).join(""):A(E);return D?document._getElementsByXPath(".//*"+D,C):[];}:function(E,F){F=F.toString().strip();var G=[],H=(/\s/.test(F)?$w(F):null);if(!H&&!F){return G;}var C=$(E).getElementsByTagName("*");F=" "+F+" ";for(var D=0,J,I;J=C[D];D++){if(J.className&&(I=" "+J.className+" ")&&(I.include(F)||(H&&H.all(function(K){return !K.toString().blank()&&I.include(" "+K+" ");})))){G.push(Element.extend(J));}}return G;};return function(D,C){return $(C||document.body).getElementsByClassName(D);};}(Element.Methods);}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(A){this.element=$(A);},_each:function(A){this.element.className.split(/\s+/).select(function(B){return B.length>0;})._each(A);},set:function(A){this.element.className=A;},add:function(A){if(this.include(A)){return ;}this.set($A(this).concat(A).join(" "));},remove:function(A){if(!this.include(A)){return ;}this.set($A(this).without(A).join(" "));},toString:function(){return $A(this).join(" ");}};Object.extend(Element.ClassNames.prototype,Enumerable);Element.addMethods();Object.extend(Event,{_domReady:function(){if(arguments.callee.done){return ;}arguments.callee.done=true;if(this._timer){clearInterval(this._timer);}this._readyCallbacks.each(function(A){A();});this._readyCallbacks=null;},onDOMReady:function(f){if(!this._readyCallbacks){var domReady=this._domReady.bind(this);if(document.addEventListener){document.addEventListener("DOMContentLoaded",domReady,false);
/*@cc_on @*/
/*@if (@_win32)
            document.write("<script id=__ie_onload defer src='/javascripts/blank.html'><\/script>");
            document.getElementById("__ie_onload").onreadystatechange = function() {
                if (this.readyState == "complete") domReady();
            };
        /*@end @*/
}if(/WebKit/i.test(navigator.userAgent)){this._timer=setInterval(function(){if(/loaded|complete/.test(document.readyState)){domReady();}},10);}Event.observe(window,"load",domReady);Event._readyCallbacks=[];}Event._readyCallbacks.push(f);}});


var Scriptaculous = {
  Version: '1.8.2',
  require: function(libraryName) {
    document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
  },
  REQUIRED_PROTOTYPE: '1.6.0.3',
  load: function() {
    function convertVersionString(versionString) {
      var v = versionString.replace(/_.*|\./g, '');
      v = parseInt(v + '0'.times(4-v.length));
      return versionString.indexOf('_') > -1 ? v-1 : v;
    }

    if((typeof Prototype=='undefined') ||
       (typeof Element == 'undefined') ||
       (typeof Element.Methods=='undefined') ||
       (convertVersionString(Prototype.Version) <
        convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
       throw("script.aculo.us requires the Prototype JavaScript framework >= " +
        Scriptaculous.REQUIRED_PROTOTYPE);

    var js = /scriptaculous\.js(\?.*)?$/;
    $$('head script[src]').findAll(function(s) {
      return s.src.match(js);
    }).each(function(s) {
      var path = s.src.replace(js, ''),
      includes = s.src.match(/\?.*load=([a-z,]*)/);
      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
       function(include) { Scriptaculous.require(path+include+'.js') });
    });
  }
};


var Builder = {
  NODEMAP: {
    AREA: 'map',
    CAPTION: 'table',
    COL: 'table',
    COLGROUP: 'table',
    LEGEND: 'fieldset',
    OPTGROUP: 'select',
    OPTION: 'select',
    PARAM: 'object',
    TBODY: 'table',
    TD: 'table',
    TFOOT: 'table',
    TH: 'table',
    THEAD: 'table',
    TR: 'table'
  },
  node: function(elementName) {
    elementName = elementName.toUpperCase();

    var parentTag = this.NODEMAP[elementName] || 'div';
    var parentElement = document.createElement(parentTag);
    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
    } catch(e) {}
    var element = parentElement.firstChild || null;

    if(element && (element.tagName.toUpperCase() != elementName))
      element = element.getElementsByTagName(elementName)[0];

    if(!element) element = document.createElement(elementName);

    if(!element) return;

    if(arguments[1])
      if(this._isStringOrNumber(arguments[1]) ||
        (arguments[1] instanceof Array) ||
        arguments[1].tagName) {
          this._children(element, arguments[1]);
        } else {
          var attrs = this._attributes(arguments[1]);
          if(attrs.length) {
            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
              parentElement.innerHTML = "<" +elementName + " " +
                attrs + "></" + elementName + ">";
            } catch(e) {}
            element = parentElement.firstChild || null;
            if(!element) {
              element = document.createElement(elementName);
              for(attr in arguments[1])
                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
            }
            if(element.tagName.toUpperCase() != elementName)
              element = parentElement.getElementsByTagName(elementName)[0];
          }
        }

    if(arguments[2])
      this._children(element, arguments[2]);

     return $(element);
  },
  _text: function(text) {
     return document.createTextNode(text);
  },

  ATTR_MAP: {
    'className': 'class',
    'htmlFor': 'for'
  },

  _attributes: function(attributes) {
    var attrs = [];
    for(attribute in attributes)
      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
          '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
    return attrs.join(" ");
  },
  _children: function(element, children) {
    if(children.tagName) {
      element.appendChild(children);
      return;
    }
    if(typeof children=='object') { // array can hold nodes and text
      children.flatten().each( function(e) {
        if(typeof e=='object')
          element.appendChild(e);
        else
          if(Builder._isStringOrNumber(e))
            element.appendChild(Builder._text(e));
      });
    } else
      if(Builder._isStringOrNumber(children))
        element.appendChild(Builder._text(children));
  },
  _isStringOrNumber: function(param) {
    return(typeof param=='string' || typeof param=='number');
  },
  build: function(html) {
    var element = this.node('div');
    $(element).update(html.strip());
    return element.down();
  },
  dump: function(scope) {
    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope

    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);

    tags.each( function(tag){
      scope[tag] = function() {
        return Builder.node.apply(Builder, [tag].concat($A(arguments)));
      };
    });
  }
};


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.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
};

Element.setContentZoom = function(element, percent) {
  element = $(element);
  element.setStyle({fontSize: (percent/100) + 'em'});
  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
  return element;
};

Element.getInlineOpacity = function(element){
  return $(element).style.opacity || '';
};

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  Transitions: {
    linear: Prototype.K,
    sinoidal: function(pos) {
      return (-Math.cos(pos*Math.PI)/2) + .5;
    },
    reverse: function(pos) {
      return 1-pos;
    },
    flicker: function(pos) {
      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
      return pos > 1 ? 1 : pos;
    },
    wobble: function(pos) {
      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
    },
    pulse: function(pos, pulses) {
      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
    },
    spring: function(pos) {
      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
    },
    none: function(pos) {
      return 0;
    },
    full: function(pos) {
      return 1;
    }
  },
  DefaultOptions: {
    duration:   1.0,   // seconds
    fps:        100,   // 100= assume 66fps max.
    sync:       false, // true for combining
    from:       0.0,
    to:         1.0,
    delay:      0.0,
    queue:      'parallel'
  },
  tagifyText: function(element) {
    var tagifyStyle = 'position:relative';
    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';

    element = $(element);
    $A(element.childNodes).each( function(child) {
      if (child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            new Element('span', {style: tagifyStyle}).update(
              character == ' ' ? String.fromCharCode(160) : character),
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if (((typeof element == 'object') ||
        Object.isFunction(element)) &&
       (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'), limit: 1 }
    }, arguments[2] || { });
    Effect[element.visible() ?
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create(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 = Object.isString(effect.options.queue) ?
      effect.options.queue : effect.options.queue.position;

    switch(position) {
      case 'front':
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }

    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);

    if (!this.interval)
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  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();
    for(var i=0, len=this.effects.length;i<len;i++)
      this.effects[i] && this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if (!Object.isString(queueName)) return queueName;

    return this.instances.get(queueName) ||
      this.instances.set(queueName, new Effect.ScopedQueue());
  }
};
Effect.Queue = Effect.Queues.get('global');

Effect.Base = Class.create({
  position: null,
  start: function(options) {
    function codeForEvent(options,eventName){
      return (
        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
      );
    }
    if (options && options.transition === false) options.transition = Effect.Transitions.linear;
    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.fromToDelta  = this.options.to-this.options.from;
    this.totalTime    = this.finishOn-this.startOn;
    this.totalFrames  = this.options.fps*this.options.duration;

    this.render = (function() {
      function dispatch(effect, eventName) {
        if (effect.options[eventName + 'Internal'])
          effect.options[eventName + 'Internal'](effect);
        if (effect.options[eventName])
          effect.options[eventName](effect);
      }

      return function(pos) {
        if (this.state === "idle") {
          this.state = "running";
          dispatch(this, 'beforeSetup');
          if (this.setup) this.setup();
          dispatch(this, 'afterSetup');
        }
        if (this.state === "running") {
          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
          this.position = pos;
          dispatch(this, 'beforeUpdate');
          if (this.update) this.update(pos);
          dispatch(this, 'afterUpdate');
        }
      };
    })();

    this.event('beforeStart');
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        '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.totalTime,
          frame = (pos * this.totalFrames).round();
      if (frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  cancel: function() {
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        '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() {
    var data = $H();
    for(property in this)
      if (!Object.isFunction(this[property])) data.set(property, this[property]);
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
});

Effect.Parallel = Class.create(Effect.Base, {
  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.Tween = Class.create(Effect.Base, {
  initialize: function(object, from, to) {
    object = Object.isString(object) ? $(object) : object;
    var args = $A(arguments), method = args.last(),
      options = args.length == 5 ? args[3] : null;
    this.method = Object.isFunction(method) ? method.bind(object) :
      Object.isFunction(object[method]) ? object[method].bind(object) :
      function(value) { object[method] = value };
    this.start(Object.extend({ from: from, to: to }, options || { }));
  },
  update: function(position) {
    this.method(position);
  }
});

Effect.Event = Class.create(Effect.Base, {
  initialize: function() {
    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || { });
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if (this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: (this.options.x  * position + this.originalLeft).round() + 'px',
      top:  (this.options.y  * position + this.originalTop).round()  + 'px'
    });
  }
});

Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element,
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
};

Effect.Scale = Class.create(Effect.Base, {
  initialize: function(element, percent) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    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 = this.element.getStyle('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 = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].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)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = { };
    if (this.options.scaleX) d.width = width.round() + 'px';
    if (this.options.scaleY) d.height = height.round() + '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';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    if (this.element.getStyle('display')=='none') { this.cancel(); return; }
    this.oldStyle = { };
    if (!this.options.keepBackgroundImage) {
      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
      this.element.setStyle({backgroundImage: 'none'});
    }
    if (!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if (!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    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) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = function(element) {
  var options = arguments[1] || { },
  scrollOffsets = document.viewport.getScrollOffsets(),
  elementOffsets = $(element).cumulativeOffset();

  if (options.offset) elementOffsets[1] += options.offset;

  return new Effect.Tween(null,
    scrollOffsets.top,
    elementOffsets[1],
    options,
    function(p){ scrollTo(scrollOffsets.left, p.round()); }
  );
};

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
    from: element.getOpacity() || 1.0,
    to:   0.0,
    afterFinishInternal: function(effect) {
      if (effect.options.to!=0) return;
      effect.element.hide().setStyle({opacity: oldOpacity});
    }
  }, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Appear = function(element) {
  element = $(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from).show();
  }}, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = {
    opacity: element.getInlineOpacity(),
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  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) {
        Position.absolutize(effect.effects[0].element);
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide().setStyle(oldStyle); }
     }, arguments[1] || { })
   );
};

Effect.BlindUp = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false,
      scaleX: false,
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      }
    }, arguments[1] || { })
  );
};

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  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) {
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || { }));
};

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    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) {
          effect.element.makePositioned().makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
        }
      });
    }
  }, arguments[1] || { }));
};

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  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) {
          effect.effects[0].element.makePositioned();
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
        }
      }, arguments[1] || { }));
};

Effect.Shake = function(element) {
  element = $(element);
  var options = Object.extend({
    distance: 20,
    duration: 0.5
  }, arguments[1] || {});
  var distance = parseFloat(options.distance);
  var split = parseFloat(options.duration) / 10.0;
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element,
      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
        effect.element.undoPositioned().setStyle(oldStyle);
  }}); }}); }}); }}); }}); }});
};

Effect.SlideDown = function(element) {
  element = $(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || { })
  );
};

Effect.SlideUp = function(element) {
  element = $(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false,
    scaleX: false,
    scaleMode: 'box',
    scaleFrom: 100,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
    }
   }, arguments[1] || { })
  );
};

Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, {
    restoreAfterFinish: true,
    beforeSetup: function(effect) {
      effect.element.makeClipping();
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping();
    }
  });
};

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: 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() };

  var dims = element.getDimensions();
  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) {
      effect.element.hide().makeClipping().makePositioned();
    },
    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) {
               effect.effects[0].element.setStyle({height: '0px'}).show();
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
             }
           }, options)
      );
    }
  });
};

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: 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() };

  var dims = element.getDimensions();
  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) {
           effect.effects[0].element.makePositioned().makeClipping();
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
       }, options)
  );
};

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || { },
    oldOpacity = element.getInlineOpacity(),
    transition = options.transition || Effect.Transitions.linear,
    reverser   = function(pos){
      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
    };

  return new Effect.Opacity(element,
    Object.extend(Object.extend({  duration: 2.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({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();
  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) {
        effect.element.hide().undoClipping().setStyle(oldStyle);
      } });
  }}, arguments[1] || { }));
};

Effect.Morph = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: { }
    }, arguments[1] || { });

    if (!Object.isString(options.style)) this.style = $H(options.style);
    else {
      if (options.style.include(':'))
        this.style = options.style.parseStyle();
      else {
        this.element.addClassName(options.style);
        this.style = $H(this.element.getStyles());
        this.element.removeClassName(options.style);
        var css = this.element.getStyles();
        this.style = this.style.reject(function(style) {
          return style.value == css[style.key];
        });
        options.afterFinishInternal = function(effect) {
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            effect.element.style[transform.style] = '';
          });
        };
      }
    }
    this.start(options);
  },

  setup: function(){
    function parseColor(color){
      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
      color = color.parseColor();
      return $R(0,2).map(function(i){
        return parseInt( color.slice(i*2+1,i*2+3), 16 );
      });
    }
    this.transforms = this.style.map(function(pair){
      var property = pair[0], value = pair[1], unit = null;

      if (value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if (property == 'opacity') {
        value = parseFloat(value);
        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
          this.element.setStyle({zoom: 1});
      } else if (Element.CSS_LENGTH.test(value)) {
          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
          value = parseFloat(components[1]);
          unit = (components.length == 3) ? components[2] : null;
      }

      var originalValue = this.element.getStyle(property);
      return {
        style: property.camelize(),
        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
        targetValue: unit=='color' ? parseColor(value) : value,
        unit: unit
      };
    }.bind(this)).reject(function(transform){
      return (
        (transform.originalValue == transform.targetValue) ||
        (
          transform.unit != 'color' &&
          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
        )
      );
    });
  },
  update: function(position) {
    var style = { }, transform, i = this.transforms.length;
    while(i--)
      style[(transform = this.transforms[i]).style] =
        transform.unit=='color' ? '#'+
          (Math.round(transform.originalValue[0]+
            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
          (Math.round(transform.originalValue[1]+
            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
          (Math.round(transform.originalValue[2]+
            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
        (transform.originalValue +
          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
            (transform.unit === null ? '' : transform.unit);
    this.element.setStyle(style, true);
  }
});

Effect.Transform = Class.create({
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || { };
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      track = $H(track);
      var data = track.values().first();
      this.tracks.push($H({
        ids:     track.keys().first(),
        effect:  Effect.Morph,
        options: { style: data }
      }));
    }.bind(this));
    return this;
  },
  play: function(){
    return new Effect.Parallel(
      this.tracks.map(function(track){
        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
        var elements = [$(ids) || $$(ids)].flatten();
        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
      }).flatten(),
      this.options
    );
  }
});

Element.CSS_PROPERTIES = $w(
  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  'fontSize fontWeight height left letterSpacing lineHeight ' +
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  'right textIndent top width wordSpacing zIndex');

Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.__parseStyleElement = document.createElement('div');
String.prototype.parseStyle = function(){
  var style, styleRules = $H();
  if (Prototype.Browser.WebKit)
    style = new Element('div',{style:this}).style;
  else {
    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
    style = String.__parseStyleElement.childNodes[0].style;
  }

  Element.CSS_PROPERTIES.each(function(property){
    if (style[property]) styleRules.set(property, style[property]);
  });

  if (Prototype.Browser.IE && this.include('opacity'))
    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);

  return styleRules;
};

if (document.defaultView && document.defaultView.getComputedStyle) {
  Element.getStyles = function(element) {
    var css = document.defaultView.getComputedStyle($(element), null);
    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
      styles[property] = css[property];
      return styles;
    });
  };
} else {
  Element.getStyles = function(element) {
    element = $(element);
    var css = element.currentStyle, styles;
    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
      results[property] = css[property];
      return results;
    });
    if (!styles.opacity) styles.opacity = element.getOpacity();
    return styles;
  };
}

Effect.Methods = {
  morph: function(element, style) {
    element = $(element);
    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
    return element;
  },
  visualEffect: function(element, effect, options) {
    element = $(element);
    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
    new Effect[klass](element, options);
    return element;
  },
  highlight: function(element, options) {
    element = $(element);
    new Effect.Highlight(element, options);
    return element;
  }
};

$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
  'pulsate shake puff squish switchOff dropOut').each(
  function(effect) {
    Effect.Methods[effect] = function(element, options){
      element = $(element);
      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
      return element;
    };
  }
);

$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
  function(f) { Effect.Methods[f] = Element[f]; }
);

Element.addMethods(Effect.Methods);


if(Object.isUndefined(Effect))
  throw("dragdrop.js requires including script.aculo.us' effects.js library");

var Droppables = {
  drops: [],

  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },

  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null,
      tree:       false
    }, arguments[1] || { });

    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if(Object.isArray(containment)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }

    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },

  findDeepestChild: function(drops) {
    deepest = drops[0];

    for (i = 1; i < drops.length; ++i)
      if (Element.isParent(drops[i].element, deepest.element))
        deepest = drops[i];

    return deepest;
  },

  isContained: function(element, drop) {
    var containmentNode;
    if(drop.tree) {
      containmentNode = element.treeNode;
    } else {
      containmentNode = element.parentNode;
    }
    return drop._containers.detect(function(c) { return containmentNode == c });
  },

  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect(
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },

  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },

  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },

  show: function(point, element) {
    if(!this.drops.length) return;
    var drop, affected = [];

    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop))
        affected.push(drop);
    });

    if(affected.length>0)
      drop = Droppables.findDeepestChild(affected);

    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
    if (drop) {
      Position.within(drop.element, point[0], point[1]);
      if(drop.onHover)
        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));

      if (drop != this.last_active) Droppables.activate(drop);
    }
  },

  fire: function(event, element) {
    if(!this.last_active) return;
    Position.prepare();

    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
      if (this.last_active.onDrop) {
        this.last_active.onDrop(element, this.last_active.element, event);
        return true;
      }
  },

  reset: function() {
    if(this.last_active)
      this.deactivate(this.last_active);
  }
};

var Draggables = {
  drags: [],
  observers: [],

  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);

      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(document, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
  },

  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(document, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },

  activate: function(draggable) {
    if(draggable.options.delay) {
      this._timeout = setTimeout(function() {
        Draggables._timeout = null;
        window.focus();
        Draggables.activeDraggable = draggable;
      }.bind(this), draggable.options.delay);
    } else {
      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
      this.activeDraggable = draggable;
    }
  },

  deactivate: function() {
    this.activeDraggable = null;
  },

  updateDrag: function(event) {
    if(!this.activeDraggable) return;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
    this._lastPointer = pointer;

    this.activeDraggable.updateDrag(event, pointer);
  },

  endDrag: function(event) {
    if(this._timeout) {
      clearTimeout(this._timeout);
      this._timeout = null;
    }
    if(!this.activeDraggable) return;
    this._lastPointer = null;
    this.activeDraggable.endDrag(event);
    this.activeDraggable = null;
  },

  keyPress: function(event) {
    if(this.activeDraggable)
      this.activeDraggable.keyPress(event);
  },

  addObserver: function(observer) {
    this.observers.push(observer);
    this._cacheObserverCallbacks();
  },

  removeObserver: function(element) {  // element instead of observer fixes mem leaks
    this.observers = this.observers.reject( function(o) { return o.element==element });
    this._cacheObserverCallbacks();
  },

  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
    if(this[eventName+'Count'] > 0)
      this.observers.each( function(o) {
        if(o[eventName]) o[eventName](eventName, draggable, event);
      });
    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
  },

  _cacheObserverCallbacks: function() {
    ['onStart','onEnd','onDrag'].each( function(eventName) {
      Draggables[eventName+'Count'] = Draggables.observers.select(
        function(o) { return o[eventName]; }
      ).length;
    });
  }
};

/*--------------------------------------------------------------------------*/

var Draggable = Class.create({
  initialize: function(element) {
    var defaults = {
      handle: false,
      reverteffect: function(element, top_offset, left_offset) {
        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
          queue: {scope:'_draggable', position:'end'}
        });
      },
      endeffect: function(element) {
        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
          queue: {scope:'_draggable', position:'end'},
          afterFinish: function(){
            Draggable._dragging[element] = false
          }
        });
      },
      zindex: 1000,
      revert: false,
      quiet: false,
      scroll: false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
      delay: 0
    };

    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
      Object.extend(defaults, {
        starteffect: function(element) {
          element._opacity = Element.getOpacity(element);
          Draggable._dragging[element] = true;
          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
        }
      });

    var options = Object.extend(defaults, arguments[1] || { });

    this.element = $(element);

    if(options.handle && Object.isString(options.handle))
      this.handle = this.element.down('.'+options.handle, 0);

    if(!this.handle) this.handle = $(options.handle);
    if(!this.handle) this.handle = this.element;

    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
      options.scroll = $(options.scroll);
      this._isScrollChild = Element.childOf(this.element, options.scroll);
    }

    Element.makePositioned(this.element); // fix IE

    this.options  = options;
    this.dragging = false;

    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
    Event.observe(this.handle, "mousedown", this.eventMouseDown);

    Draggables.register(this);
  },

  destroy: function() {
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    Draggables.unregister(this);
  },

  currentDelta: function() {
    return([
      parseInt(Element.getStyle(this.element,'left') || '0'),
      parseInt(Element.getStyle(this.element,'top') || '0')]);
  },

  initDrag: function(event) {
    if(!Object.isUndefined(Draggable._dragging[this.element]) &&
      Draggable._dragging[this.element]) return;
    if(Event.isLeftClick(event)) {
      var src = Event.element(event);
      if((tag_name = src.tagName.toUpperCase()) && (
        tag_name=='INPUT' ||
        tag_name=='SELECT' ||
        tag_name=='OPTION' ||
        tag_name=='BUTTON' ||
        tag_name=='TEXTAREA')) return;

      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      var pos     = Position.cumulativeOffset(this.element);
      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });

      Draggables.activate(this);
      Event.stop(event);
    }
  },

  startDrag: function(event) {
    this.dragging = true;
    if(!this.delta)
      this.delta = this.currentDelta();

    if(this.options.zindex) {
      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
      this.element.style.zIndex = this.options.zindex;
    }

    if(this.options.ghosting) {
      this._clone = this.element.cloneNode(true);
      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
      if (!this._originallyAbsolute)
        Position.absolutize(this.element);
      this.element.parentNode.insertBefore(this._clone, this.element);
    }

    if(this.options.scroll) {
      if (this.options.scroll == window) {
        var where = this._getWindowScroll(this.options.scroll);
        this.originalScrollLeft = where.left;
        this.originalScrollTop = where.top;
      } else {
        this.originalScrollLeft = this.options.scroll.scrollLeft;
        this.originalScrollTop = this.options.scroll.scrollTop;
      }
    }

    Draggables.notify('onStart', this, event);

    if(this.options.starteffect) this.options.starteffect(this.element);
  },

  updateDrag: function(event, pointer) {
    if(!this.dragging) this.startDrag(event);

    if(!this.options.quiet){
      Position.prepare();
      Droppables.show(pointer, this.element);
    }

    Draggables.notify('onDrag', this, event);

    this.draw(pointer);
    if(this.options.change) this.options.change(this);

    if(this.options.scroll) {
      this.stopScrolling();

      var p;
      if (this.options.scroll == window) {
        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
      } else {
        p = Position.page(this.options.scroll);
        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
        p[1] += this.options.scroll.scrollTop + Position.deltaY;
        p.push(p[0]+this.options.scroll.offsetWidth);
        p.push(p[1]+this.options.scroll.offsetHeight);
      }
      var speed = [0,0];
      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
      this.startScrolling(speed);
    }

    if(Prototype.Browser.WebKit) window.scrollBy(0,0);

    Event.stop(event);
  },

  finishDrag: function(event, success) {
    this.dragging = false;

    if(this.options.quiet){
      Position.prepare();
      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      Droppables.show(pointer, this.element);
    }

    if(this.options.ghosting) {
      if (!this._originallyAbsolute)
        Position.relativize(this.element);
      delete this._originallyAbsolute;
      Element.remove(this._clone);
      this._clone = null;
    }

    var dropped = false;
    if(success) {
      dropped = Droppables.fire(event, this.element);
      if (!dropped) dropped = false;
    }
    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
    Draggables.notify('onEnd', this, event);

    var revert = this.options.revert;
    if(revert && Object.isFunction(revert)) revert = revert(this.element);

    var d = this.currentDelta();
    if(revert && this.options.reverteffect) {
      if (dropped == 0 || revert != 'failure')
        this.options.reverteffect(this.element,
          d[1]-this.delta[1], d[0]-this.delta[0]);
    } else {
      this.delta = d;
    }

    if(this.options.zindex)
      this.element.style.zIndex = this.originalZ;

    if(this.options.endeffect)
      this.options.endeffect(this.element);

    Draggables.deactivate(this);
    Droppables.reset();
  },

  keyPress: function(event) {
    if(event.keyCode!=Event.KEY_ESC) return;
    this.finishDrag(event, false);
    Event.stop(event);
  },

  endDrag: function(event) {
    if(!this.dragging) return;
    this.stopScrolling();
    this.finishDrag(event, true);
    Event.stop(event);
  },

  draw: function(point) {
    var pos = Position.cumulativeOffset(this.element);
    if(this.options.ghosting) {
      var r   = Position.realOffset(this.element);
      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
    }

    var d = this.currentDelta();
    pos[0] -= d[0]; pos[1] -= d[1];

    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
    }

    var p = [0,1].map(function(i){
      return (point[i]-pos[i]-this.offset[i])
    }.bind(this));

    if(this.options.snap) {
      if(Object.isFunction(this.options.snap)) {
        p = this.options.snap(p[0],p[1],this);
      } else {
      if(Object.isArray(this.options.snap)) {
        p = p.map( function(v, i) {
          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
      } else {
        p = p.map( function(v) {
          return (v/this.options.snap).round()*this.options.snap }.bind(this));
      }
    }}

    var style = this.element.style;
    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
      style.left = p[0] + "px";
    if((!this.options.constraint) || (this.options.constraint=='vertical'))
      style.top  = p[1] + "px";

    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  },

  stopScrolling: function() {
    if(this.scrollInterval) {
      clearInterval(this.scrollInterval);
      this.scrollInterval = null;
      Draggables._lastScrollPointer = null;
    }
  },

  startScrolling: function(speed) {
    if(!(speed[0] || speed[1])) return;
    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
    this.lastScrolled = new Date();
    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
  },

  scroll: function() {
    var current = new Date();
    var delta = current - this.lastScrolled;
    this.lastScrolled = current;
    if(this.options.scroll == window) {
      with (this._getWindowScroll(this.options.scroll)) {
        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
          var d = delta / 1000;
          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
        }
      }
    } else {
      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
    }

    Position.prepare();
    Droppables.show(Draggables._lastPointer, this.element);
    Draggables.notify('onDrag', this);
    if (this._isScrollChild) {
      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
      if (Draggables._lastScrollPointer[0] < 0)
        Draggables._lastScrollPointer[0] = 0;
      if (Draggables._lastScrollPointer[1] < 0)
        Draggables._lastScrollPointer[1] = 0;
      this.draw(Draggables._lastScrollPointer);
    }

    if(this.options.change) this.options.change(this);
  },

  _getWindowScroll: function(w) {
    var T, L, W, H;
    with (w.document) {
      if (w.document.documentElement && documentElement.scrollTop) {
        T = documentElement.scrollTop;
        L = documentElement.scrollLeft;
      } else if (w.document.body) {
        T = body.scrollTop;
        L = body.scrollLeft;
      }
      if (w.innerWidth) {
        W = w.innerWidth;
        H = w.innerHeight;
      } else if (w.document.documentElement && documentElement.clientWidth) {
        W = documentElement.clientWidth;
        H = documentElement.clientHeight;
      } else {
        W = body.offsetWidth;
        H = body.offsetHeight;
      }
    }
    return { top: T, left: L, width: W, height: H };
  }
});

Draggable._dragging = { };

/*--------------------------------------------------------------------------*/

var SortableObserver = Class.create({
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
    this.lastValue = Sortable.serialize(this.element);
  },

  onStart: function() {
    this.lastValue = Sortable.serialize(this.element);
  },

  onEnd: function() {
    Sortable.unmark();
    if(this.lastValue != Sortable.serialize(this.element))
      this.observer(this.element)
  }
});

var Sortable = {
  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,

  sortables: { },

  _findRootElement: function(element) {
    while (element.tagName.toUpperCase() != "BODY") {
      if(element.id && Sortable.sortables[element.id]) return element;
      element = element.parentNode;
    }
  },

  options: function(element) {
    element = Sortable._findRootElement($(element));
    if(!element) return;
    return Sortable.sortables[element.id];
  },

  destroy: function(element){
    element = $(element);
    var s = Sortable.sortables[element.id];

    if(s) {
      Draggables.removeObserver(s.element);
      s.droppables.each(function(d){ Droppables.remove(d) });
      s.draggables.invoke('destroy');

      delete Sortable.sortables[s.element.id];
    }
  },

  create: function(element) {
    element = $(element);
    var options = Object.extend({
      element:     element,
      tag:         'li',       // assumes li children, override with tag: 'tagname'
      dropOnEmpty: false,
      tree:        false,
      treeTag:     'ul',
      overlap:     'vertical', // one of 'vertical', 'horizontal'
      constraint:  'vertical', // one of 'vertical', 'horizontal', false
      containment: element,    // also takes array of elements (or id's); or false
      handle:      false,      // or a CSS class
      only:        false,
      delay:       0,
      hoverclass:  null,
      ghosting:    false,
      quiet:       false,
      scroll:      false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      format:      this.SERIALIZE_RULE,

      elements:    false,
      handles:     false,

      onChange:    Prototype.emptyFunction,
      onUpdate:    Prototype.emptyFunction
    }, arguments[1] || { });

    this.destroy(element);

    var options_for_draggable = {
      revert:      true,
      quiet:       options.quiet,
      scroll:      options.scroll,
      scrollSpeed: options.scrollSpeed,
      scrollSensitivity: options.scrollSensitivity,
      delay:       options.delay,
      ghosting:    options.ghosting,
      constraint:  options.constraint,
      handle:      options.handle };

    if(options.starteffect)
      options_for_draggable.starteffect = options.starteffect;

    if(options.reverteffect)
      options_for_draggable.reverteffect = options.reverteffect;
    else
      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
        element.style.top  = 0;
        element.style.left = 0;
      };

    if(options.endeffect)
      options_for_draggable.endeffect = options.endeffect;

    if(options.zindex)
      options_for_draggable.zindex = options.zindex;

    var options_for_droppable = {
      overlap:     options.overlap,
      containment: options.containment,
      tree:        options.tree,
      hoverclass:  options.hoverclass,
      onHover:     Sortable.onHover
    };

    var options_for_tree = {
      onHover:      Sortable.onEmptyHover,
      overlap:      options.overlap,
      containment:  options.containment,
      hoverclass:   options.hoverclass
    };

    Element.cleanWhitespace(element);

    options.draggables = [];
    options.droppables = [];

    if(options.dropOnEmpty || options.tree) {
      Droppables.add(element, options_for_tree);
      options.droppables.push(element);
    }

    (options.elements || this.findElements(element, options) || []).each( function(e,i) {
      var handle = options.handles ? $(options.handles[i]) :
        (options.handle ? $(e).select('.' + options.handle)[0] : e);
      options.draggables.push(
        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
      Droppables.add(e, options_for_droppable);
      if(options.tree) e.treeNode = element;
      options.droppables.push(e);
    });

    if(options.tree) {
      (Sortable.findTreeElements(element, options) || []).each( function(e) {
        Droppables.add(e, options_for_tree);
        e.treeNode = element;
        options.droppables.push(e);
      });
    }

    this.sortables[element.id] = options;

    Draggables.addObserver(new SortableObserver(element, options.onUpdate));

  },

  findElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.tag);
  },

  findTreeElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.treeTag);
  },

  onHover: function(element, dropon, overlap) {
    if(Element.isParent(dropon, element)) return;

    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
      return;
    } else if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },

  onEmptyHover: function(element, dropon, overlap) {
    var oldParentNode = element.parentNode;
    var droponOptions = Sortable.options(dropon);

    if(!Element.isParent(dropon, element)) {
      var index;

      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
      var child = null;

      if(children) {
        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);

        for (index = 0; index < children.length; index += 1) {
          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
            offset -= Element.offsetSize (children[index], droponOptions.overlap);
          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
            child = index + 1 < children.length ? children[index + 1] : null;
            break;
          } else {
            child = children[index];
            break;
          }
        }
      }

      dropon.insertBefore(element, child);

      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },

  unmark: function() {
    if(Sortable._marker) Sortable._marker.hide();
  },

  mark: function(dropon, position) {
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return;

    if(!Sortable._marker) {
      Sortable._marker =
        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
          hide().addClassName('dropmarker').setStyle({position:'absolute'});
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});

    if(position=='after')
      if(sortable.overlap == 'horizontal')
        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
      else
        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});

    Sortable._marker.show();
  },

  _tree: function(element, options, parent) {
    var children = Sortable.findElements(element, options) || [];

    for (var i = 0; i < children.length; ++i) {
      var match = children[i].id.match(options.format);

      if (!match) continue;

      var child = {
        id: encodeURIComponent(match ? match[1] : null),
        element: element,
        parent: parent,
        children: [],
        position: parent.children.length,
        container: $(children[i]).down(options.treeTag)
      };

      /* Get the element containing the children and recurse over it */
      if (child.container)
        this._tree(child.container, options, child);

      parent.children.push (child);
    }

    return parent;
  },

  tree: function(element) {
    element = $(element);
    var sortableOptions = this.options(element);
    var options = Object.extend({
      tag: sortableOptions.tag,
      treeTag: sortableOptions.treeTag,
      only: sortableOptions.only,
      name: element.id,
      format: sortableOptions.format
    }, arguments[1] || { });

    var root = {
      id: null,
      parent: null,
      children: [],
      container: element,
      position: 0
    };

    return Sortable._tree(element, options, root);
  },

  /* Construct a [i] index for a particular node */
  _constructIndex: function(node) {
    var index = '';
    do {
      if (node.id) index = '[' + node.position + ']' + index;
    } while ((node = node.parent) != null);
    return index;
  },

  sequence: function(element) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[1] || { });

    return $(this.findElements(element, options) || []).map( function(item) {
      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
    });
  },

  setSequence: function(element, new_sequence) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[2] || { });

    var nodeMap = { };
    this.findElements(element, options).each( function(n) {
        if (n.id.match(options.format))
            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
        n.parentNode.removeChild(n);
    });

    new_sequence.each(function(ident) {
      var n = nodeMap[ident];
      if (n) {
        n[1].appendChild(n[0]);
        delete nodeMap[ident];
      }
    });
  },

  serialize: function(element) {
    element = $(element);
    var options = Object.extend(Sortable.options(element), arguments[1] || { });
    var name = encodeURIComponent(
      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);

    if (options.tree) {
      return Sortable.tree(element, arguments[1]).children.map( function (item) {
        return [name + Sortable._constructIndex(item) + "[id]=" +
                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
      }).flatten().join('&');
    } else {
      return Sortable.sequence(element, arguments[1]).map( function(item) {
        return name + "[]=" + encodeURIComponent(item);
      }).join('&');
    }
  }
};

Element.isParent = function(child, element) {
  if (!child.parentNode || child == element) return false;
  if (child.parentNode == element) return true;
  return Element.isParent(child.parentNode, element);
};

Element.findChildren = function(element, only, recursive, tagName) {
  if(!element.hasChildNodes()) return null;
  tagName = tagName.toUpperCase();
  if(only) only = [only].flatten();
  var elements = [];
  $A(element.childNodes).each( function(e) {
    if(e.tagName && e.tagName.toUpperCase()==tagName &&
      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
        elements.push(e);
    if(recursive) {
      var grandchildren = Element.findChildren(e, only, recursive, tagName);
      if(grandchildren) elements.push(grandchildren);
    }
  });

  return (elements.length>0 ? elements.flatten() : []);
};

Element.offsetSize = function (element, type) {
  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
};



if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = { };
Autocompleter.Base = Class.create({
  baseInitialize: function(element, update, options) {
    element          = $(element);
    this.element     = element;
    this.update      = $(update);
    this.hasFocus    = false;
    this.changed     = false;
    this.active      = false;
    this.index       = 0;
    this.entryCount  = 0;
    this.oldElementValue = this.element.value;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || { };

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow ||
      function(element, update){
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false,
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide ||
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string')
      this.options.tokens = new Array(this.options.tokens);
    if (!this.options.tokens.include('\n'))
      this.options.tokens.push('\n');

    this.observer = null;

    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);

    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix &&
      (Prototype.Browser.IE) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update,
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },

  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         Event.stop(event);
         return;
      }
     else
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer =
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex)
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },

  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },

  onBlur: function(event) {
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;
  },

  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ?
          Element.addClassName(this.getEntry(i),"selected") :
          Element.removeClassName(this.getEntry(i),"selected");
      if(this.hasFocus) {
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },

  markPrevious: function() {
    if(this.index > 0) this.index--;
      else this.index = this.entryCount-1;
    this.getEntry(this.index).scrollIntoView(true);
  },

  markNext: function() {
    if(this.index < this.entryCount-1) this.index++;
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },

  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },

  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },

  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = $(selectedElement).select('.' + this.options.select) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');

    var bounds = this.getTokenBounds();
    if (bounds[0] != -1) {
      var newValue = this.element.value.substr(0, bounds[0]);
      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
    } else {
      this.element.value = value;
    }
    this.oldElementValue = this.element.value;
    this.element.focus();

    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices) {
    if(!this.changed && this.hasFocus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount =
          this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else {
        this.entryCount = 0;
      }

      this.stopIndicator();
      this.index = 0;

      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;
    this.tokenBounds = null;
    if(this.getToken().length>=this.options.minChars) {
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
    this.oldElementValue = this.element.value;
  },

  getToken: function() {
    var bounds = this.getTokenBounds();
    return this.element.value.substring(bounds[0], bounds[1]).strip();
  },

  getTokenBounds: function() {
    if (null != this.tokenBounds) return this.tokenBounds;
    var value = this.element.value;
    if (value.strip().empty()) return [-1, 0];
    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
    var offset = (diff == this.oldElementValue.length ? 1 : 0);
    var prevTokenPos = -1, nextTokenPos = value.length;
    var tp;
    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
      if (tp > prevTokenPos) prevTokenPos = tp;
      tp = value.indexOf(this.options.tokens[index], diff + offset);
      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
    }
    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
  }
});

Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
  var boundary = Math.min(newS.length, oldS.length);
  for (var index = 0; index < boundary; ++index)
    if (newS[index] != oldS[index])
      return index;
  return boundary;
};

Ajax.Autocompleter = Class.create(Autocompleter.Base, {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    this.startIndicator();

    var entry = encodeURIComponent(this.options.paramName) + '=' +
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams)
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }
});


Autocompleter.Local = Class.create(Autocompleter.Base, {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&
          ret.length < instance.options.choices ; i++) {

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ?
            elem.toLowerCase().indexOf(entry.toLowerCase()) :
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) {
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partialChars &&
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
                  foundPos + entry.length) + "</li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ?
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || { });
  }
});


Field.scrollFreeActivate = function(field) {
  setTimeout(function() {
    Field.activate(field);
  }, 1);
};

Ajax.InPlaceEditor = Class.create({
  initialize: function(element, url, options) {
    this.url = url;
    this.element = element = $(element);
    this.prepareOptions();
    this._controls = { };
    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
    Object.extend(this.options, options || { });
    if (!this.options.formId && this.element.id) {
      this.options.formId = this.element.id + '-inplaceeditor';
      if ($(this.options.formId))
        this.options.formId = '';
    }
    if (this.options.externalControl)
      this.options.externalControl = $(this.options.externalControl);
    if (!this.options.externalControl)
      this.options.externalControlOnly = false;
    this._originalBackground = this.element.getStyle('background-color') || 'transparent';
    this.element.title = this.options.clickToEditText;
    this._boundCancelHandler = this.handleFormCancellation.bind(this);
    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
    this._boundFailureHandler = this.handleAJAXFailure.bind(this);
    this._boundSubmitHandler = this.handleFormSubmission.bind(this);
    this._boundWrapperHandler = this.wrapUp.bind(this);
    this.registerListeners();
  },
  checkForEscapeOrReturn: function(e) {
    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
    if (Event.KEY_ESC == e.keyCode)
      this.handleFormCancellation(e);
    else if (Event.KEY_RETURN == e.keyCode)
      this.handleFormSubmission(e);
  },
  createControl: function(mode, handler, extraClasses) {
    var control = this.options[mode + 'Control'];
    var text = this.options[mode + 'Text'];
    if ('button' == control) {
      var btn = document.createElement('input');
      btn.type = 'submit';
      btn.value = text;
      btn.className = 'editor_' + mode + '_button';
      if ('cancel' == mode)
        btn.onclick = this._boundCancelHandler;
      this._form.appendChild(btn);
      this._controls[mode] = btn;
    } else if ('link' == control) {
      var link = document.createElement('a');
      link.href = '#';
      link.appendChild(document.createTextNode(text));
      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
      link.className = 'editor_' + mode + '_link';
      if (extraClasses)
        link.className += ' ' + extraClasses;
      this._form.appendChild(link);
      this._controls[mode] = link;
    }
  },
  createEditField: function() {
    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
    var fld;
    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
      fld = document.createElement('input');
      fld.type = 'text';
      var size = this.options.size || this.options.cols || 0;
      if (0 < size) fld.size = size;
    } else {
      fld = document.createElement('textarea');
      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
      fld.cols = this.options.cols || 40;
    }
    fld.name = this.options.paramName;
    fld.value = text; // No HTML breaks conversion anymore
    fld.className = 'editor_field';
    if (this.options.submitOnBlur)
      fld.onblur = this._boundSubmitHandler;
    this._controls.editor = fld;
    if (this.options.loadTextURL)
      this.loadExternalText();
    this._form.appendChild(this._controls.editor);
  },
  createForm: function() {
    var ipe = this;
    function addText(mode, condition) {
      var text = ipe.options['text' + mode + 'Controls'];
      if (!text || condition === false) return;
      ipe._form.appendChild(document.createTextNode(text));
    };
    this._form = $(document.createElement('form'));
    this._form.id = this.options.formId;
    this._form.addClassName(this.options.formClassName);
    this._form.onsubmit = this._boundSubmitHandler;
    this.createEditField();
    if ('textarea' == this._controls.editor.tagName.toLowerCase())
      this._form.appendChild(document.createElement('br'));
    if (this.options.onFormCustomization)
      this.options.onFormCustomization(this, this._form);
    addText('Before', this.options.okControl || this.options.cancelControl);
    this.createControl('ok', this._boundSubmitHandler);
    addText('Between', this.options.okControl && this.options.cancelControl);
    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
    addText('After', this.options.okControl || this.options.cancelControl);
  },
  destroy: function() {
    if (this._oldInnerHTML)
      this.element.innerHTML = this._oldInnerHTML;
    this.leaveEditMode();
    this.unregisterListeners();
  },
  enterEditMode: function(e) {
    if (this._saving || this._editing) return;
    this._editing = true;
    this.triggerCallback('onEnterEditMode');
    if (this.options.externalControl)
      this.options.externalControl.hide();
    this.element.hide();
    this.createForm();
    this.element.parentNode.insertBefore(this._form, this.element);
    if (!this.options.loadTextURL)
      this.postProcessEditField();
    if (e) Event.stop(e);
  },
  enterHover: function(e) {
    if (this.options.hoverClassName)
      this.element.addClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onEnterHover');
  },
  getText: function() {
    return this.element.innerHTML.unescapeHTML();
  },
  handleAJAXFailure: function(transport) {
    this.triggerCallback('onFailure', transport);
    if (this._oldInnerHTML) {
      this.element.innerHTML = this._oldInnerHTML;
      this._oldInnerHTML = null;
    }
  },
  handleFormCancellation: function(e) {
    this.wrapUp();
    if (e) Event.stop(e);
  },
  handleFormSubmission: function(e) {
    var form = this._form;
    var value = $F(this._controls.editor);
    this.prepareSubmission();
    var params = this.options.callback(form, value) || '';
    if (Object.isString(params))
      params = params.toQueryParams();
    params.editorId = this.element.id;
    if (this.options.htmlResponse) {
      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Updater({ success: this.element }, this.url, options);
    } else {
      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Request(this.url, options);
    }
    if (e) Event.stop(e);
  },
  leaveEditMode: function() {
    this.element.removeClassName(this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
    if (this.options.externalControl)
      this.options.externalControl.show();
    this._saving = false;
    this._editing = false;
    this._oldInnerHTML = null;
    this.triggerCallback('onLeaveEditMode');
  },
  leaveHover: function(e) {
    if (this.options.hoverClassName)
      this.element.removeClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onLeaveHover');
  },
  loadExternalText: function() {
    this._form.addClassName(this.options.loadingClassName);
    this._controls.editor.disabled = true;
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._form.removeClassName(this.options.loadingClassName);
        var text = transport.responseText;
        if (this.options.stripLoadedTextTags)
          text = text.stripTags();
        this._controls.editor.value = text;
        this._controls.editor.disabled = false;
        this.postProcessEditField();
      }.bind(this),
      onFailure: this._boundFailureHandler
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },
  postProcessEditField: function() {
    var fpc = this.options.fieldPostCreation;
    if (fpc)
      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
  },
  prepareOptions: function() {
    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
    [this._extraDefaultOptions].flatten().compact().each(function(defs) {
      Object.extend(this.options, defs);
    }.bind(this));
  },
  prepareSubmission: function() {
    this._saving = true;
    this.removeForm();
    this.leaveHover();
    this.showSaving();
  },
  registerListeners: function() {
    this._listeners = { };
    var listener;
    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
      listener = this[pair.value].bind(this);
      this._listeners[pair.key] = listener;
      if (!this.options.externalControlOnly)
        this.element.observe(pair.key, listener);
      if (this.options.externalControl)
        this.options.externalControl.observe(pair.key, listener);
    }.bind(this));
  },
  removeForm: function() {
    if (!this._form) return;
    this._form.remove();
    this._form = null;
    this._controls = { };
  },
  showSaving: function() {
    this._oldInnerHTML = this.element.innerHTML;
    this.element.innerHTML = this.options.savingText;
    this.element.addClassName(this.options.savingClassName);
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
  },
  triggerCallback: function(cbName, arg) {
    if ('function' == typeof this.options[cbName]) {
      this.options[cbName](this, arg);
    }
  },
  unregisterListeners: function() {
    $H(this._listeners).each(function(pair) {
      if (!this.options.externalControlOnly)
        this.element.stopObserving(pair.key, pair.value);
      if (this.options.externalControl)
        this.options.externalControl.stopObserving(pair.key, pair.value);
    }.bind(this));
  },
  wrapUp: function(transport) {
    this.leaveEditMode();
    this._boundComplete(transport, this.element);
  }
});

Object.extend(Ajax.InPlaceEditor.prototype, {
  dispose: Ajax.InPlaceEditor.prototype.destroy
});

Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
  initialize: function($super, element, url, options) {
    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
    $super(element, url, options);
  },

  createEditField: function() {
    var list = document.createElement('select');
    list.name = this.options.paramName;
    list.size = 1;
    this._controls.editor = list;
    this._collection = this.options.collection || [];
    if (this.options.loadCollectionURL)
      this.loadCollection();
    else
      this.checkForExternalText();
    this._form.appendChild(this._controls.editor);
  },

  loadCollection: function() {
    this._form.addClassName(this.options.loadingClassName);
    this.showLoadingText(this.options.loadingCollectionText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        var js = transport.responseText.strip();
        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
          throw('Server returned an invalid collection representation.');
        this._collection = eval(js);
        this.checkForExternalText();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadCollectionURL, options);
  },

  showLoadingText: function(text) {
    this._controls.editor.disabled = true;
    var tempOption = this._controls.editor.firstChild;
    if (!tempOption) {
      tempOption = document.createElement('option');
      tempOption.value = '';
      this._controls.editor.appendChild(tempOption);
      tempOption.selected = true;
    }
    tempOption.update((text || '').stripScripts().stripTags());
  },

  checkForExternalText: function() {
    this._text = this.getText();
    if (this.options.loadTextURL)
      this.loadExternalText();
    else
      this.buildOptionList();
  },

  loadExternalText: function() {
    this.showLoadingText(this.options.loadingText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._text = transport.responseText.strip();
        this.buildOptionList();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },

  buildOptionList: function() {
    this._form.removeClassName(this.options.loadingClassName);
    this._collection = this._collection.map(function(entry) {
      return 2 === entry.length ? entry : [entry, entry].flatten();
    });
    var marker = ('value' in this.options) ? this.options.value : this._text;
    var textFound = this._collection.any(function(entry) {
      return entry[0] == marker;
    }.bind(this));
    this._controls.editor.update('');
    var option;
    this._collection.each(function(entry, index) {
      option = document.createElement('option');
      option.value = entry[0];
      option.selected = textFound ? entry[0] == marker : 0 == index;
      option.appendChild(document.createTextNode(entry[1]));
      this._controls.editor.appendChild(option);
    }.bind(this));
    this._controls.editor.disabled = false;
    Field.scrollFreeActivate(this._controls.editor);
  }
});


Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
  if (!options) return;
  function fallback(name, expr) {
    if (name in options || expr === undefined) return;
    options[name] = expr;
  };
  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
    options.cancelLink == options.cancelButton == false ? false : undefined)));
  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
    options.okLink == options.okButton == false ? false : undefined)));
  fallback('highlightColor', options.highlightcolor);
  fallback('highlightEndColor', options.highlightendcolor);
};

Object.extend(Ajax.InPlaceEditor, {
  DefaultOptions: {
    ajaxOptions: { },
    autoRows: 3,                                // Use when multi-line w/ rows == 1
    cancelControl: 'link',                      // 'link'|'button'|false
    cancelText: 'cancel',
    clickToEditText: 'Click to edit',
    externalControl: null,                      // id|elt
    externalControlOnly: false,
    fieldPostCreation: 'activate',              // 'activate'|'focus'|false
    formClassName: 'inplaceeditor-form',
    formId: null,                               // id|elt
    highlightColor: '#ffff99',
    highlightEndColor: '#ffffff',
    hoverClassName: '',
    htmlResponse: true,
    loadingClassName: 'inplaceeditor-loading',
    loadingText: 'Loading...',
    okControl: 'button',                        // 'link'|'button'|false
    okText: 'ok',
    paramName: 'value',
    rows: 1,                                    // If 1 and multi-line, uses autoRows
    savingClassName: 'inplaceeditor-saving',
    savingText: 'Saving...',
    size: 0,
    stripLoadedTextTags: false,
    submitOnBlur: false,
    textAfterControls: '',
    textBeforeControls: '',
    textBetweenControls: ''
  },
  DefaultCallbacks: {
    callback: function(form) {
      return Form.serialize(form);
    },
    onComplete: function(transport, element) {
      new Effect.Highlight(element, {
        startcolor: this.options.highlightColor, keepBackgroundImage: true });
    },
    onEnterEditMode: null,
    onEnterHover: function(ipe) {
      ipe.element.style.backgroundColor = ipe.options.highlightColor;
      if (ipe._effect)
        ipe._effect.cancel();
    },
    onFailure: function(transport, ipe) {
      alert('Error communication with the server: ' + transport.responseText.stripTags());
    },
    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
    onLeaveEditMode: null,
    onLeaveHover: function(ipe) {
      ipe._effect = new Effect.Highlight(ipe.element, {
        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
        restorecolor: ipe._originalBackground, keepBackgroundImage: true
      });
    }
  },
  Listeners: {
    click: 'enterEditMode',
    keydown: 'checkForEscapeOrReturn',
    mouseover: 'enterHover',
    mouseout: 'leaveHover'
  }
});

Ajax.InPlaceCollectionEditor.DefaultOptions = {
  loadingCollectionText: 'Loading options...'
};


Form.Element.DelayedObserver = Class.create({
  initialize: function(element, delay, callback) {
    this.delay     = delay || 0.5;
    this.element   = $(element);
    this.callback  = callback;
    this.timer     = null;
    this.lastValue = $F(this.element);
    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
  },
  delayedListener: function(event) {
    if(this.lastValue == $F(this.element)) return;
    if(this.timer) clearTimeout(this.timer);
    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
    this.lastValue = $F(this.element);
  },
  onTimerEvent: function() {
    this.timer = null;
    this.callback(this.element, $F(this.element));
  }
});


if (!Control) var Control = { };

Control.Slider = Class.create({
  initialize: function(handle, track, options) {
    var slider = this;

    if (Object.isArray(handle)) {
      this.handles = handle.collect( function(e) { return $(e) });
    } else {
      this.handles = [$(handle)];
    }

    this.track   = $(track);
    this.options = options || { };

    this.axis      = this.options.axis || 'horizontal';
    this.increment = this.options.increment || 1;
    this.step      = parseInt(this.options.step || '1');
    this.range     = this.options.range || $R(0,1);

    this.value     = 0; // assure backwards compat
    this.values    = this.handles.map( function() { return 0 });
    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
    this.options.startSpan = $(this.options.startSpan || null);
    this.options.endSpan   = $(this.options.endSpan || null);

    this.restricted = this.options.restricted || false;

    this.maximum   = this.options.maximum || this.range.end;
    this.minimum   = this.options.minimum || this.range.start;

    this.alignX = parseInt(this.options.alignX || '0');
    this.alignY = parseInt(this.options.alignY || '0');

    this.trackLength = this.maximumOffset() - this.minimumOffset();

    this.handleLength = this.isVertical() ?
      (this.handles[0].offsetHeight != 0 ?
        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
        this.handles[0].style.width.replace(/px$/,""));

    this.active   = false;
    this.dragging = false;
    this.disabled = false;

    if (this.options.disabled) this.setDisabled();

    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
    if (this.allowedValues) {
      this.minimum = this.allowedValues.min();
      this.maximum = this.allowedValues.max();
    }

    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
    this.eventMouseMove = this.update.bindAsEventListener(this);

    this.handles.each( function(h,i) {
      i = slider.handles.length-1-i;
      slider.setValue(parseFloat(
        (Object.isArray(slider.options.sliderValue) ?
          slider.options.sliderValue[i] : slider.options.sliderValue) ||
         slider.range.start), i);
      h.makePositioned().observe("mousedown", slider.eventMouseDown);
    });

    this.track.observe("mousedown", this.eventMouseDown);
    document.observe("mouseup", this.eventMouseUp);
    document.observe("mousemove", this.eventMouseMove);

    this.initialized = true;
  },
  dispose: function() {
    var slider = this;
    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
    Event.stopObserving(document, "mouseup", this.eventMouseUp);
    Event.stopObserving(document, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
  },
  setEnabled: function(){
    this.disabled = false;
  },
  getNearestValue: function(value){
    if (this.allowedValues){
      if (value >= this.allowedValues.max()) return(this.allowedValues.max());
      if (value <= this.allowedValues.min()) return(this.allowedValues.min());

      var offset = Math.abs(this.allowedValues[0] - value);
      var newValue = this.allowedValues[0];
      this.allowedValues.each( function(v) {
        var currentOffset = Math.abs(v - value);
        if (currentOffset <= offset){
          newValue = v;
          offset = currentOffset;
        }
      });
      return newValue;
    }
    if (value > this.range.end) return this.range.end;
    if (value < this.range.start) return this.range.start;
    return value;
  },
  setValue: function(sliderValue, handleIdx){
    if (!this.active) {
      this.activeHandleIdx = handleIdx || 0;
      this.activeHandle    = this.handles[this.activeHandleIdx];
      this.updateStyles();
    }
    handleIdx = handleIdx || this.activeHandleIdx || 0;
    if (this.initialized && this.restricted) {
      if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
        sliderValue = this.values[handleIdx-1];
      if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
        sliderValue = this.values[handleIdx+1];
    }
    sliderValue = this.getNearestValue(sliderValue);
    this.values[handleIdx] = sliderValue;
    this.value = this.values[0]; // assure backwards compat

    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
      this.translateToPx(sliderValue);

    this.drawSpans();
    if (!this.dragging || !this.event) this.updateFinished();
  },
  setValueBy: function(delta, handleIdx) {
    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
      handleIdx || this.activeHandleIdx || 0);
  },
  translateToPx: function(value) {
    return Math.round(
      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
      (value - this.range.start)) + "px";
  },
  translateToValue: function(offset) {
    return ((offset/(this.trackLength-this.handleLength) *
      (this.range.end-this.range.start)) + this.range.start);
  },
  getRange: function(range) {
    var v = this.values.sortBy(Prototype.K);
    range = range || 0;
    return $R(v[range],v[range+1]);
  },
  minimumOffset: function(){
    return(this.isVertical() ? this.alignY : this.alignX);
  },
  maximumOffset: function(){
    return(this.isVertical() ?
      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
        this.track.style.height.replace(/px$/,"")) - this.alignY :
      (this.track.offsetWidth != 0 ? this.track.offsetWidth :
        this.track.style.width.replace(/px$/,"")) - this.alignX);
  },
  isVertical:  function(){
    return (this.axis == 'vertical');
  },
  drawSpans: function() {
    var slider = this;
    if (this.spans)
      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
    if (this.options.startSpan)
      this.setSpan(this.options.startSpan,
        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
    if (this.options.endSpan)
      this.setSpan(this.options.endSpan,
        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
  },
  setSpan: function(span, range) {
    if (this.isVertical()) {
      span.style.top = this.translateToPx(range.start);
      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
    } else {
      span.style.left = this.translateToPx(range.start);
      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
    }
  },
  updateStyles: function() {
    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
    Element.addClassName(this.activeHandle, 'selected');
  },
  startDrag: function(event) {
    if (Event.isLeftClick(event)) {
      if (!this.disabled){
        this.active = true;

        var handle = Event.element(event);
        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
        var track = handle;
        if (track==this.track) {
          var offsets  = Position.cumulativeOffset(this.track);
          this.event = event;
          this.setValue(this.translateToValue(
           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
          ));
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        } else {
          while((this.handles.indexOf(handle) == -1) && handle.parentNode)
            handle = handle.parentNode;

          if (this.handles.indexOf(handle)!=-1) {
            this.activeHandle    = handle;
            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
            this.updateStyles();

            var offsets  = Position.cumulativeOffset(this.activeHandle);
            this.offsetX = (pointer[0] - offsets[0]);
            this.offsetY = (pointer[1] - offsets[1]);
          }
        }
      }
      Event.stop(event);
    }
  },
  update: function(event) {
   if (this.active) {
      if (!this.dragging) this.dragging = true;
      this.draw(event);
      if (Prototype.Browser.WebKit) window.scrollBy(0,0);
      Event.stop(event);
   }
  },
  draw: function(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var offsets = Position.cumulativeOffset(this.track);
    pointer[0] -= this.offsetX + offsets[0];
    pointer[1] -= this.offsetY + offsets[1];
    this.event = event;
    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
    if (this.initialized && this.options.onSlide)
      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
  },
  endDrag: function(event) {
    if (this.active && this.dragging) {
      this.finishDrag(event, true);
      Event.stop(event);
    }
    this.active = false;
    this.dragging = false;
  },
  finishDrag: function(event, success) {
    this.active = false;
    this.dragging = false;
    this.updateFinished();
  },
  updateFinished: function() {
    if (this.initialized && this.options.onChange)
      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
    this.event = null;
  }
});


Sound = {
  tracks: {},
  _enabled: true,
  template:
    new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
  enable: function(){
    Sound._enabled = true;
  },
  disable: function(){
    Sound._enabled = false;
  },
  play: function(url){
    if(!Sound._enabled) return;
    var options = Object.extend({
      track: 'global', url: url, replace: false
    }, arguments[1] || {});

    if(options.replace && this.tracks[options.track]) {
      $R(0, this.tracks[options.track].id).each(function(id){
        var sound = $('sound_'+options.track+'_'+id);
        sound.Stop && sound.Stop();
        sound.remove();
      });
      this.tracks[options.track] = null;
    }

    if(!this.tracks[options.track])
      this.tracks[options.track] = { id: 0 };
    else
      this.tracks[options.track].id++;

    options.id = this.tracks[options.track].id;
    $$('body')[0].insert(
      Prototype.Browser.IE ? new Element('bgsound',{
        id: 'sound_'+options.track+'_'+options.id,
        src: options.url, loop: 1, autostart: true
      }) : Sound.template.evaluate(options));
  }
};

if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){
  if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 }))
    Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>');
  else
    Sound.play = function(){};
}
LowPro = {};
LowPro.Version = '0.5';
LowPro.CompatibleWithPrototype = '1.6';

if (Prototype.Version.indexOf(LowPro.CompatibleWithPrototype) != 0 && window.console && window.console.warn)
  console.warn("This version of Low Pro is tested with Prototype " + LowPro.CompatibleWithPrototype +
                  " it may not work as expected with this version (" + Prototype.Version + ")");

if (!Element.addMethods)
  Element.addMethods = function(o) { Object.extend(Element.Methods, o) };

DOM = {};

DOM.Builder = {
	tagFunc : function(tag) {
    return function() {
     var attrs, children;
     if (arguments.length>0) {
       if (arguments[0].constructor == Object) {
         attrs = arguments[0];
         children = Array.prototype.slice.call(arguments, 1);
       } else {
         children = arguments;
       };
       children = $A(children).flatten()
     }
     return DOM.Builder.create(tag, attrs, children);
    };
  },
	create : function(tag, attrs, children) {
		attrs = attrs || {}; children = children || []; tag = tag.toLowerCase();
		var el = new Element(tag, attrs);

		for (var i=0; i<children.length; i++) {
			if (typeof children[i] == 'string')
			  children[i] = document.createTextNode(children[i]);
			el.appendChild(children[i]);
		}
		return $(el);
	}
};

(function() {
	var els = ("p|div|span|strong|em|img|table|tr|td|th|thead|tbody|tfoot|pre|code|" +
				     "h1|h2|h3|h4|h5|h6|ul|ol|li|form|input|textarea|legend|fieldset|" +
				     "select|option|blockquote|cite|br|hr|dd|dl|dt|address|a|button|abbr|acronym|" +
				     "script|link|style|bdo|ins|del|object|param|col|colgroup|optgroup|caption|" +
				     "label|dfn|kbd|samp|var").split("|");
  var el, i=0;
	while (el = els[i++])
	  window['$' + el] = DOM.Builder.tagFunc(el);
})();

DOM.Builder.fromHTML = function(html) {
  var root;
  if (!(root = arguments.callee._root))
    root = arguments.callee._root = document.createElement('div');
  root.innerHTML = html;
  return root.childNodes[0];
};



Object.extend(Event, {
  onReady : function(f) {
    if (document.body) f();
    else document.observe('dom:loaded', f);
  }
});

Event.addBehavior = function(rules) {
  var ab = this.addBehavior;
  Object.extend(ab.rules, rules);

  if (!ab.responderApplied) {
    Ajax.Responders.register({
      onComplete : function() {
        if (Event.addBehavior.reassignAfterAjax)
          setTimeout(function() { ab.reload() }, 10);
      }
    });
    ab.responderApplied = true;
  }

  if (ab.autoTrigger) {
    this.onReady(ab.load.bind(ab, rules));
  }

};

Event.delegate = function(rules) {
  return function(e) {
      var element = $(e.element());
      for (var selector in rules)
        if (element.match(selector)) return rules[selector].apply(this, $A(arguments));
    }
}

Object.extend(Event.addBehavior, {
  rules : {}, cache : [],
  reassignAfterAjax : false,
  autoTrigger : true,

  load : function(rules) {
    for (var selector in rules) {
      var observer = rules[selector];
      var sels = selector.split(',');
      sels.each(function(sel) {
        var parts = sel.split(/:(?=[a-z]+$)/), css = parts[0], event = parts[1];
        $$(css).each(function(element) {
          if (event) {
            var wrappedObserver = Event.addBehavior._wrapObserver(observer);
            $(element).observe(event, wrappedObserver);
            Event.addBehavior.cache.push([element, event, wrappedObserver]);
          } else {
            if (!element.$$assigned || !element.$$assigned.include(observer)) {
              if (observer.attach) observer.attach(element);

              else observer.call($(element));
              element.$$assigned = element.$$assigned || [];
              element.$$assigned.push(observer);
            }
          }
        });
      });
    }
  },

  unload : function() {
    this.cache.each(function(c) {
      Event.stopObserving.apply(Event, c);
    });
    this.cache = [];
  },

  reload: function() {
    var ab = Event.addBehavior;
    ab.unload();
    ab.load(ab.rules);
  },

  _wrapObserver: function(observer) {
    return function(event) {
      if (observer.call(this, event) === false) event.stop();
    }
  }

});

Event.observe(window, 'unload', Event.addBehavior.unload.bind(Event.addBehavior));

$$$ = Event.addBehavior.bind(Event);

var Behavior = {
  create: function() {
    var parent = null, properties = $A(arguments);
    if (Object.isFunction(properties[0]))
      parent = properties.shift();

      var behavior = function() {
        if (!this.initialize) {
          var args = $A(arguments);

          return function() {
            var initArgs = [this].concat(args);
            behavior.attach.apply(behavior, initArgs);
          };
        } else {
          var args = (arguments.length == 2 && arguments[1] instanceof Array) ?
                      arguments[1] : Array.prototype.slice.call(arguments, 1);

          this.element = $(arguments[0]);
          this.initialize.apply(this, args);
          behavior._bindEvents(this);
          behavior.instances.push(this);
        }
      };

    Object.extend(behavior, Class.Methods);
    Object.extend(behavior, Behavior.Methods);
    behavior.superclass = parent;
    behavior.subclasses = [];
    behavior.instances = [];

    if (parent) {
      var subclass = function() { };
      subclass.prototype = parent.prototype;
      behavior.prototype = new subclass;
      parent.subclasses.push(behavior);
    }

    for (var i = 0; i < properties.length; i++)
      behavior.addMethods(properties[i]);

    if (!behavior.prototype.initialize)
      behavior.prototype.initialize = Prototype.emptyFunction;

    behavior.prototype.constructor = behavior;

    return behavior;
  },
  Methods : {
    attach : function(element) {
      return new this(element, Array.prototype.slice.call(arguments, 1));
    },
    _bindEvents : function(bound) {
      for (var member in bound) {
        var matches = member.match(/^on(.+)/);
        if (matches && typeof bound[member] == 'function')
          bound.element.observe(matches[1], Event.addBehavior._wrapObserver(bound[member].bindAsEventListener(bound)));
      }
    }
  }
};



Remote = Behavior.create({
  initialize: function(options) {
    if (this.element.nodeName == 'FORM') new Remote.Form(this.element, options);
    else new Remote.Link(this.element, options);
  }
});

Remote.Base = {
  initialize : function(options) {
    this.options = Object.extend({
      evaluateScripts : true
    }, options || {});

    this._bindCallbacks();
  },
  _makeRequest : function(options) {
    if (options.update) new Ajax.Updater(options.update, options.url, options);
    else new Ajax.Request(options.url, options);
    return false;
  },
  _bindCallbacks: function() {
    $w('onCreate onComplete onException onFailure onInteractive onLoading onLoaded onSuccess').each(function(cb) {
      if (Object.isFunction(this.options[cb]))
        this.options[cb] = this.options[cb].bind(this);
    }.bind(this));
  }
}

Remote.Link = Behavior.create(Remote.Base, {
  onclick : function() {
    var options = Object.extend({ url : this.element.href, method : 'get' }, this.options);
    return this._makeRequest(options);
  }
});


Remote.Form = Behavior.create(Remote.Base, {
  onclick : function(e) {
    var sourceElement = e.element();

    if (['input', 'button'].include(sourceElement.nodeName.toLowerCase()) &&
        sourceElement.type == 'submit')
      this._submitButton = sourceElement;
  },
  onsubmit : function() {
    var options = Object.extend({
      url : this.element.action,
      method : this.element.method || 'get',
      parameters : this.element.serialize({ submit: this._submitButton.name })
    }, this.options);
    this._submitButton = null;
    return this._makeRequest(options);
  }
});

Observed = Behavior.create({
  initialize : function(callback, options) {
    this.callback = callback.bind(this);
    this.options = options || {};
    this.observer = (this.element.nodeName == 'FORM') ? this._observeForm() : this._observeField();
  },
  stop: function() {
    this.observer.stop();
  },
  _observeForm: function() {
    return (this.options.frequency) ? new Form.Observer(this.element, this.options.frequency, this.callback) :
                                      new Form.EventObserver(this.element, this.callback);
  },
  _observeField: function() {
    return (this.options.frequency) ? new Form.Element.Observer(this.element, this.options.frequency, this.callback) :
                                      new Form.Element.EventObserver(this.element, this.callback);
  }
});



var Prototip = {
  Version: '2.0.5'
};

var Tips = {
  options: {
    images: '../images/prototip/', // image path, can be relative to this file or an absolute url
    zIndex: 6000                   // raise if required
  }
};

Prototip.Styles = {
  'default': {
    border: 1,
    borderColor: '',
    className: 'default',
    closeButton: false,
    hideAfter: false,
    hideOn: 'mouseleave',
    hook: false,
    radius: 1,
	showOn: 'mousemove',
    stem: {
      height: 12,
      width: 15
    }
  },
  'protoblue': {
    className: 'protoblue',
    border: 6,
    borderColor: '#116497',
    radius: 6,
    stem: { height: 12, width: 15 }
  },

  'darkgrey': {
    className: 'darkgrey',
    border: 6,
    borderColor: '#363636',
    radius: 6,
    stem: { height: 12, width: 15 }
  },

  'creamy': {
    className: 'creamy',
    border: 6,
    borderColor: '#ebe4b4',
    radius: 6,
    stem: { height: 12, width: 15 }
  },

  'protogrey': {
    className: 'protogrey',
    border: 6,
    borderColor: '#606060',
    radius: 6,
    stem: { height: 12, width: 15 }
  }
};

eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('P.11(X,{5V:"1.6.0.3",3U:c(){8.3C("25");b(/^(6x?:\\/\\/|\\/)/.6i(e.9.W)){e.W=e.9.W}13{h A=/1P(?:-[\\w\\d.]+)?\\.4G(.*)/;e.W=(($$("4C 4y[2b]").3t(c(B){O B.2b.2k(A)})||{}).2b||"").3j(A,"")+e.9.W}b(25.2r.3e&&!17.3X.v){17.3X.34("v","5L:5y-5r-5k:5d");17.1f("3G:32",c(){17.4P().4I("v\\\\:*","4H: 30(#2Z#4D);")})}e.2p();r.1f(2S,"2R",8.2R)},3C:c(A){b((4v 2S[A]=="4p")||(8.2P(2S[A].4l)<8.2P(8["4i"+A]))){4g("X 6p "+A+" >= "+8["4i"+A]);}},2P:c(A){h B=A.3j(/4c.*|\\./g,"");B=6h(B+"0".6e(4-B.3g));O A.66("4c")>-1?B-1:B},62:$w("43 60"),1U:c(A){b(25.2r.3e){O A}A=A.2s(c(E,D){h B=P.2A(8)?8:8.m,C=D.5J;5E(C&&C!=B){5x{C=C.5t}5q(F){C=B}}b(C==B){O}E(D)});O A},37:c(A){O(A>0)?(-1*A):(A).5g()},2R:c(){e.4j()}});P.11(e,{1D:[],1c:[],2p:c(){8.2G=8.1t},1p:(c(A){O{1k:(A?"29":"1k"),1a:(A?"1S":"1a"),29:(A?"29":"1k"),1S:(A?"1S":"1a")}})(25.2r.3e),3D:{1k:"1k",1a:"1a",29:"1k",1S:"1a"},2f:{k:"31",31:"k",i:"1s",1s:"i",1Y:"1Y",1e:"1h",1h:"1e"},3A:{q:"1e",p:"1h"},2U:c(A){O!!23[1]?8.2f[A]:A},1n:(c(B){h A=s 4x("4w ([\\\\d.]+)").4u(B);O A?(3u(A[1])<7):10})(4n.4m),2N:(25.2r.4k&&!17.6w),34:c(A){8.1D.2L(A)},1J:c(A){h B=8.1D.3t(c(C){O C.m==$(A)});b(B){B.4f();b(B.1b){B.o.1J();b(e.1n){B.1v.1J()}}8.1D=8.1D.4b(B)}A.1P=2a},4j:c(){8.1D.3m(c(A){8.1J(A.m)}.1j(8))},2J:c(C){b(C==8.49){O}b(8.1c.3g===0){8.2G=8.9.1t;3i(h B=0,A=8.1D.3g;B<A;B++){8.1D[B].o.f({1t:8.9.1t})}}C.o.f({1t:8.2G++});b(C.T){C.T.f({1t:8.2G})}8.49=C},47:c(A){8.3f(A);8.1c.2L(A)},3f:c(A){8.1c=8.1c.4b(A)},46:c(){e.1c.1Q("V")},Y:c(B,F){B=$(B),F=$(F);h K=P.11({1g:{x:0,y:0},R:10},23[2]||{});h D=K.1z||F.2t();D.k+=K.1g.x;D.i+=K.1g.y;h C=K.1z?[0,0]:F.3H(),A=17.1E.2D(),G=K.1z?"20":"15";D.k+=(-1*(C[0]-A[0]));D.i+=(-1*(C[1]-A[1]));b(K.1z){h E=[0,0];E.q=0;E.p=0}h I={m:B.21()},J={m:P.2c(D)};I[G]=K.1z?E:F.21();J[G]=P.2c(D);3i(h H 3Q J){3O(K[H]){U"5w":U"5u":J[H].k+=I[H].q;18;U"5s":J[H].k+=(I[H].q/2);18;U"5p":J[H].k+=I[H].q;J[H].i+=(I[H].p/2);18;U"5o":U"5m":J[H].i+=I[H].p;18;U"5l":U"5j":J[H].k+=I[H].q;J[H].i+=I[H].p;18;U"5h":J[H].k+=(I[H].q/2);J[H].i+=I[H].p;18;U"5f":J[H].i+=(I[H].p/2);18}}D.k+=-1*(J.m.k-J[G].k);D.i+=-1*(J.m.i-J[G].i);b(K.R){B.f({k:D.k+"j",i:D.i+"j"})}O D}});e.2p();h 5c=59.3J({2p:c(C,E){8.m=$(C);b(!8.m){4g("X: r 58 56, 55 3J a 1b.");O}e.1J(8.m);h A=(P.2F(E)||P.2A(E)),B=A?23[2]||[]:E;8.1u=A?E:2a;b(B.28){B=P.11(P.2c(X.33[B.28]),B)}8.9=P.11(P.11({1m:10,1i:0,3k:"#4R",1o:0,u:e.9.u,19:e.9.4L,1B:!(B.1d&&B.1d=="1Z")?0.14:10,1C:10,1x:"1S",3B:10,Y:B.Y,1g:B.Y?{x:0,y:0}:{x:16,y:16},1K:(B.Y&&!B.Y.1z)?1l:10,1d:"2q",n:10,28:"2Z",15:8.m,12:10,1E:(B.Y&&!B.Y.1z)?10:1l,q:10},X.33["2Z"]),B);8.15=$(8.9.15);8.1o=8.9.1o;8.1i=(8.1o>8.9.1i)?8.1o:8.9.1i;b(8.9.W){8.W=8.9.W.2Y("://")?8.9.W:e.W+8.9.W}13{8.W=e.W+"4F/"+(8.9.28||"")+"/"}b(!8.W.4E("/")){8.W+="/"}b(P.2F(8.9.n)){8.9.n={R:8.9.n}}b(8.9.n.R){8.9.n=P.11(P.2c(X.33[8.9.28].n)||{},8.9.n);8.9.n.R=[8.9.n.R.2k(/[a-z]+/)[0].2e(),8.9.n.R.2k(/[A-Z][a-z]+/)[0].2e()];8.9.n.1I=["k","31"].3z(8.9.n.R[0])?"1e":"1h";8.1r={1e:10,1h:10}}b(8.9.1m){8.9.1m.9=P.11({2V:25.4B},8.9.1m.9||{})}8.1p=$w("4A 43").3z(8.m.4z.2e())?e.3D:e.1p;b(8.9.Y.1z){h D=8.9.Y.1q.2k(/[a-z]+/)[0].2e();8.20=e.2f[D]+e.2f[8.9.Y.1q.2k(/[A-Z][a-z]+/)[0].2e()].2B()}8.3y=(e.2N&&8.1o);8.3x();e.34(8);8.3w();X.11(8)},3x:c(){8.o=s r("S",{u:"1P"}).f({1t:e.9.1t});b(8.3y){8.o.V=c(){8.f("k:-3v;i:-3v;1O:2o;");O 8};8.o.Q=c(){8.f("1O:1c");O 8};8.o.1c=c(){O(8.2Q("1O")=="1c"&&3u(8.2Q("i").3j("j",""))>-4t)}}8.o.V();b(e.1n){8.1v=s r("4s",{u:"1v",2b:"4r:10;",4q:0}).f({2m:"2i",1t:e.9.1t-1,4o:0})}b(8.9.1m){8.24=8.24.2s(8.2O)}8.1q=s r("S",{u:"1u"});8.12=s r("S",{u:"12"}).V();b(8.9.19||(8.9.1x.m&&8.9.1x.m=="19")){8.19=s r("S",{u:"2j"}).26(8.W+"2j.2l")}},2H:c(){b(17.32){8.3r();8.3s=1l;O 1l}13{b(!8.3s){17.1f("3G:32",8.3r);O 10}}},3r:c(){$(17.2M).N(8.o);b(e.1n){$(17.2M).N(8.1v)}b(8.9.1m){$(17.2M).N(8.T=s r("S",{u:"6v"}).26(8.W+"T.6t").V())}h G="o";b(8.9.n.R){8.n=s r("S",{u:"6r"}).f({p:8.9.n[8.9.n.1I=="1h"?"p":"q"]+"j"});h B=8.9.n.1I=="1e";8[G].N(8.3p=s r("S",{u:"6q 2K"}).N(8.4e=s r("S",{u:"6o 2K"})));8.n.N(8.1T=s r("S",{u:"6n"}).f({p:8.9.n[B?"q":"p"]+"j",q:8.9.n[B?"p":"q"]+"j"}));b(e.1n&&!8.9.n.R[1].4d().2Y("6m")){8.1T.f({2m:"6l"})}G="4e"}b(8.1i){h D=8.1i,F;8[G].N(8.1W=s r("6j",{u:"1W"}).N(8.1V=s r("3n",{u:"1V 3l"}).f("p: "+D+"j").N(s r("S",{u:"2n 6g"}).N(s r("S",{u:"1X"}))).N(F=s r("S",{u:"6f"}).f({p:D+"j"}).N(s r("S",{u:"4a"}).f({1w:"0 "+D+"j",p:D+"j"}))).N(s r("S",{u:"2n 6d"}).N(s r("S",{u:"1X"})))).N(8.2W=s r("3n",{u:"2W 3l"}).N(8.2T=s r("S",{u:"2T"}).f("2I: 0 "+D+"j"))).N(8.48=s r("3n",{u:"48 3l"}).f("p: "+D+"j").N(s r("S",{u:"2n 6c"}).N(s r("S",{u:"1X"}))).N(F.6b(1l)).N(s r("S",{u:"2n 69"}).N(s r("S",{u:"1X"})))));G="2T";h C=8.1W.2X(".1X");$w("68 67 65 63").3m(c(I,H){b(8.1o>0){X.45(C[H],I,{1L:8.9.3k,1i:D,1o:8.9.1o})}13{C[H].2E("44")}C[H].f({q:D+"j",p:D+"j"}).2E("1X"+I.2B())}.1j(8));8.1W.2X(".4a",".2W",".44").1Q("f",{1L:8.9.3k})}8[G].N(8.1b=s r("S",{u:"1b "+8.9.u}).N(8.27=s r("S",{u:"27"}).N(8.12)));b(8.9.q){h E=8.9.q;b(P.61(E)){E+="j"}8.1b.f("q:"+E)}b(8.n){h A={};A[8.9.n.1I=="1e"?"i":"1s"]=8.n;8.o.N(A);8.2g()}8.1b.N(8.1q);b(!8.9.1m){8.3d({12:8.9.12,1u:8.1u})}},3d:c(E){h A=8.o.2Q("1O");8.o.f("p:1M;q:1M;1O:2o").Q();b(8.1i){8.1V.f("p:0");8.1V.f("p:0")}b(E.12){8.12.Q().42(E.12);8.27.Q()}13{b(!8.19){8.12.V();8.27.V()}}b(P.2A(E.1u)){E.1u.Q()}b(P.2F(E.1u)||P.2A(E.1u)){8.1q.42(E.1u)}8.1b.f({q:8.1b.41()+"j"});8.o.f("1O:1c").Q();8.1b.Q();h C=8.1b.21(),B={q:C.q+"j"},D=[8.o];b(e.1n){D.2L(8.1v)}b(8.19){8.12.Q().N({i:8.19});8.27.Q()}b(E.12||8.19){8.27.f("q: 3c%")}B.p=2a;8.o.f({1O:A});8.1q.2E("2K");b(E.12||8.19){8.12.2E("2K")}b(8.1i){8.1V.f("p:"+8.1i+"j");8.1V.f("p:"+8.1i+"j");B="q: "+(C.q+2*8.1i)+"j";D.2L(8.1W)}D.1Q("f",B);b(8.n){8.2g();b(8.9.n.1I=="1e"){8.o.f({q:8.o.41()+8.9.n.p+"j"})}}8.o.V()},3w:c(){8.3b=8.24.1y(8);8.40=8.V.1y(8);b(8.9.1K&&8.9.1d=="2q"){8.9.1d="1k"}b(8.9.1d==8.9.1x){8.1R=8.3Z.1y(8);8.m.1f(8.9.1d,8.1R)}b(8.19){8.19.1f("1k",c(E){E.26(8.W+"5Y.2l")}.1j(8,8.19)).1f("1a",c(E){E.26(8.W+"2j.2l")}.1j(8,8.19))}h C={m:8.1R?[]:[8.m],15:8.1R?[]:[8.15],1q:8.1R?[]:[8.o],19:[],2i:[]},A=8.9.1x.m;8.39=A||(!8.9.1x?"2i":"m");8.1N=C[8.39];b(!8.1N&&A&&P.2F(A)){8.1N=8.1q.2X(A)}h D={29:"1k",1S:"1a"};$w("Q V").3m(c(H){h G=H.2B(),F=(8.9[H+"3Y"].38||8.9[H+"3Y"]);8[H+"3W"]=F;b(["29","1S","1k","1a"].2Y(F)){8[H+"3W"]=(8.1p[F]||F);8["38"+G]=X.1U(8["38"+G])}}.1j(8));b(!8.1R){8.m.1f(8.9.1d,8.3b)}b(8.1N){8.1N.1Q("1f",8.5X,8.40)}b(!8.9.1K&&8.9.1d=="1Z"){8.2u=8.R.1y(8);8.m.1f("2q",8.2u)}8.3V=8.V.2s(c(G,F){h E=F.5P(".2j");b(E){E.5N();F.5M();G(F)}}).1y(8);b(8.19||(8.9.1x&&(8.9.1x.m==".2j"))){8.o.1f("1Z",8.3V)}b(8.9.1d!="1Z"&&(8.39!="m")){8.2C=X.1U(c(){8.1G("Q")}).1y(8);8.m.1f(8.1p.1a,8.2C)}h B=[8.m,8.o];8.36=X.1U(c(){e.2J(8);8.2v()}).1y(8);8.35=X.1U(8.1C).1y(8);B.1Q("1f",8.1p.1k,8.36).1Q("1f",8.1p.1a,8.35);b(8.9.1m&&8.9.1d!="1Z"){8.2z=X.1U(8.3T).1y(8);8.m.1f(8.1p.1a,8.2z)}},4f:c(){b(8.9.1d==8.9.1x){8.m.1A(8.9.1d,8.1R)}13{8.m.1A(8.9.1d,8.3b);b(8.1N){8.1N.1Q("1A")}}b(8.2u){8.m.1A("2q",8.2u)}b(8.2C){8.m.1A("1a",8.2C)}8.o.1A();8.m.1A(8.1p.1k,8.36).1A(8.1p.1a,8.35);b(8.2z){8.m.1A(8.1p.1a,8.2z)}},2O:c(C,B){b(!8.1b){b(!8.2H()){O}}8.R(B);b(8.2y){O}13{b(8.3S){C(B);O}}8.2y=1l;h D={2h:{1F:22.1F(B),1H:22.1H(B)}};h A=P.2c(8.9.1m.9);A.2V=A.2V.2s(c(F,E){8.3d({12:8.9.12,1u:E.5I});8.R(D);(c(){F(E);h G=(8.T&&8.T.1c());b(8.T){8.1G("T");8.T.1J();8.T=2a}b(G){8.Q()}8.3S=1l;8.2y=2a}.1j(8)).1B(0.6)}.1j(8));8.5H=r.Q.1B(8.9.1B,8.T);8.o.V();8.2y=1l;8.T.Q();8.5F=(c(){s 5B.5A(8.9.1m.30,A)}.1j(8)).1B(8.9.1B);O 10},3T:c(){8.1G("T")},24:c(A){b(!8.1b){b(!8.2H()){O}}8.R(A);b(8.o.1c()){O}8.1G("Q");8.5z=8.Q.1j(8).1B(8.9.1B)},1G:c(A){b(8[A+"3N"]){5v(8[A+"3N"])}},Q:c(){b(8.o.1c()){O}b(e.1n){8.1v.Q()}b(8.9.3B){e.46()}e.47(8);8.1b.Q();8.o.Q();b(8.n){8.n.Q()}8.m.3M("1P:5C")},1C:c(A){b(8.9.1m){b(8.T&&8.9.1d!="1Z"){8.T.V()}}b(!8.9.1C){O}8.2v();8.5D=8.V.1j(8).1B(8.9.1C)},2v:c(){b(8.9.1C){8.1G("1C")}},V:c(){8.1G("Q");8.1G("T");b(!8.o.1c()){O}8.3L()},3L:c(){b(e.1n){8.1v.V()}b(8.T){8.T.V()}8.o.V();(8.1W||8.1b).Q();e.3f(8);8.m.3M("1P:2o")},3Z:c(A){b(8.o&&8.o.1c()){8.V(A)}13{8.24(A)}},2g:c(){h C=8.9.n,B=23[0]||8.1r,D=e.2U(C.R[0],B[C.1I]),F=e.2U(C.R[1],B[e.2f[C.1I]]),A=8.1o||0;8.1T.26(8.W+D+F+".2l");b(C.1I=="1e"){h E=(D=="k")?C.p:0;8.3p.f("k: "+E+"j;");8.1T.f({"2w":D});8.n.f({k:0,i:(F=="1s"?"3c%":F=="1Y"?"50%":0),5G:(F=="1s"?-1*C.q:F=="1Y"?-0.5*C.q:0)+(F=="1s"?-1*A:F=="i"?A:0)+"j"})}13{8.3p.f(D=="i"?"1w: 0; 2I: "+C.p+"j 0 0 0;":"2I: 0; 1w: 0 0 "+C.p+"j 0;");8.n.f(D=="i"?"i: 0; 1s: 1M;":"i: 1M; 1s: 0;");8.1T.f({1w:0,"2w":F!="1Y"?F:"2i"});b(F=="1Y"){8.1T.f("1w: 0 1M;")}13{8.1T.f("1w-"+F+": "+A+"j;")}b(e.2N){b(D=="1s"){8.n.f({R:"3P",5n:"5K",i:"1M",1s:"1M","2w":"k",q:"3c%",1w:(-1*C.p)+"j 0 0 0"});8.n.28.2m="3K"}13{8.n.f({R:"3R","2w":"2i",1w:0})}}}8.1r=B},R:c(B){b(!8.1b){b(!8.2H()){O}}e.2J(8);b(e.1n){h A=8.o.21();b(!8.2x||8.2x.p!=A.p||8.2x.q!=A.q){8.1v.f({q:A.q+"j",p:A.p+"j"})}8.2x=A}b(8.9.Y){h J,H;b(8.20){h K=17.1E.2D(),C=B.2h||{};h G,I=2;3O(8.20.4d()){U"5O":U"5i":G={x:0-I,y:0-I};18;U"5Q":G={x:0,y:0-I};18;U"5R":U"5S":G={x:I,y:0-I};18;U"5T":G={x:I,y:0};18;U"5U":U"5e":G={x:I,y:I};18;U"5W":G={x:0,y:I};18;U"5b":U"5a":G={x:0-I,y:I};18;U"5Z":G={x:0-I,y:0};18}G.x+=8.9.1g.x;G.y+=8.9.1g.y;J=P.11({1g:G},{m:8.9.Y.1q,20:8.20,1z:{i:C.1H||22.1H(B)-K.i,k:C.1F||22.1F(B)-K.k}});H=e.Y(8.o,8.15,J);b(8.9.1E){h M=8.3a(H),L=M.1r;H=M.R;H.k+=L.1h?2*X.37(G.x-8.9.1g.x):0;H.i+=L.1h?2*X.37(G.y-8.9.1g.y):0;b(8.n&&(8.1r.1e!=L.1e||8.1r.1h!=L.1h)){8.2g(L)}}H={k:H.k+"j",i:H.i+"j"};8.o.f(H)}13{J=P.11({1g:8.9.1g},{m:8.9.Y.1q,15:8.9.Y.15});H=e.Y(8.o,8.15,P.11({R:1l},J));H={k:H.k+"j",i:H.i+"j"}}b(8.T){h E=e.Y(8.T,8.15,P.11({R:1l},J))}b(e.1n){8.1v.f(H)}}13{h F=8.15.2t(),C=B.2h||{},H={k:((8.9.1K)?F[0]:C.1F||22.1F(B))+8.9.1g.x,i:((8.9.1K)?F[1]:C.1H||22.1H(B))+8.9.1g.y};b(!8.9.1K&&8.m!==8.15){h D=8.m.2t();H.k+=-1*(D[0]-F[0]);H.i+=-1*(D[1]-F[1])}b(!8.9.1K&&8.9.1E){h M=8.3a(H),L=M.1r;H=M.R;b(8.n&&(8.1r.1e!=L.1e||8.1r.1h!=L.1h)){8.2g(L)}}H={k:H.k+"j",i:H.i+"j"};8.o.f(H);b(8.T){8.T.f(H)}b(e.1n){8.1v.f(H)}}},3a:c(C){h E={1e:10,1h:10},D=8.o.21(),B=17.1E.2D(),A=17.1E.21(),G={k:"q",i:"p"};3i(h F 3Q G){b((C[F]+D[G[F]]-B[F])>A[G[F]]){C[F]=C[F]-(D[G[F]]+(2*8.9.1g[F=="k"?"x":"y"]));b(8.n){E[e.3A[G[F]]]=1l}}}O{R:C,1r:E}}});P.11(X,{45:c(G,H){h F=23[2]||8.9,B=F.1o,E=F.1i,D=s r("57",{u:"64"+H.2B(),q:E+"j",p:E+"j"}),A={i:(H.3I(0)=="t"),k:(H.3I(1)=="l")};b(D&&D.3h&&D.3h("2d")){G.N(D);h C=D.3h("2d");C.54=F.1L;C.53((A.k?B:E-B),(A.i?B:E-B),B,0,6a.52*2,1l);C.51();C.3F((A.k?B:0),0,E-B,E);C.3F(0,(A.i?B:0),E,E-B)}13{G.N(s r("S").f({q:E+"j",p:E+"j",1w:0,2I:0,2m:"3K",R:"3P",4Z:"2o"}).N(s r("v:4Y",{4X:F.1L,4W:"4V",4U:F.1L,4T:(B/E*0.5).4S(2)}).f({q:2*E-1+"j",p:2*E-1+"j",R:"3R",k:(A.k?0:(-1*E))+"j",i:(A.i?0:(-1*E))+"j"})))}}});r.6k({26:c(C,B){C=$(C);h A=P.11({3E:"i k",3q:"4Q-3q",3o:"4O",1L:""},23[2]||{});C.f(e.1n?{4N:"4M:6s.4K.6u(2b=\'"+B+"\'\', 3o=\'"+A.3o+"\')"}:{4J:A.1L+" 30("+B+") "+A.3E+" "+A.3q});O C}});X.4h={Q:c(){e.2J(8);8.2v();h D={};b(8.9.Y){D.2h={1F:0,1H:0}}13{h A=8.15.2t(),C=8.15.3H(),B=17.1E.2D();A.k+=(-1*(C[0]-B[0]));A.i+=(-1*(C[1]-B[1]));D.2h={1F:A.k,1H:A.i}}b(8.9.1m){8.2O(D)}13{8.24(D)}8.1C()}};X.11=c(A){A.m.1P={};P.11(A.m.1P,{Q:X.4h.Q.1j(A),V:A.V.1j(A),1J:e.1J.1j(e,A.m)})};X.3U();',62,406,'||||||||this|options||if|function||Tips|setStyle||var|top|px|left||element|stem|wrapper|height|width|Element|new||className|||||||||||||||||||insert|return|Object|show|position|div|loader|case|hide|images|Prototip|hook||false|extend|title|else||target||document|break|closeButton|mouseout|tooltip|visible|showOn|horizontal|observe|offset|vertical|border|bind|mouseover|true|ajax|fixIE|radius|useEvent|tip|stemInverse|bottom|zIndex|content|iframeShim|margin|hideOn|bindAsEventListener|mouse|stopObserving|delay|hideAfter|tips|viewport|pointerX|clearTimer|pointerY|orientation|remove|fixed|backgroundColor|auto|hideTargets|visibility|prototip|invoke|eventToggle|mouseleave|stemImage|capture|borderTop|borderFrame|prototip_Corner|middle|click|mouseHook|getDimensions|Event|arguments|showDelayed|Prototype|setPngBackground|toolbar|style|mouseenter|null|src|clone||toLowerCase|_inverse|positionStem|fakePointer|none|close|match|png|display|prototip_CornerWrapper|hidden|initialize|mousemove|Browser|wrap|cumulativeOffset|eventPosition|cancelHideAfter|float|iframeShimDimensions|ajaxContentLoading|ajaxHideEvent|isElement|capitalize|eventCheckDelay|getScrollOffsets|addClassName|isString|zIndexTop|build|padding|raise|clearfix|push|body|WebKit419|ajaxShow|convertVersionString|getStyle|unload|window|borderCenter|inverseStem|onComplete|borderMiddle|select|include|default|url|right|loaded|Styles|add|activityLeave|activityEnter|toggleInt|event|hideElement|getPositionWithinViewport|eventShow|100|_update|IE|removeVisible|length|getContext|for|replace|borderColor|borderRow|each|li|sizingMethod|stemWrapper|repeat|_build|_isBuilding|find|parseFloat|9500px|activate|setup|fixSafari2|member|_stemTranslation|hideOthers|require|specialEvent|align|fillRect|dom|cumulativeScrollOffset|charAt|create|block|afterHide|fire|Timer|switch|relative|in|absolute|ajaxContentLoaded|ajaxHide|start|buttonEvent|Action|namespaces|On|toggle|eventHide|getWidth|update|input|prototip_Fill|createCorner|hideAll|addVisibile|borderBottom|_highest|prototip_Between|without|_|toUpperCase|stemBox|deactivate|throw|Methods|REQUIRED_|removeAll|WebKit|Version|userAgent|navigator|opacity|undefined|frameBorder|javascript|iframe|9500|exec|typeof|MSIE|RegExp|script|tagName|area|emptyFunction|head|VML|endsWith|styles|js|behavior|addRule|background|Microsoft|closeButtons|progid|filter|scale|createStyleSheet|no|000000|toFixed|arcSize|strokeColor|1px|strokeWeight|fillcolor|roundrect|overflow||fill|PI|arc|fillStyle|cannot|available|canvas|not|Class|LEFTBOTTOM|BOTTOMLEFT|Tip|vml|BOTTOMRIGHT|leftMiddle|abs|bottomMiddle|TOPLEFT|rightBottom|com|bottomRight|leftBottom|clear|bottomLeft|rightMiddle|catch|microsoft|topMiddle|parentNode|rightTop|clearTimeout|topRight|try|schemas|showTimer|Request|Ajax|shown|hideAfterTimer|while|ajaxTimer|marginTop|loaderTimer|responseText|relatedTarget|both|urn|stop|blur|LEFTTOP|findElement|TOPMIDDLE|TOPRIGHT|RIGHTTOP|RIGHTMIDDLE|RIGHTBOTTOM|REQUIRED_Prototype|BOTTOMMIDDLE|hideAction|close_hover|LEFTMIDDLE|textarea|isNumber|_captureTroubleElements|br|cornerCanvas|bl|indexOf|tr|tl|prototip_CornerWrapperBottomRight|Math|cloneNode|prototip_CornerWrapperBottomLeft|prototip_CornerWrapperTopRight|times|prototip_BetweenCorners|prototip_CornerWrapperTopLeft|parseInt|test|ul|addMethods|inline|MIDDLE|prototip_StemImage|prototip_StemBox|requires|prototip_StemWrapper|prototip_Stem|DXImageTransform|gif|AlphaImageLoader|prototipLoader|evaluate|https'.split('|'),0,{}));


var Lightview = {
  Version: '2.3.2',
  options: {
    backgroundColor: '#264564',                            // Background color of the view
    border: 10,                                            // Size of the border
    buttons: {
      opacity: {                                           // Opacity of inner buttons
        disabled: 0.4,
        normal: 0.7,
        hover: 1
      },
      side: { display: true },                             // show side buttons
      innerPreviousNext: { display: true },                // show the inner previous and next button
      slideshow: { display: true }                         // show slideshow button
    },
    cyclic: false,                                         // Makes galleries cyclic, no end/begin.
    images: '/images/default/layout/popup/lightview/',     // The directory of the images, from this file
    imgNumberTemplate: 'Image #{position} of #{total}',    // Want a different language? change it here
    keyboard: { enabled: true },
    overlay: {                                             // Overlay
      background: '#000',                                  // Background color, Mac Firefox & Mac Safari use overlay.png
      close: true,
      opacity: 0.85,
      display: true
    },
    preloadHover: true,                                    // Preload images on mouseover
    radius: 10,                                            // Corner radius of the border
    removeTitles: true,                                    // Set to false if you want to keep title attributes intact
    resizeDuration: 0.45,                                  // When effects are used, the duration of resizing in seconds
    slideshowDelay: 5,                                     // Seconds to wait before showing the next slide in slideshow
    titleSplit: '::',                                      // The characters you want to split title with
    transition: function(pos) {                            // Or your own transition
      return ((pos/=0.5) < 1 ? 0.5 * Math.pow(pos, 4) :
        -0.5 * ((pos-=2) * Math.pow(pos,3) - 2));
    },
    viewport: false,                                       // Stay within the viewport, true is recommended
    zIndex: 5000,                                          // zIndex of #lightview, #overlay is this -1

    closeDimensions: {                                     // If you've changed the close button you can change these
      large: { width: 77, height: 22 },                    // not required but it speeds things up.
      small: { width: 25, height: 22 },
      topclose: { width: 22, height: 18 }                  // when topclose option is used
    },
    defaultOptions : {                                     // Default open dimensions for each type
      ajax:   { width: 900, height: 300 },
      iframe: { width: 400, height: 300, scrolling: true },
      inline: { width: 400, height: 300 },
      flash:  { width: 400, height: 300 },
      quicktime: { width: 480, height: 220, autoplay: true, controls: true }
    },
    sideDimensions: { width: 16, height: 22 }              // see closeDimensions
  },

  classids: {
    quicktime: 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
    flash: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
  },
  codebases: {
    quicktime: 'http://www.apple.com/qtactivex/qtplugin.cab#version=7,3,0,0',
    flash: 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0'
  },
  errors: {
    requiresPlugin: "<div class='message'>The content your are attempting to view requires the <span class='type'>#{type}</span> plugin.</div><div class='pluginspage'><p>Please download and install the required plugin from:</p><a href='#{pluginspage}' target='_blank'>#{pluginspage}</a></div>"
  },
  mimetypes: {
    quicktime: 'video/quicktime',
    flash: 'application/x-shockwave-flash'
  },
  pluginspages: {
    quicktime: 'http://www.apple.com/quicktime/download',
    flash: 'http://www.adobe.com/go/getflashplayer'
  },
  typeExtensions: {
    flash: 'swf',
    image: 'bmp gif jpeg jpg png',
    iframe: 'asp aspx cgi cfm htm html jsp php pl php3 php4 php5 phtml rb rhtml shtml txt',
    quicktime: 'avi mov mpg mpeg movie'
  }
};

eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1b.4a=(h(B){q A=k 4b("76 ([\\\\d.]+)").77(B);z A?5i(A[1]):-1})(2B.4c);Z.1f(X.12,{2t:X.12.2u&&(1b.4a>=6&&1b.4a<7),2v:(X.12.3r&&!1g.4d)});Z.1f(1b,{78:"1.6.0.2",79:"1.8.1",W:{1l:"4e",3s:"10"},5j:!!2B.4c.3t(/5k/i),4f:!!2B.4c.3t(/5k/i)&&(X.12.3r||X.12.2l),4g:h(A){f((7a 2a[A]=="7b")||(9.4h(2a[A].7c)<9.4h(9["5l"+A]))){7d("1b 7e "+A+" >= "+9["5l"+A]);}},4h:h(A){q B=A.2w(/5m.*|\\./g,"");B=3u(B+"0".7f(4-B.21));z A.23("5m")>-1?B-1:B},5n:h(){9.4g("X");f(!!2a.11&&!2a.5o){9.4g("5o")}f(/^(7g?:\\/\\/|\\/)/.4i(9.m.1h)){9.1h=9.m.1h}13{q A=/10(?:-[\\w\\d.]+)?\\.7h(.*)/;9.1h=(($$("7i 7j[1v]").5p(h(B){z B.1v.3t(A)})||{}).1v||"").2w(A,"")+9.m.1h}f(X.12.2u&&!1g.5q.v){1g.5q.5r("v","7k:7l-7m-7n:7o");1g.1i("4j:3v",h(){1g.7p().7q("v\\\\:*","7r: 30(#5s#7s);")})}},4k:h(){9.2C=9.m.2C;9.1c=(9.2C>9.m.1c)?9.2C:9.m.1c;9.1B=9.m.1B;9.1C=9.m.1C;9.5t();9.5u();9.5v();9.1R()}});Z.1f(1b,{5w:14,1R:h(){q A=4l.7t;A.4m++;f(A.4m==9.5w){$(1g.31).4n("10:3v")}}});1b.1R.4m=0;Z.1f(1b,{5t:h(){9.10=k y("Y",{2D:"10"});q B,I,D=9.1S(9.1C);f(X.12.2v){9.10.17=h(){9.r("1o:-3w;1j:-3w;1t:32;");z 9};9.10.1a=h(){9.r("1t:2x");z 9};9.10.2x=h(){z(9.1w("1t")=="2x"&&5i(9.1w("1j").2w("u",""))>-7u)}}$(1g.31).S(9.1T=k y("Y",{2D:"5x"}).r({3x:9.m.3x-1,1l:(!(X.12.2l||X.12.2t))?"4o":"3y",2E:9.4f?"30("+9.1h+"1T.1J) 1j 1o 2F":9.m.1T.2E}).1x((X.12.2l)?1:9.m.1T.1D).17()).S(9.10.r({3x:9.m.3x,1j:"-3w",1o:"-3w"}).1x(0).S(9.5y=k y("Y",{V:"7v"}).S(9.3z=k y("33",{V:"7w"}).S(9.5z=k y("1M",{V:"7x"}).r(I=Z.1f({1E:-1*9.1C.o+"u"},D)).S(9.3A=k y("Y",{V:"4p"}).r(Z.1f({1E:9.1C.o+"u"},D)).S(k y("Y",{V:"1U"})))).S(9.5A=k y("1M",{V:"7y"}).r(Z.1f({5B:-1*9.1C.o+"u"},D)).S(9.3B=k y("Y",{V:"4p"}).r(I).S(k y("Y",{V:"1U"}))))).S(9.5C=k y("Y",{V:"5D"}).S(9.3C=k y("Y",{V:"4p 7z"}).S(9.7A=k y("Y",{V:"1U"})))).S(k y("33",{V:"7B"}).S(k y("1M",{V:"5E 7C"}).S(B=k y("Y",{V:"7D"}).r({n:9.1c+"u"}).S(k y("33",{V:"5F 7E"}).S(k y("1M",{V:"5G"}).S(k y("Y",{V:"3D"})).S(k y("Y",{V:"34"}).r({1o:9.1c+"u"})))).S(k y("Y",{V:"5H"})).S(k y("33",{V:"5F 7F"}).S(k y("1M",{V:"5G"}).r("35-1j: "+(-1*9.1c)+"u").S(k y("Y",{V:"3D"})).S(k y("Y",{V:"34"}).r("1o: "+(-1*9.1c)+"u")))))).S(9.3E=k y("1M",{V:"7G"}).r("n: "+(7H-9.1c)+"u").S(k y("Y",{V:"7I"}).S(k y("Y",{V:"5I"}).r("35-1j: "+9.1c+"u").S(9.2G=k y("Y",{V:"7J"}).1x(0).r("3F: 0 "+9.1c+"u").S(9.2b=k y("Y",{V:"7K 34"})).S(9.1V=k y("Y",{V:"7L"}).S(9.36=k y("Y",{V:"1U 5J"}).r(9.1S(9.m.1B.3G)).r({2E:9.m.19}).1x(9.m.1K.1D.2y)).S(9.3H=k y("33",{V:"7M"}).S(9.4q=k y("1M",{V:"7N"}).S(9.1y=k y("Y",{V:"7O"})).S(9.1W=k y("Y",{V:"7P"}))).S(9.3I=k y("1M",{V:"7Q"}).S(k y("Y"))).S(9.4r=k y("1M",{V:"7R"}).S(9.7S=k y("Y",{V:"1U"}).1x(9.m.1K.1D.2y).r({19:9.m.19}).2c(9.1h+"7T.1J",{19:9.m.19})).S(9.7U=k y("Y",{V:"1U"}).1x(9.m.1K.1D.2y).r({19:9.m.19}).2c(9.1h+"7V.1J",{19:9.m.19}))).S(9.2m=k y("1M",{V:"7W"}).S(9.2z=k y("Y",{V:"1U"}).1x(9.m.1K.1D.2y).r({19:9.m.19}).2c(9.1h+"5K.1J",{19:9.m.19}))))).S(9.1N=k y("Y",{V:"7X"}))))).S(9.2H=k y("Y",{V:"5L"}).S(9.7Y=k y("Y",{V:"1U"}).r("2E: 30("+9.1h+"2H.4s) 1j 1o 3J-2F")))).S(k y("1M",{V:"5E 7Z"}).S(B.80(1O))).S(9.1L=k y("1M",{V:"81"}).17().r("35-1j: "+9.1c+"u; 2E: 30("+9.1h+"82.4s) 1j 1o 2F"))))).S(k y("Y",{2D:"38"}).17());q H=k 2n();H.1u=h(){H.1u=X.2e;9.1C={o:H.o,n:H.n};q K=9.1S(9.1C),C;9.3z.r({1P:0-(H.n/2).2o()+"u",n:H.n+"u"});9.5z.r(C=Z.1f({1E:-1*9.1C.o+"u"},K));9.3A.r(Z.1f({1E:K.o},K));9.5A.r(Z.1f({5B:-1*9.1C.o+"u"},K));9.3B.r(C);9.1R()}.U(9);H.1v=9.1h+"2f.1J";$w("2G 1y 1W 3I").1d(h(C){9[C].r({19:9.m.19})}.U(9));q G=9.5y.3a(".3D");$w("83 84 85 5M").1d(h(K,C){f(9.2C>0){9.5N(G[C],K)}13{G[C].S(k y("Y",{V:"34"}))}G[C].r({o:9.1c+"u",n:9.1c+"u"}).86("3D"+K.24());9.1R()}.U(9));9.10.3a(".5H",".34",".5I").3K("r",{19:9.m.19});q E={};$w("2f 1k 2g").1d(h(K){9[K+"2I"].3b=K;q C=9.1h+K+".1J";f(K=="2g"){E[K]=k 2n();E[K].1u=h(){E[K].1u=X.2e;9.1B[K]={o:E[K].o,n:E[K].n};q L=9.5j?"1o":"87",M=Z.1f({"88":L,1P:9.1B[K].n+"u"},9.1S(9.1B[K]));M["3F"+L.24()]=9.1c+"u";9[K+"2I"].r(M);9.5C.r({n:E[K].n+"u",1j:-1*9.1B[K].n+"u"});9[K+"2I"].5O().2c(C).r(9.1S(9.1B[K]));9.1R()}.U(9);E[K].1v=9.1h+K+".1J"}13{9[K+"2I"].2c(C)}}.U(9));q A={};$w("3G 3L").1d(h(C){A[C]=k 2n();A[C].1u=h(){A[C].1u=X.2e;9.1B[C]={o:A[C].o,n:A[C].n};9.1R()}.U(9);A[C].1v=9.1h+"5P"+C+".1J"}.U(9));q J=k 2n();J.1u=h(){J.1u=X.2e;9.2H.r({o:J.o+"u",n:J.n+"u",1P:-0.5*J.n+0.5*9.1c+"u",1E:-0.5*J.o+"u"});9.1R()}.U(9);J.1v=9.1h+"2H.4s";q F=k 2n();F.1u=h(C){F.1u=X.2e;q K={o:F.o+"u",n:F.n+"u"};9.2m.r(K);9.2z.r(K);9.1R()}.U(9);F.1v=9.1h+"5Q.1J";$w("2f 1k").1d(h(L){q K=L.24(),C=k 2n();C.1u=h(){C.1u=X.2e;9["2J"+K+"2K"].r({o:C.o+"u",n:C.n+"u"});9.1R()}.U(9);C.1v=9.1h+"89"+L+".1J";9["2J"+K+"2K"].1L=L}.U(9));9.1R()},5R:h(){11.2L.2M("10").1d(h(A){A.5S()});9.1z=1q;f(3u(9.3C.1w("1P"))<9.1B.2g.n){9.4t(2h)}9.4u();9.1m=1q},4u:h(){f(!9.3c||!9.3d){z}9.3d.S({8a:9.3c.r({1Q:9.3c.5T})});9.3d.26();9.3d=1q},1a:h(B){9.1r=1q;f(Z.5U(B)||Z.5V(B)){9.1r=$(B);f(!9.1r){z}9.1r.8b();9.j=9.1r.1X}13{f(B.1e){9.1r=$(1g.31);9.j=k 1b.4v(B)}13{f(Z.5W(B)){9.1r=9.4w(9.j.1p).4x[B];9.j=9.1r.1X}}}f(!9.j.1e){z}9.5R();9.4y();9.5X();9.5Y();9.3e();9.5Z();f(9.j.1e!="#38"&&Z.60(1b.4z).61(" ").23(9.j.18)>=0){f(!1b.4z[9.j.18]){$("38").1F(k 62(9.8c.8d).4d({18:9.j.18.24(),4A:9.4B[9.j.18]}));q C=$("38").2N();9.1a({1e:"#38",1y:9.j.18.24()+" 8e 8f",m:C});z 2h}}f(9.j.1G()){9.1m=9.j.1G()?9.4C(9.j.1p):[9.j]}q A=Z.1f({1V:1O,2g:2h,4D:"8g",4E:9.j.1G()&&9.m.1K.4E.1Q,63:9.m.1T.8h,2m:9.j.1G()&&9.m.1K.2m.1Q},9.m.8i[9.j.18]||{});9.j.m=Z.1f(A,9.j.m);f(!(9.j.1y||9.j.1W||(9.1m&&9.1m.21>1))&&9.j.m.2g){9.j.m.1V=2h}f(9.j.2O()){f(9.j.1G()){9.1l=9.1m.23(9.j);9.64()}9.1H=9.j.3M;f(9.1H){9.3N()}13{9.4F();q D=k 2n();D.1u=h(){D.1u=X.2e;9.3O();9.1H={o:D.o,n:D.n};9.3N()}.U(9);D.1v=9.j.1e}}13{9.1H=9.j.m.4G?1g.2P.2N():{o:9.j.m.o,n:9.j.m.n};9.3N()}},4H:h(){q D=9.65(9.j.1e),A=9.1z||9.1H;f(9.j.2O()){q B=9.1S(A);9.2b.r(B).1F(k y("66",{2D:"2i",1v:9.j.1e,8j:"",8k:"3J"}).r(B))}13{f(9.j.3P()){f(9.1z&&9.j.m.4G){A.n-=9.3f.n}3Q(9.j.18){2p"3g":q F=Z.3R(9.j.m.3g)||{};q E=h(){9.3O();f(9.j.m.4I){9.1N.r({o:"3S",n:"3S"});9.1H=9.3T(9.1N)}k 11.1n({W:9.W,1s:9.3U.U(9)})}.U(9);f(F.3V){F.3V=F.3V.1Y(h(N,M){E();N(M)})}13{F.3V=E}9.4F();k 8l.8m(9.1N,9.j.1e,F);2j;2p"27":9.1N.1F(9.27=k y("27",{8n:0,8o:0,1v:9.j.1e,2D:"2i",1Z:"8p"+(67.8q()*8r).2o(),68:(9.j.m&&9.j.m.68)?"3S":"3J"}).r(Z.1f({1c:0,35:0,3F:0},9.1S(A))));2j;2p"3W":q C=9.j.1e,H=$(C.69(C.23("#")+1));f(!H||!H.4J){z}q L=k y(9.j.m.8s||"Y"),G=H.1w("1t"),J=H.1w("1Q");H.1Y(L);H.r({1t:"32"}).1a();q I=9.3T(L);H.r({1t:G,1Q:J});L.S({6a:H}).26();H.S({6a:9.3d=k y(H.4J)});H.5T=H.1w("1Q");9.3c=H.1a();9.1N.1F(9.3c);9.1N.3a("3a, 3h, 6b").1d(h(M){9.3X.1d(h(N){f(N.1r==M){M.r({1t:N.1t})}})}.U(9));f(9.j.m.4I){9.1H=I;k 11.1n({W:9.W,1s:9.3U.U(9)})}2j}}13{q K={1I:"3h",2D:"2i",o:A.o,n:A.n};3Q(9.j.18){2p"2Q":Z.1f(K,{4A:9.4B[9.j.18],2R:[{1I:"28",1Z:"6c",2k:9.j.m.6c},{1I:"28",1Z:"6d",2k:"8t"},{1I:"28",1Z:"4K",2k:9.j.m.4L},{1I:"28",1Z:"8u",2k:1O},{1I:"28",1Z:"1v",2k:9.j.1e},{1I:"28",1Z:"6e",2k:9.j.m.6e||2h}]});Z.1f(K,X.12.2u?{8v:9.8w[9.j.18],8x:9.8y[9.j.18]}:{3H:9.j.1e,18:9.6f[9.j.18]});2j;2p"3i":Z.1f(K,{3H:9.j.1e,18:9.6f[9.j.18],8z:"8A",4D:9.j.m.4D,4A:9.4B[9.j.18],2R:[{1I:"28",1Z:"8B",2k:9.j.1e},{1I:"28",1Z:"8C",2k:"1O"}]});f(9.j.m.6g){K.2R.3j({1I:"28",1Z:"8D",2k:9.j.m.6g})}2j}9.2b.r(9.1S(A)).1a();9.2b.1F(9.4M(K));f(9.j.4N()&&$("2i")){(h(){3Y{f("6h"6i $("2i")){$("2i").6h(9.j.m.4L)}}3Z(M){}}.U(9)).2S(0.4)}}}},3T:h(B){B=$(B);q A=B.8E(),C=[],E=[];A.3j(B);A.1d(h(F){f(F!=B&&F.2x()){z}C.3j(F);E.3j({1Q:F.1w("1Q"),1l:F.1w("1l"),1t:F.1w("1t")});F.r({1Q:"6j",1l:"3y",1t:"2x"})});q D={o:B.8F,n:B.8G};C.1d(h(G,F){G.r(E[F])});z D},4O:h(){q A=$("2i");f(A){3Q(A.4J.4P()){2p"3h":f(X.12.3r&&9.j.4N()){3Y{A.6k()}3Z(B){}A.8H=""}f(A.8I){A.26()}13{A=X.2e}2j;2p"27":A.26();f(X.12.2l){4Q 2a.8J.2i}2j;5s:A.26();2j}}},6l:h(){q A=9.1z||9.1H;f(9.j.m.4L){3Q(9.j.18){2p"2Q":A.n+=16;2j}}9[(9.1z?"6m":"i")+"6n"]=A},3N:h(){k 11.1n({W:9.W,1s:h(){9.40()}.U(9)})},40:h(){9.3k();f(!9.j.6o()){9.3O()}f(!((9.j.m.4I&&9.j.8K())||9.j.6o())){9.3U()}f(!9.j.41()){k 11.1n({W:9.W,1s:9.4H.U(9)})}f(9.j.m.2g){k 11.1n({W:9.W,1s:9.4t.U(9,1O)})}},6p:h(){k 11.1n({W:9.W,1s:9.6q.U(9)});f(9.j.41()){k 11.1n({2S:0.2,W:9.W,1s:9.4H.U(9)})}f(9.2T){k 11.1n({W:9.W,1s:9.6r.U(9)})}},2q:h(){9.1a(9.2r().2q)},1k:h(){9.1a(9.2r().1k)},3U:h(){9.6l();q B=9.4R(),D=9.6s();f(9.m.2P&&(B.o>D.o||B.n>D.n)){f(!9.j.m.4G){q E=Z.3R(9.6t()),A=D,C=Z.3R(E);f(C.o>A.o){C.n*=A.o/C.o;C.o=A.o;f(C.n>A.n){C.o*=A.n/C.n;C.n=A.n}}13{f(C.n>A.n){C.o*=A.n/C.n;C.n=A.n;f(C.o>A.o){C.n*=A.o/C.o;C.o=A.o}}}q F=(C.o%1>0?C.n/E.n:C.n%1>0?C.o/E.o:1);9.1z={o:(9.1H.o*F).2o(),n:(9.1H.n*F).2o()};9.3k();B={o:9.1z.o,n:9.1z.n+9.3f.n}}13{9.1z=D;9.3k();B=D}}13{9.3k();9.1z=1q}9.42(B)},42:h(B){q F=9.10.2N(),I=2*9.1c,D=B.o+I,M=B.n+I;9.4S();q L=h(){9.3e();9.4T=1q;9.6p()};f(F.o==D&&F.n==M){L.U(9)();z}q C={o:D+"u",n:M+"u"};f(!X.12.2t){Z.1f(C,{1E:0-D/2+"u",1P:0-M/2+"u"})}q G=D-F.o,K=M-F.n,J=3u(9.10.1w("1E").2w("u","")),E=3u(9.10.1w("1P").2w("u",""));f(!X.12.2t){q A=(0-D/2)-J,H=(0-M/2)-E}9.4T=k 11.8L(9.10,0,1,{29:9.m.8M,W:9.W,6u:9.m.6u,1s:L.U(9)},h(Q){q N=(F.o+Q*G).3l(0),P=(F.n+Q*K).3l(0);f(X.12.2t){9.10.r({o:(F.o+Q*G).3l(0)+"u",n:(F.n+Q*K).3l(0)+"u"});9.3E.r({n:P-1*9.1c+"u"})}13{f(X.12.2u){9.10.r({1l:"4o",o:N+"u",n:P+"u",1E:((0-N)/2).2o()+"u",1P:((0-P)/2).2o()+"u"});9.3E.r({n:P-1*9.1c+"u"})}13{q O=9.43(),R=1g.2P.6v();9.10.r({1l:"3y",1E:0,1P:0,o:N+"u",n:P+"u",1o:(R[0]+(O.o/2)-(N/2)).3m()+"u",1j:(R[1]+(O.n/2)-(P/2)).3m()+"u"});9.3E.r({n:P-1*9.1c+"u"})}}}.U(9))},6q:h(){k 11.1n({W:9.W,1s:y.1a.U(9,9[9.j.44()?"2b":"1N"])});k 11.1n({W:9.W,1s:9.4S.U(9)});k 11.6w([k 11.45(9.2G,{46:1O,2U:0,2V:1}),k 11.4U(9.3z,{46:1O})],{W:9.W,29:0.25,1s:h(){f(9.1r){9.1r.4n("10:8N")}}.U(9)});f(9.j.1G()){k 11.1n({W:9.W,1s:9.6x.U(9)})}},5Y:h(){f(!9.10.2x()){z}k 11.6w([k 11.45(9.3z,{46:1O,2U:1,2V:0}),k 11.45(9.2G,{46:1O,2U:1,2V:0})],{W:9.W,29:0.2});k 11.1n({W:9.W,1s:h(){9.4O();9.2b.1F("").17();9.1N.1F("").17();9.3C.r({1P:9.1B.2g.n+"u"})}.U(9)})},6y:h(){9.4q.17();9.1y.17();9.1W.17();9.3I.17();9.4r.17();9.2m.17()},3k:h(){9.6y();f(!9.j.m.1V){9.3f={o:0,n:0};9.4V=0;9.1V.17();z 2h}13{9.1V.1a()}9.1V[(9.j.3P()?"5r":"26")+"8O"]("8P");f(9.j.1y||9.j.1W){9.4q.1a()}f(9.j.1y){9.1y.1F(9.j.1y).1a()}f(9.j.1W){9.1W.1F(9.j.1W).1a()}f(9.1m&&9.1m.21>1){9.3I.1a().5O().1F(k 62(9.m.8Q).4d({1l:9.1l+1,8R:9.1m.21}));f(9.j.m.2m){9.2z.1a();9.2m.1a()}}f(9.j.m.4E&&9.1m.21>1){q A={2f:(9.m.2s||9.1l!=0),1k:(9.m.2s||(9.j.1G()&&9.2r().1k!=0))};$w("2f 1k").1d(h(B){9["2J"+B.24()+"2K"].r({8S:(A[B]?"8T":"3S")}).1x(A[B]?9.m.1K.1D.2y:9.m.1K.1D.8U)}.U(9));9.4r.1a()}9.6z();9.6A()},6z:h(){q E=9.1B.3L.o,D=9.1B.3G.o,A=9.1z?9.1z.o:9.1H.o,F=8V,C=0,B=9.m.8W;f(9.j.m.2g){B=1q}13{f(!9.j.44()){B="3L";C=E}13{f(A>=F+E&&A<F+D){B="3L";C=E}13{f(A>=F+D){B="3G";C=D}}}}f(C>0){9.36.r({o:C+"u"}).1a()}13{9.36.17()}f(B){9.36.2c(9.1h+"5P"+B+".1J",{19:9.m.19})}9.4V=C},4F:h(){9.4W=k 11.4U(9.2H,{29:0.16,2U:0,2V:1,W:9.W})},3O:h(){f(9.4W){11.2L.2M("10").26(9.4W)}k 11.6B(9.2H,{29:0.22,W:9.W})},6C:h(){f(!9.j.2O()){z}q D=(9.m.2s||9.1l!=0),B=(9.m.2s||(9.j.1G()&&9.2r().1k!=0));9.3A[D?"1a":"17"]();9.3B[B?"1a":"17"]();q C=9.1z||9.1H;9.1L.r({n:C.n+"u"});q A=((C.o/2-1)+9.1c).3m();f(D){9.1L.S(9.2W=k y("Y",{V:"1U 8X"}).r({o:A+"u"}));9.2W.3b="2f"}f(B){9.1L.S(9.2X=k y("Y",{V:"1U 8Y"}).r({o:A+"u"}));9.2X.3b="1k"}f(D||B){9.1L.1a()}},6x:h(){f(!9.m.1K.3b.1Q||!9.j.2O()){z}9.6C();9.1L.1a()},4S:h(){9.1L.1F("").17();9.3A.17().r({1E:9.1C.o+"u"});9.3B.17().r({1E:-1*9.1C.o+"u"})},5Z:h(){f(9.10.1w("1D")!=0){z}q A=h(){f(!X.12.2v){9.10.1a()}9.10.1x(1)}.U(9);f(9.m.1T.1Q){k 11.4U(9.1T,{29:0.2,2U:0,2V:9.4f?1:9.m.1T.1D,W:9.W,8Z:9.4X.U(9),1s:A})}13{A()}},17:h(){f(X.12.2u&&9.27&&9.j.41()){9.27.26()}f(X.12.2v&&9.j.4N()){q A=$$("3h#2i")[0];f(A){3Y{A.6k()}3Z(B){}}}f(9.10.1w("1D")==0){z}9.2A();9.1L.17();f(!X.12.2u||!9.j.41()){9.2G.17()}f(11.2L.2M("4Y").90.21>0){z}11.2L.2M("10").1d(h(C){C.5S()});k 11.1n({W:9.W,1s:9.4u.U(9)});k 11.45(9.10,{29:0.1,2U:1,2V:0,W:{1l:"4e",3s:"4Y"}});k 11.6B(9.1T,{29:0.16,W:{1l:"4e",3s:"4Y"},1s:9.6D.U(9)})},6D:h(){9.10.17();9.2G.1x(0).1a();9.1L.1F("").17();9.4O();9.2b.1F("").17();9.1N.1F("").17();9.4y();9.6E();f(9.1r){9.1r.4n("10:32")}9.1r=1q;9.1m=1q;9.j=1q;9.1z=1q},6A:h(){q B={},A=9[(9.1z?"6m":"i")+"6n"].o;9.1V.r({o:A+"u"});9.3H.r({o:A-9.4V-1+"u"});B=9.3T(9.1V);9.1V.r({o:"91%"});9.3f=9.j.m.1V?B:{o:B.o,n:0}},3e:h(){q B=9.10.2N();f(X.12.2t){9.10.r({1j:"50%",1o:"50%"})}13{f(X.12.2v||X.12.2l){q A=9.43(),C=1g.2P.6v();9.10.r({1E:0,1P:0,1o:(C[0]+(A.o/2)-(B.o/2)).3m()+"u",1j:(C[1]+(A.n/2)-(B.n/2)).3m()+"u"})}13{9.10.r({1l:"4o",1o:"50%",1j:"50%",1E:(0-B.o/2).2o()+"u",1P:(0-B.n/2).2o()+"u"})}}},6F:h(){9.2A();9.2T=1O;9.1k.U(9).2S(0.25);9.2z.2c(9.1h+"5Q.1J",{19:9.m.19}).17()},2A:h(){f(9.2T){9.2T=2h}f(9.4Z){92(9.4Z)}9.2z.2c(9.1h+"5K.1J",{19:9.m.19})},6G:h(){9[(9.2T?"51":"4k")+"93"]()},6r:h(){f(9.2T){9.4Z=9.1k.U(9).2S(9.m.94)}},5u:h(){9.52=[];q A=$$("a[95~=10]");A.1d(h(B){B.6H();k 1b.4v(B);B.1i("2Y",9.1a.53(B).1Y(h(E,D){D.51();E(D)}).1A(9));f(B.1X.2O()){f(9.m.96){B.1i("2Z",9.6I.U(9,B.1X))}q C=A.97(h(D){z D.1p==B.1p});f(C[0].21){9.52.3j({1p:B.1X.1p,4x:C[0]});A=C[1]}}}.U(9))},4w:h(A){z 9.52.5p(h(B){z B.1p==A})},4C:h(A){z 9.4w(A).4x.6J("1X")},5v:h(){$(1g.31).1i("2Y",9.6K.1A(9));$w("2Z 3n").1d(h(C){9.1L.1i(C,h(D){q E=D.54("Y");f(!E){z}f(9.2W&&9.2W==E||9.2X&&9.2X==E){9.47(D)}}.1A(9))}.U(9));9.1L.1i("2Y",h(D){q E=D.54("Y");f(!E){z}q C=(9.2W&&9.2W==E)?"2q":(9.2X&&9.2X==E)?"1k":1q;f(C){9[C].1Y(h(G,F){9.2A();G(F)}).U(9)()}}.1A(9));$w("2f 1k").1d(h(F){q E=F.24(),C=h(H,G){9.2A();H(G)},D=h(I,H){q G=H.1r().1L;f((G=="2f"&&(9.m.2s||9.1l!=0))||(G=="1k"&&(9.m.2s||(9.j.1G()&&9.2r().1k!=0)))){I(H)}};9[F+"2I"].1i("2Z",9.47.1A(9)).1i("3n",9.47.1A(9)).1i("2Y",9[F=="1k"?F:"2q"].1Y(C).1A(9));9["2J"+E+"2K"].1i("2Y",9[F=="1k"?F:"2q"].1Y(D).1A(9)).1i("2Z",y.1x.53(9["2J"+E+"2K"],9.m.1K.1D.6L).1Y(D).1A(9)).1i("3n",y.1x.53(9["2J"+E+"2K"],9.m.1K.1D.2y).1Y(D).1A(9))}.U(9));q B=[9.36,9.2z];f(!X.12.2v){B.1d(h(C){C.1i("2Z",y.1x.U(9,C,9.m.1K.1D.6L)).1i("3n",y.1x.U(9,C,9.m.1K.1D.2y))}.U(9))}13{B.3K("1x",1)}9.2z.1i("2Y",9.6G.1A(9));f(X.12.2v||X.12.2l){q A=h(D,C){f(9.10.1w("1j").55(0)=="-"){z}D(C)};1n.1i(2a,"48",9.3e.1Y(A).1A(9));1n.1i(2a,"42",9.3e.1Y(A).1A(9))}f(X.12.2l){1n.1i(2a,"42",9.4X.1A(9))}},4t:h(A){f(9.6M){11.2L.2M("98").26(9.99)}q B={1P:(A?0:9.1B.2g.n)+"u"};9.6M=k 11.6N(9.3C,{6O:B,29:0.16,W:9.W,2S:A?0.15:0})},6P:h(){q A={};$w("o n").1d(h(E){q C=E.24();q B=1g.9a;A[E]=X.12.2u?[B["9b"+C],B["48"+C]].9c():X.12.3r?1g.31["48"+C]:B["48"+C]});z A},4X:h(){f(!X.12.2l){z}9.1T.r(9.1S(1g.2P.2N()));9.1T.r(9.1S(9.6P()))},6K:(h(){q A=".5J, .5D .1U, .5L, .9d";z h(B){f(9.j&&9.j.m&&B.54(A+(9.j.m.63?", #5x":""))){9.17()}}})(),47:h(E){q C=E.9e,B=C.3b,A=9.1C.o,F=(E.18=="2Z")?0:B=="2f"?A:-1*A,D={1E:F+"u"};f(!9.3o){9.3o={}}f(9.3o[B]){11.2L.2M("6Q"+B).26(9.3o[B])}9.3o[B]=k 11.6N(9[B+"2I"],{6O:D,29:0.2,W:{3s:"6Q"+B,9f:1},2S:(E.18=="3n"?0.1:0)})},2r:h(){f(!9.1m){z}q D=9.1l,C=9.1m.21;q B=(D<=0)?C-1:D-1,A=(D>=C-1)?0:D+1;z{2q:B,1k:A}},5N:h(G,H){q F=4l[2]||9.m,B=F.2C,E=F.1c,D=k y("9g",{V:"9h"+H.24(),o:E+"u",n:E+"u"}),A={1j:(H.55(0)=="t"),1o:(H.55(1)=="l")};f(D&&D.56&&D.56("2d")){G.S(D);q C=D.56("2d");C.9i=F.19;C.9j((A.1o?B:E-B),(A.1j?B:E-B),B,0,67.9k*2,1O);C.9l();C.6R((A.1o?B:0),0,E-B,E);C.6R(0,(A.1j?B:0),E,E-B)}13{G.S(k y("Y").r({o:E+"u",n:E+"u",35:0,3F:0,1Q:"6j",1l:"9m",9n:"32"}).S(k y("v:9o",{9p:F.19,9q:"9r",9s:F.19,9t:(B/E*0.5).3l(2)}).r({o:2*E-1+"u",n:2*E-1+"u",1l:"3y",1o:(A.1o?0:(-1*E))+"u",1j:(A.1j?0:(-1*E))+"u"})))}},5X:h(){f(9.57){z}q A=$$("3a","6b","3h");9.3X=A.9u(h(B){z{1r:B,1t:B.1w("1t")}});A.3K("r","1t:32");9.57=1O},6E:h(){9.3X.1d(h(B,A){B.1r.r("1t: "+B.1t)});4Q 9.3X;9.57=2h},1S:h(A){q B={};Z.60(A).1d(h(C){B[C]=A[C]+"u"});z B},4R:h(){z{o:9.1H.o,n:9.1H.n+9.3f.n}},6t:h(){q B=9.4R(),A=2*9.1c;z{o:B.o+A,n:B.n+A}},6s:h(){q C=20,A=2*9.1C.n+C,B=9.43();z{o:B.o-A,n:B.n-A}},43:h(){q A=1g.2P.2N();f(9.4K&&9.4K.2x()){A.n-=9.9v}z A}});Z.1f(1b,{6S:h(){f(!9.m.6T.6U){z}9.49=9.6V.1A(9);1g.1i("6W",9.49)},4y:h(){f(!9.m.6T.6U){z}f(9.49){1g.6H("6W",9.49)}},6V:h(C){q B=9w.9x(C.6X).4P(),E=C.6X,F=9.j.1G()&&!9.4T,A=9.j.m.2m,D;f(9.j.44()){C.51();D=(E==1n.6Y||["x","c"].58(B))?"17":(E==37&&F&&(9.m.2s||9.1l!=0))?"2q":(E==39&&F&&(9.m.2s||9.2r().1k!=0))?"1k":(B=="p"&&A&&9.j.1G())?"6F":(B=="s"&&A&&9.j.1G())?"2A":1q;f(B!="s"){9.2A()}}13{D=(E==1n.6Y)?"17":1q}f(D){9[D]()}f(F){f(E==1n.9y&&9.1m.6Z()!=9.j){9.1a(9.1m.6Z())}f(E==1n.9z&&9.1m.70()!=9.j){9.1a(9.1m.70())}}}});1b.40=1b.40.1Y(h(B,A){9.6S();B(A)});Z.1f(1b,{64:h(){f(9.1m.21==0){z}q A=9.2r();9.59([A.1k,A.2q])},59:h(C){q A=(9.1m&&9.1m.58(C)||Z.9A(C))?9.1m:C.1p?9.4C(C.1p):1q;f(!A){z}q B=$A(Z.5W(C)?[C]:C.18?[A.23(C)]:C).9B();B.1d(h(F){q D=A[F],E=D.1e;f(D.3M||D.5a||!E){z}q G=k 2n();G.1u=h(){G.1u=X.2e;D.5a=1q;9.71(D,G)}.U(9);G.1v=E}.U(9))},71:h(A,B){A.3M={o:B.o,n:B.n}},6I:h(A){f(A.3M||A.5a){z}9.59(A)}});y.9C({2c:h(C,B){C=$(C);q A=Z.1f({72:"1j 1o",2F:"3J-2F",5b:"6d",19:""},4l[2]||{});C.r(X.12.2t?{9D:"9E:9F.9G.9H(1v=\'"+B+"\'\', 5b=\'"+A.5b+"\')"}:{2E:A.19+" 30("+B+") "+A.72+" "+A.2F});z C}});Z.1f(1b,{73:h(A){q B;$w("3i 3p 27 2Q").1d(h(C){f(k 4b("\\\\.("+9.9I[C].2w(/\\s+/g,"|")+")(\\\\?.*)?","i").4i(A)){B=C}}.U(9));f(B){z B}f(A.5c("#")){z"3W"}f(1g.74&&1g.74!=(A).2w(/(^.*\\/\\/)|(:.*)|(\\/.*)/g,"")){z"27"}z"3p"},65:h(A){q B=A.9J(/\\?.*/,"").3t(/\\.([^.]{3,4})$/);z B?B[1]:1q},4M:h(B){q C="<"+B.1I;9K(q A 6i B){f(!["2R","5d","1I"].58(A)){C+=" "+A+\'="\'+B[A]+\'"\'}}f(k 4b("^(?:9L|9M|9N|5M|9O|9P|9Q|66|9R|9S|9T|9U|28|9V|9W|9X)$","i").4i(B.1I)){C+="/>"}13{C+=">";f(B.2R){B.2R.1d(h(D){C+=9.4M(D)}.U(9))}f(B.5d){C+=B.5d}C+="</"+B.1I+">"}z C}});(h(){1g.1i("4j:3v",h(){q B=(2B.5e&&2B.5e.21),A=h(D){q C=2h;f(B){C=($A(2B.5e).6J("1Z").61(",").23(D)>=0)}13{3Y{C=k 9Y(D)}3Z(E){}}z!!C};2a.1b.4z=(B)?{3i:A("9Z a0"),2Q:A("5f")}:{3i:A("75.75"),2Q:A("5f.5f")}})})();1b.4v=a1.a2({a3:h(b){q c=Z.5U(b);f(c&&!b.1X){b.1X=9;f(b.1y){b.1X.5g=b.1y;f(1b.m.a4){b.1y=""}}}9.1e=c?b.a5("1e"):b.1e;f(9.1e.23("#")>=0){9.1e=9.1e.69(9.1e.23("#"))}f(b.1p&&b.1p.5c("3q")){9.18="3q";9.1p=b.1p}13{f(b.1p){9.18=b.1p;9.1p=b.1p}13{9.18=1b.73(9.1e);9.1p=9.18}}$w("3g 3i 3q 27 3p 3W 2Q 1N 2b").1d(h(a){q T=a.24(),t=a.4P();f("3p 3q 2b 1N".23(a)<0){9["a6"+T]=h(){z 9.18==t}.U(9)}}.U(9));f(c&&b.1X.5g){q d=b.1X.5g.a7(1b.m.a8).3K("a9");f(d[0]){9.1y=d[0]}f(d[1]){9.1W=d[1]}q e=d[2];9.m=(e&&Z.5V(e))?aa("({"+e+"})"):{}}13{9.1y=b.1y;9.1W=b.1W;9.m=b.m||{}}f(9.m.5h){9.m.3g=Z.3R(9.m.5h);4Q 9.m.5h}},1G:h(){z 9.18.5c("3q")},2O:h(){z(9.1G()||9.18=="3p")},3P:h(){z"27 3W 3g".23(9.18)>=0},44:h(){z!9.3P()}});1b.5n();1g.1i("4j:3v",1b.4k.U(1b));',62,631,'|||||||||this||||||if||function||view|new||options|height|width||var|setStyle|||px||||Element|return|||||||||||||||||||insert||bind|className|queue|Prototype|div|Object|lightview|Effect|Browser|else||||hide|type|backgroundColor|show|Lightview|border|each|href|extend|document|images|observe|top|next|position|views|Event|left|rel|null|element|afterFinish|visibility|onload|src|getStyle|setOpacity|title|scaledInnerDimensions|bindAsEventListener|closeDimensions|sideDimensions|opacity|marginLeft|update|isGallery|innerDimensions|tag|png|buttons|prevnext|li|external|true|marginTop|display|_lightviewLoadedEvent|pixelClone|overlay|lv_Button|menubar|caption|_view|wrap|name||length||indexOf|capitalize||remove|iframe|param|duration|window|media|setPngBackground||emptyFunction|prev|topclose|false|lightviewContent|break|value|Gecko|slideshow|Image|round|case|previous|getSurroundingIndexes|cyclic|IE6|IE|WebKit419|replace|visible|normal|slideshowButton|stopSlideshow|navigator|radius|id|background|repeat|center|loading|ButtonImage|inner|Button|Queues|get|getDimensions|isImage|viewport|quicktime|children|delay|sliding|from|to|prevButton|nextButton|click|mouseover|url|body|hidden|ul|lv_Fill|margin|closeButton||lightviewError||select|side|inlineContent|inlineMarker|restoreCenter|menuBarDimensions|ajax|object|flash|push|fillMenuBar|toFixed|floor|mouseout|sideEffect|image|gallery|WebKit|scope|match|parseInt|loaded|9500px|zIndex|absolute|sideButtons|prevButtonImage|nextButtonImage|topcloseButtonImage|lv_Corner|resizeCenter|padding|large|data|imgNumber|no|invoke|small|preloadedDimensions|afterEffect|stopLoading|isExternal|switch|clone|auto|getHiddenDimensions|resizeWithinViewport|onComplete|inline|overlappingRestore|try|catch|afterShow|isIframe|resize|getViewportDimensions|isMedia|Opacity|sync|toggleSideButton|scroll|keyboardEvent|IEVersion|RegExp|userAgent|evaluate|end|pngOverlay|require|convertVersionString|test|dom|start|arguments|counter|fire|fixed|lv_Wrapper|dataText|innerPrevNext|gif|toggleTopClose|restoreInlineContent|View|getSet|elements|disableKeyboardNavigation|Plugin|pluginspage|pluginspages|getViews|wmode|innerPreviousNext|startLoading|fullscreen|insertContent|autosize|tagName|controller|controls|createHTML|isQuicktime|clearContent|toLowerCase|delete|getInnerDimensions|hidePrevNext|resizing|Appear|closeButtonWidth|loadingEffect|maxOverlay|lightview_hide|slideTimer||stop|sets|curry|findElement|charAt|getContext|preventingOverlap|member|preloadFromSet|isPreloading|sizingMethod|startsWith|html|plugins|QuickTime|_title|ajaxOptions|parseFloat|isMac|mac|REQUIRED_|_|load|Scriptaculous|find|namespaces|add|default|build|updateViews|addObservers|_lightviewLoadedEvents|lv_overlay|container|prevSide|nextSide|marginRight|topButtons|lv_topButtons|lv_Frame|lv_Half|lv_CornerWrapper|lv_Filler|lv_WrapDown|lv_Close|inner_slideshow_play|lv_Loading|br|createCorner|down|close_|inner_slideshow_stop|prepare|cancel|_inlineDisplayRestore|isElement|isString|isNumber|hideOverlapping|hideContent|appear|keys|join|Template|overlayClose|preloadSurroundingImages|detectExtension|img|Math|scrolling|substr|before|embed|autoplay|scale|loop|mimetypes|flashvars|SetControllerVisible|in|block|Stop|adjustDimensionsToView|scaledI|nnerDimensions|isAjax|finishShow|showContent|nextSlide|getBounds|getOuterDimensions|transition|getScrollOffsets|Parallel|showPrevNext|hideData|setCloseButtons|setMenuBarDimensions|Fade|setPrevNext|afterHide|showOverlapping|startSlideshow|toggleSlideshow|stopObserving|preloadImageHover|pluck|delegateClose|hover|_topCloseEffect|Morph|style|getScrollDimensions|lightview_side|fillRect|enableKeyboardNavigation|keyboard|enabled|keyboardDown|keydown|keyCode|KEY_ESC|first|last|setPreloadedDimensions|align|detectType|domain|ShockwaveFlash|MSIE|exec|REQUIRED_Prototype|REQUIRED_Scriptaculous|typeof|undefined|Version|throw|requires|times|https|js|head|script|urn|schemas|microsoft|com|vml|createStyleSheet|addRule|behavior|VML|callee|9500|lv_Container|lv_Sides|lv_PrevSide|lv_NextSide|lv_topcloseButtonImage|topcloseButton|lv_Frames|lv_FrameTop|lv_Liquid|lv_HalfLeft|lv_HalfRight|lv_Center|150|lv_WrapUp|lv_WrapCenter|lv_Media|lv_MenuBar|lv_Data|lv_DataText|lv_Title|lv_Caption|lv_ImgNumber|lv_innerPrevNext|innerPrevButton|inner_prev|innerNextButton|inner_next|lv_Slideshow|lv_External|loadingButton|lv_FrameBottom|cloneNode|lv_PrevNext|blank|tl|tr|bl|addClassName|right|float|inner_|after|blur|errors|requiresPlugin|plugin|required|transparent|close|defaultOptions|alt|galleryimg|Ajax|Updater|frameBorder|hspace|lightviewContent_|random|99999|wrapperTag|tofit|enablejavascript|codebase|codebases|classid|classids|quality|high|movie|allowFullScreen|FlashVars|ancestors|clientWidth|clientHeight|innerHTML|parentNode|frames|isInline|Tween|resizeDuration|opened|ClassName|lv_MenuTop|imgNumberTemplate|total|cursor|pointer|disabled|180|borderColor|lv_PrevButton|lv_NextButton|beforeStart|effects|100|clearTimeout|Slideshow|slideshowDelay|class|preloadHover|partition|lightview_topCloseEffect|topCloseEffect|documentElement|offset|max|lv_controllerClose|target|limit|canvas|cornerCanvas|fillStyle|arc|PI|fill|relative|overflow|roundrect|fillcolor|strokeWeight|1px|strokeColor|arcSize|map|controllerOffset|String|fromCharCode|KEY_HOME|KEY_END|isArray|uniq|addMethods|filter|progid|DXImageTransform|Microsoft|AlphaImageLoader|typeExtensions|gsub|for|area|base|basefont|col|frame|hr|input|link|isindex|meta|range|spacer|wbr|ActiveXObject|Shockwave|Flash|Class|create|initialize|removeTitles|getAttribute|is|split|titleSplit|strip|eval'.split('|'),0,{}));
/*
Makes 32 bit PNG's transparency work in Internet Explorer 6
 * Dependent on Prototype 1.6
 * Works on img elements and on background images of elements
 * Image tiling will not work
 * Refer to the readme

Example Usages:

 $('yourPNG').pngHack();
 $$('div#fixMe', 'img#andMe', 'img.andUsTo').invoke('pngHack');

*/
Element.addMethods({
  pngHack: function(el){
    var el = $(el);
    if (!Prototype.Browser.IE) return el;
    var gif = 'images/s.gif';
    var bg  = 'background';
    var i   = 'Image';
    var c   = 'Color';
    if ((el.match('img')) && (el.src.include('png'))){
      var alphaImgSrc  = el.src;
      var sizingMethod = 'scale';
      el.src = gif;
    } else if (el.getStyle(bg + i).include('png')){
      var bgc = el.getStyle(bg + c) || '';
      var alphaImgSrc = el.getStyle(bg + i).gsub(/url\(|\)|'|"/, '');
      var sizingMethod = 'crop';
      el.setStyle({ background: bgc + gif });
    } else {
      return el;
    }
    el.runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="#{al}",sizingMethod="#{sz}")'.interpolate({ al: alphaImgSrc, sz: sizingMethod });
    return el;
  }
});

/* Takes whatever content exists in a meta tag and evaluates it (safely) to
*/

var Stash = Class.create({
  initialize: function(name) {
    name = name || 'stash';
    tags = $$('meta[name=' + name + ']');

    hash = $H({});

    tags.each(function (item) {
      value = item.getAttribute("content").evalJSON(true);
      hash.update(value);
    });

    this.store = hash;
  },
  get: function(key) {
    return this.store.get(key);
  }
});

function authenticityToken() {
  t = new Stash('token');
  return t.get("authenticity_token");
}

eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('t K={16:\'K\',1L:G,1M:G,1d:G,2f:y(){u(D.2g!=8&&D.1N&&!D.1N[q.16]){q.1L=M;q.1M=M}17 u(D.2g==8){q.1d=M}},2h:D.2i,1O:[],1b:{},2j:y(){u(q.1L||q.1M){D.1N.2L(q.16,\'2M:2N-2O-2P:x\')}u(q.1d){D.2Q(\'<?2R 2S="\'+q.16+\'" 2T="#1P#2k" ?>\')}},2l:y(){t a=D.1k(\'z\');D.2m.1w.1Q(a,D.2m.1w.1w);u(a.12){2n{t b=a.12;b.1x(q.16+\'\\\\:*\',\'{1l:2U(#1P#2k)}\');q.12=b}2o(2p){}}17{q.12=a}},1x:y(a,b,c){u(1R b==\'1S\'||b===2V){b=0}u(b.2W.2q().1y(\'2X\')==-1){b=b.2q().2Y(/[^0-9 ]/g,\'\').1T(\' \')}H(t i=0;i<4;i++){b[i]=(!b[i]&&b[i]!==0)?b[C.1e((i-2),0)]:b[i]}u(q.12){u(q.12.1x){t d=a.1T(\',\');H(t i=0;i<d.1U;i++){q.12.1x(d[i],\'1l:2Z(K.1V.2r(q, [\'+b.1W(\',\')+\']))\')}}17 u(c){t e=b.1W(\'F \')+\'F\';q.12.1z(D.2s(a+\' {Q-1f:\'+e+\'; -30-Q-1f:\'+e+\';}\'));q.12.1z(D.2s(a+\' {-1A-Q-1m-1n-1f:\'+b[0]+\'F \'+b[0]+\'F; -1A-Q-1m-1X-1f:\'+b[1]+\'F \'+b[1]+\'F; -1A-Q-1Y-1X-1f:\'+b[2]+\'F \'+b[2]+\'F; -1A-Q-1Y-1n-1f:\'+b[3]+\'F \'+b[3]+\'F;}\'))}}17 u(q.1d){q.1O.31({\'2t\':a,\'2u\':b})}},2v:y(a){2w(32.33){I\'z.Q\':I\'z.34\':I\'z.1B\':q.1o(a);13;I\'z.2x\':q.1Z(a);13;I\'z.1p\':I\'z.2y\':I\'z.2z\':q.1o(a);13;I\'z.20\':a.18.z.20=(a.z.20==\'S\')?\'S\':\'35\';13;I\'z.21\':q.22(a);13;I\'z.1c\':a.18.z.1c=a.z.1c;13}},1o:y(a){a.14.23=\'\';q.2A(a);q.1Z(a);q.1C(a);q.1D(a);q.24(a);q.2B(a);q.22(a)},22:y(a){u(a.W.21.1y(\'36\')!=-1){t b=a.W.21;b=1g(b.37(b.25(\'=\')+1,b.25(\')\')),10)/2C;H(t v 1h a.x){a.x[v].1i.38=b}}},2A:y(a){u(!a.W){1q}17{t b=a.W}a.14.1p=\'\';a.14.1E=\'\';t c=(b.1p==\'2D\');t d=M;u(b.1E!=\'S\'||a.1F){u(!a.1F){a.J=b.1E;a.J=a.J.39(5,a.J.25(\'")\')-5)}17{a.J=a.26}t e=q;u(!e.1b[a.J]){t f=D.1k(\'3a\');f.1r(\'3b\',y(){q.1s=q.3c;q.1t=q.3d;e.1D(a)});f.3e=e.16+\'3f\';f.14.23=\'1l:S; 1j:27; 1m:-2E; 1n:-2E; Q:S;\';f.26=a.J;f.2F(\'1s\');f.2F(\'1t\');D.2G.1Q(f,D.2G.1w);e.1b[a.J]=f}a.x.Z.1i.26=a.J;d=G}a.x.Z.2H=!d;a.x.Z.1G=\'S\';a.x.1u.2H=!c;a.x.1u.1G=b.1p;a.14.1E=\'S\';a.14.1p=\'2D\'},1Z:y(a){a.x.1H.1G=a.W.2x},1C:y(a){t c=[\'N\',\'19\',\'1a\',\'O\'];a.P={};H(t b=0;b<4;b++){a.P[c[b]]=1g(a.W[\'Q\'+c[b]+\'U\'],10)||0}},1D:y(c){t e=[\'O\',\'N\',\'U\',\'V\'];H(t d=0;d<4;d++){c.E[e[d]]=c[\'3g\'+e[d]]}t f=y(a,b){a.z.1n=(b?0:c.E.O)+\'F\';a.z.1m=(b?0:c.E.N)+\'F\';a.z.1s=c.E.U+\'F\';a.z.1t=c.E.V+\'F\'};H(t v 1h c.x){t g=(v==\'Z\')?1:2;c.x[v].3h=(c.E.U*g)+\', \'+(c.E.V*g);f(c.x[v],M)}f(c.18,G);u(K.1d){c.x.1H.z.28=\'-3i\';u(1R c.P==\'1S\'){q.1C(c)}c.x.1u.z.28=(c.P.N-1)+\'F \'+(c.P.O-1)+\'F\'}},24:y(j){t k=y(a,w,h,r,b,c,d){t e=a?[\'m\',\'1I\',\'l\',\'1J\',\'l\',\'1I\',\'l\',\'1J\',\'l\']:[\'1J\',\'l\',\'1I\',\'l\',\'1J\',\'l\',\'1I\',\'l\',\'m\'];b*=d;c*=d;w*=d;h*=d;t R=r.2I();H(t i=0;i<4;i++){R[i]*=d;R[i]=C.3j(w/2,h/2,R[i])}t f=[e[0]+C.11(0+b)+\',\'+C.11(R[0]+c),e[1]+C.11(R[0]+b)+\',\'+C.11(0+c),e[2]+C.15(w-R[1]+b)+\',\'+C.11(0+c),e[3]+C.15(w+b)+\',\'+C.11(R[1]+c),e[4]+C.15(w+b)+\',\'+C.15(h-R[2]+c),e[5]+C.15(w-R[2]+b)+\',\'+C.15(h+c),e[6]+C.11(R[3]+b)+\',\'+C.15(h+c),e[7]+C.11(0+b)+\',\'+C.15(h-R[3]+c),e[8]+C.11(0+b)+\',\'+C.11(R[0]+c)];u(!a){f.3k()}t g=f.1W(\'\');1q g};u(1R j.P==\'1S\'){q.1C(j)}t l=j.P;t m=j.2J.2I();t n=k(M,j.E.U,j.E.V,m,0,0,2);m[0]-=C.1e(l.O,l.N);m[1]-=C.1e(l.N,l.19);m[2]-=C.1e(l.19,l.1a);m[3]-=C.1e(l.1a,l.O);H(t i=0;i<4;i++){m[i]=C.1e(m[i],0)}t o=k(G,j.E.U-l.O-l.19,j.E.V-l.N-l.1a,m,l.O,l.N,2);t p=k(M,j.E.U-l.O-l.19+1,j.E.V-l.N-l.1a+1,m,l.O,l.N,1);j.x.1u.29=o;j.x.Z.29=p;j.x.1H.29=n+o;q.2K(j)},2B:y(a){t s=a.W;t b=[\'N\',\'O\',\'19\',\'1a\'];H(t i=0;i<4;i++){a.14[\'1B\'+b[i]]=(1g(s[\'1B\'+b[i]],10)||0)+(1g(s[\'Q\'+b[i]+\'U\'],10)||0)+\'F\'}a.14.Q=\'S\'},2K:y(e){t f=K;u(!e.J||!f.1b[e.J]){1q}t g=e.W;t h={\'X\':0,\'Y\':0};t i=y(a,b){t c=M;2w(b){I\'1n\':I\'1m\':h[a]=0;13;I\'3l\':h[a]=0.5;13;I\'1X\':I\'1Y\':h[a]=1;13;1P:u(b.1y(\'%\')!=-1){h[a]=1g(b,10)*0.3m}17{c=G}}t d=(a==\'X\');h[a]=C.15(c?((e.E[d?\'U\':\'V\']-(e.P[d?\'O\':\'N\']+e.P[d?\'19\':\'1a\']))*h[a])-(f.1b[e.J][d?\'1s\':\'1t\']*h[a]):1g(b,10));h[a]+=1};H(t b 1h h){i(b,g[\'2y\'+b])}e.x.Z.1i.1j=(h.X/(e.E.U-e.P.O-e.P.19+1))+\',\'+(h.Y/(e.E.V-e.P.N-e.P.1a+1));t j=g.2z;t c={\'T\':1,\'R\':e.E.U+1,\'B\':e.E.V+1,\'L\':1};t k={\'X\':{\'2a\':\'L\',\'2b\':\'R\',\'d\':\'U\'},\'Y\':{\'2a\':\'T\',\'2b\':\'B\',\'d\':\'V\'}};u(j!=\'2c\'){c={\'T\':(h.Y),\'R\':(h.X+f.1b[e.J].1s),\'B\':(h.Y+f.1b[e.J].1t),\'L\':(h.X)};u(j.1y(\'2c-\')!=-1){t v=j.1T(\'2c-\')[1].3n();c[k[v].2a]=1;c[k[v].2b]=e.E[k[v].d]+1}u(c.B>e.E.V){c.B=e.E.V+1}}e.x.Z.z.3o=\'3p(\'+c.T+\'F \'+c.R+\'F \'+c.B+\'F \'+c.L+\'F)\'},1v:y(a){t b=q;2d(y(){b.1o(a)},1)},2e:y(a){q.1D(a);q.24(a)},1V:y(b){q.z.1l=\'S\';u(!q.W){1q}17{t c=q.W}t d={3q:G,3r:G,3s:G,3t:G,3u:G,3v:G,3w:G};u(d[q.1K]===G){1q}t e=q;t f=K;q.2J=b;q.E={};t g={3x:\'2e\',3y:\'2e\'};u(q.1K==\'A\'){t i={3z:\'1v\',3A:\'1v\',3B:\'1v\',3C:\'1v\'};H(t a 1h i){g[a]=i[a]}}H(t h 1h g){q.1r(\'3D\'+h,y(){f[g[h]](e)})}q.1r(\'3E\',y(){f.2v(e)});t j=y(a){a.z.3F=1;u(a.W.1j==\'3G\'){a.z.1j=\'3H\'}};j(q.3I);j(q);q.18=D.1k(\'3J\');q.18.14.23=\'1l:S; 1j:27; 28:0; 1B:0; Q:0; 3K:S;\';q.18.z.1c=c.1c;q.x={\'1u\':M,\'Z\':M,\'1H\':M};H(t v 1h q.x){q.x[v]=D.1k(f.16+\':3L\');q.x[v].1i=D.1k(f.16+\':3M\');q.x[v].1z(q.x[v].1i);q.x[v].3N=G;q.x[v].z.1j=\'27\';q.x[v].z.1c=c.1c;q.x[v].3O=\'1,1\';q.18.1z(q.x[v])}q.x.Z.1G=\'S\';q.x.Z.1i.3P=\'3Q\';q.3R.1Q(q.18,q);q.1F=G;u(q.1K==\'3S\'){q.1F=M;q.z.3T=\'3U\'}2d(y(){f.1o(e)},1)}};2n{D.3V("3W",G,M)}2o(2p){}K.2f();K.2j();K.2l();u(K.1d&&D.1r&&K.2h){D.1r(\'3X\',y(){u(D.3Y==\'3Z\'){t d=K.1O;t e=d.1U;t f=y(a,b,c){2d(y(){K.1V.2r(a,b)},c*2C)};H(t i=0;i<e;i++){t g=D.2i(d[i].2t);t h=g.1U;H(t r=0;r<h;r++){u(g[r].1K!=\'40\'){f(g[r],d[i].2u,r)}}}}})}',62,249,'||||||||||||||||||||||||||this|||var|if|||vml|function|style|||Math|document|dim|px|false|for|case|vmlBg|DD_roundies||true|Top|Left|bW|border||none||Width|Height|currentStyle|||image||floor|styleSheet|break|runtimeStyle|ceil|ns|else|vmlBox|Right|Bottom|imgSize|zIndex|IE8|max|radius|parseInt|in|filler|position|createElement|behavior|top|left|applyVML|backgroundColor|return|attachEvent|width|height|color|pseudoClass|firstChild|addRule|search|appendChild|webkit|padding|vmlStrokeWeight|vmlOffsets|backgroundImage|isImg|fillcolor|stroke|qy|qx|nodeName|IE6|IE7|namespaces|selectorsToProcess|default|insertBefore|typeof|undefined|split|length|roundify|join|right|bottom|vmlStrokeColor|display|filter|vmlOpacity|cssText|vmlPath|lastIndexOf|src|absolute|margin|path|b1|b2|repeat|setTimeout|reposition|IEversion|documentMode|querySelector|querySelectorAll|createVmlNameSpace|VML|createVmlStyleSheet|documentElement|try|catch|err|toString|call|createTextNode|selector|radii|readPropertyChanges|switch|borderColor|backgroundPosition|backgroundRepeat|vmlFill|nixBorder|100|transparent|10000px|removeAttribute|body|filled|slice|DD_radii|clipImage|add|urn|schemas|microsoft|com|writeln|import|namespace|implementation|url|null|constructor|Array|replace|expression|moz|push|event|propertyName|borderWidth|block|lpha|substring|opacity|substr|img|onload|offsetWidth|offsetHeight|className|_sizeFinder|offset|coordsize|1px|min|reverse|center|01|toUpperCase|clip|rect|BODY|TABLE|TR|TD|SELECT|OPTION|TEXTAREA|resize|move|mouseleave|mouseenter|focus|blur|on|onpropertychange|zoom|static|relative|offsetParent|ignore|background|shape|fill|stroked|coordorigin|type|tile|parentNode|IMG|visibility|hidden|execCommand|BackgroundImageCache|onreadystatechange|readyState|complete|INPUT'.split('|'),0,{}))
var poller;
var alertIE = {};
var alternatesFormCollection = {};
var VerfiyAsset={}



var assetModalSetting = { };

function assetDuringUpload(message) {
  setUploadStateToProcessing();
  $('upload-form-progress-message').update('<p>Your file is uploading, please do not refresh your browser or close this window.</p>');
  return true;
}

function assetAfterUpload(json) {
  $('upload-form-progress-message').update('<p>Your file has uploaded and is now being processed...</p>');
  return true;
}

function assetProcessing(json) {
  $('upload-form-progress-message').update('<p>Your file is still being processed.</p><p><strong>Please note</strong> that large files take longer to process.  If this process is taking too long, you may close this window and check back for your file later.</p>');
  return true;
}

function assetReady(assetJSON) {
  $('upload-form-progress-message').update('<p>Your file has been processed and can now be used on your VisualCV!</p>');
  $('upload-form-spinner').hide();

  if ($('modal_contents_for_assets_choose')) {}

  if ( $('modal_contents_for_assets_choose') ||
       $('modal_contents_for_cvs_choose_image') ||
       $('modal_contents_for_sections_choose_image') ||
       $('modal_contents_for_companies_choose_image')) {

       portfolioItemHandler.add(assetJSON);

  } else if ( $('modal_contents_for_assets_new') ) {
    location.reload();

  } else {
    alert('Your file uploaded and can now be added to you VisualCV...');
    portfolioItemHandler.showPortfolio();
  }

  return true;
}



function assetFailed(json) {
  $('upload-form-progress-message').update('<p>Your file uploaded but could not be processed.  It cannot be used yet on your VisualCV, our team has been notified.</p>');
  $('upload-form-spinner').hide();
  return true;
}

function assetTimeout(json) {
  $('upload-form-progress-message').update('<p>Sorry, but your file is taking longer than expected to process.  Processing will continue even if you close this window.</p>');
  $('upload-form-spinner').hide();
}
UploadPoller=Class.create(PeriodicalExecuter,{
  initialize:function($super, options, callbacks) {

    $super(this.polling, options.interval);
    this.retries = options.retry || 30;
    this.timeout = (options.timeout || 15) * 1000; // convert seconds to milliseconds
    this.uploaded = false;
    this.processed = false;

    if (callbacks != null) {
      if (callbacks.onUploading) { this.onUploading = callbacks.onUploading; }
      if (callbacks.onUpload)    { this.onUpload = callbacks.onUpload; }
      if (callbacks.onRetry)     { this.onRetry  = callbacks.onRetry; }
      if (callbacks.onReady)     { this.onReady  = callbacks.onReady; }
      if (callbacks.onFail)      { this.onFail   = callbacks.onFail; }
      if (callbacks.onTimeout)   { this.onTimeout = callbacks.onTimeout; }
    }

    this.token = $('asset_token').value;

    this.initial_text = this.getUploadFrameContent();
    this.doCallback(this.onUploading, null);
  },
  polling:function(pe) {
    if (this.uploaded == true && this.processed == true || this.finished == true) {
      pe.stop();
    } else if (this.uploaded == true) {
      this.retry(null);
      this.processing(pe);
    } else {
      this.uploading(pe);
    }
  },
  uploading:function(pe) {
    if (this.initial_text != this.getUploadFrameContent()) {
      pe.uploaded = true;
      pe.uploadedAt = new Date();
      pe.doCallback(this.onUpload, null);
    } else {
      pe.doCallback(this.onUploading, null);
    }
  },
  processing:function(pe) {
    r = new Ajax.Request("/assets/poll/" + pe.token + ".json", {
      method:'get', asynchronous:false,
      on200 : function(transport) { pe.ready(transport.responseJSON); },
      on202 : function(transport) { pe.retry(transport.responseJSON); },
      on404 : function(transport) { pe.retry(transport.responseJSON); },
      on406 : function(transport) { pe.fail(transport.responseJSON); },
      on415 : function(transport) { pe.fail(transport.responseJSON); },
      on500 : function(transport) { pe.fail(transport.responseJSON); },
      parameters: { authenticity_token: authenticityToken(), token:pe.token }
    });
  },
  retry:function(json) {
    timeDelta = new Date() - this.uploadedAt;
    if (this.timeout > 0 && timeDelta > this.timeout) {
       this.stop();
       this.doCallback(this.onTimeout, json);
    } else if (--this.retries < 1) {
      this.stop();
      this.doCallback(this.onTimeout, json);
    } else {
      this.doCallback(this.onRetry, json);
    }
  },
  fail:function(json) {
    this.finished = true;
    this.stop();
    this.doCallback(this.onFail, json);
  },
  ready:function(json) {
    this.processed = true;
    this.stop();
    this.doCallback(this.onReady, json);
  },
  getUploadFrameContent:function() {
    return $('upload_frame').contentWindow.location.href;
  },
  doCallback:function(f, value) {
    if (f != null) { f.call(this, value); }
  },
  msg:function(value) {
    $('upload-form-progress-message').update(value);
  }
});

var chooserTabSet = null;
var portfolioItemHandler = {
  asset_id:'',
  asset_path:null,
  asset_title:null,
  a_path:null,
  a_type:null,
  from:null,
  section_type:null,
    company_dashboard:"/home/employer",
    audio_video_message:'We have added your portfolio item, unfourntaetly we can not add this type of media here',
  engage:function(){
        switch(String(this.from)){
            case "reload":
                      this.hideView()
                      this.reloadPage()
                      break
            case "company_dashboard":
                      this.hideView()
                      this.directDashboard(this.company_dashboard)
                      break
            default:
                      this.createItem()
                      break
        }
  },
  add:function(asset) {
    new Ajax.Request('/assets/'+asset.id, {
      method: 'get',
      evalJS: false,
      onSuccess:function(transport) {
        portfolioItemHandler.showPortfolio();

        resetUploadState();
        $("thumbs").insert({top:transport.responseText});
        return true;
      },
      onError:function() {
        portfolioItemHandler.showPortfolio();
        resetUploadState();
        alert("An error was encountered while trying to add the uploaded item to your list of portfolio items.");
      },
      onLoading:function() {
      },
      parameters: {
        from: assetModalSetting.from,
        cv_id: assetModalSetting.cv,
        section: assetModalSetting.section,
        container: assetModalSetting.section,
        entry: assetModalSetting.entry,
        section_type: assetModalSetting.section_type,
        authenticity_token: authenticityToken()
      }
    });

  },
  chkSectionMedia:function(){
      mediaType = ( this.a_type == "Audioclip" || this.a_type == "Videoclip" || this.a_type == "Document" ) ? true : false;
      if(this.a_type == "Document" && this.section_type == "large") mediaType = false
      return mediaType;
  },
  chkSectionType:function(){
      chkMedia = ( this.section_type != "small" && this.chkSectionMedia() == true ) ? true : false;
        return chkMedia;
  },
  hideView:function(){
    Lightview.hide()
    },
  directDashboard:function(path){
    window.location = path;
  },
  reloadPage:function(){
    window.location.reload();
  },
  showPortfolio:function(){
      $('upload-tab').removeClassName('selected');
      $('upload').hide();
      resetUploadState()
      if (chooserTabSet) {chooserTabSet.openPanel($('portfolio-tab'));}

    },
  showUpload:function(){
      resetUploadState();
      if (chooserTabSet) { chooserTabSet.openPanel($('upload-tab')); }
    },
  clearFormElements:function(){
    $('sendAsset').getElements().each(function(s){
      if (s.type != 'hidden' && s.type != 'submit') {
        s.value = '';
      }
    });
  },
  spinThumb:function(element){
      if( $(element) )
        {
            var spinnerImage = "/images/default/components/icons/spinner.gif"
            $(element).update("<div class='asset-selected'><img src='"+spinnerImage+"' alt='Processing...' /></div>");
            $(element).show();
        }
  }

}





function resetUploadState()
{
    new Ajax.Request('/assets/new', { method: "get",
    onLoading : function(transport) { $('upload').update('<h2>Upload New File</h2><p>Processing is complete!</p>'); },
    onSuccess : function(transport) { $('upload').update(transport.responseText); }
  });
}

function setUploadStateToProcessing()
{
    $('upload-form').hide();
    $('upload-form-progress-bar').show();
}
function returnUploadStateFromProcessing()
{
    $('upload-form-progress-bar').hide();
    $('upload-form').show();

}

function showUploadErrors(errors)
{
    flashMessage.alert({
        message:"<p>There were errors with your upload:</p> <ul>" + unescape(errors) + "</ul>",
        elementClass:'modal-errors',
        element:'dialog-messages'
        })
}
function isLightViewClickDisabled(element)
{
    if(element)
    {
        click = element.readAttribute('click')
        if(click=='false'){return true;}
        else{return false;}
    }
}

function disableLightViewClick(element)
{
    if(element)
    {
        element.writeAttribute('click','false')
    }
}

function enableLightViewClick(element)
{
    if(element)
    {
        element.writeAttribute('click','true')
    }
}




lightViewIframe=Behavior.create({
  onclick:function(e){
    Lightview.show({
      href: this.element.readAttribute('href'),
      title:this.element.title,
      options:{
        autosize: true,
        width: 900,
        height: 500
      }
      });
    return false;
  }


});

closeLightview=Behavior.create({
    onclick:function(){
        Lightview.hide()
    }
});

function showLightview(element, width, height, autosize)
{
    if( isLightViewClickDisabled(element)){
        enableLightViewClick(element);
        return false;
    }
    form_id = element.readAttribute('rel');
    if( form_id && $(form_id) )
    {
        href = element.readAttribute('href') + '&' +
            Form.serialize(form_id);
    }
    else
    {
        href = element.readAttribute('href');
    }

    Lightview.show({
        href: href,
        title: element.title,
        rel: 'ajax',
        options:{
                bottomclose: true,
                width: width,
                height: height,
                autosize: autosize,
                topclose:true,
                ajax:{
                        method: 'get',
                        asynchronous:true,
                        evalScripts: true,
                        parameters: '&authenticity_token=' + (authenticityToken())
                        }
                }
        });
}

ajaxLightview=Behavior.create({
  onclick: function(e){
                showLightview(
                             this.element,
                             900,
                             530,
                             false);
    return false;
  }
});

function tinyMCENewWindow() {
  ajaxLighview
}

ajaxLightviewScale =Behavior.create({
  onclick: function(e){
                showLightview(
                             this.element,
                             400,
                             100,
                             true);

    return false;
  }
});

shareLightview=Behavior.create({
  onclick: function(e){

            showLightview(
                         this.element,
                         100,
                         100,
                         true);

            return false;
  }
});

verify=Behavior.create({
    onclick:function(){
        var file = $('asset_upload').value;

        if( !verify_asset() )
        {
           return false;
        }

        if(this.verifyFrom()){
           if (!this.verifyImage(file)) { return false; }
        }

        setUploadStateToProcessing();

        return true;
    },
    verifyFrom:function(){
         var verified = (assetModalSetting.from == "profile" ||  assetModalSetting.from == "affiliate") ? true : false
         return verified
    },
    verifyImage:function(upload_file){
          var file_type_regex = /^.*\.(gif|png|jpg|jpeg)$/;
            var match = file_type_regex.exec(upload_file.toLowerCase());
            var unsupported_format = (match == null) ? true:false;
            if(unsupported_format) {
                return false;
            }
            else {
                return true;
            }
 }

});


var uploadHandler=Class.create({
  initialize:function(){
    $('external_form').descendants().each(function(s){if(s.type == 'text' || s.type == 'hidden'){ s.disable(); }})
    $('external_form').hide()
    $('slideshare-description').hide()
    $('external-video-description').hide()
    $('btnUploadExternal').hide()
  }
});

externalAssetFormHandler=Behavior.create({
    asset_form:$('asset_form'),
    external_form:$('external_form'),
    external_video_description:$('external-video-description'),
    slideshare_description:$('slideshare-description'),
    default_description:$('default-default'),
    asset_external_type:$('asset_external_type'),
    asset_type:$('type'),
    uploadExternal:$('btnUploadExternal'),
    uploadAsset:$('btnUpload'),
  onclick:function(){
    this.toggleSelected()
   switch(String(this.element.title)){
    case 'yahoo':
      this.yahoo()
      break
    case 'slideshare':
      this.slideShare()
      break
    case 'youTube':
      this.youTube()
      break
    default:
      this.internalAsset()
      break
    }
  },
  toggleForm:function(form,state){
     form.descendants().each(function(s){
                    if(s.type == 'text' || s.type == 'hidden'){
      if(state == 'disable') {s.disable();form.hide();} else {s.enable();form.show(); }
                        if(s.type=='text'){s.value='';}
                    }
      });
  },
  toggleDescription:function(id){
    $$('div.upload-desc').each(function(el){
      if(el.id != id) el.hide()
    })
    $(id).show()
  },
  toggleExternal:function(){
    this.toggleForm($('asset_form'),'disable')
    this.toggleForm($('external_form'),'enable')
    $('btnUploadExternal').show()
    $('btnUpload').hide()
  },
  toggleSelected:function(){
    $('upload-icons').descendants().each(
      function ball(e){
        if(e.hasClassName('selected')) {
          e.removeClassName('selected');
          cur_class = e.readAttribute('class')
          e.removeClassName(cur_class)
          cur_class = cur_class.gsub('-selected','')
          e.writeAttribute({'class':cur_class})
        }

      }
    )
    cur_class = this.element.up().readAttribute('class')
    cur_class = cur_class+'-selected selected';
    this.element.up().writeAttribute({'class':cur_class})
  },
  assetUploaded:function(){
  },
  yahoo:function(){
    this.toggleExternal()
    this.dressLabel('URL')
    this.toggleDescription('external-video-description')
    this.dressHeading('Add Yahoo! Video')
    this.dressUpload('Add Video')

    $('type').value = 'videoclip'
    $('asset_external_type').value = 'videoclip'
  },
  youTube:function(){
    this.toggleExternal()
    this.dressLabel('URL')
    this.toggleDescription('external-video-description')
    this.dressHeading('Add YouTube Video')
    this.dressUpload('Add Video')
    $('type').value = 'videoclip'
    $('asset_external_type').value = 'videoclip'
  },
  slideShare:function(){
    this.toggleDescription('slideshare-description')
    this.toggleExternal()
    this.dressLabel('Embed Code')
    this.dressHeading('Add SlideShare Presentation')
    this.dressUpload('Add SlideShare')
    $('type').value = 'document'
    $('asset_external_type').value = 'document'
  },
  internalAsset:function(){
    this.toggleForm($('asset_form'),'enable')
    this.toggleForm($('external_form'),'disable')
    this.toggleDescription('default-description')
    $('btnUploadExternal').hide()
    $('btnUpload').show()
    this.dressHeading('Upload New File')
  },
  dressUpload:function(label){
    $('btnUploadExternal').value = label;
  },
  dressLabel:function(label){
    $$('label[for=asset_external_url]').each(function(s){s.update(label)})
  },
  dressHeading:function(heading){
    $('upload-label').update(heading)
  }
})

PollingBehavior = Behavior.create( {
  onclick:function() {
    var is_external = (this.element.id == 'btnUploadExternal') ? true : false;
    if(is_external){
        if(VerfiyAsset.externalAsset()) {
            $('sendAsset').submit();
            this.createPoller();
        } else {
            return false;
        }
    } else {
        if (verify_asset()) {
          $('sendAsset').submit();
            this.createPoller()
        } else {
            return false;
        }
    }
  },
  createPoller:function(){
      poller = new UploadPoller({interval:4, retry:15, timeout:90}, {
        onReady:assetReady,
        onRetry:assetProcessing,
        onFail:assetFailed,
        onUpload:assetAfterUpload,
        onUploading:assetDuringUpload,
        onTimeout:assetTimeout });
  }
});


document.observe('lightview:opened', function(event) {
    if(poller){
    poller.stop()
    poller=null;
    returnUploadStateFromProcessing()
    }
});

function verify_asset()
{
    var file = $('asset_upload').value;
    var title = $('asset_title').value;
    UploadProgress.verify(file);

    validated = true;
    if (UploadProgress.unsupported_format)
    {
        var message = "Invalid file format.";
        validated = false;
    }
    else if (title.blank())
    {
        var message = "Please provide a title for your file (maximum of 255 characters)."
        validated = false;
    }
    else if (title.length > 255)
    {
        var message = "Your title is too big (maximum of 255 characters)."
        validated = false;

    }
    if (!validated)
    {
            flashMessage.alert({
                                message: message,
                                elementClass:'modal-errors',
                                element:'dialog-messages'});
    }
    return validated;
}

VerfiyAsset={
    externalAsset:function()
    {
        var file = $F('asset_external_url').strip();
        var title = alternatesFormCollection.readSendAsset(11).strip();

        b_title = title.blank()

        var youtubeExp = new RegExp();
        youtubeExp.compile("^(http|https)+://(www.)?youtube.com/(watch\?).+", "i");

        var yahooExp = new RegExp();
        yahooExp.compile("^(http|https)+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+\/watch\/([0-9]+\/[0-9]+)$", "i");

        var slideshareExp = /\<div|\[slideshare.+\]/i;

        var matches = youtubeExp.exec(file) || yahooExp.exec(file) || slideshareExp.exec(file);
        invalidFile = matches ? false : true;

        var verifyExternal = (invalidFile || b_title) ? true : false;
        if(verifyExternal) flashMessage.alert({message:'Invalid Title or URL Path',elementClass:'modal-errors',element:'dialog-messages'
    })
    if (!verifyExternal) return true
}
}







alternatesFormCollection = {
    'readValue':function(position){
        return $F(this.collection()[position])
    },
    'writeValue':function(setValue, position){
        this.collection()[position].value = setValue;
    },
    collection:function(){
     var formCollection=$('alternates').getInputs().each(function(e){ });
     return formCollection
    },
    clearForm:function(){
     $('alternates').getInputs().each(function(e){e.value = '' });
    },
    sendAssetCollection:function(){
        var sendAssetCollection=$('sendAsset').getInputs().each(function(e){ });
        return sendAssetCollection
    },
    readSendAsset:function(position){
        return $F(this.sendAssetCollection()[position])
    }
}


FilterAssets=Behavior.create( {
  onclick:function(){
    el=this.element
    $$('a.portfolioFilter').each(function(e){
      e != el ? e.up().removeClassName('selected') : e.up().addClassName('selected')
    })
    new Ajax.Request(el.href,
    { asynchronous:true,
      evalScripts:true,
      method:'get',
      onLoading:function(request){spinnify('portfolio_items')},
      parameters:'authenticity_token=' + authenticityToken()});
      return false;
  }
})
var Collapsible = Behavior.create({
	initialize:function(contentContainer, minimizeContainer, options) {

    this.container = this.element;

		this.minimizeEditContainer = minimizeContainer || this.element.down(".header_edit");
		this.minimizeContainer = minimizeContainer || this.element.down(".header");
		this.contentContainer = contentContainer == null ? this.element.down(".body") : this.element.down(contentContainer);

		if( this.element.down(".header") && !this.element.down(".header_edit") && !this.element.down('a.collapsible_button')) {
		  this.minimizeContainer.insert({top:'<a href="#" rel="' +  this.element.id + '" class="collapsible_button minimized" title="Collapse/Expand"></a>'});
	  	}
		if( this.element.down(".header_edit") && !this.element.down('a.collapsible_button')) {
		  this.minimizeEditContainer.insert({top:'<a href="#" class="collapsible_button maximized" title="Collapse/Expand"></a>'});
		}

		this.options = Object.extend({
			effect:'slide',
			duration:0.2
		}, options || {});
	},

	onclick:function(e) {
            var source = Event.element(e);
            if (source.hasClassName('collapsible_button')) {

                searchString = "'#" + source.rel + " [id=video_glimpse]'";
                hideme = $$(searchString)


                if (this.container.hasClassName("minimized")) {
                    this.container.removeClassName("minimized");
                    source.removeClassName("maximized")
                    Effect.SlideDown(this.contentContainer,{duration:this.options.duration});
                    showVideos(hideme);
                } else {
                    hideVideos(hideme);
                    Effect.SlideUp(this.contentContainer,{duration:this.options.duration});
                    this.container.addClassName("minimized");
                    source.addClassName("maximized")
                }

                source.blur();
                Event.stop(e);
            }
	}
});

function hideVideos(glimpseArray)
{
    if(glimpseArray )
    {
        for( i=0; i<glimpseArray.length;i++)
        {
            glimpseArray[i].hide();
        }
    }
}

function showVideos(glimpseArray)
{
    if(glimpseArray )
    {
        for( i=0; i<glimpseArray.length;i++)
        {
            glimpseArray[i].show();
        }
    }
}
function tinyMceLight(elements)
{
    tinyMCE.init({
      mode : "exact",
      elements: elements,
      theme : "advanced",
      plugins : "inlinepopups,portfoliolink,safari,pagebreak,style,layer,table,save,advhr,paste,directionality,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
      theme_advanced_buttons1 : "pasteword,pastetext, | ,bold,italic,underline, | ,bullist,numlist,",
      theme_advanced_buttons2 : "",
      theme_advanced_buttons3 : "",
      theme_advanced_toolbar_location : "top",
      theme_advanced_toolbar_align : "left",
      theme_advanced_statusbar_location : "bottom",
      theme_advanced_toolbar_location : "external",
      theme_advanced_statusbar_location : "none",
      width: '100%',
      height: '250px',
      skin: 'o2k7',
      language:"en",
      browsers : "msie,gecko,safari",
      cleanup: true,
      cleanup_on_startup: true,
      invalid_elements: "form,meta,iframe,body,head,object,script,select,embed,img,params,table,tr,td,th,tbody,input",
      theme_advanced_styles: [],
      force_p_newlines: true,
      force_br_newlines: false,
      fix_list_elements: true,
      fix_nesting: true,
      auto_reset_designmode: true,
      hidden_tab_class: 'hideTab',
      tab_focus: ':next',
      entity_encoding: 'named',
      convert_fonts_to_spans: true,
      convert_urls: false
    });
}

function toggleOpportunityForm(current_id, target_id)
{
    $$('div#position div.content').each(function(s){
        if(s == $(target_id)){s.show();}
        else {s.hide()}
    })
}

function checkForOpenContactForm(link)
{
    if($('cv_contact_form'))
    {
        alert('Please finish editing your Contact Information first.');
        disableLightViewClick($(link));
        return false;
    }
    else
    {
        enableLightViewClick($(link));
        return true;
    }
}

function assetSelected(element)
{
    if( $(element) )
    {
        var spinnerImage = "/images/default/components/icons/spinner.gif"
        $(element).update("<div class='asset-selected'><img src='"+spinnerImage+"' alt='Processing...' /></div>");
        $(element).show();
    }
}



function get_num_columns( section_body ) {

  if( section_body.hasClassName( 'two_column' ) )
    return 2
  else if( section_body.hasClassName( 'three_column' ) )
    return 3
  else if( section_body.hasClassName( 'four_column' ) )
    return 4
}

function set_layout( section_body_id, class_to_apply, acceptable_classes ) {

  section_body = $( section_body_id)
  apply_styles( section_body, class_to_apply, acceptable_classes );
  show_hide_blanks( section_body, class_to_apply );
  set_heights( section_body_id );

}

function set_heights( section_body_id ) {

  section_body = $( section_body_id)
  set_description_heights( section_body );
  set_h4_heights( section_body );

}

function set_heights_offscreen( section_body_id ) {

  section_body = $( section_body_id)
  section_body.setStyle( { left: '-999em', position: 'fixed'} )
  section_body.show();
  set_heights( section_body_id );
  section_body.hide();
  section_body.setStyle( { left: 'auto', position: 'static'} )

}

function apply_styles( element, class_to_apply, acceptable_classes ) {

  element.addClassName( class_to_apply );
  element.classNames().each( function(c) {
    if( acceptable_classes.indexOf( c ) < 0 && c != class_to_apply ) {
      element.removeClassName( c );
    }
  });

}

function reset_blanks( section_body_id )
{
  section_body = $( section_body_id )
  is_error = ($('errorExplanation')) ? true : false;
  if(!is_error) {
  reset_row_dividers( section_body );
  if( section_body.hasClassName( 'two_column' ) )
    show_hide_blanks( section_body, 'two_column' )
  else if( section_body.hasClassName( 'three_column' ) )
    show_hide_blanks( section_body, 'three_column' )
  else if( section_body.hasClassName( 'four_column' ) )
    show_hide_blanks( section_body, 'four_column' )
  set_heights( section_body_id );
  }

}

function reset_row_dividers( section_body ) {
  counter = 1

  section_body.select('div.row_divider').each( function( divider ) {
    divider.removeClassName('first')
    divider.removeClassName('second')
    divider.removeClassName('third')
    divider.removeClassName('fourth')
    if( counter % 2 == 0 ) divider.addClassName('second')
    if( counter % 3 == 0 ) divider.addClassName('third')
    if( counter % 4 == 0) divider.addClassName('fourth')
    counter += 1
  })
}

function set_description_heights( section_body ) {

  num_columns = get_num_columns( section_body );
  section_body.select('div.desc').inGroupsOf( num_columns ).each( function( group ) {
  set_all_to_max_height( group );
  })
}

function set_h4_heights( section_body ) {

  num_columns = get_num_columns( section_body )
  section_body.select('div.large_portfolio_entry h4').inGroupsOf( num_columns ).each( function( group ) {
  set_all_to_max_height( group ) })

}

function set_all_to_max_height( elements ) {
  additionalOffset = arguments[1] || 0
  heights = elements.collect( function(s) {
    if( s != null ) {
      s.setStyle( { 'height': 'auto'})
      return s.getHeight()
    }
  })

  max_height = heights.max();

  elements.each( function (s) {
    if( s != null  )
      s.setStyle( { 'height': max_height + additionalOffset + 'px'})
  })

}



function show_hide_blanks( section_body, class_to_apply ) {
  num_entries = section_body.select( 'div.entry_wrapper' ).size();

  if( class_to_apply == 'two_column' )
    num_columns = 2
  else if( class_to_apply == 'three_column' )
    num_columns = 3
  else if( class_to_apply == 'four_column' )
    num_columns = 4

  show_x_blanks( section_body, num_columns - num_entries % num_columns, num_entries % num_columns  )
}

function show_x_blanks( section_body, num_blanks, num_entries_in_row ) {

  add_button = section_body.down( 'a.add_button' )
  acceptable_classes = new Array( 'button', 'add_button')

  if( num_entries_in_row == 0 || num_entries_in_row == 4 )
    apply_styles( add_button, 'first', acceptable_classes )
  else if ( num_entries_in_row == 1 )
    apply_styles( add_button, 'second', acceptable_classes)
  else if ( num_entries_in_row == 2 )
    apply_styles( add_button, 'third', acceptable_classes)
  else if ( num_entries_in_row == 3 )
    apply_styles( add_button, 'fourth', acceptable_classes)

  if( num_blanks == 0 ) {
    section_body.down( 'div.first_blank' ).hide();
    section_body.down( 'div.second_blank' ).hide();
    section_body.down( 'div.third_blank' ).hide();
    section_body.down( 'div.fourth_blank' ).hide();
  }
  else if( num_blanks == 1 ) {
    section_body.down( 'div.first_blank' ).show();
    section_body.down( 'div.second_blank' ).hide();
    section_body.down( 'div.third_blank' ).hide();
    section_body.down( 'div.fourth_blank' ).hide();
  }
  else if( num_blanks == 2 ) {
    section_body.down( 'div.first_blank' ).show();
    section_body.down( 'div.second_blank' ).show();
    section_body.down( 'div.third_blank' ).hide();
    section_body.down( 'div.fourth_blank' ).hide();
  }
  else if( num_blanks == 3 ) {
    section_body.down( 'div.first_blank' ).show();
    section_body.down( 'div.second_blank' ).show();
    section_body.down( 'div.third_blank' ).show();
    section_body.down( 'div.fourth_blank' ).hide();
  }
  else if( num_blanks == 4 ) {
    section_body.down( 'div.first_blank' ).show();
    section_body.down( 'div.second_blank' ).show();
    section_body.down( 'div.third_blank' ).show();
    section_body.down( 'div.fourth_blank' ).show();
  }
}


InlineEdit = Behavior.create({
  onclick:function(){
    var editor =  new Ajax.InPlaceEditor( this.element.readAttribute('id'),
    this.element.readAttribute('rel'),
        { rows:1,
          clickToEditText:"Click here to edit this title",
          onFormCustomization: function(ipe, ipeForm) { ipe._controls.editor.value = ipe._controls.editor.value.unescapeHTML();},
          callback: function(form) { return Form.serialize(form) + '&authenticity_token=' + (authenticityToken()); },
          onComplete:function(){editor.dispose();}
        });
  }
})

RemoveFromSection = Behavior.create({
  onclick:function(){
  if (confirm('Are you sure you want to delete this section?')) {
   spinnify('section_'+this.element.id);
    new Ajax.Request(this.element.href, {
      asynchronous:true,
      evalScripts:true,
      method:'delete',
      parameters:'authenticity_token=' + (authenticityToken()) });
      };

    return false;
  }

})
EditEntry= Behavior.create({
  onclick:function(){
    var spinnerRef = this.element.readAttribute('rel')
    new Ajax.Request(this.element.href, {
      asynchronous:true,
      evalScripts:true,
      method:'get',
      onLoaded:function(request){deSpinnify()},
      onLoading:function(request){spinnify(spinnerRef);},
      parameters:'authenticity_token=' + authenticityToken()});
      return false;
  }
})
RemoveEntry= Behavior.create({
  onclick:function(){
     var spinnerRef = this.element.readAttribute('rel')
      if (confirm('Are you sure you want to delete this section?')) {
        new Ajax.Request(this.element.href, {
          asynchronous:true,
          evalScripts:true,
          method:'delete',
          onLoading:function(request){spinnify(spinnerRef);},
          parameters:'authenticity_token=' + authenticityToken()
          })
        }
      return false;
   }
});

AddEntry=Behavior.create({
  onclick:function(event){
    doAddEntry.apply(this.element);
    event.stop();
  }
})

document.observe("entry:add", function(event) {
  doAddEntry.apply(event.target);
  event.stop();
  return false;
});

document.observe("section:add", function(event) {
  doAddSection.apply(event.target);
  event.stop();
  return false;
});

function doAddEntry() {
  spinnerRef=this.readAttribute('rel');
  div = new Element('div',{id:spinnerRef})
  this.up().up().insert({top:div})
  this.up().hide()
  new Ajax.Request( this.href, {
    asynchronous:true,
    evalScripts:true,
    method:'get',
    onLoaded:function(request){deSpinnify()},
    onLoading:function(request){spinnify(spinnerRef)},
    parameters:'authenticity_token=' + authenticityToken()
    });

  return false;
}

function doAddSection() {
  new Ajax.Request( this.href, {
    asynchronous:true,
    evalScripts:true,
    method:'post',
    parameters:'authenticity_token=' + authenticityToken()
  });

  return false;
}

Element.observe(window,'load',function(e) {
  Event.addBehavior({
    '.add_entry':AddEntry,
    '.edit_entry':EditEntry,
    '.remove_entry':RemoveEntry,
    '.in_place_edit_target':InlineEdit,
    '.close_button':RemoveFromSection,
    '#add_entry_large_portfolio:mousedown':function(){
      $('add_entry_large_portfolio').setAttribute('href', $('add-entry-cache').readAttribute('rel'))
    },
    '#add_entry_large_portfolio:click':function(){

      spinnerRef=$('add-entry-cache').readAttribute('class');
      div = new Element('div',{id:spinnerRef})
      $('add-entry-cache').up().insert({top:div})

      new Ajax.Request( $('add_entry_large_portfolio').href, {
        asynchronous:true,
        evalScripts:true,
        method:'get',
        onLoaded:function(request){deSpinnify()},
        onLoading:function(request){spinnify(spinnerRef)},
        parameters:'authenticity_token=' + authenticityToken()
        });
      return false;
      },
    '.opportunity':function() {
          $$('div.opportunity').each(function(e){
                  whiteBG = [
                  'gray',
                  'creative',
                  'green',
                  'gold',
                  ]

                  for (var i = whiteBG.length - 1; i >= 0; i--){
                      if (String(whiteBG[i]) != 'undefined'){
                         bgState = ($('contents').hasClassName(whiteBG[i]))? true : false
                         background = bgState ? 'creative' : 'professional'
                         if(bgState) break
                      }
                  };

                 e.setStyle({background:'url(/images/default/components/themes/opportunity/'+background+'_small_column_header.png) no-repeat scroll center top'})
                 e.up().setStyle({background:'url(/images/default/components/themes/opportunity/'+background+'_small_column_bg.png) repeat-y scroll center top',color:'#fff'})
                 e.down().setStyle({background:'url(/images/default/components/themes/opportunity/'+background+'_small_column_footer.png) no-repeat scroll center bottom'})
                 e.down().writeAttribute({id:'opp'})

                 $$('#opp h3').each(function(e){e.setStyle({color:'#fff'})})
                 $$('#opp ul.opportunities li a').each(function(e){e.setStyle({color:'#fff'})})
                 $$('#opp p').each(function(e){e.setStyle({color:'#fff'})})

            })
    },
    '.main_column_entry':function(){
        remove_par_tags()
    }

  });

});
function remove_par_tags(){
    $$('div.main_column_entry p').each(function(s){if(s.empty())s.hide()})
    if($('opp')){
     $$('#opp ul.opportunities li a').each(function(e){e.setStyle({color:'#fff'})})
    }
}

Event.observe(window, 'load', function() {
  entryTypeMap = {
    "SkillEntry": "Skill",
    "EducationEntry": "Education",
    "EmploymentEntry": "Employment",
    "Certification": "Certification",
    "PortfolioEntry": "Portfolio"
  };

  var stash = new Stash();
  key = stash.get("entry") || "";
  type = entryTypeMap[key];

  if (type == null) {
    return;
  }


  el = $$('a.add_button.add_entry[href*=' + type + ']');
  if (el.length > 0) {
    el[0].fire('entry:add');
    return;
  }

  el = $$('.button_bar a[href*=kind=' + type + ']');
  if (el.length > 0) {
    el[0].fire('section:add');
    return;
  }
});

CvPrivacyHelper = Behavior.create({
  initialize:function(){
      this.anyone = 0;
      this.friends = 1;
      this.onlyme = 2;

      this.cv_privacy_id = 'professional_privacy';
      this.cv_privacy_value = null;

      this.ci_privacy_id = 'contact_privacy';
      this.ci_privacy_value = null;

      this.rf_privacy_id = 'reference_privacy';
      this.rf_privacy_value = null;

      this.pro_search_id = 'cv_setting_professional_search';
      this.co_search_id = 'cv_setting_company_search';

      this.resetPrivacies();
  },
  onchange:function(){
    this.refresh();
  },
  refresh:function(){
    this.resetPrivacies();

    switch(this.cv_privacy_value)
    {
        case this.friends+'':
            this.setPrivacyLevel(this.ci_privacy_id, this.friends);

            this.setPrivacyLevel(this.rf_privacy_id, this.friends);

            this.setCheckboxValue(this.pro_search_id, false);

            this.setCheckboxValue(this.co_search_id, true);

            this.togglePrivacyMessage(false);

            break;
        case this.onlyme+'':
            this.setPrivacyLevel(this.ci_privacy_id, this.onlyme);

            this.setPrivacyLevel(this.rf_privacy_id, this.onlyme);

            this.setCheckboxValue(this.pro_search_id, false);

            this.setCheckboxValue(this.co_search_id, false);

            this.togglePrivacyMessage(false);

            break;
        case this.anyone+'':
            this.setPrivacyLevel(this.ci_privacy_id, this.friends);

            this.setPrivacyLevel(this.rf_privacy_id, this.friends);

            this.setCheckboxValue(this.pro_search_id, true);

            this.setCheckboxValue(this.co_search_id, true);

            this.togglePrivacyMessage(true);

            break;
        default:
            break;
    }
  },
  resetPrivacies:function(){
    this.cv_privacy_value = $(this.cv_privacy_id).options[$(this.cv_privacy_id).selectedIndex].value;
    this.ci_privacy_value = $(this.ci_privacy_id).options[$(this.ci_privacy_id).selectedIndex].value;
    this.rf_privacy_value = $(this.rf_privacy_id).options[$(this.rf_privacy_id).selectedIndex].value;
  },
  setPrivacyLevel:function(element, value){
    if( $(element).disabled == false )
    {
        if($(element).options.length<3){value--;}
        $(element).options[value].selected = true;
    }
  },
  setCheckboxValue:function(element, checked){
      $(element).checked = checked

      if( !checked ){
          $(element).disabled = true;
      }
      else
      {
          $(element).disabled = false;
      }

  },
  togglePrivacyMessage:function(showPublic){
      if(showPublic)
      {
          if($('profile-public'))
          {
              $('profile-public').removeClassName('hide');
              $('profile-private').addClassName('hide');
          }
      }
      else
      {
          if($('profile-private'))
          {
              $('profile-private').removeClassName('hide');
              $('profile-public').addClassName('hide');
          }
      }

  }
})

document.observe('dom:loaded', function() {

var ShareToggle = {
  privacy       :   false,
  limited       :   false,
  privacy_div   :   null,

  initialize:function(){

    },
    handle:function(elm){
      ShareToggle.toggle(elm.target);
    },
    toggle:function(element){
      var el_rel      =   element.rel;
      var mes_height  =   $(el_rel).getHeight();

      ShareToggle.chosen(element.up())      //add arrow

      $$('div.sp').each(function(e){
       if(e.id == el_rel) { e.removeClassName('hide')} else {e.addClassName('hide')}
      })
    },
    chosen:function(el){
      $$('#share_list li').each(function(e){
        e.removeClassName('selected')
      })
      el.addClassName('selected')
    }
  }

  if ($('share_list')) {
      ShareToggle.initialize();
  }

    $$("#share_list li a")
      .invoke('observe', 'click', ShareToggle.handle)

    $$("#share_list li a").each(function(el){
      if(el.up().hasClassName('selected')){
          ShareToggle.toggle(el);
      }
})

});


var Prefs = Class.create({
  initialize: function() {}
});

Prefs.append = function(event) {
  Event.stop(event);
  params = event.element().href.toQueryParams();

  var req = new Ajax.Request("/preferences/append", { // ID is ignored, key is used instead
    method: 'post',
    parameters: {
      authenticity_token: authenticityToken(),
      preference_resource_id: params["preference[resource_id]"],
      preference_resource_type: params["preference[resource_type]"],
      preference_key: params["preference[key]"],
      preference_value: params["preference[value]"]
    },
    onSuccess: Prefs.updated
  });

  return false;
};

Prefs.destroy = function(event) {
  Event.stop(event)
  params = $H(event.element().href.toQueryParams());

  var req = new Ajax.Request("/preferences/1", { // ID is ignored, key is used instead
   method: 'delete',
   parameters: {
      authenticity_token: authenticityToken(),
      preference_resource_id: params.get("resource_id"),
      preference_resource_type: params.get("resource_type"),
      preference_key: params.get("key")
   },
   onSuccess: Prefs.updated
  });
}

Prefs.updated = function(transport) {
}

document.observe('dom:loaded', function(){
  $$('a.append').each(function(i) { i.observe('click',Prefs.append); });
  $$('a.destroyPreference').each(function(i) { i.observe('click',Prefs.destroy); });
})
function applyActivityBehavior() {
  $$('a.loadActivity').each(function(i) { i.observe('click', Activity.loadMore); });
  $$('a.hideActivity').each(function(i) { i.observe('click', Activity.hide); });
}

var Activity = Class.create({
  initialize: function() {}
});

Activity.loadMore = function(event) {
  Event.stop(event);
  var monitor = $('activityMonitor');
  var trigger = event.element();
  var loadingMsg = new Element('p', { 'class': 'pleaseWait' }).update("Loading more activity");

  var req = new Ajax.Request(event.element().href, {
    method: 'get',
    requestHeaders: {
      'Accept': "text/nano+html"
    },
    parameters: {
      authenticity_token: authenticityToken()
    },
    onLoading: function(transport) {
      trigger.replace(loadingMsg);
    },
    onSuccess: function(transport) {
      loadingMsg.remove();
      monitor.insert(transport.responseText);
      applyActivityBehavior();
    },
    onFailure: function(transport) {
    }
  });
}

Activity.moreLoading = function(arg) {
}

Activity.moreLoaded = function(result) {
  debugger;
}

Activity.hide = function(event) {
  Event.stop(event);
  id = event.element().rel
  $(id).hide();

  var req = new Ajax.Request(event.element().href, {
    method: 'put', parameters: { authenticity_token: authenticityToken() }
  });

  return true;
};

document.observe('dom:loaded', function(){
  applyActivityBehavior();
});
function onEndCrop(coords, dimensions) {
  $('crop_coord[x1]').value = coords.x1;
  $('crop_coord[y1]').value = coords.y1;
  $('crop_coord[x2]').value = coords.x2;
  $('crop_coord[y2]').value = coords.y2;
  $('crop_coord[width]').value = dimensions.width;
  $('crop_coord[height]').value = dimensions.height;
}

Event.observe(window, 'load', function() {
  if($('image_to_crop'))
  {
      new Cropper.ImgWithPreview(
        'image_to_crop',
        {
          previewWrap: 'crop_preview',
          minWidth: 46,
          minHeight: 46,
          ratioDim: { x: 46, y: 46 },
          onEndCrop: onEndCrop
        });
  }
});

document.observe('dom:loaded', function(){

  if($('suggestions')){
      $('suggestions').firstDescendant().appear();
  }

  $$('a.anothertime').each(function(i) { i.observe('click', function(event) {
    var container = event.element().ancestors()[1];
    container.fade({duration:0.05});

    container.next().appear();
  }); });
})

function applyDeclineBehavior() {
  $$('a.decline').each(function(i) { i.observe('click', decline); });
}

function decline(event) {
  Event.stop(event);

  var link = event.element();
  var decline_href = link.href;
  var container = $(link.rel);
  var parent = container.up("li");

  var decline = new Ajax.Request(decline_href, { method: 'put',
    parameters: { authenticity_token: authenticityToken() }
  });

  if (parent.siblings().size() > 0) {
    parent.remove();
  } else {
    parent.update("Refresh for more matches.");
  };
};

document.observe('dom:loaded', function(){
  applyDeclineBehavior();
});



document.observe('dom:loaded', function(){
  /* IE only */
  DD_roundies.addRule('.lip, .welcomeCard', '10px 10px 0 0');
  DD_roundies.addRule('#leftcol', '0 0 10px 10px');
  DD_roundies.addRule('.round, .box-blue', '10px');
  DD_roundies.addRule('#content,#rightcol', '0 0 10px 10px');
})

var EmbedVideo;

var spinnerIcon = new Image(32,32);
spinnerIcon.src="/images/default/components/icons/spinner.gif";

var spinnerIconDark = new Image(32,32);
spinnerIconDark.src="/images/default/components/icons/spinner_dark.gif";

function cleanupTinyMCE(element) {
   $(element).select('.tiny_mce').each(
    function(mce) {
      tinyMCE.triggerSave(true,true);
      tinyMCE.execCommand('mceRemoveControl',true,mce.id)
    });
}

TrapLightview=Behavior.create({
    onmousedown:function(){
        $$('.tiny_mce').each(function(s){
          tiny = tinyMCE.getInstanceById(s.readAttribute('id'));
          if (tiny != null) {
            tiny.remove();
          }
        })
    }
})



function spinnify(element) {
  spinnify_control_scroll(element, true);
}

function spinnify_small(element, scrollTo)
{
    spinnify_control_scroll(element, scrollTo, 12)
}

function spinnify_control_scroll(element, scrollTo, size)
{
  $(element).select('textarea.text_area_for_tiny_mce').each( function( obj ) { tinyMCE.execCommand('mceRemoveControl', true, obj.id); } );

  if ($(element).up(DARK_LIST)) {
    var spinnerImage = spinnerIconDark.src;
  } else {
    var spinnerImage = spinnerIcon.src;
  }
  if( scrollTo )
  {
    $(element).scrollTo();
  }
  if( !size ){size=31;}
  $(element).update("<div id='spinner_icon'> <img src='"+spinnerImage+"' alt='Processing...' width='"+size+"px' height='"+size+"px' class='spinner'/></div>");
}

DARK_LIST = "#modal_window";

function deSpinnify()
{
    spinners = $$('[id="spinner_icon"]');
    for( i =0; i<spinners.length; i++)
    {
        spinners[i].hide();
    }
}

function processToggle(element, process, parentElement)
{
    if( $(element) )
    {
        if( process )
        {

            if( $(parentElement) )
            {
                $(parentElement).hide();
            }
            var spinnerImage = spinnerIcon.src;
            $(element).update("<img src='"+spinnerImage+"' alt='Processing...' class='spinner' width='12px' height='12px' align='top'/>");
            $(element).show();
        }
        else
        {
            $(element).hide();
            if( $(parentElement) )
            {
                $(parentElement).show();
            }
        }
    }
}

function video_embed_html(swf, flv, thumb, width, height) {
  flashvars = 'file='+flv+'&image='+thumb+'&showdigits=true&overstretch=false&displayheight='+(height-20);
  return '<embed ' +
    'allowScriptAccess="always" '+
    'src="'+swf+'" '+
    'width="'+width+'" '+
    'border="0" ' +
    'height="'+height+'" '+
 	 'wmode="opaque"'+
    'type="application/x-shockwave-flash" ' +
    'pluginspage="http://www.macromedia.com/go/getflashplayer" '+
    'flashvars="'+flashvars+'"/>';
}

function embed_video(swf, flv, thumb, width, height) {
  document.write(video_embed_html(swf, flv, thumb, width, height));
}

Event.addBehavior.reassignAfterAjax = true;

function state_prov_select_other(element_id,hidden_id)
{
	if ($(element_id).options[$(element_id).selectedIndex].value == "Other")
	{
            $(hidden_id).disabled = false;
            $(hidden_id).value = "";

            if( $(element_id).form.className == 'useSimpleDefaults' )
            {
                $(hidden_id).addClassName('optional');
                $(hidden_id).value=$(hidden_id).title;
            }
            $(hidden_id).show();
	} else {
		$(hidden_id).disabled = false;
		$(hidden_id).value = $(element_id).options[$(element_id).selectedIndex].value;
		$(hidden_id).hide();
	}
}

function showHelperText(domId, helperText)
{
    new Tip(domId, helperText, { className: 'helper_tooltip', delay: 0, hideAfter: true, event: 'click|mouseout'  });
}

function select_unselect_all(form_name) {
    Form.getInputs(form_name, 'checkbox').each(function(box){box.checked = $('select_all').checked})
}

function select_unselect_all_for_hidden_form(form_name, el_prefix) {
    el_name = el_prefix + '_select_all';
    el_name_all = el_prefix + '_ids[]';

    Form.getInputs(form_name, 'checkbox').each(
            function(box){
                if (box.name == el_name) {
                  box.checked = $(el_name).checked;
                }
                if (box.name == el_name_all) {
                    box.checked = $(el_name).checked;
                }
            })
}

function select_unselect_all_for_pro(form_name) {
    Form.getInputs(form_name, 'checkbox').each(
            function(box){
                if (box.name == 'pro_select_all') {
                  box.checked = $('pro_select_all').checked;
                }
                if (box.name == 'pro_share_ids[]') {
                    box.checked = $('pro_select_all').checked;
                }
            })
}
function select_unselect_all_for_co(form_name) {
    Form.getInputs(form_name, 'checkbox').each(
            function(box){
                if (box.name == 'co_select_all') {
                  box.checked = $('co_select_all').checked;
                }
                if (box.name == 'co_share_ids[]') {
                    box.checked = $('co_select_all').checked;
                }
            })
}

function select_unselect_all_for_pro_sent(form_name) {
    Form.getInputs(form_name, 'checkbox').each(
            function(box){
                if (box.name == 'sent_pro_select_all') {
                  box.checked = $('sent_pro_select_all').checked;
                }
                if (box.name == 'sent_pro_share_ids[]') {
                    box.checked = $('sent_pro_select_all').checked;
                }
            })
}
function select_unselect_all_for_email_sent(form_name) {
    Form.getInputs(form_name, 'checkbox').each(
            function(box){
                if (box.name == 'sent_email_select_all') {
                  box.checked = $('sent_email_select_all').checked;
                }
                if (box.name == 'sent_email_share_ids[]') {
                    box.checked = $('sent_email_select_all').checked;
                }
            })
}
function select_unselect_all_for_co_sent(form_name) {
    Form.getInputs(form_name, 'checkbox').each(
            function(box){
                if (box.name == 'sent_co_select_all') {
                  box.checked = $('sent_co_select_all').checked;
                }
                if (box.name == 'sent_co_share_ids[]') {
                    box.checked = $('sent_co_select_all').checked;
                }
            })
}
function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

function writeCookie(name, value, days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  } else {
    var expires = ";";
  }
  document.cookie = name + "=" + value + expires + "; path=/";
}

function limitCheckedCI(obj, type)
{
    el_count = type + "_selected_count";
    var numberChecked = parseInt($(el_count).innerHTML);
    numberChecked = (obj.checked) ? ++numberChecked : --numberChecked;
    if (numberChecked > 5) {
        alert('You may only choose up to 5 items.');
        obj.checked = false;
        numberChecked--;
    }
    $(el_count).innerHTML = numberChecked;
    numberChecked = 0;
}

function resizeElement(el, width, height)
{
    if( el )
    {
        var wlogo = el.getWidth();
        var hlogo = el.getHeight();
        if(wlogo > width) { el.width = width;}
        if(hlogo > height) { el.height = height;}
    }
}

var userFolders = "Folders loading...";

function getFolderMenuContents(cv_id, share_id)
{
    folders="<ul>";
    var folder_arr = new Array();
    folder_arr = userFolders.split('|');

    for (i=0; i<folder_arr.length; i++)
    {
        if (folder_arr[i] && folder_arr[i]!="")
        {
            folder_id = folder_arr[i].split(',')[0];
            folder_name = folder_arr[i].split(',')[1];

            if( share_id )
            {
                folder_link = "<li><a href='/professionals/addtofolder/" + folder_id + "/" + cv_id + "/" + share_id +"' onclick=\"new Ajax.Request('/professionals/addtofolder/" + folder_id + "/" + cv_id + "/" + share_id +"', {asynchronous:true, evalScripts:true, onLoading:function(request){processToggle('spinner" +  share_id + "', true, 'foldermenu" +  share_id + "')}, parameters:'authenticity_token="+ authenticityToken()+ "'}); return false;\">" + folder_name + "</a></li>";
            }
            else
            {
                folder_link = "<li><a href='/professionals/addtofolder/" + folder_id + "/" + cv_id +"/0' onclick=\"new Ajax.Request('/professionals/addtofolder/" + folder_id + "/" + cv_id +"/0', {asynchronous:true, evalScripts:true, onLoading:function(request){processToggle('spinner" + cv_id + "', true, 'foldermenu" + cv_id + "')}, parameters:'authenticity_token="+ authenticityToken()+ "'}); return false;\">" + folder_name + "</a></li>";
            }
            folders += folder_link;
        }
    }
    folders+="</ul>";

    return folders;
}

function createNewTip(resource_name, cv_id, share_id)
{
    if( share_id )
    {
      resource_name += share_id;
    }
    else {
      resource_name += cv_id
    }

    y = 2;
    x = 3;

    $(resource_name).tip = new Tip(resource_name , getFolderMenuContents(cv_id, share_id),
        {
        className: 'FolderMenu',
        style: 'default',
        hook: { tip: 'topRight', target: 'bottomRight' },
        hideOn: false,
        delay: 0,
        hideAfter: .5,
        offset: { x: x, y: y }
      });

}

function regenerateFolderMenus()
{
    $$('a#[class=foldermenu]').each(function(element){

      createNewTip('foldermenu', element.rel.split('|')[0], element.rel.split('|')[1]);
    });
}

function validate_field(form, field, status){
  actual_field = form + '_' + field
  $(actual_field).value = $(actual_field).value.replace(/%/,"")
  value = $(actual_field).value;

  if (value == current_url)
  {
    highlight_url_error(status, 'ok');
    return;
  }

  new Ajax.Request('/cvs/live_url_validation', {
    method: 'post',
    postBody: 'field='+encodeURIComponent(field)+'&query='+encodeURIComponent(value)+'&authenticity_token=' + authenticityToken(),
      onCreate: function(transport){
        $(status).innerHTML = "<img src='/images/default/components/icons/"+ spinner('none') +"'/>";
      }, onSuccess: function(transport) {
      message = transport.responseText.length == '1' ? '' : transport.responseText
      highlight_url_error(status, message);
    }/*, onComplete: function(transport){
    validate_form('new_user');
    }*/
  });
}

function highlight_url_error(field, message){
  if (message == 'ok' || message == ''){
    $(field).className = 'text-green';
    $(field).innerHTML = 'URL available!'
  } else {
    $(field).className = 'text-red';
    $(field).innerHTML = 'URL has been taken!'
  }
}

document.observe('dom:loaded', function(){
  $$('a#[class=foldermenu]').each(function(element){
    createNewTip('foldermenu', element.rel.split('|')[0], element.rel.split('|')[1]);
  });
});
document.observe('dom:loaded', function(){
  createLinkedInMenu();
});
document.observe('dom:loaded', function(){
  $$('a#[class=navmenu]').each(function(element){
    createNavMenuTip(element.id, element.rel);
  });
});


function createLinkedInMenu()
{
    $$('a#[class=linkedinmenu]').each(function(element){
        y = 2;
        x = 3;
        resource_name = "linkedinmenu";
        folders="<ul>";
        folders += "<li><a href='/linkedin?linkedin_action=import_profile'>Import Profile</a></li>";
        folders += "<li><a href='/linkedin'>Update LinkedIn</a></li>";
        folders+="</ul>";

        $(resource_name).tip = new Tip(resource_name , folders,
            {
            className: 'LinkedInMenu',
            style: 'default',
            hook: { tip: 'topRight', target: 'bottomRight' },
            hideOn: false,
            delay: 0,
            hideAfter: .5,
            offset: { x: x, y: y }
          });
      })
}

function createNavMenuTip(resource_name, content)
{
    if(content !='')
    {
        content = content.substring(1, content.length - 1);

        var content_arr = new Array();

        if( content.indexOf('|') > 0)
        {
            content_arr = content.split('|');
        }
        else{
            content_arr[0] = content
        }

        menu_html = '<ul>';

        for (i=0; i<content_arr.length; i++)
        {
            menu_html += "<li>" + content_arr[i] + "</li>"
        }
        menu_html += "</ul>"
        y = 3;
        x = 0;

        $(resource_name).tip = new Tip(resource_name , menu_html,
            {
            className: 'NavMenu',
            borderColor: '#CCCCCC',
            style: 'default',
            hook: { tip: 'topRight', target: 'bottomRight' },
            hideOn: false,
            delay: 0,
            hideAfter: .5,
            offset: { x: x, y: y }
          });
    }
}

function toggleContent(scope, target_id)
{
    $$('div#' + scope + ' div.content').each(function(s){
        if(s == $(target_id)){s.show();}
        else {s.hide()}
    })
}

document.observe('dom:loaded', applyPNGHacks);

function applyPNGHacks () {
    $$('png_hack').each(function(e){e.pngHack()})
}

setDefaults = Behavior.create({
  initialize: function(obj) {
	myforms = this.element;
	myforms.writeAttribute({onsubmit: ''});
	this.setFormDefaults();
    var inp;
    remote_form = myforms.hasClassName('remote-form');
	},
  setFormDefaults: function(e){
	var inp;
	for(var i=0;i<myforms.elements.length;i++)
	{
		this.setDefaultValue(myforms.elements[i]);
	  	this.setFieldHandlers(myforms.elements[i]); }
  },
  setDefaultValue: function(formField) {
  	if(formField.type == 'text' || formField.type == 'password')
    {
      $(formField.id).removeClassName('highlight');
      if(formField.value=='' || formField.value==formField.title)
      {
        $(formField.id).addClassName('optional');
        formField.value=formField.title;

      }
    }
  },
  setFieldHandlers: function(ff){
	if( ff && ff.type == 'text' || ff.type == 'password')
    {
		ff.onfocus = function() {
			if(this.type == 'text' || ff.type == 'password')
		    {
		      if(this.value==this.title && this.hasClassName('optional'))
		      {
		        this.value='';
		        $(this.id).removeClassName('optional');
		      }
		      $(this.id).addClassName('highlight');
		    }
		}
		ff.onblur = function () {
				if(this.type == 'text' || this.type == 'password')
			    {
			      if(this.value=='')
			      {
			        this.value=this.title;
			        $(this.id).addClassName('optional');
			      }
			      $(this.id).removeClassName('highlight');
			    }
			}
    }
  },
  clearFormDefaults: function() {
 	if(myforms && myforms.tagName.toLowerCase() == "form")
    {
      for(var i=0;i<myforms.elements.length;i++)
      {
	    inp = myforms.elements[i];
    	if( inp.type == 'text' && inp.title == inp.value) {
			inp.value = '';
		}
      }
    }

  },
  onsubmit: function() {
	this.clearFormDefaults();
    if (typeof(tinyMCE) != "undefined"){
        tinyMCE.triggerSave();
    }

    if(remote_form)
    {
        this.sendRequest();
        return false;
    }
    else
    {
        return true;
    }
  },
  sendRequest:function() {
    new Ajax.Request(this.element.action, {
	asynchronous:true,
	evalScripts:true,
	method:'put',
	parameters: Form.serialize(myforms) +'&authenticity_token=' + authenticityToken() });
  }
});


MeasureSelect=Behavior.create({
	initialize: function(obj) {

  	isIE = (navigator.appVersion.search(/MSIE\s7.0/) != -1) ? true : false
	},
	onmousedown: function(){
    if(isIE){
		el =this.element.id+'_sel';
		el_width = this.element.getWidth();
		if(!$(el)){this.storeEl(el_width)}
		this.clickEvent(this.setWidth())
		}
	},
	onblur: function(){
	if(isIE) this.clickEvent($(el).readAttribute('curwidth'));
	},
	onchange: function(){
		if(isIE) this.clickEvent($(el).readAttribute('curwidth'));
	},
	clickEvent: function(optWidth){
		if(isIE && this.optLen()){$(this.element.id).setStyle({width: optWidth })}
	},
	optTextLen: function(){
		opts = this.element.childElements();
		strLen = opts.collect(function(s){ return s.text.length })
		return strLen.max();
	},
	setWidth: function(){
		selWidth = this.optTextLen();
		return (selWidth * 7);
	},
	optLen: function(e){
		if(this.optTextLen() > 25){ return true } else {return false}
	},
	storeEl: function(ew){
		if(!this.element.getWidth()==0){
			if($('contents') != null) {
				$('contents').insert({after: new Element("span",{'curwidth':ew,'id':this.element.id + '_sel'})  })
			}
		}
	}

});

socialNetworkUtility=Behavior.create({
	initialize: function(obj) {
	},
	onclick: function(){
        media = this.element.getAttribute('name');
        input_target = this.element.getAttribute('rel');

        url = '/social_networks/' + media + '_contacts?input_target=' + input_target;
        var utilityWindow = window.open(url,"","directories=no,height=400,width=600,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,titlebar=yes,left=0,top=0,location=no");
        utilityWindow.focus();

        return false;
	}
});

selectAll=Behavior.create({
	initialize: function(obj) {
        form = this.element.form;
	},
	onclick: function(){
        checked = true;
        if (!this.element.checked)
        {
            checked = false;
        }

        $(form.id).getInputs('checkbox').each(
            function(box){
                box.checked = checked;
            }
        )
	}
});

isIE7 = (navigator.appVersion.search(/MSIE\s7.0/) != -1) ? true : false




Element.observe(window,'load',function(e) {
 if( navigator.appVersion.search(/MSIE\s6.0/) != -1) {
     if($('affiliate-logo') && $('affiliate-logo').complete) {
         resizeElement($('affiliate-logo'), 100, 60);
     }

     $$('img#[class=affiliate_logo_pro]').each(function(element){
         resizeElement(element, 100, 60)
     });
 }
});

flashMessage = {
    'alert':function(options){
        this.element = options.element
        this.elementClass = options.elementClass;
        this.message = options.message;
        $(this.element).show();
        $(this.element).addClassName(this.elementClass);
        $(this.element).update(this.message)
        setTimeout("flashMessage.dropMessage()", 5000)
    },
    'dropMessage':function(){
        $(this.element).dropOut();
    }
};

var EmbedVideo= {
    yahoo_movie:'http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30',
    parYahooMovie: new Element('param',{name:'movie',value:this.yahoo_movie
    }),
    parAllowFullScreen: new Element('param',{name:'allowFullScreen',value:'true'
    }),
    parAllowScriptAccess: new Element('param',{name:'AllowScriptAccess',value:'always'
    }),
    parBgcolor: new Element('param',{name:'bgcolor',value:'#000000'
    }),
    initialize:function(params)
    {
        this.parentElement = params.parent
        this.id = params.id
        this.vid = params.vid
        this.height = params.height
        this.width = params.width
        switch(params.kind)
        {
            case 'yahoo':
            this.embedYahoo()
            break
            case 'slideshare':
            this.embedSlideshare()
            break
            case 'youTube':
            this.embedYouTube()
            break
            default:
            this.embedYouTube()
            break
        }
    },
    embedYahoo:function(params)
    {
        var object_tag_id = String('obj_' + this.parentElement)
        var objTag = new Element('object', { height: this.height, width: this.width, id:object_tag_id
        })
        var flashVars = 'id='+this.id+'&vid='+this.vid+'&lang=en-us&intl=us&thumbUrl=&embed=1'
        var parFlashVars = new Element('param',{name:'flashVars',value:'id='+this.id+'&vid='+this.vid+'&lang=en-us&intl=us&thumbUrl=&embed=1'})
        var embededYahoo = new Element('embed',{
          src:'http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30',
          type:'application/x-shockwave-flash',
          width:this.width,
          height:this.height,
          allowFullScreen:'true',
          allowscriptaccess:'always',
          bgcolor:'#00000',
          flashvars:'id='+this.id+'&vid='+this.vid+'&lang=en-us&intl=us&thumbUrl=&embed=1'
        });
        if(this.isIE())
        {
            $(String(this.parentElement)).insert(embededYahoo)
        }
        else
        {
            $(String(this.parentElement)).insert(objTag);
            $(object_tag_id).insert({top:this.parAllowFullScreen
            })
            $(object_tag_id).insert({top:this.parAllowScriptAccess
            })
            $(object_tag_id).insert({top:this.parBgcolor
            })
            $(object_tag_id).insert({top:parFlashVars
            })
            $(object_tag_id).insert(embededYahoo)
            $(object_tag_id).insert({top:this.parYahooMovie
            })
        }
},
embedYouTube:function()
{
    var ot = String('obj_'+this.parentElement)
    var objTag = new Element('object', { height: this.height, width: this.width, id: ot
    })
    var parMovie = new Element('param',{name:'movie',value:"http://www.youtube.com/v/"+this.vid+"&rel=1"
})

var embededYouTube = new Element('embed',{
    src:"http://www.youtube.com/v/"+this.vid+"&rel=1",
    type:'application/x-shockwave-flash',
    width:this.width,
    height:this.height,
    allowFullScreen:'true',
    allowscriptaccess:'always'
});

if(this.isIE())
{
    $(String(this.parentElement)).insert(embededYouTube);
}
else
{
    $(String(this.parentElement)).insert(objTag);
    $(ot).insert(parMovie)
    $(ot).insert(this.parAllowFullScreen)
    $(ot).insert(this.parAllowScriptAccess)
    $(ot).insert(embededYouTube)
}
},
isIE:function()
{
    var browser=navigator.appName;
    return (browser=="Microsoft Internet Explorer") ? true :false
}
}

var Opportunity = new Object;
Opportunity.onComplete = function(request) {
  switch(request.status) {
    case 200:
      break;
    case 404:
      $("share-modal").update("<p>We're sorry, that opportunity could not be found. It may have been removed recently.</p>");
      break;
    case 500:
      $("share-modal").update("<p>We're sorry, a problem happened on the server while applying for this position.</p>");
      break;
  }
  return true;
};

var ProtoTabs=Class.create();ProtoTabs.prototype={initialize:function(element,options)
{this.options=Object.extend({defaultPanel:'',ajaxUrls:{},ajaxLoadingText:'Loading...'},options||{});this.currentTab='';this.element=$(element);this.listElements=$A(this.element.getElementsByTagName('LI'));for(i=0;i<this.listElements.length;i++)
{tabLI=this.listElements[i];var itemLinks=tabLI.getElementsByTagName('A');tabLI.itemId=itemLinks[0].href.split("#")[1];tabLI.linkedPanel=$(tabLI.itemId);tabLI.linkedPanel.style.clear="both";if((this.options.defaultPanel!='')&&(this.options.defaultPanel==tabLI.itemId))
{this.openPanel(tabLI)}
else
{$($(tabLI).linkedPanel).hide()}
$(itemLinks[0]).observe('click',function(event)
{element=Event.findElement(event,'LI');this.openPanel(element);Event.stop(event)}.bind(this))}},openPanel:function(tab)
{tab=$(tab);if(this.currentTab!='')
{this.currentTab.linkedPanel.hide();this.currentTab.removeClassName('selected')}
this.currentTab=tab;tab.linkedPanel.show();tab.addClassName('selected');var url=this.options.ajaxUrls[tab.itemId];if(url!=undefined)
{tab.linkedPanel.update(this.options.ajaxLoadingText);new Ajax.Request(url,{onComplete:function(transport)
{tab.linkedPanel.update(transport.responseText)}})}}};

function trim11 (str) {
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}




var Opportunity = new Object;
Opportunity.onComplete = function(request) {
  switch(request.status) {
    case 200:
      break;
    case 404:
      $("share-modal").update("<p>We're sorry, that opportunity could not be found. It may have been removed recently.</p>");
      break;
    case 500:
      $("share-modal").update("<p>We're sorry, a problem happened on the server while applying for this position.</p>");
      break;
  }
  return true;
};



function trim11 (str) {
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}



var Accordion;

      Accordion={
          parent:$('accordion'),                            //parent element ul#accordian
          viewCollection:$$('#accordion li div.view'),     // child collection of view containers
          parseList:function(){



              this.viewCollection.each(function(child){ child.hide() });

          },
          blindSelected:function(element){


              if(element.next('div').visible()) return false;

              this.slideOpen({view:element.next('div'),link:element})

              this.viewCollection.each(function(el){
                  if(el.visible()) {Accordion.slideClose({view:el,link:el.previous()})}
              })

          },
          slideOpen:function(element){
              element.view.blindDown({delay: .5, duration: .1})
              this.deactive()
              element.link.addClassName('active')
          },
          slideClose:function(element){
              element.view.blindUp({delay: .2, duration: .1})
              element.link.removeClassName('active')
          },
          deactive:function(){
            $$('#accordion li a').each(function(e){e.removeClassName('active')})
          }
      };

var Accordion;

      Accordion={
          parent:$('accordion'),                            //parent element ul#accordian
          viewCollection:$$('#accordion li div.view'),     // child collection of view containers
          parseList:function(){



              this.viewCollection.each(function(child){ child.hide() });

          },
          blindSelected:function(element){


              if(element.next('div').visible()) return false;

              this.slideOpen({view:element.next('div'),link:element})

              this.viewCollection.each(function(el){
                  if(el.visible()) {Accordion.slideClose({view:el,link:el.previous()})}
              })

          },
          slideOpen:function(element){
              element.view.blindDown({delay: .5, duration: .1})
              this.deactive()
              element.link.addClassName('active')
          },
          slideClose:function(element){
              element.view.blindUp({delay: .2, duration: .1})
              element.link.removeClassName('active')
          },
          deactive:function(){
            $$('#accordion li a').each(function(e){e.removeClassName('active')})
          }
      };

var AssetState;
var AssetPreviewBehavior={}

AssetState={id:null,path:'',src:'',type:'',active:false,mode:'',linksEnable:true,linked:{id:null,active:false,path:'',type:'',title:'',behavior:'',state:''},flush:function(){this.id=null;this.path="";this.src="";this.type="";this.active=false;this.mode="";linksEnable=true;this.linked.id=null;this.linked.active=false;this.linked.path="";this.linked.type="";this.linked.title="";this.linked.behavior="";this.linked.state="";},flushLinked:function(){this.linked.id=null;this.linked.active=false;this.linked.path="";this.linked.src="";this.linked.type="";this.linked.title="";this.linked.behavior="";this.linked.state="";}}


var AssetLink = Behavior.create(Accordion,{
        initialize:function($super){
            this.parent = this.element; // just to be certain the parent element is set
            this.viewCollection=$$('#accordion li div.view');

            this.parseList()      // parse li elements
            this.defaults()

            $$('ul.view-finder li a').each(function(el){
                Event.observe(el, 'click', function(event) {
                    $$('ul.view-finder li').each(function(e){e.removeClassName('bind')})    // clear any markers
                    this.up().addClassName('bind')                                           // hot link element

                    if(this.up().readAttribute('rel') ==1) {
                        AssetState.mode='default'
                        AssetPreviewBehavior.disableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
                    }
                    else {
                        AssetPreviewBehavior.enableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
                        AssetState.mode='bind'
                    }
                })
            })

        },
        onmousedown:Event.delegate({
         '.fasten-item':function(e){
             this.blindSelected(e.target)                    // method inhre ited from Accordion
             AssetPreviewBehavior.screen('vf-fasten-1',AssetState.src)
             AssetPreviewBehavior.screen('vf-fasten-2','')   //force reset
             AssetState.mode='bind'                          // defualt the click behavior to faten
             AssetState.linked.active=true;                  // may be uncessary
             AssetState.linked.behavior = 'alternate'        // set the behavior of the alt asset
             AssetState.linked.state = 'fasten'
             AssetState.linked.path = ''                     // clear alternat form

             if(!AssetState.linksEnable) AssetPreviewBehavior.enableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
         },
         '.link-external':function(e){
             this.blindSelected(e.target)
             AssetState.mode='default'                        // defualt the click behavior to faten
             AssetState.linked.active=true;
             AssetState.linked.behavior = 'url'
             AssetState.linked.state = 'link'
             AssetState.linked.id = null;                     // keep from mix and match [its 2:30 am comments are going to wain...]
             $('f_alternate_asset').value = ''
             AssetPreviewBehavior.disableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
             AssetPreviewBehavior.screen('vf-link-1',AssetState.src) //set view finder
          },
          '.drape-document':function(e){
             this.blindSelected(e.target)
             AssetPreviewBehavior.screen('vf-drape-2',AssetState.src)

             AssetPreviewBehavior.disableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
             AssetState.mode='default'                          // defualt the click behavior to faten
             AssetState.linked.id = AssetState.id
             AssetState.linked.active=true;
             AssetState.linked.behavior = 'alternate'        // set the behavior of the alt asset
             AssetState.linked.state = 'drape'

          },
         '.show-asset':function(e){
             this.blindSelected(e.target)
             if(!AssetState.linksEnable) AssetPreviewBehavior.enableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
             if(AssetState.linked.state == 'drape') {}
             AssetState.mode='default'                        // defualt the click behavior to faten
             AssetState.flushLinked()


            AssetState.linked.state = 'show'
            AssetPreviewBehavior.show()  //set veiwfinder
         },
         '.reset-state':function(e){
            this.reset()
            if(!AssetState.linksEnable) AssetPreviewBehavior.enableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
            $('asset-title').update('')
            $$('ul.view-finder li').each(function(e){e.removeClassName('bind')})

         }
        }),
        reset:function(){

          AssetState.flush()
          $$('ul.view-finder li').each(function(e){ AssetPreviewBehavior.flush(e) })
          AssetPreviewBehavior.filter({onCollection:'',offCollection:'.show-asset, .fasten-item, .link-external, .reset-state,.drape-document'})
          $$('#accordion li div').each(function(e){e.hide()}) //hide any viewports open
          this.deactive()   //deactivate links
          $('alternate_url').value = 'http://'
        },
        defaults:function(){


            AssetState.linked.path =  $('f_alternate_url').value // IE does not reaing from <-, .value or getValue [ use collection ]
            AssetState.linked.id = ($('f_alternate_asset').value == '') ? null : $('f_alternate_asset').value    //removing ternary
            AssetState.linked.behavior = $('f_behavior').value;

            if(AssetState.linked.id){
              AssetState.linked.src = $(AssetState.linked.id).readAttribute('rel')
            }
            this.defaultPreview() // if exsiting, set the main preview

            if(AssetState.linked.path != ''){
                AssetPreviewBehavior.filter({onCollection:'.show-asset, .fasten-item, .link-external, .reset-state',offCollection:'.drape-document'})
                this.slideOpen({view:$$('#accordion li a.link-external')[0].next('div'),link:$$('#accordion li a.link-external')[0]})

                alternatesFormCollection.writeValue(AssetState.linked.path,0)      // the above code stoped working in IE... go figure

                AssetState.type='Image'
                AssetState.mode='default'
                AssetState.linked.state = 'link'
                AssetState.linked.behavior = 'url'
                AssetState.linked.id = null;                                    // return to default since an external path is set
                AssetPreviewBehavior.screen('vf-link-1',AssetState.src)
            }
            else if(AssetState.linked.id !== null){
                AssetPreviewBehavior.filter({onCollection:'.show-asset, .fasten-item, .link-external, .reset-state',offCollection:'.drape-document'})
                AssetState.linked.type = $(AssetState.linked.id).readAttribute('type')

                if(AssetState.linked.type == 'Document'){ // take the asset id and match with corresponding elements
                  AssetPreviewBehavior.filter({onCollection:'.show-asset, .drape-document, .reset-state',offCollection:'.fasten-item, .link-external'})
                  this.slideOpen({view:$$('#accordion li a.drape-document')[0].next('div'),link:$$('#accordion li a.drape-document')[0]})
                  AssetState.type='Image'
                  AssetState.mode='bind'
                  AssetState.linked.state = 'drape'
                  AssetPreviewBehavior.screen('vf-drape-1',AssetState.src)
                  AssetPreviewBehavior.screen('vf-drape-2',AssetState.linked.src)
                  AssetPreviewBehavior.disableThumbs('ul#thumbs li a[type~=Videoclip],ul#thumbs li a[type~=Audioclip],ul#thumbs li a[type~=Document]')
                }
                else {
                 AssetPreviewBehavior.filter({onCollection:'.show-asset, .fasten-item, .link-external, .reset-state',offCollection:'.drape-document'})
                 this.slideOpen({view:$$('#accordion li a.fasten-item')[0].next('div'),link:$$('#accordion li a.fasten-item')[0]})

                  AssetState.type='Image'
                  AssetState.mode='bind'
                  AssetState.linked.state = 'fasten'

                  AssetPreviewBehavior.screen('vf-fasten-1',AssetState.src)
                  AssetPreviewBehavior.screen('vf-fasten-2',AssetState.linked.src)

                }

                AssetState.linked.behavior = 'alternate'
                AssetState.active=true;
            }
            else {
              if(AssetState.src !=''){
                  AssetPreviewBehavior.setPreview()
                }
              else {
                this.parent.childElements().each(function(e){e.hide()})
              }
            }

        },
        defaultPreview:function(){

            AssetState.active=true

            AssetState.path = ($$('.setPreview') != '') ? $$('.setPreview')[0].down().readAttribute('href') : ''
            AssetState.src = ($$('.setPreview') != '') ? $$('.setPreview')[0].down().readAttribute('rel') : ''
            AssetState.type = ($$('.setPreview') != '') ? $$('.setPreview')[0].down().readAttribute('type') : ''
            if(AssetState.path != '') AssetState.mode = 'int'

        }


    })

    AssetPreviewBehavior= {
         setPreview: function(e){
           if($('start-chooser')) $('start-chooser').fade()

              if(this.passCurrent()){
                AssetState.src = this.element.readAttribute('rel');
                AssetState.type = this.element.readAttribute('type')
                AssetState.path = this.element.readAttribute('href')
                AssetState.id = this.element.readAttribute('id')
                $('asset-title').update(this.element.readAttribute('title'))
              }
             switch(AssetState.type)
              {
              case 'Image':
                 if (this.ignore({states:['drape']}) ){ this.define(); break}  //break filter while in drape mode
                 this.labeling = this.getLabeling('Image')
                 this.filter({onCollection:'.show-asset, .fasten-item, .link-external, .reset-state',offCollection:'.drape-document'})
                 this.define()
                 break;
              case 'Audioclip':
                 if (this.ignore({states:['fasten','link']}) ) { this.define(); break}
                 this.labeling = this.getLabeling('Audioclip')
                 $('drape-label').update(AssetPreviewBehavior.getDrapeLabeling(AssetState.type))
                 this.filter({onCollection:'.show-asset, .drape-document,.reset-state',offCollection:'.fasten-item, .link-external'})
                 this.define()
                 break;
              case 'Videoclip':
                 if (this.ignore({states:['fasten','link']}) ){ this.define(); break}
                 this.labeling = this.getLabeling('Videoclip')
                 $('drape-label').update(AssetPreviewBehavior.getDrapeLabeling(AssetState.type))
                 this.filter({onCollection:'.show-asset, .drape-document,.reset-state',offCollection:'.fasten-item, .link-external'})
                 this.define()
                 break;
              case 'Document':
                 if (this.ignore({states:['fasten','link']}) ){ this.define(); break}
                 this.labeling = this.getLabeling('Document')
                 $('drape-label').update(AssetPreviewBehavior.getDrapeLabeling(AssetState.type))
                 this.filter({onCollection:'.show-asset, .drape-document,.reset-state',offCollection:'.fasten-item, .link-external'})
                 this.define()
                 break;
              }
              return false;
           },
           define:function(){
            switch(AssetState.linked.state)
               {
                   case 'fasten':
                      this.fasten()
                         break
                   case 'drape':
                      this.drape()
                      break
                   case 'link':
                      this.link()
                      break
                   case 'show':
                      this.show()
                      break
                   default:
                      AssetState.linked.state='show'
                      Accordion.slideOpen({view:$$('#accordion li a.show-asset')[0].next('div'),link:$$('#accordion li a.show-asset')[0]})
                      this.show()
               }
           },
           show:function(vfCollection){
               this.labeling = AssetPreviewBehavior.getLabeling(AssetState.type)
               this.screen('vf-show-1',AssetState.src)
               $('show-text').update(this.labeling)
           },
           fasten:function(){
               if(AssetState.mode == 'bind'){
                   AssetState.linked.id = this.element.readAttribute('id')
                   this.screen('vf-fasten-2', this.element.readAttribute('rel'))
               }
               else {

                    this.screen('vf-fasten-1',AssetState.src)

               }
           },
           drape:function(){
           var label = this.getDrapeLabeling  (AssetState.type);
            if(AssetState.mode == 'default'){
              if(AssetState.type != 'Image') $('drape-label').update(label)
              if(AssetState.type =='Image')  this.screen('vf-drape-1',AssetState.src)
            }
            else {

              if(this.element.readAttribute('type') !='Image'){
                  $('drape-label').update(label)
                  AssetState.linked.id = this.element.readAttribute('id')
                  this.screen('vf-drape-2',this.element.readAttribute('rel'))}
              }

           },
           link:function(){
             if(AssetState.type =='Image'){

               this.screen('vf-link-1',AssetState.src)
               AssetState.type = this.element.readAttribute('type')
               AssetState.path = this.element.readAttribute('href')
             }
           },
           screen:function(element,background){
             $(element).setStyle({
                background: 'url('+background+') no-repeat center'});
           },
           flush:function(element){
               $(element).setStyle({background: '' });
           },
           filter:function(collection){
               $$(collection.onCollection).each(function(e){ e.up().show() })
               $$(collection.offCollection).each(function(e){ e.up().hide() })
           },
           ignore:function(state){
             pass = false;
             state.states.each(function(st){
             if(st == AssetState.linked.state){
                 pass = true
              }
             })
             return pass
           },
          passCurrent:function(){
              pass = true
              if(AssetState.mode == 'bind'){ pass=false}
              if(AssetState.mode == 'int'){ pass=false; AssetState.mode = ''}
              if(pass!=false){
                if(AssetState.linked.state=='fasten' && this.element.readAttribute('type') != 'Image'){ pass=false}
                if(AssetState.linked.state=='link' && this.element.readAttribute('type') != 'Image'){ pass=false}
              }
              return pass
          },
          getLabeling:function(type){
            switch(type)
              {
              case 'Image':
                  msg = 'Show Image'
                 break;
              case 'Audioclip':
                 msg = 'Play Audio Clip'
                 break;
              case 'Videoclip':
                 msg = 'Play Video Clip'
                 break;
              case 'Document':
                 msg = 'Open Document'
                 break;
              }
              return msg
         },
         getDrapeLabeling:function(type){
           switch(type)
             {
             case 'Audioclip':
                msg = 'Drape Audio Clip with Image'
                break;
             case 'Videoclip':
                msg = 'Drape Video Clip with Image'
                break;
             case 'Document':
                msg = 'Drape Document with Image'
                break;
             }
             return msg
         },
          disableThumbs:function(filter){
            $$(filter).each(function(s){s.up().setOpacity(.2)})
            $$(filter).each(function(s){s.hide()}) //disable clicks
            AssetState.linksEnable=false
          },
          enableThumbs:function(filter){
             $$(filter).each(function(s){s.up().setOpacity(1)})
             $$(filter).each(function(s){s.show()})
             AssetState.linksEnable=true
           }
     }

      AssetPreview=Behavior.create(AssetPreviewBehavior,{
          onclick:function(e){
            AssetState.active = true;
            this.setPreview();
            return false;
          }
        });

        AssetAddToSection=Behavior.create({
          onclick:function(e){
                var chkURL = this.validateURL();
                if(chkURL) { this.sendItem() }
                return false;
            },
          validateURL:function(){
                if(AssetState.linked.behavior == 'url') {                   // is the behavior an External URL?
                  if(this.validURL())  return true                       // URL is valid jump to sendItem

                    flashMessage.alert({ message:"You must supply a valid URL (http://www.yourlink.com)",
                                         elementClass:'modal-errors',
                                         element:'dialog-messages-portfolio'})
                    return false;       // validation did not pass, returning false
               }
                else {
                    alternatesFormCollection.writeValue('',0)       // Since External URL is not the behavior, clear prefill
                    return true;
              }
          },
          sendItem:function(){

                sendPath = unescape(AssetState.path)
                AssetState.linked.id = (AssetState.linked.id == null) ? '' : AssetState.linked.id     // find a beter way to do this... if return null, don't pass to string
                qryAppend = '&behavior=' + AssetState.linked.behavior +'&alternate_asset=' + AssetState.linked.id + '&alternate_url=' + escape(AssetState.linked.path)

                setPath = (qryAppend != 'undefined') ? sendPath + qryAppend : sendPath;
                new Ajax.Request(setPath,
                    {
                      method: 'post',
                      asynchronous: true,
                      evalScripts: true,
                      parameters:'authenticity_token=' + (authenticityToken())
                      });
           },
           validURL:function(){
               v = /^(http|https)+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_%&\?\/.=]+/i;
               var path = alternatesFormCollection.readValue(0)
               isValid = (v.exec(trim11(path)) ? true : false);
               AssetState.linked.path = trim11(path)              //keep it clean and save in AssetState object
               return isValid
           }
        });

document.observe('lightview:hidden', function() {
    AssetState.flush()
});
/* --- BoxOver ---
/* --- v 2.1 17th June 2006
By Oliver Bryant with help of Matthew Tagg
http://boxover.swazz.org */

if (typeof document.attachEvent!='undefined') {
   window.attachEvent('onload',init);
   document.attachEvent('onmousemove',moveMouse);
   document.attachEvent('onclick',checkMove); }
else {
   window.addEventListener('load',init,false);
   document.addEventListener('mousemove',moveMouse,false);
   document.addEventListener('click',checkMove,false);
}

var oDv=document.createElement("div");
var dvHdr=document.createElement("div");
var dvBdy=document.createElement("div");
var windowlock,boxMove,fixposx,fixposy,lockX,lockY,fixx,fixy,ox,oy,boxLeft,boxRight,boxTop,boxBottom,evt,mouseX,mouseY,boxOpen,totalScrollTop,totalScrollLeft;
boxOpen=false;
ox=10;
oy=10;
lockX=0;
lockY=0;

function init() {
	oDv.appendChild(dvHdr);
	oDv.appendChild(dvBdy);
	oDv.style.position="absolute";
	oDv.style.visibility='hidden';
	document.body.appendChild(oDv);
}

function defHdrStyle() {
	dvHdr.innerHTML='<img  style="vertical-align:middle"  src="info.gif">&nbsp;&nbsp;'+dvHdr.innerHTML;
	dvHdr.style.fontWeight='bold';
	dvHdr.style.width='150px';
	dvHdr.style.fontFamily='"Trebuchet MS", Verdana, Arial';
	dvHdr.style.border='1px solid #A5CFE9';
	dvHdr.style.padding='8px';
	dvHdr.style.fontSize='11';
	dvHdr.style.color='#4B7A98';
	dvHdr.style.background='#D5EBF9';
	dvHdr.style.filter='alpha(opacity=95)'; // IE
	dvHdr.style.opacity='0.95'; // FF
}

function defBdyStyle() {
	dvBdy.style.borderBottom='1px solid #A5CFE9';
	dvBdy.style.borderTop='1px solid #A5CFE9';
	dvBdy.style.borderLeft='1px solid #A5CFE9';
	dvBdy.style.borderRight='1px solid #A5CFE9';
	dvBdy.style.width='150px';
	dvBdy.style.fontFamily='"Trebuchet MS", Verdana, Arial';
	dvBdy.style.fontSize='11';
	dvBdy.style.padding='8px';
	dvBdy.style.color='#1B4966';
	dvBdy.style.background='#FFFFFF';
	dvBdy.style.filter='alpha(opacity=95)'; // IE
	dvBdy.style.opacity='0.95'; // FF
}

function checkElemBO(txt) {
if (!txt || typeof(txt) != 'string') return false;
if ((txt.indexOf('header')>-1)&&(txt.indexOf('body')>-1)&&(txt.indexOf('[')>-1)&&(txt.indexOf('[')>-1))
   return true;
else
   return false;
}

function scanBO(curNode) {
	  if (checkElemBO(curNode.title)) {
         curNode.boHDR=getParam('header',curNode.title);
         curNode.boBDY=getParam('body',curNode.title);
			curNode.boCSSBDY=getParam('cssbody',curNode.title);
			curNode.boCSSHDR=getParam('cssheader',curNode.title);
			curNode.IEbugfix=(getParam('hideselects',curNode.title)=='on')?true:false;
			curNode.fixX=parseInt(getParam('fixedrelx',curNode.title));
			curNode.fixY=parseInt(getParam('fixedrely',curNode.title));
			curNode.absX=parseInt(getParam('fixedabsx',curNode.title));
			curNode.absY=parseInt(getParam('fixedabsy',curNode.title));
			curNode.offY=(getParam('offsety',curNode.title)!='')?parseInt(getParam('offsety',curNode.title)):10;
			curNode.offX=(getParam('offsetx',curNode.title)!='')?parseInt(getParam('offsetx',curNode.title)):10;
			curNode.fade=(getParam('fade',curNode.title)=='on')?true:false;
			curNode.fadespeed=(getParam('fadespeed',curNode.title)!='')?getParam('fadespeed',curNode.title):0.04;
			curNode.delay=(getParam('delay',curNode.title)!='')?parseInt(getParam('delay',curNode.title)):0;
			if (getParam('requireclick',curNode.title)=='on') {
				curNode.requireclick=true;
				document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false);
				document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false);
			}
			else {// Note : if requireclick is on the stop clicks are ignored
   			if (getParam('doubleclickstop',curNode.title)!='off') {
   				document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false);
   			}
   			if (getParam('singleclickstop',curNode.title)=='on') {
   				document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false);
   			}
   		}
			curNode.windowLock=getParam('windowlock',curNode.title).toLowerCase()=='off'?false:true;
			curNode.title='';
			curNode.hasbox=1;
	   }
	   else
	      curNode.hasbox=2;
}


function getParam(param,list) {
	var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]');
	var res = reg.exec(list);
	var returnvar;
	if(res)
		return res[2].replace('[[','[').replace(']]',']');
	else
		return '';
}

function Left(elem){
	var x=0;
	if (elem.calcLeft)
		return elem.calcLeft;
	var oElem=elem;
	while(elem){
		 if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderLeftWidth)))&&(x!=0))
		 	x+=parseInt(elem.currentStyle.borderLeftWidth);
		 x+=elem.offsetLeft;
		 elem=elem.offsetParent;
	  }
	oElem.calcLeft=x;
	return x;
	}

function Top(elem){
	 var x=0;
	 if (elem.calcTop)
	 	return elem.calcTop;
	 var oElem=elem;
	 while(elem){
	 	 if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderTopWidth)))&&(x!=0))
		 	x+=parseInt(elem.currentStyle.borderTopWidth);
		 x+=elem.offsetTop;
	         elem=elem.offsetParent;
 	 }
 	 oElem.calcTop=x;
 	 return x;

}

var ah,ab;
function applyStyles() {
	if(ab)
		oDv.removeChild(dvBdy);
	if (ah)
		oDv.removeChild(dvHdr);
	dvHdr=document.createElement("div");
	dvBdy=document.createElement("div");
	CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle();
	CBE.boCSSHDR?dvHdr.className=CBE.boCSSHDR:defHdrStyle();
	dvHdr.innerHTML=CBE.boHDR;
	dvBdy.innerHTML=CBE.boBDY;
	ah=false;
	ab=false;
	if (CBE.boHDR!='') {
		oDv.appendChild(dvHdr);
		ah=true;
	}
	if (CBE.boBDY!=''){
		oDv.appendChild(dvBdy);
		ab=true;
	}
}

var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ;
var ini=false;

function SHW() {
   if (document.body && (document.body.clientWidth !=0)) {
      width=document.body.clientWidth;
      height=document.body.clientHeight;
   }
   if (document.documentElement && (document.documentElement.clientWidth!=0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) {
      width=document.documentElement.clientWidth;
      height=document.documentElement.clientHeight;
   }
   return [width,height];
}


var ID=null;
function moveMouse(e) {
	e?evt=e:evt=event;

	CSE=evt.target?evt.target:evt.srcElement;

	if (!CSE.hasbox) {
	   iElem=CSE;
	   while ((iElem.parentNode) && (!iElem.hasbox)) {
	      scanBO(iElem);
	      iElem=iElem.parentNode;
	   }
	}

	if ((CSE!=LSE)&&(!isChild(CSE,dvHdr))&&(!isChild(CSE,dvBdy))){
	   if (!CSE.boxItem) {
			iterElem=CSE;
			while ((iterElem.hasbox==2)&&(iterElem.parentNode))
					iterElem=iterElem.parentNode;
			CSE.boxItem=iterElem;
			}
		iterElem=CSE.boxItem;
		if (CSE.boxItem&&(CSE.boxItem.hasbox==1))  {
			LBE=CBE;
			CBE=iterElem;
			if (CBE!=LBE) {
				applyStyles();
				if (!CBE.requireclick)
					if (CBE.fade) {
						if (ID!=null)
							clearTimeout(ID);
						ID=setTimeout("fadeIn("+CBE.fadespeed+")",CBE.delay);
					}
					else {
						if (ID!=null)
							clearTimeout(ID);
						COL=1;
						ID=setTimeout("oDv.style.visibility='visible';ID=null;",CBE.delay);
					}
				if (CBE.IEbugfix) {hideSelects();}
				fixposx=!isNaN(CBE.fixX)?Left(CBE)+CBE.fixX:CBE.absX;
				fixposy=!isNaN(CBE.fixY)?Top(CBE)+CBE.fixY:CBE.absY;
				lockX=0;
				lockY=0;
				boxMove=true;
				ox=CBE.offX?CBE.offX:10;
				oy=CBE.offY?CBE.offY:10;
			}
		}
		else if (!isChild(CSE,dvHdr) && !isChild(CSE,dvBdy) && (boxMove))	{
			if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) {
   			CBE=null;
   			if (ID!=null)
  					clearTimeout(ID);
   			fadeOut();
   			showSelects();
			}
		}
		LSE=CSE;
	}
	else if (((isChild(CSE,dvHdr) || isChild(CSE,dvBdy))&&(boxMove))) {
		totalScrollLeft=0;
		totalScrollTop=0;

		iterElem=CSE;
		while(iterElem) {
			if(!isNaN(parseInt(iterElem.scrollTop)))
				totalScrollTop+=parseInt(iterElem.scrollTop);
			if(!isNaN(parseInt(iterElem.scrollLeft)))
				totalScrollLeft+=parseInt(iterElem.scrollLeft);
			iterElem=iterElem.parentNode;
		}
		if (CBE!=null) {
			boxLeft=Left(CBE)-totalScrollLeft;
			boxRight=parseInt(Left(CBE)+CBE.offsetWidth)-totalScrollLeft;
			boxTop=Top(CBE)-totalScrollTop;
			boxBottom=parseInt(Top(CBE)+CBE.offsetHeight)-totalScrollTop;
			doCheck();
		}
	}

	if (boxMove&&CBE) {
		bodyScrollTop=document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop;
		bodyScrollLet=document.documentElement&&document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft;
		mouseX=evt.pageX?evt.pageX-bodyScrollLet:evt.clientX-document.body.clientLeft;
		mouseY=evt.pageY?evt.pageY-bodyScrollTop:evt.clientY-document.body.clientTop;
		if ((CBE)&&(CBE.windowLock)) {
			mouseY < -oy?lockY=-mouseY-oy:lockY=0;
			mouseX < -ox?lockX=-mouseX-ox:lockX=0;
			mouseY > (SHW()[1]-oDv.offsetHeight-oy)?lockY=-mouseY+SHW()[1]-oDv.offsetHeight-oy:lockY=lockY;
			mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)?lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth:lockX=lockX;
		}
		oDv.style.left=((fixposx)||(fixposx==0))?fixposx:bodyScrollLet+mouseX+ox+lockX+"px";
		oDv.style.top=((fixposy)||(fixposy==0))?fixposy:bodyScrollTop+mouseY+oy+lockY+"px";

	}
}

function doCheck() {
	if (   (mouseX < boxLeft)    ||     (mouseX >boxRight)     || (mouseY < boxTop) || (mouseY > boxBottom)) {
		if (!CBE.requireclick)
			fadeOut();
		if (CBE.IEbugfix) {showSelects();}
		CBE=null;
	}
}

function pauseBox(e) {
   e?evt=e:evt=event;
	boxMove=false;
	evt.cancelBubble=true;
}

function showHideBox(e) {
	oDv.style.visibility=(oDv.style.visibility!='visible')?'visible':'hidden';
}

function hideBox(e) {
	oDv.style.visibility='hidden';
}

var COL=0;
var stopfade=false;
function fadeIn(fs) {
		ID=null;
		COL=0;
		oDv.style.visibility='visible';
		fadeIn2(fs);
}

function fadeIn2(fs) {
		COL=COL+fs;
		COL=(COL>1)?1:COL;
		oDv.style.filter='alpha(opacity='+parseInt(100*COL)+')';
		oDv.style.opacity=COL;
		if (COL<1)
		 setTimeout("fadeIn2("+fs+")",20);
}


function fadeOut() {
	oDv.style.visibility='hidden';

}

function isChild(s,d) {
	while(s) {
		if (s==d)
			return true;
		s=s.parentNode;
	}
	return false;
}

var cSrc;
function checkMove(e) {
	e?evt=e:evt=event;
	cSrc=evt.target?evt.target:evt.srcElement;
	if ((!boxMove)&&(!isChild(cSrc,oDv))) {
		fadeOut();
		if (CBE&&CBE.IEbugfix) {showSelects();}
		boxMove=true;
		CBE=null;
	}
}

function showSelects(){
   var elements = document.getElementsByTagName("select");
   for (i=0;i< elements.length;i++){
      elements[i].style.visibility='visible';
   }
}

function hideSelects(){
   var elements = document.getElementsByTagName("select");
   for (i=0;i< elements.length;i++){
   elements[i].style.visibility='hidden';
   }
}
/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Sandeep Gangadharan | http://www.sivamdesign.com/scripts/ */
if (document.getElementById) {
  document.write('<style type="text/css">.texter {display:none; border-left:white 20px solid; color:#404040; font: .9em verdana, arial, helvetica, sans-serif; margin-bottom: 12px;}</style>') }


  var divNum = new Array("a1","a2","a3","a4","a5","a6","a7");  // at the left you should add a1, a2 etc. for each header you wish to include
function openClose(theID) {
for(var i=0; i < divNum.length; i++) {
if (divNum[i] == theID) {
if (document.getElementById(divNum[i]).style.display == "block") {
document.getElementById(divNum[i]).style.display = "none";
document.getElementById(divNum[i]).style.visibility = "hidden";
} else {
document.getElementById(divNum[i]).style.display = "block";
document.getElementById(divNum[i]).style.visibility = "visible";
}
} else {
document.getElementById(divNum[i]).style.display = "none";
document.getElementById(divNum[i]).style.visibility = "hidden";
}
  }
}
var Disabled = Behavior.create({
	initialize:function() {
		this.element.href = "#";
		this.element.onclick = function(event) {this.blur();return false;}
	},

	onclick:function(e) {
		Event.stop(e);
	}
});

var EntryAutopopulatorKlass = Class.create({
	update_title_and_description: function(select){
		item_no = parseFloat(select.value);
		form = select.up("FORM")
		item = form.down(".meta_item_"+item_no)
		form.down(".title").value=item.down(".meta_title").firstChild.nodeValue

		tinyMCE.execInstanceCommand(form.down("iframe").id, 'mceSetContent', false, item.down(".meta_description").firstChild.nodeValue);
	}


})
var EntryAutopopulator = new EntryAutopopulatorKlass();


/*
 *	Intended to be a bucked for any formatting to be applied to form elements
 */

var FormAutoFormatterKlass = Class.create({

	format_phone_number:function(form_field) {
		var stripped_number = form_field.value.replace(/[^\d]/g,"")
		var formatted_number = ""
		if(stripped_number.match(/1\d{10}\d*/)){stripped_number = stripped_number.replace(/^1/,"")}

		if(stripped_number.match(/\d{10}\d*/)){
			match = stripped_number.match(/(\d{3})(\d{3})(\d{4})(\d*)/)
			formatted_number = "(" + match[1] + ") " + match[2] + "-" + match[3] + (match[4] != "" ? formatted_number += " x" + match[4] : "")
			form_field.value = formatted_number
			form_field.removeClassName("invalid")
		}else{
			form_field.addClassName("invalid")
		}
	}

})
var FormAutoFormatter = new FormAutoFormatterKlass();


var HoverBox = Behavior.create({
  initialize:function() {

	  this.link_item = this.element.parentNode.parentNode;
    this.container = this.element.parentNode;
	  this.mousedOver = false;

    this.setZIndexes();

    Event.observe(this.container, "mousemove", this.manage_position.bindAsEventListener(this), false);
  },

  setZIndexes: function() {
    this.next_section = this.element.up( '.section' ).next( '.section')

    if( this.next_section ) {
	    this.container.up( '.section' ).setStyle( {zIndex: (this.container.getStyle('z-index') -1)} );
	    this.next_section.setStyle( {zIndex: (this.container.getStyle('z-index') -2)} );
    }
  },

  unsetZIndexes: function() {
    this.next_section = this.element.up( '.section' ).next( '.section')

    if( this.next_section ) {
	    this.container.up( '.section' ).setStyle( {zIndex: null } );
	    this.next_section.setStyle( {zIndex: null} );
    }
  },


  manage_position: function(e){
    x_width  = this.element.getWidth();
    x_offset = this.element.cumulativeOffset().left;
    y_width  = this.element.getHeight();
    y_offset = this.element.cumulativeOffset().top;

    x_in_range = false;
    y_in_range = false;

    left_padding = 30;
	  right_padding = 15;
	  top_padding = 10;
	  bottom_padding = 30;

    if ((Event.pointerX(e) > x_offset + left_padding) && (Event.pointerX(e) < (x_offset + x_width - right_padding))){
      x_in_range = true;
    }

    if ((Event.pointerY(e) > y_offset + top_padding) && (Event.pointerY(e) < (y_offset + y_width - bottom_padding))){
      y_in_range = true;
    }

	  if( y_in_range && x_in_range ) {
		  this.mousedOver = true
	  }
	  else if( this.mousedOver ) {
	    this.mousedOver = false;
      this.fademe();
	  }

  },

  fademe:function(e) {
    Effect.Fade(this.element.parentNode.id, {duration: 0.5});
    this.unsetZIndexes();
  },

	onclick:function(e) {
	  var source = Event.element(e);
	  if (source.tagName == "A" && source.up(".menu")) {
	  	Event.stop(e);
		  source.blur();
		  this.switchTo(source.id.gsub("_tab",""));
	  } else if (source.id == "close_hover_button") {
		  this.fademe();
		  Event.stop(e);
	  }
	},

	switchTo:function(tabName) {
	  $$('#' + this.container.id + ' .hover_box .contents').each(function(e){
	    if( e.id == (tabName + "_content") )  {
        e.show();
  	    e.removeClassName("hidden");
      }
      else {
	      e.hide();
	      e.addClassName("hidden")
	    }
	  });

	  $$('#' + this.container.id + ' .hover_box .menu li').each(function(e){
	    if( e.firstChild.id == (tabName + "_tab") ) {
	      e.addClassName("current");
	    }
	    else {
	      e.removeClassName("current")
	    }
	  });
	}
});

var HoverLink = Behavior.create({
  initialize:function() {
    this.hoverLoaded = false;
	},

  onclick:function(e) {
    Event.stop(e);
    return;
  },

  setZIndexes: function() {
    this.next_section = this.element.up( '.section' ).next( '.section')

    container_z_index = this.element.up('h4').down( '.hover_container').getStyle('z-index');

    if( this.next_section ) {
	    this.element.up( '.section' ).setStyle( {zIndex: (container_z_index - 1 )} );
	    this.next_section.setStyle( {zIndex: ( container_z_index - 2 )} );
    }
  },

  onmouseover:function(e) {
		hoversStillVisible = false;
		visibleElements = 0;
    $$('.hover_container').each(function(element){
      if(element.visible()){
          element.hide();
          visibleElements++;
      }
    });
		hoversStillVisible = false;

    Event.stop(e);
	  if( !this.hoverLoaded ) {
            if(!hoversStillVisible) {
	      this.timer = this.fire_ajax.bindAsEventListener(this).delay(0);
            }
	  }
	  else if ( !$(this.element.id + "_container").visible()) {
	    $$('.hover_box').each(function(element){
        if(!element.visible() && !hoversStillVisible){
          element.show();
        }
      });
	    this.setZIndexes();
	    if(!hoversStillVisible) {
				Effect.Appear($(this.element.id + "_container"),{duration:0.2, queue:'end'});
				hoversStillVisible = false;
			}
	  }
	},

	onmouseout:function(e){
    Event.stop(e);
		if( !this.hoverLoaded ) {
			window.clearTimeout(this.timer);
		}
	},

  fire_ajax:function(e){
    this.element.blur();
	  if (!HoverLoading && !this.hoverLoaded) {
	    HoverLoading = true;
    	this.hoverLoaded = true;
  	  var container_id = this.element.id + "_container"
  	  this.element.insert({before: "<div id='" + container_id + "' class='hover_container'></div>"})
  	  new Ajax.Updater(container_id, this.element.href, {method:"get",
  	    onSuccess:function(e) {
					Effect.Appear(e.request.container.success,{duration:0.2, queue:'end'});
					hoversStillVisible = false;
  	      HoverLoading = false;
  	    }
  	  });
    }
  }

})


HoverLoading = false;
hoversStillVisible = false;
visibleElements = 0;
Hoverize = Behavior.create({
  onmouseover: function() { this.element.addClassName("hover"); },
  onmouseout: function() { this.element.removeClassName("hover"); }
});

function createInPlaceEditor(el, url, className, cols, fieldLabel)
{
  new Ajax.InPlaceEditor(el, url,
                      { formClassName: className,
                        cols: cols,
                        onFailure: function (i,t) {
                          reportError(t.responseText.stripTags(), el);
                          },
                        clickToEditText:'Click here to edit ' + fieldLabel,
                        callback: function(form) {
                          return Form.serialize(form) + '&authenticity_token=' + (authenticityToken());
                        }
                      });
}

function createInPlaceCollectionEditor(el, url, collection, fieldLabel, form_authenticity_token)
{
  new Ajax.InPlaceCollectionEditor( el, url,
                            { collection: collection,
                              onFailure: function (i,t) {
                                reportError(t,el);
                              },
                              clickToEditText:'Click here to edit ' + fieldLabel,
                              callback: function(form) {
                                return Form.serialize(form) + '&authenticity_token=' + (authenticityToken());
                              }
                            }
                           );
}

function reportError(msg, el)
{
    element = $('contact_error_message')

    if (element)
    {
      element.update("<div id='flash_errors'>Sorry, we couldn't save your change. " + msg + "</div>");
      element.show();
      Effect.Fade('contact_error_message', { duration: .75, delay: 5.5 });
    }

    new Effect.Highlight(el, {startcolor:'#FF0000', endcolor: '#FFFFBF', duration:10.5});
}
var OpenFormWarning = Behavior.create({

	initialize: function( dom_selector, alert_text  ) {
		this.alert_text = alert_text;
		window.onbeforeunload = function(e) {
			if( $$( dom_selector ).size() > 0 )
			{	if( typeof document.skip_redirect_message != "undefined" || ( $('modal_window') && $('modal_window').visible() && $$( dom_selector ).size() <= 1 ) )
				{ }
				else
				{
                    if(_isset)
                    {
                        _isset = false;
                    }
                    else
                    {
                        return alert_text;
                    }

				}
		 	}
		}
	}
})
SectionColumn = Behavior.create({
  initialize: function(options) {
  	this.options = Object.extend({
      columns: $$('.column')
    }, options || {});

    this.doSortable();
  },

  onUpdate: function(e) {
  	new Ajax.Request("/users/"+SectionColumn.instances[0].options.user_id+"/cvs/"+SectionColumn.instances[0].options.cv_id+"/sections/reorder", {
	  		parameters: Sortable.serialize(e),
	  		method: 'put',
	  		onFailure: function() { alert("Could not save the widget position."); }});
  },

  doSortable: function() {
    this.element.getElementsBySelector(".section .header").each(function(e) {
      if ( e.readAttribute('rel')!="no_handle" && !e.down(".handle"))
        e.insert({top: "<a href='#' title='Move Section' class='handle'/>Move</a>"})
    });

    Sortable.create(this.element, {constraint: "vertical",
                                    tag: 'div',
                                    handle: 'header',
                                    hoverclass: "hover_drop",
                                    onUpdate: this.onUpdate,
                                    scroll: window });

    $$(".section .header .handle").each(function(e){e.style.cursor = "move"});
  },

  onclick: function(e) {
    var source = Event.element(e);

    if (source.className == "move_up") {
      this.callMoveSection(source.up('.section'),'up');
      Event.stop(e);
    } else if (source.className == "move_down") {
      this.callMoveSection(source.up('.section'),'down');
      Event.stop(e);
    }
  },

  callMoveSection: function(element, direction) {
      var section_id = element.id.match(/section_([0-9]+)/)[1];
      var url = "/users/" + SectionColumn.instances[0].options.user_id + "/cvs/" + SectionColumn.instances[0].options.cv_id + "/sections/" + section_id + "/move_" + direction;

      new Ajax.Request(url, {
                method: 'put',
                onFailure: function() { alert("Could not move the section."); }});
  }
});

function setLeftmostColumn(column) {
	var smallColumn = $('small_container');
	var largeColumn = $('large_container');
	if (column == "large") {
		smallColumn.addClassName("on_right");
		largeColumn.addClassName("on_left");
		smallColumn.removeClassName("on_left");
		largeColumn.removeClassName("on_right");
	} else {
		smallColumn.addClassName("on_left");
		largeColumn.addClassName("on_right");
		smallColumn.removeClassName("on_right");
		largeColumn.removeClassName("on_left");
	}
}

function reinitializeSortables() {
	SectionColumn.instances.each(function(c) {
		c.doSortable();
	})
}

function togglePortfolioSectionAdder(instant) {
	if ($('cv_section_adder_box').visible()) toggleMainSectionAdder(true);
}

function toggleMainSectionAdder(instant) {
	toggleSectionAdder("cv_section_adder_box","cv_section_adder_button",instant);
}

function toggleSectionAdder(boxId,buttonId,instant) {
	var box = $(boxId);
	var button = $(buttonId);
	if (!box.visible()) {
		if (instant)
		  Element.show(box)
		else
		  Effect.Appear(box,{duration:0.5});
		button.addClassName("current");
	} else {
		if (instant)
		  Element.hide(box)
		else
		  Effect.Fade(box,{duration:0.5});

		button.removeClassName("current");
	}
}

function checkEmptyColumns() {
  if ($('small_container').down('.section')) {
    $('large_container').removeClassName("without_small");
    $('small_container').removeClassName("empty");
  } else {
    $('large_container').addClassName("without_small");
    $('small_container').addClassName("empty");
  }
}
var ShowHide = Behavior.create({

	initialize: function( truth_condition, element_to_show_or_hide  ) {
		this.truth_condition = truth_condition || this.element.checked;
		this.element_to_show_or_hide = element_to_show_or_hide || $("target_of_" + this.element.id);
    if (this.element.checked)
      this.element_to_show_or_hide.hide()
	},

	onclick: function(e) {
			if( this.truth_condition ) {
				$( this.element_to_show_or_hide ).show();
			}
			else {
				$( this.element_to_show_or_hide ).hide();
			}
            this.truth_condition = !this.truth_condition
	}
})

var DropMenuPaths={
  active:false,
  el:null,
  menu:{    out:"/images/default/layout/core/nav_arrow.gif",
            up:"/images/default/layout/core/nav_arrow_select.gif",
            over:"/images/default/layout/core/nav_arrow_hover.gif"},
  main:{    out:"/images/default/layout/core/arrow.png",
            up:"/images/default/layout/core/arrow_select.png",
            over:"/images/default/layout/core/arrow_hover.png"},
  clear:function(){
    $$('ul.sub_menu').each(function(e){e.removeClassName('show');e.up().removeClassName('brace')})
    this.active=false;
    this.el=null;
  }
}
DropMenu=Behavior.create(DropMenuPaths,{
  onclick:function(){
    DropMenuPaths.active = DropMenuPaths.active == false ? true : false;
    DropMenuPaths.el = this.element;
    var my_menu = $(this.element.readAttribute('rel'))
    var my_par = this.element.up()
    $$('ul.dropmenu ul.sub_menu').each(function(e){
      if(e != my_menu) {
        e.removeClassName('show')
        e.up().removeClassName('brace')
        }
     })
    my_menu.up().addClassName('brace')
    my_menu.toggleClassName('show')
  },
  onmouseover:function(){
      over=this.kind();
      if(over){this.element.src =DropMenuPaths[over].over;};
  },
  onmouseup:function()  {
      up=this.kind();
      if(up){this.element.src =DropMenuPaths[up].up;};
  },
  onmouseout:function() {
      out=this.kind();
      if(out){this.element.src=DropMenuPaths[out].out;};
  },
  kind:function(){
    var ld=this.element.readAttribute('longdesc');
    img_path = 'main';
    img_path = ( ld != '') ? ld : 'main'
    return img_path;
  }
})
var UploadProgress = {
  uploading: null,
  unsupported_format: null,
  verify: function(file, type) {
  	var file_type_regex;

  	switch(type) {
		case 'Image':
			file_type_regex = /^.*\.(gif|png|jpg|jpeg)$/;
			break;
		case 'Document':
			file_type_regex = /^.*\.(doc|pdf|ppt|pps|xls|txt|docx|xlsx|pptx)$/;
			break;
		case 'Video':
			file_type_regex = /^.*\.(avi|3gp|mov|mp4|wmv|m2v|flv|mpg|mpeg)$/;
			break;
		case 'Audio':
			file_type_regex = /^.*\.(wav|mp2|ra|aiff|qt|au|mp3)$/;
			break;
		default:
			file_type_regex = /^.*\.(avi|3gp|mov|mp4|wmv|m2v|flv|wav|mp3|ra|aiff|qt|au|mp2|doc|pdf|ppt|pps|xls|txt|docx|xlsx|pptx|gif|png|jpg|jpeg|mpg|mpeg)$/;
	}
	var match = file_type_regex.exec(file.toLowerCase());
	if(match == null) {
		this.unsupported_format = true;
	} else {
		this.unsupported_format = false;
	}
  },

  monitor: function() {
  	this.uploading = true;
	this.StatusBar.create();
  },

  update: function(total, current) {
    if(!this.uploading) return;
    var status     = current / total;
    var statusHTML = "<small>" + status.toPercentage() + ', ' + current.toHumanSize() + ' of ' + total.toHumanSize() + " uploaded.</small>";
    this.StatusBar.update(status, statusHTML);
  },

  finish: function() {
    this.uploading = false;
    this.StatusBar.finish();
  },

  cancel: function(msg) {
    if(!this.uploading) return;
    this.uploading = false;
    if(this.StatusBar.statusText) this.StatusBar.statusText.innerHTML = msg || '<small>Canceled</small>';
  },

  StatusBar: {
    statusBar: null,
    statusText: null,
    statusBarWidth: 300,

    create: function() {
      this.statusBar  = this._createStatus('status-bar');
      this.statusText = this._createStatus('status-text');
      this.statusText.innerHTML  = '<small>0%</small>';
      this.statusBar.style.width = '0';
    },

    update: function(status, statusHTML) {
      this.statusText.innerHTML = statusHTML;
      this.statusBar.style.width = Math.floor(this.statusBarWidth * status) + 'px';
    },

    finish: function() {
      this.statusText.innerHTML  = '<small>Upload complete. Processing your request.</small> <img src="/images/default/components/icons/spinner.gif" height="15" width="15">';
      this.statusBar.style.width = '100%';
    },

    _createStatus: function(id) {
      el = $(id);
      if(!el) {
        el = document.createElement('span');
        el.setAttribute('id', id);
        $('progress-bar').appendChild(el);
      }
      return el;
    }
  }
}

Number.prototype.bytes     = function() { return this; };
Number.prototype.kilobytes = function() { return this *  1024; };
Number.prototype.megabytes = function() { return this * (1024).kilobytes(); };
Number.prototype.gigabytes = function() { return this * (1024).megabytes(); };
Number.prototype.terabytes = function() { return this * (1024).gigabytes(); };
Number.prototype.petabytes = function() { return this * (1024).terabytes(); };
Number.prototype.exabytes =  function() { return this * (1024).petabytes(); };
['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'petabyte', 'exabyte'].each(function(meth) {
  Number.prototype[meth] = Number.prototype[meth+'s'];
});

Number.prototype.toPrecision = function() {
  var precision = arguments[0] || 2;
  var s         = Math.round(this * Math.pow(10, precision)).toString();
  var pos       = s.length - precision;
  var last      = s.substr(pos, precision);
  return s.substr(0, pos) + (last.match("^0{" + precision + "}$") ? '' : '.' + last);
}

Number.prototype.toPercentage = function() {
  return (this * 100).toPrecision() + '%';
}

Number.prototype.toHumanSize = function() {
  if(this < (1).kilobyte())  return this + " Bytes";
  if(this < (1).megabyte())  return (this / (1).kilobyte()).toPrecision()  + ' KB';
  if(this < (1).gigabytes()) return (this / (1).megabyte()).toPrecision()  + ' MB';
  if(this < (1).terabytes()) return (this / (1).gigabytes()).toPrecision() + ' GB';
  if(this < (1).petabytes()) return (this / (1).terabytes()).toPrecision() + ' TB';
  if(this < (1).exabytes())  return (this / (1).petabytes()).toPrecision() + ' PB';
                             return (this / (1).exabytes()).toPrecision()  + ' EB';
}
function spinner(class_name){
  return (class_name == 'active' ? 'small_spinner_blue.gif' : 'small_spinner.gif')
}

function validate_image_field(form){
    upload_file = form.upload.value;

    if(upload_file != '')
    {
        var file_type_regex = /^.*\.(gif|png|jpg|jpeg)$/;
        var match = file_type_regex.exec(upload_file.toLowerCase());
        var unsupported_format = (match == null) ? true:false;
        if(unsupported_format) {
            alert('Your VisualCV photo does not match any of our supported image formats:  .gif .png .jpg .jpeg');
            return false;
        }
    }

    return true;

 }
var ProtoTabs=Class.create();ProtoTabs.prototype={initialize:function(element,options)
{this.options=Object.extend({defaultPanel:'',ajaxUrls:{},ajaxLoadingText:'Loading...'},options||{});this.currentTab='';this.element=$(element);this.listElements=$A(this.element.getElementsByTagName('LI'));for(i=0;i<this.listElements.length;i++)
{tabLI=this.listElements[i];var itemLinks=tabLI.getElementsByTagName('A');tabLI.itemId=itemLinks[0].href.split("#")[1];tabLI.linkedPanel=$(tabLI.itemId);tabLI.linkedPanel.style.clear="both";if((this.options.defaultPanel!='')&&(this.options.defaultPanel==tabLI.itemId))
{this.openPanel(tabLI)}
else
{$($(tabLI).linkedPanel).hide()}
$(itemLinks[0]).observe('click',function(event)
{element=Event.findElement(event,'LI');this.openPanel(element);Event.stop(event)}.bind(this))}},openPanel:function(tab)
{tab=$(tab);if(this.currentTab!='')
{this.currentTab.linkedPanel.hide();this.currentTab.removeClassName('selected')}
this.currentTab=tab;tab.linkedPanel.show();tab.addClassName('selected');var url=this.options.ajaxUrls[tab.itemId];if(url!=undefined)
{tab.linkedPanel.update(this.options.ajaxLoadingText);new Ajax.Request(url,{onComplete:function(transport)
{tab.linkedPanel.update(transport.responseText)}})}}};

function clearMenu(element, msg) {
  var menu = $(element);
  menu.innerHTML = '<option value="">' + msg + '</option>';
}

function updateMenu(primaryElement, secondaryElement, data, args) {

  tag = 'option';
  attr = 'value';

  childNodeName = data.type == 'State' ? 'metros' : 'children';
  children = eval("data." + childNodeName);

  var menu = $(primaryElement);

    if (children.length > 0) {

        menu.innerHTML = '';
        var option = document.createElement(tag);
        option.innerHTML = args.include_blank;
        option.value = '';
        menu.appendChild(option);

        if (args.extra != null) {
          args.extra.each(function(item) {
            var option = document.createElement(tag);
            option.innerHTML = item;
            option.value = item;
            menu.appendChild(option);
          });
        }

        children.each(function(child, index){
            var item = document.createElement(tag);
            item.setAttribute(attr, child.code);
            item.appendChild(document.createTextNode(child.name));
            menu.appendChild(item);
        });

    }
    else{
        menu.innerHTML = '';
        var option = document.createElement(tag);
        option.innerHTML = args.include_blank;
        option.value = '';
        menu.appendChild(option);

        args.extra.each(function(item) {
          var option = document.createElement(tag);
          option.innerHTML = item;
          option.value = item;
          menu.appendChild(option);
        });

        if (data.type == 'Country' && secondaryElement != '') {
            var menu = $(secondaryElement);
            menu.innerHTML = '';
            var option = document.createElement(tag);
            option.innerHTML = '-- N/A --';
            option.value = '';
            menu.appendChild(option);
        }
    }

}

document.observe('dom:loaded', function(){
  $$('a#[rel=pro-search-tips]').each(function(element){
    helperText ='';
    helperText += '<dl class="examples wbg">';
    helperText += '<dt>coffee | tea</dt>';
    helperText += '<dd>May contain either coffee or tea.</dd>';
    helperText += '<dt>java -coffee</dt>';
    helperText += '<dd>Must not contain coffee.</dd>';
    helperText += '<dt>"hello world"</dt>';
    helperText += '<dd>Must contain the exact combination of words.</dd>';
    helperText += '<dt>"sales director"~10</dt>';
    helperText += '<dd>Each word must be less than ten words apart.</dd>';
    helperText += '</dl>';

    showHelperText(element.id, helperText)
  });
});
function display_skillometer_for( id ) {

  switch ( $('proficiency_' + id ).selectedIndex ) {

    case 0: img = '<img src="/images/default/components/cvs/skills/skillometer_1.gif" />'; break;
    case 1: img = '<img src="/images/default/components/cvs/skills/skillometer_2.gif" />'; break;
    case 2: img = '<img src="/images/default/components/cvs/skills/skillometer_3.gif" />'; break;
    case 3: img = '<img src="/images/default/components/cvs/skills/skillometer_4.gif" />'; break;
    case 4: img = '<img src="/images/default/components/cvs/skills/skillometer_5.gif" />'; break;
  }

  $('skillometer_' + id ).update( img );
}
/**
 * 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="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}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.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=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;
function update_portfolio_tabs(collection, tabs) {
	if (collection == "portfolio" || collection == "company_portfolio") {
		tabs = tabs.split(",");
		tabs.each(function(current_tab){
			previous_tab = readCookie(collection);
			if (previous_tab != null) { // previous tab will be null once cookie is destroyed
				var previous_tab_split = previous_tab.split("(");
				var current_tab_split = current_tab.split("(");
				if (previous_tab_split[0] == current_tab_split[0]) {
					writeCookie(collection, current_tab);
				}
			}
		});
	}
}

function initialize_selected_tabs(collection){
  document.observe('dom:loaded', function() {
    selected_tab = readCookie(collection)
	if(selected_tab && $(selected_tab+'_contents')) {
		select_tab(collection, selected_tab);
	} else {
		''; // default to first tab
	}
  });
}

function select_tab(collection, tab){
  $(collection+'_tab_contents').childElements().each(function(element){
    element.hide();
  });

  $(collection+'_tab_nav_list').childElements().each(function(element){
    element.removeClassName('selected');
    element.childElements().each(function(list_element){
      list_element.removeClassName('selected');
    });
  });

  writeCookie(collection, tab);

  $(tab+'_contents').show();
  $(tab+'_li').addClassName('selected');
  $(tab+'_a').addClassName('selected');
}
/*	Unobtrusive Flash Objects (UFO) v3.20 <http://www.bobbyvandersluis.com/ufo/>
	Copyright 2005, 2006 Bobby van der Sluis
	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/

var UFO = {
	req: ["movie", "width", "height", "majorversion", "build"],
	opt: ["play", "loop", "menu", "quality", "scale", "salign", "wmode", "bgcolor", "base", "flashvars", "devicefont", "allowscriptaccess", "seamlesstabbing"],
	optAtt: ["id", "name", "align"],
	optExc: ["swliveconnect"],
	ximovie: "ufo.swf",
	xiwidth: "215",
	xiheight: "138",
	ua: navigator.userAgent.toLowerCase(),
	pluginType: "",
	fv: [0,0],
	foList: [],

	create: function(FO, id) {
		if (!UFO.uaHas("w3cdom") || UFO.uaHas("ieMac")) return;
		UFO.getFlashVersion();
		UFO.foList[id] = UFO.updateFO(FO);
		UFO.createCSS("#" + id, "visibility:hidden;");
		UFO.domLoad(id);
	},

	updateFO: function(FO) {
		if (typeof FO.xi != "undefined" && FO.xi == "true") {
			if (typeof FO.ximovie == "undefined") FO.ximovie = UFO.ximovie;
			if (typeof FO.xiwidth == "undefined") FO.xiwidth = UFO.xiwidth;
			if (typeof FO.xiheight == "undefined") FO.xiheight = UFO.xiheight;
		}
		FO.mainCalled = false;
		return FO;
	},

	domLoad: function(id) {
		var _t = setInterval(function() {
			if ((document.getElementsByTagName("body")[0] != null || document.body != null) && document.getElementById(id) != null) {
				UFO.main(id);
				clearInterval(_t);
			}
		}, 250);
		if (typeof document.addEventListener != "undefined") {
			document.addEventListener("DOMContentLoaded", function() { UFO.main(id); clearInterval(_t); } , null); // Gecko, Opera 9+
		}
	},

	main: function(id) {
		var _fo = UFO.foList[id];
		if (_fo.mainCalled) return;
		UFO.foList[id].mainCalled = true;
		document.getElementById(id).style.visibility = "hidden";
		if (UFO.hasRequired(id)) {
			if (UFO.hasFlashVersion(parseInt(_fo.majorversion, 10), parseInt(_fo.build, 10))) {
				if (typeof _fo.setcontainercss != "undefined" && _fo.setcontainercss == "true") UFO.setContainerCSS(id);
				UFO.writeSWF(id);
			}
			else if (_fo.xi == "true" && UFO.hasFlashVersion(6, 65)) {
				UFO.createDialog(id);
			}
		}
		document.getElementById(id).style.visibility = "visible";
	},

	createCSS: function(selector, declaration) {
		var _h = document.getElementsByTagName("head")[0];
		var _s = UFO.createElement("style");
		if (!UFO.uaHas("ieWin")) _s.appendChild(document.createTextNode(selector + " {" + declaration + "}")); // bugs in IE/Win
		_s.setAttribute("type", "text/css");
		_s.setAttribute("media", "screen");
		_h.appendChild(_s);
		if (UFO.uaHas("ieWin") && document.styleSheets && document.styleSheets.length > 0) {
			var _ls = document.styleSheets[document.styleSheets.length - 1];
			if (typeof _ls.addRule == "object") _ls.addRule(selector, declaration);
		}
	},

	setContainerCSS: function(id) {
		var _fo = UFO.foList[id];
		var _w = /%/.test(_fo.width) ? "" : "px";
		var _h = /%/.test(_fo.height) ? "" : "px";
		UFO.createCSS("#" + id, "width:" + _fo.width + _w +"; height:" + _fo.height + _h +";");
		if (_fo.width == "100%") {
			UFO.createCSS("body", "margin-left:0; margin-right:0; padding-left:0; padding-right:0;");
		}
		if (_fo.height == "100%") {
			UFO.createCSS("html", "height:100%; overflow:hidden;");
			UFO.createCSS("body", "margin-top:0; margin-bottom:0; padding-top:0; padding-bottom:0; height:100%;");
		}
	},

	createElement: function(el) {
		return (UFO.uaHas("xml") && typeof document.createElementNS != "undefined") ?  document.createElementNS("http://www.w3.org/1999/xhtml", el) : document.createElement(el);
	},

	createObjParam: function(el, aName, aValue) {
		var _p = UFO.createElement("param");
		_p.setAttribute("name", aName);
		_p.setAttribute("value", aValue);
		el.appendChild(_p);
	},

	uaHas: function(ft) {
		var _u = UFO.ua;
		switch(ft) {
			case "w3cdom":
				return (typeof document.getElementById != "undefined" && typeof document.getElementsByTagName != "undefined" && (typeof document.createElement != "undefined" || typeof document.createElementNS != "undefined"));
			case "xml":
				var _m = document.getElementsByTagName("meta");
				var _l = _m.length;
				for (var i = 0; i < _l; i++) {
					if (/content-type/i.test(_m[i].getAttribute("http-equiv")) && /xml/i.test(_m[i].getAttribute("content"))) return true;
				}
				return false;
			case "ieMac":
				return /msie/.test(_u) && !/opera/.test(_u) && /mac/.test(_u);
			case "ieWin":
				return /msie/.test(_u) && !/opera/.test(_u) && /win/.test(_u);
			case "gecko":
				return /gecko/.test(_u) && !/applewebkit/.test(_u);
			case "opera":
				return /opera/.test(_u);
			case "safari":
				return /applewebkit/.test(_u);
			default:
				return false;
		}
	},

	getFlashVersion: function() {
		if (UFO.fv[0] != 0) return;
		if (navigator.plugins && typeof navigator.plugins["Shockwave Flash"] == "object") {
			UFO.pluginType = "npapi";
			var _d = navigator.plugins["Shockwave Flash"].description;
			if (typeof _d != "undefined") {
				_d = _d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				var _m = parseInt(_d.replace(/^(.*)\..*$/, "$1"), 10);
				var _r = /r/.test(_d) ? parseInt(_d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
				UFO.fv = [_m, _r];
			}
		}
		else if (window.ActiveXObject) {
			UFO.pluginType = "ax";
			try { // avoid fp 6 crashes
				var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			}
			catch(e) {
				try {
					var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
					UFO.fv = [6, 0];
					_a.AllowScriptAccess = "always"; // throws if fp < 6.47
				}
				catch(e) {
					if (UFO.fv[0] == 6) return;
				}
				try {
					var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				}
				catch(e) {}
			}
			if (typeof _a == "object") {
				var _d = _a.GetVariable("$version"); // bugs in fp 6.21/6.23
				if (typeof _d != "undefined") {
					_d = _d.replace(/^\S+\s+(.*)$/, "$1").split(",");
					UFO.fv = [parseInt(_d[0], 10), parseInt(_d[2], 10)];
				}
			}
		}
	},

	hasRequired: function(id) {
		var _l = UFO.req.length;
		for (var i = 0; i < _l; i++) {
			if (typeof UFO.foList[id][UFO.req[i]] == "undefined") return false;
		}
		return true;
	},

	hasFlashVersion: function(major, release) {
		return (UFO.fv[0] > major || (UFO.fv[0] == major && UFO.fv[1] >= release)) ? true : false;
	},

	writeSWF: function(id) {
		var _fo = UFO.foList[id];
		var _e = document.getElementById(id);
		if (UFO.pluginType == "npapi") {
			if (UFO.uaHas("gecko") || UFO.uaHas("xml")) {
				while(_e.hasChildNodes()) {
					_e.removeChild(_e.firstChild);
				}
				var _obj = UFO.createElement("object");
				_obj.setAttribute("type", "application/x-shockwave-flash");
				_obj.setAttribute("data", _fo.movie);
				_obj.setAttribute("width", _fo.width);
				_obj.setAttribute("height", _fo.height);
				var _l = UFO.optAtt.length;
				for (var i = 0; i < _l; i++) {
					if (typeof _fo[UFO.optAtt[i]] != "undefined") _obj.setAttribute(UFO.optAtt[i], _fo[UFO.optAtt[i]]);
				}
				var _o = UFO.opt.concat(UFO.optExc);
				var _l = _o.length;
				for (var i = 0; i < _l; i++) {
					if (typeof _fo[_o[i]] != "undefined") UFO.createObjParam(_obj, _o[i], _fo[_o[i]]);
				}
				_e.appendChild(_obj);
			}
			else {
				var _emb = "";
				var _o = UFO.opt.concat(UFO.optAtt).concat(UFO.optExc);
				var _l = _o.length;
				for (var i = 0; i < _l; i++) {
					if (typeof _fo[_o[i]] != "undefined") _emb += ' ' + _o[i] + '="' + _fo[_o[i]] + '"';
				}
				_e.innerHTML = '<embed type="application/x-shockwave-flash" src="' + _fo.movie + '" width="' + _fo.width + '" height="' + _fo.height + '" pluginspage="http://www.macromedia.com/go/getflashplayer"' + _emb + '></embed>';
			}
		}
		else if (UFO.pluginType == "ax") {
			var _objAtt = "";
			var _l = UFO.optAtt.length;
			for (var i = 0; i < _l; i++) {
				if (typeof _fo[UFO.optAtt[i]] != "undefined") _objAtt += ' ' + UFO.optAtt[i] + '="' + _fo[UFO.optAtt[i]] + '"';
			}
			var _objPar = "";
			var _l = UFO.opt.length;
			for (var i = 0; i < _l; i++) {
				if (typeof _fo[UFO.opt[i]] != "undefined") _objPar += '<param name="' + UFO.opt[i] + '" value="' + _fo[UFO.opt[i]] + '" />';
			}
			var _p = window.location.protocol == "https:" ? "https:" : "http:";
			_e.innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + _objAtt + ' width="' + _fo.width + '" height="' + _fo.height + '" codebase="' + _p + '//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + _fo.majorversion + ',0,' + _fo.build + ',0"><param name="movie" value="' + _fo.movie + '" />' + _objPar + '</object>';
		}
	},

	createDialog: function(id) {
		var _fo = UFO.foList[id];
		UFO.createCSS("html", "height:100%; overflow:hidden;");
		UFO.createCSS("body", "height:100%; overflow:hidden;");
		UFO.createCSS("#xi-con", "position:absolute; left:0; top:0; z-index:1000; width:100%; height:100%; background-color:#fff; filter:alpha(opacity:75); opacity:0.75;");
		UFO.createCSS("#xi-dia", "position:absolute; left:50%; top:50%; margin-left: -" + Math.round(parseInt(_fo.xiwidth, 10) / 2) + "px; margin-top: -" + Math.round(parseInt(_fo.xiheight, 10) / 2) + "px; width:" + _fo.xiwidth + "px; height:" + _fo.xiheight + "px;");
		var _b = document.getElementsByTagName("body")[0];
		var _c = UFO.createElement("div");
		_c.setAttribute("id", "xi-con");
		var _d = UFO.createElement("div");
		_d.setAttribute("id", "xi-dia");
		_c.appendChild(_d);
		_b.appendChild(_c);
		var _mmu = window.location;
		if (UFO.uaHas("xml") && UFO.uaHas("safari")) {
			var _mmd = document.getElementsByTagName("title")[0].firstChild.nodeValue = document.getElementsByTagName("title")[0].firstChild.nodeValue.slice(0, 47) + " - Flash Player Installation";
		}
		else {
			var _mmd = document.title = document.title.slice(0, 47) + " - Flash Player Installation";
		}
		var _mmp = UFO.pluginType == "ax" ? "ActiveX" : "PlugIn";
		var _uc = typeof _fo.xiurlcancel != "undefined" ? "&xiUrlCancel=" + _fo.xiurlcancel : "";
		var _uf = typeof _fo.xiurlfailed != "undefined" ? "&xiUrlFailed=" + _fo.xiurlfailed : "";
		UFO.foList["xi-dia"] = { movie:_fo.ximovie, width:_fo.xiwidth, height:_fo.xiheight, majorversion:"6", build:"65", flashvars:"MMredirectURL=" + _mmu + "&MMplayerType=" + _mmp + "&MMdoctitle=" + _mmd + _uc + _uf };
		UFO.writeSWF("xi-dia");
	},

	expressInstallCallback: function() {
		var _b = document.getElementsByTagName("body")[0];
		var _c = document.getElementById("xi-con");
		_b.removeChild(_c);
		UFO.createCSS("body", "height:auto; overflow:auto;");
		UFO.createCSS("html", "height:auto; overflow:auto;");
	},

	cleanupIELeaks: function() {
		var _o = document.getElementsByTagName("object");
		var _l = _o.length
		for (var i = 0; i < _l; i++) {
			_o[i].style.display = "none";
			for (var x in _o[i]) {
				if (typeof _o[i][x] == "function") {
					_o[i][x] = null;
				}
			}
		}
	}

};

if (typeof window.attachEvent != "undefined" && UFO.uaHas("ieWin")) {
	window.attachEvent("onunload", UFO.cleanupIELeaks);
}

Event.addBehavior({
  'a.toggleTip:click' : function(e) {
      tl = this['rel'];
      ($(tl).hasClassName('showOn'))? (a=true) : (a=false);
      if(a){
          $(tl).blindUp({duration:.2});
          this.removeClassName('off');
          $(tl).removeClassName('showOn');
          $(tl).removeClassName('showOff');
          }
      else{
          this.addClassName('off')
          $(tl).blindDown({duration:.2});
          $(tl).addClassName('showOn');
          $(tl).removeClassName('showOff');
      }
  },
  'a.social-media':socialNetworkUtility,
  'a.overlay:click':function(e) {
  		this.MBoverlay = new Element("div", { id: "modal_overlay", opacity: "0", 'class': 'preload', style: ''});
		new Insertion.Bottom(document.body,this.MBoverlay);
		new Effect.Fade(this.MBoverlay, { from: 0, to: .65, duration: .25 });
  },
  'div.loaded:click':function(e){
		Effect.Fade($('modal_overlay'), {duration:0.5});
		Effect.Fade($('modal_window'), {duration:0.5});
		$('modal_overlay').remove();
		$('modal_window').remove();
  },
  'a.modal:click':function(e){
	Modalbox.show(this.href, {});
	return false;
  },
  'a.blindBar:click':function(e){
	elm=this['rel'];
	$(elm).blindDown({duration:.2});
	},
  'a.clearForm:click':function(e){
	elm=this['rel'];
	form = $(elm)
		for (var i=0; i < form.length; i++) {
			 if(!($(form[i]).name=='authenticity_token')){
			  Field.clear($(form[i]));
			}
		};
	},
  'a.search-multi-mail:click':function(e){
	var s = "";
	$$(".multi-mail").each(function(element){s = s + element.rel + ";";});
	$("multi-mail-link").href = "mailto:" + s;
  },
  'a.comp_mass_share_delete:click':function(e){
    if (!verify_selection_received($('shares_received_form'))) {return false;}
    new Ajax.Request('/shares/mass_remove', {
      asynchronous:true, evalScripts:true,
      parameters:'mode=professionals&' + Form.serialize('shares_received_form') + '&authenticity_token=' + authenticityToken()});
      return false;
    }
});

Event.addBehavior({
	'.entry_item_select:change' :  function(e) {
		EntryAutopopulator.update_title_and_description(this)
	},
	'.entry_item_select' :  function(e) {
		EntryAutopopulator.update_title_and_description(this)
	}
});



Event.addBehavior({
  '#grid':function(){this.hide()},
  'body:click':function(e){
    if(DropMenuPaths.active){
      if ($(e.target) != DropMenuPaths.el ) DropMenuPaths.clear()
    }
  },
  'ul.dropmenu li img.arrow': DropMenu,                                          // DROP MENU: arrow
  'ul.dropmenu li a.glanceDrop': DropMenu,                                       // DROP MENU: selected text
  '#gridActive:onclick':function(){$('grid').toggle();},                         // DEV MODE GRID
  'input.ongoing':ShowHide(),
  'input.make-public':ShowHide(true),
  'a.more':ShowHide(true),
  'span.more':ShowHide(true),
  '.portfolio_list li' : Hoverize,

  '.hover_box' : HoverBox(),
  'a.button.disabled, li.disabled a, a.disabled' : Disabled(),
  '.verify': verify,
  'a.tinyMCENewWindow': ajaxLightview,
  'a.tinyMCENewWindowScale': ajaxLightviewScale,
  'a.ajaxLightview': ajaxLightview,
  'a.ajaxLightviewScale': ajaxLightviewScale,
  'a.lightViewIframe': lightViewIframe,
  'a.shareLightview': shareLightview,
  'a.external-asset':externalAssetFormHandler,
  '.hideAsset':function(e){this.hide()},
  '.close_lightview':closeLightview(),
  '.fromAffiliate': Behavior.create({onclick:function(e) { assetModalSetting.from; assetModalSetting.from = "affiliate"; }}),
  '.fromProfile': Behavior.create({onclick:function(e) { assetModalSetting.from = "profile"; }}),
  '.fromSmall': Behavior.create({onclick:function(e) { assetModalSetting.from = ""; assetModalSetting.section_type = "small" }}),
  '.fromLarge': Behavior.create({onclick:function(e) { assetModalSetting.from = ""; assetModalSetting.section_type = "large" }}),
  '.portfolioFilter': FilterAssets,
  'form.useSimpleDefaults': Remote.Form,
  'form.useSimpleDefaults': setDefaults,
  'select': MeasureSelect(),
  'select.privacy-helper': CvPrivacyHelper,
  'input.select-all': selectAll,
  '.lv_Close':TrapLightview,
  '.endTiny':TrapLightview
})

