/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0

This notice only applies to this section.

*/
if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C<A.length;C=C+1){D=A[C].split(".");E=YAHOO;for(B=(D[0]=="YAHOO")?1:0;B<D.length;B=B+1){E[D[B]]=E[D[B]]||{};E=E[D[B]];}}return E;};YAHOO.log=function(D,A,C){var B=YAHOO.widget.Logger;if(B&&B.log){return B.log(D,A,C);}else{return false;}};YAHOO.register=function(A,E,D){var I=YAHOO.env.modules;if(!I[A]){I[A]={versions:[],builds:[]};}var B=I[A],H=D.version,G=D.build,F=YAHOO.env.listeners;B.name=A;B.version=H;B.build=G;B.versions.push(H);B.builds.push(G);B.mainClass=E;for(var C=0;C<F.length;C=C+1){F[C](B);}if(E){E.VERSION=H;E.BUILD=G;}else{YAHOO.log("mainClass is undefined for module "+A,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(A){return YAHOO.env.modules[A]||null;};YAHOO.env.ua=function(){var C={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0};var B=navigator.userAgent,A;if((/KHTML/).test(B)){C.webkit=1;}A=B.match(/AppleWebKit\/([^\s]*)/);if(A&&A[1]){C.webkit=parseFloat(A[1]);if(/ Mobile\//.test(B)){C.mobile="Apple";}else{A=B.match(/NokiaN[^\/]*/);if(A){C.mobile=A[0];}}A=B.match(/AdobeAIR\/([^\s]*)/);if(A){C.air=A[0];}}if(!C.webkit){A=B.match(/Opera[\s\/]([^\s]*)/);if(A&&A[1]){C.opera=parseFloat(A[1]);A=B.match(/Opera Mini[^;]*/);if(A){C.mobile=A[0];}}else{A=B.match(/MSIE\s([^;]*)/);if(A&&A[1]){C.ie=parseFloat(A[1]);}else{A=B.match(/Gecko\/([^\s]*)/);if(A){C.gecko=1;A=B.match(/rv:([^\s\)]*)/);if(A&&A[1]){C.gecko=parseFloat(A[1]);}}}}}return C;}();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var B=YAHOO_config.listener,A=YAHOO.env.listeners,D=true,C;if(B){for(C=0;C<A.length;C=C+1){if(A[C]==B){D=false;break;}}if(D){A.push(B);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var A=YAHOO.lang,C=["toString","valueOf"],B={isArray:function(D){if(D){return A.isNumber(D.length)&&A.isFunction(D.splice);}return false;},isBoolean:function(D){return typeof D==="boolean";},isFunction:function(D){return typeof D==="function";},isNull:function(D){return D===null;},isNumber:function(D){return typeof D==="number"&&isFinite(D);},isObject:function(D){return(D&&(typeof D==="object"||A.isFunction(D)))||false;},isString:function(D){return typeof D==="string";},isUndefined:function(D){return typeof D==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(F,E){for(var D=0;D<C.length;D=D+1){var H=C[D],G=E[H];if(A.isFunction(G)&&G!=Object.prototype[H]){F[H]=G;}}}:function(){},extend:function(H,I,G){if(!I||!H){throw new Error("extend failed, please check that "+"all dependencies are included.");}var E=function(){};E.prototype=I.prototype;H.prototype=new E();H.prototype.constructor=H;H.superclass=I.prototype;if(I.prototype.constructor==Object.prototype.constructor){I.prototype.constructor=I;}if(G){for(var D in G){if(A.hasOwnProperty(G,D)){H.prototype[D]=G[D];}}A._IEEnumFix(H.prototype,G);}},augmentObject:function(H,G){if(!G||!H){throw new Error("Absorb failed, verify dependencies.");}var D=arguments,F,I,E=D[2];if(E&&E!==true){for(F=2;F<D.length;F=F+1){H[D[F]]=G[D[F]];}}else{for(I in G){if(E||!(I in H)){H[I]=G[I];}}A._IEEnumFix(H,G);}},augmentProto:function(G,F){if(!F||!G){throw new Error("Augment failed, verify dependencies.");}var D=[G.prototype,F.prototype];for(var E=2;E<arguments.length;E=E+1){D.push(arguments[E]);}A.augmentObject.apply(this,D);},dump:function(D,I){var F,H,K=[],L="{...}",E="f(){...}",J=", ",G=" => ";if(!A.isObject(D)){return D+"";}else{if(D instanceof Date||("nodeType" in D&&"tagName" in D)){return D;}else{if(A.isFunction(D)){return E;}}}I=(A.isNumber(I))?I:3;if(A.isArray(D)){K.push("[");for(F=0,H=D.length;F<H;F=F+1){if(A.isObject(D[F])){K.push((I>0)?A.dump(D[F],I-1):L);}else{K.push(D[F]);}K.push(J);}if(K.length>1){K.pop();}K.push("]");}else{K.push("{");for(F in D){if(A.hasOwnProperty(D,F)){K.push(F+G);if(A.isObject(D[F])){K.push((I>0)?A.dump(D[F],I-1):L);}else{K.push(D[F]);}K.push(J);}}if(K.length>1){K.pop();}K.push("}");}return K.join("");},substitute:function(S,E,L){var I,H,G,O,P,R,N=[],F,J="dump",M=" ",D="{",Q="}";for(;;){I=S.lastIndexOf(D);if(I<0){break;}H=S.indexOf(Q,I);if(I+1>=H){break;}F=S.substring(I+1,H);O=F;R=null;G=O.indexOf(M);if(G>-1){R=O.substring(G+1);O=O.substring(0,G);}P=E[O];if(L){P=L(O,P,R);}if(A.isObject(P)){if(A.isArray(P)){P=A.dump(P,parseInt(R,10));}else{R=R||"";var K=R.indexOf(J);if(K>-1){R=R.substring(4);}if(P.toString===Object.prototype.toString||K>-1){P=A.dump(P,parseInt(R,10));}else{P=P.toString();}}}else{if(!A.isString(P)&&!A.isNumber(P)){P="~-"+N.length+"-~";N[N.length]=F;}}S=S.substring(0,I)+P+S.substring(H+1);}for(I=N.length-1;I>=0;I=I-1){S=S.replace(new RegExp("~-"+I+"-~"),"{"+N[I]+"}","g");}return S;},trim:function(D){try{return D.replace(/^\s+|\s+$/g,"");}catch(E){return D;}},merge:function(){var G={},E=arguments;for(var F=0,D=E.length;F<D;F=F+1){A.augmentObject(G,E[F],true);}return G;},later:function(K,E,L,G,H){K=K||0;E=E||{};var F=L,J=G,I,D;if(A.isString(L)){F=E[L];}if(!F){throw new TypeError("method undefined");}if(!A.isArray(J)){J=[G];}I=function(){F.apply(E,J);};D=(H)?setInterval(I,K):setTimeout(I,K);return{interval:H,cancel:function(){if(this.interval){clearInterval(D);}else{clearTimeout(D);}}};},isValue:function(D){return(A.isObject(D)||A.isString(D)||A.isNumber(D)||A.isBoolean(D));}};A.hasOwnProperty=(Object.prototype.hasOwnProperty)?function(D,E){return D&&D.hasOwnProperty(E);}:function(D,E){return !A.isUndefined(D[E])&&D.constructor.prototype[E]!==D[E];};B.augmentObject(A,B,true);YAHOO.util.Lang=A;A.augment=A.augmentProto;YAHOO.augment=A.augmentProto;YAHOO.extend=A.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.6.0",build:"1321"});(function(){var B=YAHOO.util,F=YAHOO.lang,L,J,K={},G={},N=window.document;YAHOO.env._id_counter=YAHOO.env._id_counter||0;var C=YAHOO.env.ua.opera,M=YAHOO.env.ua.webkit,A=YAHOO.env.ua.gecko,H=YAHOO.env.ua.ie;var E={HYPHEN:/(-[a-z])/i,ROOT_TAG:/^body|html$/i,OP_SCROLL:/^(?:inline|table-row)$/i};var O=function(Q){if(!E.HYPHEN.test(Q)){return Q;}if(K[Q]){return K[Q];}var R=Q;while(E.HYPHEN.exec(R)){R=R.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());}K[Q]=R;return R;};var P=function(R){var Q=G[R];if(!Q){Q=new RegExp("(?:^|\\s+)"+R+"(?:\\s+|$)");G[R]=Q;}return Q;};if(N.defaultView&&N.defaultView.getComputedStyle){L=function(Q,T){var S=null;if(T=="float"){T="cssFloat";}var R=Q.ownerDocument.defaultView.getComputedStyle(Q,"");if(R){S=R[O(T)];}return Q.style[T]||S;};}else{if(N.documentElement.currentStyle&&H){L=function(Q,S){switch(O(S)){case"opacity":var U=100;try{U=Q.filters["DXImageTransform.Microsoft.Alpha"].opacity;}catch(T){try{U=Q.filters("alpha").opacity;}catch(T){}}return U/100;case"float":S="styleFloat";default:var R=Q.currentStyle?Q.currentStyle[S]:null;return(Q.style[S]||R);}};}else{L=function(Q,R){return Q.style[R];};}}if(H){J=function(Q,R,S){switch(R){case"opacity":if(F.isString(Q.style.filter)){Q.style.filter="alpha(opacity="+S*100+")";if(!Q.currentStyle||!Q.currentStyle.hasLayout){Q.style.zoom=1;}}break;case"float":R="styleFloat";default:Q.style[R]=S;}};}else{J=function(Q,R,S){if(R=="float"){R="cssFloat";}Q.style[R]=S;};}var D=function(Q,R){return Q&&Q.nodeType==1&&(!R||R(Q));};YAHOO.util.Dom={get:function(S){if(S){if(S.nodeType||S.item){return S;}if(typeof S==="string"){return N.getElementById(S);}if("length" in S){var T=[];for(var R=0,Q=S.length;R<Q;++R){T[T.length]=B.Dom.get(S[R]);}return T;}return S;}return null;},getStyle:function(Q,S){S=O(S);var R=function(T){return L(T,S);};return B.Dom.batch(Q,R,B.Dom,true);},setStyle:function(Q,S,T){S=O(S);var R=function(U){J(U,S,T);};B.Dom.batch(Q,R,B.Dom,true);},getXY:function(Q){var R=function(S){if((S.parentNode===null||S.offsetParent===null||this.getStyle(S,"display")=="none")&&S!=S.ownerDocument.body){return false;}return I(S);};return B.Dom.batch(Q,R,B.Dom,true);},getX:function(Q){var R=function(S){return B.Dom.getXY(S)[0];};return B.Dom.batch(Q,R,B.Dom,true);},getY:function(Q){var R=function(S){return B.Dom.getXY(S)[1];};return B.Dom.batch(Q,R,B.Dom,true);},setXY:function(Q,T,S){var R=function(W){var V=this.getStyle(W,"position");if(V=="static"){this.setStyle(W,"position","relative");V="relative";}var Y=this.getXY(W);if(Y===false){return false;}var X=[parseInt(this.getStyle(W,"left"),10),parseInt(this.getStyle(W,"top"),10)];if(isNaN(X[0])){X[0]=(V=="relative")?0:W.offsetLeft;}if(isNaN(X[1])){X[1]=(V=="relative")?0:W.offsetTop;}if(T[0]!==null){W.style.left=T[0]-Y[0]+X[0]+"px";}if(T[1]!==null){W.style.top=T[1]-Y[1]+X[1]+"px";}if(!S){var U=this.getXY(W);if((T[0]!==null&&U[0]!=T[0])||(T[1]!==null&&U[1]!=T[1])){this.setXY(W,T,true);}}};B.Dom.batch(Q,R,B.Dom,true);},setX:function(R,Q){B.Dom.setXY(R,[Q,null]);},setY:function(Q,R){B.Dom.setXY(Q,[null,R]);},getRegion:function(Q){var R=function(S){if((S.parentNode===null||S.offsetParent===null||this.getStyle(S,"display")=="none")&&S!=S.ownerDocument.body){return false;}var T=B.Region.getRegion(S);return T;};return B.Dom.batch(Q,R,B.Dom,true);},getClientWidth:function(){return B.Dom.getViewportWidth();},getClientHeight:function(){return B.Dom.getViewportHeight();},getElementsByClassName:function(U,Y,V,W){U=F.trim(U);Y=Y||"*";V=(V)?B.Dom.get(V):null||N;if(!V){return[];}var R=[],Q=V.getElementsByTagName(Y),X=P(U);for(var S=0,T=Q.length;S<T;++S){if(X.test(Q[S].className)){R[R.length]=Q[S];if(W){W.call(Q[S],Q[S]);}}}return R;},hasClass:function(S,R){var Q=P(R);var T=function(U){return Q.test(U.className);};return B.Dom.batch(S,T,B.Dom,true);},addClass:function(R,Q){var S=function(T){if(this.hasClass(T,Q)){return false;}T.className=F.trim([T.className,Q].join(" "));return true;};return B.Dom.batch(R,S,B.Dom,true);},removeClass:function(S,R){var Q=P(R);var T=function(W){var V=false,X=W.className;if(R&&X&&this.hasClass(W,R)){W.className=X.replace(Q," ");if(this.hasClass(W,R)){this.removeClass(W,R);}W.className=F.trim(W.className);if(W.className===""){var U=(W.hasAttribute)?"class":"className";W.removeAttribute(U);}V=true;}return V;};return B.Dom.batch(S,T,B.Dom,true);},replaceClass:function(T,R,Q){if(!Q||R===Q){return false;}var S=P(R);var U=function(V){if(!this.hasClass(V,R)){this.addClass(V,Q);return true;}V.className=V.className.replace(S," "+Q+" ");if(this.hasClass(V,R)){this.removeClass(V,R);}V.className=F.trim(V.className);return true;};return B.Dom.batch(T,U,B.Dom,true);},generateId:function(Q,S){S=S||"yui-gen";var R=function(T){if(T&&T.id){return T.id;}var U=S+YAHOO.env._id_counter++;if(T){T.id=U;}return U;};return B.Dom.batch(Q,R,B.Dom,true)||R.apply(B.Dom,arguments);},isAncestor:function(R,S){R=B.Dom.get(R);S=B.Dom.get(S);var Q=false;if((R&&S)&&(R.nodeType&&S.nodeType)){if(R.contains&&R!==S){Q=R.contains(S);}else{if(R.compareDocumentPosition){Q=!!(R.compareDocumentPosition(S)&16);}}}else{}return Q;},inDocument:function(Q){return this.isAncestor(N.documentElement,Q);},getElementsBy:function(X,R,S,U){R=R||"*";S=(S)?B.Dom.get(S):null||N;if(!S){return[];}var T=[],W=S.getElementsByTagName(R);for(var V=0,Q=W.length;V<Q;++V){if(X(W[V])){T[T.length]=W[V];if(U){U(W[V]);}}}return T;},batch:function(U,X,W,S){U=(U&&(U.tagName||U.item))?U:B.Dom.get(U);if(!U||!X){return false;}var T=(S)?W:window;if(U.tagName||U.length===undefined){return X.call(T,U,W);}var V=[];for(var R=0,Q=U.length;R<Q;++R){V[V.length]=X.call(T,U[R],W);}return V;},getDocumentHeight:function(){var R=(N.compatMode!="CSS1Compat")?N.body.scrollHeight:N.documentElement.scrollHeight;var Q=Math.max(R,B.Dom.getViewportHeight());return Q;},getDocumentWidth:function(){var R=(N.compatMode!="CSS1Compat")?N.body.scrollWidth:N.documentElement.scrollWidth;var Q=Math.max(R,B.Dom.getViewportWidth());return Q;},getViewportHeight:function(){var Q=self.innerHeight;
var R=N.compatMode;if((R||H)&&!C){Q=(R=="CSS1Compat")?N.documentElement.clientHeight:N.body.clientHeight;}return Q;},getViewportWidth:function(){var Q=self.innerWidth;var R=N.compatMode;if(R||H){Q=(R=="CSS1Compat")?N.documentElement.clientWidth:N.body.clientWidth;}return Q;},getAncestorBy:function(Q,R){while((Q=Q.parentNode)){if(D(Q,R)){return Q;}}return null;},getAncestorByClassName:function(R,Q){R=B.Dom.get(R);if(!R){return null;}var S=function(T){return B.Dom.hasClass(T,Q);};return B.Dom.getAncestorBy(R,S);},getAncestorByTagName:function(R,Q){R=B.Dom.get(R);if(!R){return null;}var S=function(T){return T.tagName&&T.tagName.toUpperCase()==Q.toUpperCase();};return B.Dom.getAncestorBy(R,S);},getPreviousSiblingBy:function(Q,R){while(Q){Q=Q.previousSibling;if(D(Q,R)){return Q;}}return null;},getPreviousSibling:function(Q){Q=B.Dom.get(Q);if(!Q){return null;}return B.Dom.getPreviousSiblingBy(Q);},getNextSiblingBy:function(Q,R){while(Q){Q=Q.nextSibling;if(D(Q,R)){return Q;}}return null;},getNextSibling:function(Q){Q=B.Dom.get(Q);if(!Q){return null;}return B.Dom.getNextSiblingBy(Q);},getFirstChildBy:function(Q,S){var R=(D(Q.firstChild,S))?Q.firstChild:null;return R||B.Dom.getNextSiblingBy(Q.firstChild,S);},getFirstChild:function(Q,R){Q=B.Dom.get(Q);if(!Q){return null;}return B.Dom.getFirstChildBy(Q);},getLastChildBy:function(Q,S){if(!Q){return null;}var R=(D(Q.lastChild,S))?Q.lastChild:null;return R||B.Dom.getPreviousSiblingBy(Q.lastChild,S);},getLastChild:function(Q){Q=B.Dom.get(Q);return B.Dom.getLastChildBy(Q);},getChildrenBy:function(R,T){var S=B.Dom.getFirstChildBy(R,T);var Q=S?[S]:[];B.Dom.getNextSiblingBy(S,function(U){if(!T||T(U)){Q[Q.length]=U;}return false;});return Q;},getChildren:function(Q){Q=B.Dom.get(Q);if(!Q){}return B.Dom.getChildrenBy(Q);},getDocumentScrollLeft:function(Q){Q=Q||N;return Math.max(Q.documentElement.scrollLeft,Q.body.scrollLeft);},getDocumentScrollTop:function(Q){Q=Q||N;return Math.max(Q.documentElement.scrollTop,Q.body.scrollTop);},insertBefore:function(R,Q){R=B.Dom.get(R);Q=B.Dom.get(Q);if(!R||!Q||!Q.parentNode){return null;}return Q.parentNode.insertBefore(R,Q);},insertAfter:function(R,Q){R=B.Dom.get(R);Q=B.Dom.get(Q);if(!R||!Q||!Q.parentNode){return null;}if(Q.nextSibling){return Q.parentNode.insertBefore(R,Q.nextSibling);}else{return Q.parentNode.appendChild(R);}},getClientRegion:function(){var S=B.Dom.getDocumentScrollTop(),R=B.Dom.getDocumentScrollLeft(),T=B.Dom.getViewportWidth()+R,Q=B.Dom.getViewportHeight()+S;return new B.Region(S,T,Q,R);}};var I=function(){if(N.documentElement.getBoundingClientRect){return function(S){var T=S.getBoundingClientRect(),R=Math.round;var Q=S.ownerDocument;return[R(T.left+B.Dom.getDocumentScrollLeft(Q)),R(T.top+B.Dom.getDocumentScrollTop(Q))];};}else{return function(S){var T=[S.offsetLeft,S.offsetTop];var R=S.offsetParent;var Q=(M&&B.Dom.getStyle(S,"position")=="absolute"&&S.offsetParent==S.ownerDocument.body);if(R!=S){while(R){T[0]+=R.offsetLeft;T[1]+=R.offsetTop;if(!Q&&M&&B.Dom.getStyle(R,"position")=="absolute"){Q=true;}R=R.offsetParent;}}if(Q){T[0]-=S.ownerDocument.body.offsetLeft;T[1]-=S.ownerDocument.body.offsetTop;}R=S.parentNode;while(R.tagName&&!E.ROOT_TAG.test(R.tagName)){if(R.scrollTop||R.scrollLeft){T[0]-=R.scrollLeft;T[1]-=R.scrollTop;}R=R.parentNode;}return T;};}}();})();YAHOO.util.Region=function(C,D,A,B){this.top=C;this[1]=C;this.right=D;this.bottom=A;this.left=B;this[0]=B;};YAHOO.util.Region.prototype.contains=function(A){return(A.left>=this.left&&A.right<=this.right&&A.top>=this.top&&A.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(E){var C=Math.max(this.top,E.top);var D=Math.min(this.right,E.right);var A=Math.min(this.bottom,E.bottom);var B=Math.max(this.left,E.left);if(A>=C&&D>=B){return new YAHOO.util.Region(C,D,A,B);}else{return null;}};YAHOO.util.Region.prototype.union=function(E){var C=Math.min(this.top,E.top);var D=Math.max(this.right,E.right);var A=Math.max(this.bottom,E.bottom);var B=Math.min(this.left,E.left);return new YAHOO.util.Region(C,D,A,B);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(D){var F=YAHOO.util.Dom.getXY(D);var C=F[1];var E=F[0]+D.offsetWidth;var A=F[1]+D.offsetHeight;var B=F[0];return new YAHOO.util.Region(C,E,A,B);};YAHOO.util.Point=function(A,B){if(YAHOO.lang.isArray(A)){B=A[1];A=A[0];}this.x=this.right=this.left=this[0]=A;this.y=this.top=this.bottom=this[1]=B;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.6.0",build:"1321"});YAHOO.util.CustomEvent=function(D,B,C,A){this.type=D;this.scope=B||window;this.silent=C;this.signature=A||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var E="_YUICEOnSubscribe";if(D!==E){this.subscribeEvent=new YAHOO.util.CustomEvent(E,this,true);}this.lastError=null;};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(B,C,A){if(!B){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}if(this.subscribeEvent){this.subscribeEvent.fire(B,C,A);}this.subscribers.push(new YAHOO.util.Subscriber(B,C,A));},unsubscribe:function(D,F){if(!D){return this.unsubscribeAll();}var E=false;for(var B=0,A=this.subscribers.length;B<A;++B){var C=this.subscribers[B];if(C&&C.contains(D,F)){this._delete(B);E=true;}}return E;},fire:function(){this.lastError=null;var K=[],E=this.subscribers.length;if(!E&&this.silent){return true;}var I=[].slice.call(arguments,0),G=true,D,J=false;if(!this.silent){}var C=this.subscribers.slice(),A=YAHOO.util.Event.throwErrors;for(D=0;D<E;++D){var M=C[D];if(!M){J=true;}else{if(!this.silent){}var L=M.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var B=null;if(I.length>0){B=I[0];}try{G=M.fn.call(L,B,M.obj);}catch(F){this.lastError=F;if(A){throw F;}}}else{try{G=M.fn.call(L,this.type,I,M.obj);}catch(H){this.lastError=H;if(A){throw H;}}}if(false===G){if(!this.silent){}break;}}}return(G!==false);},unsubscribeAll:function(){for(var A=this.subscribers.length-1;A>-1;A--){this._delete(A);}this.subscribers=[];return A;},_delete:function(A){var B=this.subscribers[A];if(B){delete B.fn;delete B.obj;}this.subscribers.splice(A,1);},toString:function(){return"CustomEvent: "+"'"+this.type+"', "+"scope: "+this.scope;}};YAHOO.util.Subscriber=function(B,C,A){this.fn=B;this.obj=YAHOO.lang.isUndefined(C)?null:C;this.override=A;};YAHOO.util.Subscriber.prototype.getScope=function(A){if(this.override){if(this.override===true){return this.obj;}else{return this.override;}}return A;};YAHOO.util.Subscriber.prototype.contains=function(A,B){if(B){return(this.fn==A&&this.obj==B);}else{return(this.fn==A);}};YAHOO.util.Subscriber.prototype.toString=function(){return"Subscriber { obj: "+this.obj+", override: "+(this.override||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var H=false;var I=[];var J=[];var G=[];var E=[];var C=0;var F=[];var B=[];var A=0;var D={63232:38,63233:40,63234:37,63235:39,63276:33,63277:34,25:9};var K=YAHOO.env.ua.ie?"focusin":"focus";var L=YAHOO.env.ua.ie?"focusout":"blur";return{POLL_RETRYS:2000,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,UNLOAD_OBJ:3,ADJ_SCOPE:4,OBJ:5,OVERRIDE:6,CAPTURE:7,lastError:null,isSafari:YAHOO.env.ua.webkit,webkit:YAHOO.env.ua.webkit,isIE:YAHOO.env.ua.ie,_interval:null,_dri:null,DOMReady:false,throwErrors:false,startInterval:function(){if(!this._interval){var M=this;var N=function(){M._tryPreloadAttach();};this._interval=setInterval(N,this.POLL_INTERVAL);}},onAvailable:function(R,O,S,Q,P){var M=(YAHOO.lang.isString(R))?[R]:R;for(var N=0;N<M.length;N=N+1){F.push({id:M[N],fn:O,obj:S,override:Q,checkReady:P});}C=this.POLL_RETRYS;this.startInterval();},onContentReady:function(O,M,P,N){this.onAvailable(O,M,P,N,true);},onDOMReady:function(M,O,N){if(this.DOMReady){setTimeout(function(){var P=window;if(N){if(N===true){P=O;}else{P=N;}}M.call(P,"DOMReady",[],O);},0);}else{this.DOMReadyEvent.subscribe(M,O,N);}},_addListener:function(O,M,X,S,N,a){if(!X||!X.call){return false;}if(this._isValidCollection(O)){var Y=true;for(var T=0,V=O.length;T<V;++T){Y=this._addListener(O[T],M,X,S,N,a)&&Y;}return Y;}else{if(YAHOO.lang.isString(O)){var R=this.getEl(O);if(R){O=R;}else{this.onAvailable(O,function(){YAHOO.util.Event._addListener(O,M,X,S,N,a);});return true;}}}if(!O){return false;}if("unload"==M&&S!==this){J[J.length]=[O,M,X,S,N,a];return true;}var b=O;if(N){if(N===true){b=S;}else{b=N;}}var P=function(c){return X.call(b,YAHOO.util.Event.getEvent(c,O),S);};var Z=[O,M,X,P,b,S,N,a];var U=I.length;I[U]=Z;if(this.useLegacyEvent(O,M)){var Q=this.getLegacyIndex(O,M);if(Q==-1||O!=G[Q][0]){Q=G.length;B[O.id+M]=Q;G[Q]=[O,M,O["on"+M]];E[Q]=[];O["on"+M]=function(c){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(c),Q);};}E[Q].push(Z);}else{try{this._simpleAdd(O,M,P,a);}catch(W){this.lastError=W;this._removeListener(O,M,X,a);return false;}}return true;},addListener:function(O,Q,N,P,M){return this._addListener(O,Q,N,P,M,false);},addFocusListener:function(O,N,P,M){return this._addListener(O,K,N,P,M,true);},removeFocusListener:function(N,M){return this._removeListener(N,K,M,true);},addBlurListener:function(O,N,P,M){return this._addListener(O,L,N,P,M,true);},removeBlurListener:function(N,M){return this._removeListener(N,L,M,true);},fireLegacyEvent:function(Q,O){var S=true,M,U,T,V,R;U=E[O].slice();for(var N=0,P=U.length;N<P;++N){T=U[N];if(T&&T[this.WFN]){V=T[this.ADJ_SCOPE];R=T[this.WFN].call(V,Q);S=(S&&R);}}M=G[O];if(M&&M[2]){M[2](Q);}return S;},getLegacyIndex:function(N,O){var M=this.generateId(N)+O;if(typeof B[M]=="undefined"){return -1;}else{return B[M];}},useLegacyEvent:function(M,N){return(this.webkit&&this.webkit<419&&("click"==N||"dblclick"==N));},_removeListener:function(N,M,V,Y){var Q,T,X;if(typeof N=="string"){N=this.getEl(N);}else{if(this._isValidCollection(N)){var W=true;for(Q=N.length-1;Q>-1;Q--){W=(this._removeListener(N[Q],M,V,Y)&&W);}return W;}}if(!V||!V.call){return this.purgeElement(N,false,M);}if("unload"==M){for(Q=J.length-1;Q>-1;Q--){X=J[Q];if(X&&X[0]==N&&X[1]==M&&X[2]==V){J.splice(Q,1);return true;}}return false;}var R=null;var S=arguments[4];if("undefined"===typeof S){S=this._getCacheIndex(N,M,V);}if(S>=0){R=I[S];}if(!N||!R){return false;}if(this.useLegacyEvent(N,M)){var P=this.getLegacyIndex(N,M);var O=E[P];if(O){for(Q=0,T=O.length;Q<T;++Q){X=O[Q];if(X&&X[this.EL]==N&&X[this.TYPE]==M&&X[this.FN]==V){O.splice(Q,1);break;}}}}else{try{this._simpleRemove(N,M,R[this.WFN],Y);}catch(U){this.lastError=U;return false;}}delete I[S][this.WFN];delete I[S][this.FN];
I.splice(S,1);return true;},removeListener:function(N,O,M){return this._removeListener(N,O,M,false);},getTarget:function(O,N){var M=O.target||O.srcElement;return this.resolveTextNode(M);},resolveTextNode:function(N){try{if(N&&3==N.nodeType){return N.parentNode;}}catch(M){}return N;},getPageX:function(N){var M=N.pageX;if(!M&&0!==M){M=N.clientX||0;if(this.isIE){M+=this._getScrollLeft();}}return M;},getPageY:function(M){var N=M.pageY;if(!N&&0!==N){N=M.clientY||0;if(this.isIE){N+=this._getScrollTop();}}return N;},getXY:function(M){return[this.getPageX(M),this.getPageY(M)];},getRelatedTarget:function(N){var M=N.relatedTarget;if(!M){if(N.type=="mouseout"){M=N.toElement;}else{if(N.type=="mouseover"){M=N.fromElement;}}}return this.resolveTextNode(M);},getTime:function(O){if(!O.time){var N=new Date().getTime();try{O.time=N;}catch(M){this.lastError=M;return N;}}return O.time;},stopEvent:function(M){this.stopPropagation(M);this.preventDefault(M);},stopPropagation:function(M){if(M.stopPropagation){M.stopPropagation();}else{M.cancelBubble=true;}},preventDefault:function(M){if(M.preventDefault){M.preventDefault();}else{M.returnValue=false;}},getEvent:function(O,M){var N=O||window.event;if(!N){var P=this.getEvent.caller;while(P){N=P.arguments[0];if(N&&Event==N.constructor){break;}P=P.caller;}}return N;},getCharCode:function(N){var M=N.keyCode||N.charCode||0;if(YAHOO.env.ua.webkit&&(M in D)){M=D[M];}return M;},_getCacheIndex:function(Q,R,P){for(var O=0,N=I.length;O<N;O=O+1){var M=I[O];if(M&&M[this.FN]==P&&M[this.EL]==Q&&M[this.TYPE]==R){return O;}}return -1;},generateId:function(M){var N=M.id;if(!N){N="yuievtautoid-"+A;++A;M.id=N;}return N;},_isValidCollection:function(N){try{return(N&&typeof N!=="string"&&N.length&&!N.tagName&&!N.alert&&typeof N[0]!=="undefined");}catch(M){return false;}},elCache:{},getEl:function(M){return(typeof M==="string")?document.getElementById(M):M;},clearCache:function(){},DOMReadyEvent:new YAHOO.util.CustomEvent("DOMReady",this),_load:function(N){if(!H){H=true;var M=YAHOO.util.Event;M._ready();M._tryPreloadAttach();}},_ready:function(N){var M=YAHOO.util.Event;if(!M.DOMReady){M.DOMReady=true;M.DOMReadyEvent.fire();M._simpleRemove(document,"DOMContentLoaded",M._ready);}},_tryPreloadAttach:function(){if(F.length===0){C=0;clearInterval(this._interval);this._interval=null;return ;}if(this.locked){return ;}if(this.isIE){if(!this.DOMReady){this.startInterval();return ;}}this.locked=true;var S=!H;if(!S){S=(C>0&&F.length>0);}var R=[];var T=function(V,W){var U=V;if(W.override){if(W.override===true){U=W.obj;}else{U=W.override;}}W.fn.call(U,W.obj);};var N,M,Q,P,O=[];for(N=0,M=F.length;N<M;N=N+1){Q=F[N];if(Q){P=this.getEl(Q.id);if(P){if(Q.checkReady){if(H||P.nextSibling||!S){O.push(Q);F[N]=null;}}else{T(P,Q);F[N]=null;}}else{R.push(Q);}}}for(N=0,M=O.length;N<M;N=N+1){Q=O[N];T(this.getEl(Q.id),Q);}C--;if(S){for(N=F.length-1;N>-1;N--){Q=F[N];if(!Q||!Q.id){F.splice(N,1);}}this.startInterval();}else{clearInterval(this._interval);this._interval=null;}this.locked=false;},purgeElement:function(Q,R,T){var O=(YAHOO.lang.isString(Q))?this.getEl(Q):Q;var S=this.getListeners(O,T),P,M;if(S){for(P=S.length-1;P>-1;P--){var N=S[P];this._removeListener(O,N.type,N.fn,N.capture);}}if(R&&O&&O.childNodes){for(P=0,M=O.childNodes.length;P<M;++P){this.purgeElement(O.childNodes[P],R,T);}}},getListeners:function(O,M){var R=[],N;if(!M){N=[I,J];}else{if(M==="unload"){N=[J];}else{N=[I];}}var T=(YAHOO.lang.isString(O))?this.getEl(O):O;for(var Q=0;Q<N.length;Q=Q+1){var V=N[Q];if(V){for(var S=0,U=V.length;S<U;++S){var P=V[S];if(P&&P[this.EL]===T&&(!M||M===P[this.TYPE])){R.push({type:P[this.TYPE],fn:P[this.FN],obj:P[this.OBJ],adjust:P[this.OVERRIDE],scope:P[this.ADJ_SCOPE],capture:P[this.CAPTURE],index:S});}}}}return(R.length)?R:null;},_unload:function(S){var M=YAHOO.util.Event,P,O,N,R,Q,T=J.slice();for(P=0,R=J.length;P<R;++P){N=T[P];if(N){var U=window;if(N[M.ADJ_SCOPE]){if(N[M.ADJ_SCOPE]===true){U=N[M.UNLOAD_OBJ];}else{U=N[M.ADJ_SCOPE];}}N[M.FN].call(U,M.getEvent(S,N[M.EL]),N[M.UNLOAD_OBJ]);T[P]=null;N=null;U=null;}}J=null;if(I){for(O=I.length-1;O>-1;O--){N=I[O];if(N){M._removeListener(N[M.EL],N[M.TYPE],N[M.FN],N[M.CAPTURE],O);}}N=null;}G=null;M._simpleRemove(window,"unload",M._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var M=document.documentElement,N=document.body;if(M&&(M.scrollTop||M.scrollLeft)){return[M.scrollTop,M.scrollLeft];}else{if(N){return[N.scrollTop,N.scrollLeft];}else{return[0,0];}}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(O,P,N,M){O.addEventListener(P,N,(M));};}else{if(window.attachEvent){return function(O,P,N,M){O.attachEvent("on"+P,N);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(O,P,N,M){O.removeEventListener(P,N,(M));};}else{if(window.detachEvent){return function(N,O,M){N.detachEvent("on"+O,M);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;EU.onFocus=EU.addFocusListener;EU.onBlur=EU.addBlurListener;
/* DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
if(EU.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);var n=document.createElement("p");EU._dri=setInterval(function(){try{n.doScroll("left");clearInterval(EU._dri);EU._dri=null;EU._ready();n=null;}catch(ex){}},EU.POLL_INTERVAL);}else{if(EU.webkit&&EU.webkit<525){EU._dri=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._dri);EU._dri=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);}}EU._simpleAdd(window,"load",EU._load);EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(A,C,F,E){this.__yui_events=this.__yui_events||{};
var D=this.__yui_events[A];if(D){D.subscribe(C,F,E);}else{this.__yui_subscribers=this.__yui_subscribers||{};var B=this.__yui_subscribers;if(!B[A]){B[A]=[];}B[A].push({fn:C,obj:F,override:E});}},unsubscribe:function(C,E,G){this.__yui_events=this.__yui_events||{};var A=this.__yui_events;if(C){var F=A[C];if(F){return F.unsubscribe(E,G);}}else{var B=true;for(var D in A){if(YAHOO.lang.hasOwnProperty(A,D)){B=B&&A[D].unsubscribe(E,G);}}return B;}return false;},unsubscribeAll:function(A){return this.unsubscribe(A);},createEvent:function(G,D){this.__yui_events=this.__yui_events||{};var A=D||{};var I=this.__yui_events;if(I[G]){}else{var H=A.scope||this;var E=(A.silent);var B=new YAHOO.util.CustomEvent(G,H,E,YAHOO.util.CustomEvent.FLAT);I[G]=B;if(A.onSubscribeCallback){B.subscribeEvent.subscribe(A.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var F=this.__yui_subscribers[G];if(F){for(var C=0;C<F.length;++C){B.subscribe(F[C].fn,F[C].obj,F[C].override);}}}return I[G];},fireEvent:function(E,D,A,C){this.__yui_events=this.__yui_events||{};var G=this.__yui_events[E];if(!G){return null;}var B=[];for(var F=1;F<arguments.length;++F){B.push(arguments[F]);}return G.fire.apply(G,B);},hasEvent:function(A){if(this.__yui_events){if(this.__yui_events[A]){return true;}}return false;}};YAHOO.util.KeyListener=function(A,F,B,C){if(!A){}else{if(!F){}else{if(!B){}}}if(!C){C=YAHOO.util.KeyListener.KEYDOWN;}var D=new YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=new YAHOO.util.CustomEvent("enabled");this.disabledEvent=new YAHOO.util.CustomEvent("disabled");if(typeof A=="string"){A=document.getElementById(A);}if(typeof B=="function"){D.subscribe(B);}else{D.subscribe(B.fn,B.scope,B.correctScope);}function E(J,I){if(!F.shift){F.shift=false;}if(!F.alt){F.alt=false;}if(!F.ctrl){F.ctrl=false;}if(J.shiftKey==F.shift&&J.altKey==F.alt&&J.ctrlKey==F.ctrl){var G;if(F.keys instanceof Array){for(var H=0;H<F.keys.length;H++){G=F.keys[H];if(G==J.charCode){D.fire(J.charCode,J);break;}else{if(G==J.keyCode){D.fire(J.keyCode,J);break;}}}}else{G=F.keys;if(G==J.charCode){D.fire(J.charCode,J);}else{if(G==J.keyCode){D.fire(J.keyCode,J);}}}}}this.enable=function(){if(!this.enabled){YAHOO.util.Event.addListener(A,C,E);this.enabledEvent.fire(F);}this.enabled=true;};this.disable=function(){if(this.enabled){YAHOO.util.Event.removeListener(A,C,E);this.disabledEvent.fire(F);}this.enabled=false;};this.toString=function(){return"KeyListener ["+F.keys+"] "+A.tagName+(A.id?"["+A.id+"]":"");};};YAHOO.util.KeyListener.KEYDOWN="keydown";YAHOO.util.KeyListener.KEYUP="keyup";YAHOO.util.KeyListener.KEY={ALT:18,BACK_SPACE:8,CAPS_LOCK:20,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,META:224,NUM_LOCK:144,PAGE_DOWN:34,PAGE_UP:33,PAUSE:19,PRINTSCREEN:44,RIGHT:39,SCROLL_LOCK:145,SHIFT:16,SPACE:32,TAB:9,UP:38};YAHOO.register("event",YAHOO.util.Event,{version:"2.6.0",build:"1321"});YAHOO.register("yahoo-dom-event", YAHOO, {version: "2.6.0", build: "1321"});

/* End of Yahoo Copyrighted / BSD Licensed section */
/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0

This notice only applies to this section.

*/
/**
 * The Browser History Manager provides the ability to use the back/forward
 * navigation buttons in a DHTML application. It also allows a DHTML
 * application to be bookmarked in a specific state.
 *
 * This library requires the following static markup:
 *
 * &lt;iframe id="yui-history-iframe" src="path-to-real-asset-in-same-domain"&gt;&lt;/iframe&gt;
 * &lt;input id="yui-history-field" type="hidden"&gt;
 *
 * @module history
 * @requires yahoo,event
 * @namespace YAHOO.util
 * @title Browser History Manager
 */

/**
 * The History class provides the ability to use the back/forward navigation
 * buttons in a DHTML application. It also allows a DHTML application to
 * be bookmarked in a specific state.
 *
 * @class History
 * @constructor
 */
YAHOO.util.History = (function () {

    /**
     * Our hidden IFrame used to store the browsing history.
     *
     * @property _histFrame
     * @type HTMLIFrameElement
     * @default null
     * @private
     */
    var _histFrame = null;

    /**
     * INPUT field (with type="hidden" or type="text") or TEXTAREA.
     * This field keeps the value of the initial state, current state
     * the list of all states across pages within a single browser session.
     *
     * @property _stateField
     * @type HTMLInputElement|HTMLTextAreaElement
     * @default null
     * @private
     */
    var _stateField = null;

    /**
     * Flag used to tell whether YAHOO.util.History.initialize has been called.
     *
     * @property _initialized
     * @type boolean
     * @default false
     * @private
     */
    var _initialized = false;

    /**
     * List of registered modules.
     *
     * @property _modules
     * @type array
     * @default []
     * @private
     */
    var _modules = [];

    /**
     * List of fully qualified states. This is used only by Safari.
     *
     * @property _fqstates
     * @type array
     * @default []
     * @private
     */
    var _fqstates = [];

	/**
	 * To be overridden by initialize(), a user-defined global state-change handler 
	 */

	function _fqStateChangeFn() {}

    /**
     * location.hash is a bit buggy on Opera. I have seen instances where
     * navigating the history using the back/forward buttons, and hence
     * changing the URL, would not change location.hash. That's ok, the
     * implementation of an equivalent is trivial.
     *
     * @method _getHash
     * @return {string} The hash portion of the document's location
     * @private
     */
    function _getHash() {
        var i, href;
        href = top.location.href;
        i = href.indexOf("#");
        return i >= 0 ? href.substr(i + 1) : null;
    }

    /**
     * Stores all the registered modules' initial state and current state.
     * On Safari, we also store all the fully qualified states visited by
     * the application within a single browser session. The storage takes
     * place in the form field specified during initialization.
     *
     * @method _storeStates
     * @private
     */
    function _storeStates() {

        var moduleName, moduleObj, initialStates = [], currentStates = [];

        for (moduleName in _modules) {
            if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                moduleObj = _modules[moduleName];
                initialStates.push(moduleName + "=" + moduleObj.initialState);
                currentStates.push(moduleName + "=" + moduleObj.currentState);
            }
        }

        _stateField.value = initialStates.join("&") + "|" + currentStates.join("&");

        if (YAHOO.env.ua.webkit) {
            _stateField.value += "|" + _fqstates.join(",");
        }
    }

    /**
     * Sets the new currentState attribute of all modules depending on the new
     * fully qualified state. Also notifies the modules which current state has
     * changed.
     *
     * @method _handleFQStateChange
     * @param {string} fqstate Fully qualified state
     * @private
     */
    function _handleFQStateChange(fqstate) {

        var i, len, moduleName, moduleObj, modules, states, tokens, currentState;

        if (!fqstate) {

            for (moduleName in _modules) {
                if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                    moduleObj = _modules[moduleName];
                    moduleObj.currentState = moduleObj.initialState;
                    moduleObj.onStateChange(decodeURI(moduleObj.currentState));
                }
            }
            return;
        }

        modules = [];
        states = fqstate.split("&");
        for (i = 0, len = states.length; i < len; i++) {
            tokens = states[i].split("=");
            if (tokens.length === 2) {
                moduleName = tokens[0];
                currentState = tokens[1];
                modules[moduleName] = currentState;
            }
        }

        for (moduleName in _modules) {
            if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                moduleObj = _modules[moduleName];
                currentState = modules[moduleName];
                if (!currentState || moduleObj.currentState !== currentState) {
                    moduleObj.currentState = currentState || ''; //moduleObj.initialState;
                    moduleObj.onStateChange(decodeURI(moduleObj.currentState));
                }
            }
        }

		_fqStateChangeFn();
    }

    /**
     * Update the IFrame with our new state.
     *
     * @method _updateIFrame
     * @private
     * @return {boolean} true if successful. false otherwise.
     */
    function _updateIFrame (fqstate) {

        var html, doc;

        html = '<html><body><div id="state">' + fqstate + '</div></body></html>';

        try {
            doc = _histFrame.contentWindow.document;
            doc.open();
            doc.write(html);
            doc.close();
            return true;
        } catch (e) {
            return false;
        }
    }

    /**
     * Periodically checks whether our internal IFrame is ready to be used.
     *
     * @method _checkIframeLoaded
     * @private
     */
    function _checkIframeLoaded() {

        var doc, elem, fqstate, hash;

        if (!_histFrame.contentWindow || !_histFrame.contentWindow.document) {

            setTimeout(_checkIframeLoaded, 10);
            return;
        }







        doc = _histFrame.contentWindow.document;
        elem = doc.getElementById("state");



        fqstate = elem ? elem.innerText : null;

        hash = _getHash();

        setInterval(function () {

            var newfqstate, states, moduleName, moduleObj, newHash, historyLength;

            doc = _histFrame.contentWindow.document;
            elem = doc.getElementById("state");

            newfqstate = elem ? elem.innerText : null;

            newHash = _getHash();

            if (newfqstate !== fqstate) {

                fqstate = newfqstate;
                _handleFQStateChange(fqstate);

                if (!fqstate) {
                    states = [];
                    for (moduleName in _modules) {
                        if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                            moduleObj = _modules[moduleName];
                            states.push(moduleName + "=" + moduleObj.initialState);
                        }
                    }
                    newHash = states.join("&");
                	_handleFQStateChange(newHash);
                } else {
                    newHash = fqstate;
                }







                top.location.hash = newHash;
                hash = newHash;

                _storeStates();

            } else if (newHash !== hash) {













                hash = newHash;



                _updateIFrame(newHash);
            }

        }, 50);

        _initialized = true;
        YAHOO.util.History.onLoadEvent.fire();
    }

    /**
     * Finish up the initialization of the Browser History Manager.
     *
     * @method _initialize
     * @private
     */
    function _initialize() {

        var i, len, parts, tokens, moduleName, moduleObj, initialStates, initialState, currentStates, currentState, counter, hash;


        parts = _stateField.value.split("|");

        if (parts.length > 1) {

            initialStates = parts[0].split("&");
            for (i = 0, len = initialStates.length; i < len; i++) {
                tokens = initialStates[i].split("=");
                if (tokens.length === 2) {
                    moduleName = tokens[0];
                    initialState = tokens[1];
                    moduleObj = _modules[moduleName];
                    if (moduleObj) {
                        moduleObj.initialState = initialState;
                    }
                }
            }

            currentStates = parts[1].split("&");
            for (i = 0, len = currentStates.length; i < len; i++) {
                tokens = currentStates[i].split("=");
                if (tokens.length >= 2) {
                    moduleName = tokens[0];
                    currentState = tokens[1];
                    moduleObj = _modules[moduleName];
                    if (moduleObj) {
                        moduleObj.currentState = currentState;
                    }
                }
            }
        }

        if (parts.length > 2) {
            _fqstates = parts[2].split(",");
        }

        if (YAHOO.env.ua.ie) {

            _checkIframeLoaded();

        } else {















            counter = history.length;


            hash = _getHash();

            setInterval(function () {

                var state, newHash, newCounter;

                newHash = _getHash();
                newCounter = history.length;
                if (newHash !== hash) {
                    hash = newHash;
                    counter = newCounter;
                    _handleFQStateChange(hash);
                    _storeStates();
                } else if (newCounter !== counter && YAHOO.env.ua.webkit) {
                    hash = newHash;
                    counter = newCounter;
                    state = _fqstates[counter - 1];
                    _handleFQStateChange(state);
                    _storeStates();
                }

            }, 50);

            _initialized = true;
            YAHOO.util.History.onLoadEvent.fire();
        }
    }

    return {

        /**
         * Fired when the Browser History Manager is ready. If you subscribe to
         * this event after the Browser History Manager has been initialized,
         * it will not fire. Therefore, it is recommended to use the onReady
         * method instead.
         *
         * @event onLoadEvent
         * @see onReady
         */
        onLoadEvent: new YAHOO.util.CustomEvent("onLoad"),

        /**
         * Executes the supplied callback when the Browser History Manager is
         * ready. This will execute immediately if called after the Browser
         * History Manager onLoad event has fired.
         *
         * @method onReady
         * @param {function} fn what to execute when the Browser History Manager is ready.
         * @param {object} obj an optional object to be passed back as a parameter to fn.
         * @param {boolean|object} override If true, the obj passed in becomes fn's execution scope.
         * @see onLoadEvent
         */
        onReady: function (fn, obj, override) {

            if (_initialized) {

                setTimeout(function () {
                    var ctx = window;
                    if (override) {
                        if (override === true) {
                            ctx = obj;
                        } else {
                            ctx = override;
                        }
                    }
                    fn.call(ctx, "onLoad", [], obj);
                }, 0);

            } else {

                YAHOO.util.History.onLoadEvent.subscribe(fn, obj, override);

            }
        },

        /**
         * Registers a new module.
         *
         * @method register
         * @param {string} module Non-empty string uniquely identifying the
         *     module you wish to register.
         * @param {string} initialState The initial state of the specified
         *     module corresponding to its earliest history entry.
         * @param {function} onStateChange Callback called when the
         *     state of the specified module has changed.
         * @param {object} obj An arbitrary object that will be passed as a
         *     parameter to the handler.
         * @param {boolean} override If true, the obj passed in becomes the
         *     execution scope of the listener.
         */
        register: function (module, initialState, onStateChange, obj, override) {

            var scope, wrappedFn;

			if (initialState == undefined) {
				initialState = '';
			}

            if (typeof module !== "string" || YAHOO.lang.trim(module) === "" ||
                typeof initialState !== "string" ||
                typeof onStateChange !== "function") {
                throw new Error("Missing or invalid argument");
            }

            if (_modules[module]) {


                return;
            }








            if (_initialized) {
                throw new Error("All modules must be registered before calling YAHOO.util.History.initialize");
            }


            module = encodeURI(module);
            initialState = encodeURI(initialState);



            scope = null;
            if (override === true) {
                scope = obj;
            } else {
                scope = override;
            }

            wrappedFn = function (state) {
                return onStateChange.call(scope, state, obj);
            };

            _modules[module] = {
                name: module,
                initialState: initialState,
                currentState: initialState,
                onStateChange: wrappedFn
            };
        },

        /**
         * Initializes the Browser History Manager. Call this method
         * from a script block located right after the opening body tag.
         *
         * @method initialize
         * @param {string|HTML Element} stateField <input type="hidden"> used
         *     to store application states. Must be in the static markup.
         * @param {string|HTML Element} histFrame IFrame used to store
         *     the history (only required on Internet Explorer)
         * @public
         */
        initialize: function (stateField, histFrame, fqStateChangeFn) {

            if (_initialized) {

                return;
            }

			if (typeof fqStateChangeFn == 'function') {
				_fqStateChangeFn = fqStateChangeFn;
			}

            if (YAHOO.env.ua.opera) {











            }

            if (typeof stateField === "string") {
                stateField = document.getElementById(stateField);
            }

            if (!stateField ||
                stateField.tagName.toUpperCase() !== "TEXTAREA" &&
                (stateField.tagName.toUpperCase() !== "INPUT" ||
                 stateField.type !== "hidden" &&
                 stateField.type !== "text")) {
                throw new Error("Missing or invalid argument");
            }

            _stateField = stateField;

            if (YAHOO.env.ua.ie) {

                if (typeof histFrame === "string") {
                    histFrame = document.getElementById(histFrame);
                }

                if (!histFrame || histFrame.tagName.toUpperCase() !== "IFRAME") {
                    throw new Error("Missing or invalid argument");
                }

                _histFrame = histFrame;
            }





            YAHOO.util.Event.onDOMReady(_initialize);
        },

        /**
         * Call this method when you want to store a new entry in the browser's history.
         *
         * @method navigate
         * @param {string} module Non-empty string representing your module.
         * @param {string} state String representing the new state of the specified module.
         * @return {boolean} Indicates whether the new state was successfully added to the history.
         * @public
         */
        navigate: function (module, state) {

            var states;

            if (typeof module !== "string" || typeof state !== "string") {
                throw new Error("Missing or invalid argument");
            }

            states = {};
            states[module] = state;

            return YAHOO.util.History.multiNavigate(states);
        },

        /**
         * Call this method when you want to store a new entry in the browser's history.
         *
         * @method multiNavigate
         * @param {object} states Associative array of module-state pairs to set simultaneously.
         * @return {boolean} Indicates whether the new state was successfully added to the history.
         * @public
         */
        multiNavigate: function (states) {

            var currentStates, moduleName, moduleObj, currentState, fqstate;

            if (typeof states !== "object") {
                throw new Error("Missing or invalid argument");
            }

            if (!_initialized) {
                throw new Error("The Browser History Manager is not initialized");
            }








            currentStates = [];

            for (moduleName in _modules) {
                if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                    moduleObj = _modules[moduleName];
                    if (YAHOO.lang.hasOwnProperty(states, moduleName)) {
                        currentState = states[decodeURI(moduleName)];
                    } else {
                        currentState = decodeURI(moduleObj.currentState);
                    }


                    moduleName = encodeURI(moduleName);
                    currentState = encodeURI(currentState);

					if (currentState.length) {
                    	currentStates.push(moduleName + "=" + currentState);
					}
                }
            }

            fqstate = currentStates.join("&");

            if (YAHOO.env.ua.ie) {

                return _updateIFrame(fqstate);

            } else {









                top.location.hash = fqstate;
                if (YAHOO.env.ua.webkit) {





                    _fqstates[history.length] = fqstate;
                    _storeStates();
                }

                return true;

            }
        },

        /**
         * Returns the current state of the specified module.
         *
         * @method getCurrentState
         * @param {string} module Non-empty string representing your module.
         * @return {string} The current state of the specified module.
         * @public
         */
        getCurrentState: function (module) {

            var moduleObj;

            if (typeof module !== "string") {
                throw new Error("Missing or invalid argument");
            }

            if (!_initialized) {
                throw new Error("The Browser History Manager is not initialized");
            }

            moduleObj = _modules[module];
            if (!moduleObj) {
                throw new Error("No such registered module: " + module);
            }

            return decodeURI(moduleObj.currentState);
        },

        /**
         * Returns the state of a module according to the URL fragment
         * identifier. This method is useful to initialize your modules
         * if your application was bookmarked from a particular state.
         *
         * @method getBookmarkedState
         * @param {string} module Non-empty string representing your module.
         * @return {string} The bookmarked state of the specified module.
         * @public
         */
        getBookmarkedState: function (module) {

            var i, len, idx, hash, states, tokens, moduleName;

            if (typeof module !== "string") {
                throw new Error("Missing or invalid argument");
            }




            idx = top.location.href.indexOf("#");
            hash = idx >= 0 ? top.location.href.substr(idx + 1) : top.location.href;


            states = hash.split("&");
            for (i = 0, len = states.length; i < len; i++) {
                tokens = states[i].split("=");
                if (tokens.length === 2) {
                    moduleName = tokens[0];
                    if (moduleName === module) {
                        return decodeURI(tokens[1]);
                    }
                }
            }

            return null;
        },

        /**
         * Returns the value of the specified query string parameter.
         * This method is not used internally by the Browser History Manager.
         * However, it is provided here as a helper since many applications
         * using the Browser History Manager will want to read the value of
         * url parameters to initialize themselves.
         *
         * @method getQueryStringParameter
         * @param {string} paramName Name of the parameter we want to look up.
         * @param {string} queryString Optional URL to look at. If not specified,
         *     this method uses the URL in the address bar.
         * @return {string} The value of the specified parameter, or null.
         * @public
         */
        getQueryStringParameter: function (paramName, url) {

            var i, len, idx, queryString, params, tokens;

            url = url || top.location.href;

            idx = url.indexOf("?");
            queryString = idx >= 0 ? url.substr(idx + 1) : url;


            idx = queryString.lastIndexOf("#");
            queryString = idx >= 0 ? queryString.substr(0, idx) : queryString;

            params = queryString.split("&");

            for (i = 0, len = params.length; i < len; i++) {
                tokens = params[i].split("=");
                if (tokens.length >= 2) {
                    if (tokens[0] === paramName) {
                        return decodeURI(tokens[1]);
                    }
                }
            }

            return null;
        }

    };

})();
YAHOO.register("history", YAHOO.util.History, {version: "2.6.0", build: "1321"});

/* End of Yahoo Copyrighted / BSD Licensed section */
/* Copyright (c) 2008 Shutterstock Images LLC */

var readyStateCheckInterval = 250;

var activeResultSlot;

function clearRecentSearches() {
	$('recent-searches').setOpacity(0.5);
	new Ajax.Request('/show_component.mhtml', {
		parameters: {
			component_path: 'clear_recent_searches.md'
		},
		onSuccess: function() {
			$('recent-searches').hide();
		},
		onFailure: function() {
			$('recent-searches').setOpacity(1);
			alert($t('DYNAMIC_RESULTS_ERROR_CLEAR_RECENT_SEARCHES', 'Unfortunately, due to a technical error, we were unable to clear your recent searches'));
		}
	} );
}

function updateThumbSize(args) { // args: sizeName, e

	browser.toggleCursorState('progress', args.e);

	searchControls.setDisplayPrefs( {
		thumbSize: thumbSizes[args.sizeName].session_name,
		callback: function() {
			location = '/change_results_mode.mhtml?results_mode=dynamic&' + search.results.normalizedQueryString
		}
	} );

}

function updateDisplayRows(args) { // args: rows, e

	browser.toggleCursorState('progress', args.e);

	searchControls.setDisplayPrefs( {
		rowsPerPage: args.rows,
		callback: function() {
			location = '/change_results_mode.mhtml?results_mode=dynamic&' + search.results.normalizedQueryString
		}
	} );

}

function bootstrap(args) { // args: searchCriteria, pageNumber, callback, dontInterrupt, dontSyncLocation, direction

	args.direction = args.direction == 'backward' ? args.direction : 'forward';
	
	initiallyBootstrapped = true;



	if (args.searchCriteria &&
	    args.searchCriteria.criteria.searchterm && 
	    args.searchCriteria.criteria.searchterm.match(/^\d+$/)) {

		search.showDetails( { photoId: args.searchCriteria.criteria.searchterm, e: args.e } );
		return;
	}

	searchResults.results = {};

	args.pageNumber = args.pageNumber ? args.pageNumber : 1;
	var chapterNumber = parseInt(Math.floor((args.pageNumber - 1) / pagesPerChapter));






	previousSearchCriteria = args.searchCriteria;

	var normalizedLocationArgs = args.searchCriteria.criteria;
	if (args.pageNumber && args.pageNumber != 1) {
		normalizedLocationArgs.page = args.PageNumber;
	}	



	searchResults.fetch( {
		chapterNumber: chapterNumber,
		searchCriteria: args.searchCriteria.criteria,
		initialSearch: true,
		interruptPendingRequests: args.dontInterrupt ? false : true,
		callback: function() {
			browser.wait( {
				condition: 'window.search',
				retryInterval: 100,
				callback: function() {
					syncResultsPageCount();
					easel.setCanvasOrder({ direction: args.direction });
					search.criteria = args.searchCriteria;
					easel.nascentCanvas.populateResults( { 
						pageNumber: args.pageNumber,
						callback: function() {

							searchControls.syncSearchInputsDisplay();
							if (!searchResults.count) {
								search.elements.resultsContainer.style.display = 'none';
								$('loading-indicator').style.display = 'none';
								search.elements.detailsContainer.style.display = 'none';
								$('search-results-header').style.display = 'block';
								browser.toggleCursorState('revert');

								return;	
							}
							$('loading-indicator').style.display = 'none';
							search.elements.detailsContainer.style.display = 'none';
							search.elements.resultsContainer.style.display = 'block';
							search.elements.resultsContainer.style.position = 'static';
							search.elements.resultsContainer.style.visibility = 'visible';
							$('search-results-header').style.display = 'block';
							search.showNextPage( { e: document.body, bootstrap: true, dontSetPage: true, direction: args.direction, dontConsultLocks: true } );
							if (typeof(args.callback) == 'function') {
								args.callback();
							}
							searchControls.syncDisplayPrefSelects();
							searchControls.syncPagerLinkClasses();	
					
						} 
					} );
				}
			} );
		}
	} );
}

function doSearch(args) { // e
	
	browser.toggleCursorState('progress', args.e);
	search.restoreResultsView();

	var criteria = {};

	if (args.e && args.e.hasClassName('view-selector-input')) {
		criteria[args.e.name] = criteria[args.e.value];
	}

	searchInputIds.each( function(inputElementId) {
		var e = $(inputElementId);
		if (e && e.blur) e.blur();

		if (e.name == 'show_color_wheel') {
			if (e.checked) {
				if ($('color-hex-input').value) {
					criteria.color = $('color-hex-input').value;
					criteria.color = criteria.color.replace(/^\#/, '');
				}
			}
		} else if (e.tagName == 'INPUT' && e.type == 'checkbox' && !criteria[e.name]) {
			criteria[e.name] = e.checked ? 1 : 0;
		} else {
			criteria[e.name] = criteria[e.name] ? criteria[e.name] : e.value;
			if (e.value) {

			}
		}
	} );

	browser.updateLocation( { args: criteria, clear: true, e: args.e } );
}

var newlyActiveThumb;
function setActiveThumb(args) {

	activeResultSlot = args.resultSlot;
	newlyActiveThumb = true;
}

function debug(message) {

}

function calmlyShowPhotoDetails() {

	if (browser.mouseSpeed == 0 && browser.mouseoverEnabled) {

		if (!resultPreview.showing && newlyActiveThumb) {
			resultPreview.showing = true;
			newlyActiveThumb = false;
			resultPreview.populate( { resultSlot: activeResultSlot } );
		} else {

		}
	}
}

function syncResultsPageCount() {
	$$('.results-page-count').each( function(e) { e.innerHTML = search.results.pageCount } );
}

var requests = {};
var activeRequestNumber = 0;

function setCatPageHandlers() {
	setTimeout(
		function() {
			$$('a').each( function(link) {
				if (link.href.match(/\/cat\W/)) {
					var e = link;
					link.onclick = function() {
						var categoryId = link.getAttribute('x_shutterstock_category_id');

						browser.updateLocation( { args: { category_id: categoryId }, clear: true, e: e } );
						return false;
					};
				}
			} )
		},
		10
	);
}
function setKeywordSearchHandlers() {
	setTimeout(
		function() {
			$$('#pic-page-container a').each ( function(link) {
				if (link.href.match(/\/s\/.+\/search.html$/)) {
					link.onclick = function() {
						var searchterm = link.getAttribute('x_shutterstock_keyword');
						browser.updateLocation( { args: { searchterm: searchterm }, clear: true, e: link } );
						return false;
					};
				}
			} );
		},
		10
	);
}

var searchInputIds = $w('searchterm-input category-select search-group-select orientation-select exclude-input ' +
                        'model-released-checkbox exclude-editorial-checkbox enhanced-only-checkbox photographer-input');

var previousSearchCriteria = new Object;

function testObjectEquality(o1, o2) {

	if (!o1 || !o2) {

		return false;
	}
	for (var key in o1) {
		if (o1[key] != 'all' && o1[key] && o1[key] != o2[key]) {

			return false;
		}
	}
	for (var key in o2) {
		if (o2[key] != 'all' && o2[key] && o1[key] != o2[key]) {

			return false;
		}
	}

	return true;	
}

function dismissPreviewMessage() {
	var messageElement = $('image-preview-message');
	messageElement.setOpacity(0.5);
	new Ajax.Request( '/show_component.mhtml', {
		parameters: {
			component_path: 'dismiss_image_preview_message.md'
		},
		onSuccess: function() {
			messageElement.hide();
		}
	} );
}

var lastLocation;
var handleHistoryEvent = function(newLocation, historyData) {


	var pendingLinkElement = browser.pendingLinkElements.pop();
	if (pendingLinkElement) {
		browser.toggleCursorState('progress', pendingLinkElement);
	}



	dialogSafe.appendChild(lightboxDialog);

	browser.lastLocation = newLocation;
	browser.pageArgs = browser.parseArgs();

	var pageArgs = browser.pageArgs;



	if (pageArgs.photo_id) {





		browser.toggleCursorState('progress', document.body);
		search.showDetails( { photoId: pageArgs.photo_id, e: pendingLinkElement } );
		return;
	}

	var criteria = $H(pageArgs).clone().toObject();
	delete criteria.page;
	delete criteria.photo_id;

	var searchCriteria = new SearchCriteria( { criteria: criteria } );

	var reusePopulatedResults =
		(searchCriteria && previousSearchCriteria && previousSearchCriteria.getNormalizedQueryString && searchCriteria.getNormalizedQueryString() == previousSearchCriteria.getNormalizedQueryString());



	arguments.callee.initialCallDone = true;

	if (reusePopulatedResults && (search.activePageNumber == pageArgs.page || (!pageArgs.page && search.activePageNumber == 1))) {


	
		search.elements.detailsContainer.style.display = 'none';
		easel.activeCanvas.element.style.visibility = 'visible';
		search.elements.resultsContainer.style.display = 'block';
		search.elements.resultsContainer.style.position = 'static';
		document.getElementById('search-results-header').style.display = 'block';

		window.scroll(0, search.canvasScrollOffset);
		
		search.restoreResultsView();
		searchControls.syncSearchInputsDisplay();

		document.title = searchResults.pageTitle;

	} else if (reusePopulatedResults && easel.activeCanvas.nextCanvas.pageNumber == pageArgs.page) {

		search.showNextPage( { e: pendingLinkElement } );

	} else if (reusePopulatedResults && easel.activeCanvas.prevCanvas.pageNumber == (pageArgs.page || 1)) {

		search.showNextPage( { direction: 'backward', e: pendingLinkElement } );

	} else {



		browser.toggleCursorState('progress', document.body);


		var pageNumber = pageArgs.page ? pageArgs.page : 1;

		if (pageNumber < 1) {
			pageNumber = 1;
		} else if (pageNumber > resultsPageCount) {
			pageNumber = resultsPageCount;
		}

		var direction = pageArgs.page == search.activePageNumber - 1 && reusePopulatedResults ? 'backward' : 'forward';




		bootstrap( { 
			pageNumber: parseInt(pageArgs.page ? pageArgs.page : 1), 
			searchCriteria: new SearchCriteria( { criteria: browser.parseArgs() } ),
			callback: function () { browser.toggleCursorState('revert', pendingLinkElement) },
			direction: direction
		} );

	}

}

var showAddToLightboxList = function(args) {

	selectedPhotoId = args.photoId;

	var placeholder = document.getElementById('pic-page-lightbox-dropdown-placeholder');
	var dialog = document.getElementById('add-to-lightbox-dialog');

	placeholder.appendChild(dialog);
	dialog.style.display = 'block';

	dropdownDialogShowing = true;
}

var getLocationHash = function() {
	var i, href;
	href = top.location.href;
	i = href.indexOf("#");
	return i >= 0 ? href.substr(i + 1) : null;
}

var changeResultsMode = function(legacyQueryString) {
	var resultsMode = $('results-mode-form').results_mode.value;
	var queryString = window.search && window.browser ? browser.getHash() : legacyQueryString;
	location = "/change_results_mode.mhtml?results_mode=" + [resultsMode, queryString].join('&');	
}
/* Copyright (c) 2008 Shutterstock Images LLC */

var start = new Date().getTime();
function logTime(label) {
	var now = new Date().getTime();

	start = now;
}
function BaseObject() {
	var self = arguments.callee;
	if (self.instantiated) return;

	this.instantiate = function(instance) {
		for (var p in instance.properties) {
	
			if (typeof instance.properties[p] == 'function' && 0) {
				instance.prototype[p] = instance.properties[p];
			} else {
				instance[p] = instance.properties[p];
			}
		}
	}
}

var base = new BaseObject();
/* Copyright (c) 2008 Shutterstock Images LLC */

function Canvas(args) { // id

	this.properties = {

		id: args.id,

		element: args.element,

		pageNumber: null,

		readyState: 'uninitialized',
		readyStateCheckInterval: 250, // milliseconds

		resultSlots: []	
	};
	
	base.instantiate(this);

	for (var i = 0; i < this.element.childNodes.length; i++) {
		var child = this.element.childNodes[i];
		
		if (child.nodeType != 1)
			continue;

		var resultSlot = new ResultSlot( {
			canvas: this,
			enume: i,
			containerElement: this.element.childNodes[i]
		} );

		this.resultSlots.push(resultSlot);

	} 	

}


Canvas.prototype = {

		populateResults: function(args) { // resultSlotsCount, callback, results, pageNumber, iterationCount

			var canvas = this;

			this.pageNumber = args.pageNumber != undefined ? args.pageNumber : this.pageNumber;

			this.readyState = 'loading';

			var resultsOffset = resultsPerPage * (canvas.pageNumber - 1);

			canvas.chapterNumber = Math.floor(resultsOffset / resultsPerChapter);
			canvas.chapterPageNumber = Math.floor((resultsOffset - canvas.chapterNumber * resultsPerChapter) / resultsPerPage);  //suspect

			var chapterNumberOffset = 0;

			for (var i = 0; i < resultsPerPage; i++) {

				var chapterNumber = Math.floor( (resultsOffset + i) / resultsPerChapter);
				var chapterResultsIndex = (resultsOffset + i) % resultsPerChapter;

				if (!searchResults.results[chapterNumber]) {

					if (!searchResults.locks.chapterNumbers[chapterNumber]) {

						searchResults.fetch( { 
							chapterNumber: chapterNumber,
							searchCriteria: search.criteria.criteria,
							callback: function() {
								this.populateResults(args);
							}.bind(this)
						} );
						return;
					} else {


						args.iterationCount = args.iterationCount ? args.iterationCount + 1 : 1;
						if (args.iterationCount > 180) {
							log.fatal("giving up waiting for canvas to populate after 180 iterations");
							return;
						}
						setTimeout( function() { this.populateResults(args) }.bind(this), 250);
						return; 
					}
				}

				var result = searchResults.results[chapterNumber][chapterResultsIndex];

				if (!result) {
					canvas.resultSlots[i].clear();
				} else {
					canvas.resultSlots[i].populate( {
						result: result,
						thumbSize: activeThumbSize,
						clear: !result 
					} );
				}
			}

			canvas.readyState = 'ready';

			if (typeof(args.callback) == 'function') {
				args.callback();
			}
		},


		hideResultContainers: function() { 
			for (var i = 0; i < this.resultSlots.length; i++) {
				var resultSlot = this.resultSlots[i];
				resultSlot.clear();
			}
		}
	
};
/* Copyright (c) 2008 Shutterstock Images LLC */

function ResultSlot(args) { // canvas, enume, elements, lightboxIcon, enlargeIcon
	this.properties = {

		elements: {}, 

		photoId: undefined,

		canvas: args.canvas,
		enume: args.enume,

		result: {},

		id: args.canvas.id + '-' + args.enume
	};

	base.instantiate(this);


	this._populateElementRefs(args.containerElement);
	this.elements.container = args.containerElement;
	if (!this.elements.thumb) {
		return;
	}

	this.lightboxIcon = new ResultSlotIcon( {
		activeElement: this.elements.lightboxActive,
		inactiveElement: this.elements.lightboxInactive
	} );
	this.detailsIcon = new ResultSlotIcon( {
		activeElement: this.elements.enlargeActive,
		inactiveElement: this.elements.enlargeInactive
	} );

	var enterHandlerName, leaveHandlerName;

	if (Prototype.Browser.IE) {
		enterHandlerName = 'onmouseenter';
		leaveHandlerName = 'onmouseleave';
	} else {
		enterHandlerName = 'onmouseover';
		leaveHandlerName = 'onmouseout';
	}

	this.elements.container[enterHandlerName] = this.highlight.bind(this);
	this.elements.container[leaveHandlerName] = this.unHighlight.bind(this);
	
	this.elements.thumb.onmouseover = function() { setActiveThumb( { resultSlot: this } ) }.bind(this);
	this.elements.thumb.onmouseout = function() { resultPreview.unPopulate( { resultSlot: this } ) }.bind(this);

	this.lightboxIcon.activeElement.onclick = function() { this.showAddToLightboxList() }.bind(this);
	this.detailsIcon.activeElement.onclick = function() {
		browser.toggleCursorState('progress', this.detailsIcon.activeElement);
		browser.updateLocation( { args: { similar_photo_id: this.result.id }, e: this.detailsIcon.activeElement, clear: true } );
	}.bind(this);
}

ResultSlot.prototype = {

		highlight: function() {
			this.elements.container.className += ' highlighted-result-container';
			this.lightboxIcon.highlight();
			this.detailsIcon.highlight();
		},

		unHighlight: function() {
			this.elements.container.className = this.elements.container.className.replace(/ highlighted-result-container$/, '');
			this.lightboxIcon.unHighlight();
			this.detailsIcon.unHighlight();
		},

		showAddToLightboxList: function(args) { // id, canvasEnum

			selectedPhotoId = this.photoId;
			
			this.elements.dropdownPlaceHolder.appendChild($('add-to-lightbox-dialog'));

			$('add-to-lightbox-dialog').show();
			dropdownDialogShowing = true;
		},

		getDimensions: function(maxDimensionPixels) { 
			var width, height;

			var aspectRatio = this.result.aspect_ratio;


			if (!aspectRatio) aspectRatio = 1;

			if (aspectRatio > 1) {
				width = maxDimensionPixels;
				height = Math.round(width / aspectRatio);
			} else {
				height = maxDimensionPixels;
				width = Math.round(height * aspectRatio);
			}

			return { width: width, height: height };

		},

		populate: function(args) { // result, canvas, enume, clear, thumbSize

			var result = this.result = args.result;
			var canvas = this.canvas;

			var thumb = this.elements.thumb;
			
			if (!thumb) {

				return;
			}
			
			var thumbContainer = thumb.parentNode.tagName == 'A' ? thumb.parentNode.parentNode : thumb.parentNode;

			if (!result) {

				return;
			}

			this.photoId = result.id;

			thumb.style.visibility = 'hidden';

			var maxDimensionPixels = args.thumbSize.max_dimension_pixels;

			var dimensions = this.getDimensions(maxDimensionPixels);
	
			thumbContainer.style.width = dimensions.width + 'px'; 
			thumbContainer.style.height = dimensions.height + 'px';

			thumbContainer.style.marginTop = Math.round((maxDimensionPixels - dimensions.height) / 2) + 'px';
			thumbContainer.style.marginLeft = Math.round((maxDimensionPixels - dimensions.width) / 2) + 'px';

			if (thumb.parentNode.tagName == 'A') {
				thumb.parentNode.href = "/pic-" + result.id + ".html";
			}

			this.elements.description.innerHTML = document.language == 'en' ? result['display_description'] : '';	

			var thumbURL = ['http:/', result.host, 'photos', args.thumbSize.name, result.set_name, result.filename].join('/');
	
			if (thumb.src == thumbURL) {
				thumb.style.visibility = 'visible';
			} else {
				thumb.src = thumbURL;
			} 

			this.elements.container.style.visibility = 'visible';


			thumb.onclick = function() { 
				browser.toggleCursorState('progress', thumb); 
				setTimeout( 
					function() { browser.updateLocation({ clear: true, args: { photo_id: result.id }, e: thumb }) }, 
					10
				);
			};

			this.detailsIcon.onclick = function() { search.showDetails({ photoId: result.id, e: this.detailsIcon }) };
		},

		clear: function(args) {
			this.elements.thumb.src = 'http://www.shutterstock.com/images/spacer.gif';
			this.elements.container.style.visibility = 'hidden';
		},

		_populateElementRefs: function(parent) {

			var elementMap = {
				'result-thumb': 'thumb',
				'result-description': 'description',
				'result-dropdown-placeholder': 'dropdownPlaceHolder',
				'grid-icon lightbox-active': 'lightboxActive',
				'grid-icon lightbox-inactive': 'lightboxInactive',
				'grid-icon enlarge-active': 'enlargeActive',
				'grid-icon enlarge-inactive': 'enlargeInactive'
			};

			if (parent.hasChildNodes()) {

				for (var i = 0; i < parent.childNodes.length; i++) {
					var child = parent.childNodes[i];
					if (child.nodeType != 1) {
						continue;
					}
					if (elementMap[child.className]) {
						this.elements[elementMap[child.className]] = child;
					}
					this._populateElementRefs(child);
				}
			}
			
			
		}

};

function showPhotoDetails(e) {
	if (window.search && browser) {
		var matches;
		if (matches = e.href.match(/\/pic-(\d+)/)) {
			var photoId = matches[1];
			browser.updateLocation( { args: { photo_id: photoId }, clear: true, e: e } );
			return false;
		}
	}
} 
/* Copyright (c) 2008 Shutterstock Images LLC */

function ResultSlotIcon(args) { // activeElement, inactiveElement

	this.properties = {
		activeElement: args.activeElement,
		inactiveElement: args.inactiveElement
	};
 
	base.instantiate(this);

};

ResultSlotIcon.prototype = {
	highlight: function() {
		this.activeElement.style.display = 'block';
		this.inactiveElement.style.display = 'none';
	},

	unHighlight: function() {
		this.activeElement.style.display = 'none';
		this.inactiveElement.style.display = 'block';
	}
};
/* Copyright (c) 2008 Shutterstock Images LLC */

function Easel(args) {

	this.properties = {

		canvases: {},

		moribundCanvas: undefined,
		activeCanvas: undefined,
		nascentCanvas: undefined,

		setCanvasOrder: function(args) { // direction
			args.direction = args.direction ? args.direction : 'forward';
			if (args.direction == 'forward') {
				this.nascentCanvas = this.activeCanvas.nextCanvas;
				this.moribundCanvas = this.activeCanvas.prevCanvas;	
			} else {
				this.nascentCanvas = this.activeCanvas.prevCanvas;
				this.moribundCanvas = this.activeCanvas.nextCanvas;	
			}
		},

		rotateCanvasContext: function(args) { // direction
			if (args.direction == 'forward') {
				this.activeCanvas = this.activeCanvas.nextCanvas;
			} else {
				this.activeCanvas = this.activeCanvas.prevCanvas;
			}
			this.setCanvasOrder(args);
		},

		updateCanvasDisplayStack: function(args) {

			args = args ? args : {};

			this.activeCanvas.element.style.zIndex = 30;
			this.moribundCanvas.element.style.zIndex = 20;
			this.nascentCanvas.element.style.zIndex = 10;

			this.moribundCanvas.element.hide();
			this.activeCanvas.element.show();

			if (args.pageScrollCallback) {
				args.pageScrollCallback();
			}

			this.activeCanvas.element.style.visibility = 'visible';
			this.activeCanvas.element.style.opacity = 1;

		}
	};

	base.instantiate(this);

	this.nascentCanvas = args.canvases.shift();
	this.activeCanvas = args.canvases.shift();
	this.moribundCanvas = args.canvases.shift();



	this.nascentCanvas.nextCanvas = this.activeCanvas;
	this.activeCanvas.nextCanvas = this.moribundCanvas;
	this.moribundCanvas.nextCanvas = this.nascentCanvas;

	this.moribundCanvas.prevCanvas = this.activeCanvas;
	this.activeCanvas.prevCanvas = this.nascentCanvas;
	this.nascentCanvas.prevCanvas = this.moribundCanvas;	
}
/* Copyright (c) 2008 Shutterstock Images LLC */

function Search(args) {

	this.properties = {

		locks: {
			showNextPage: false,
			detailsShowing: false,
			detailsClicks: false
		},

		dynamicResultsVersion: 102,

		elements: {},

		easel: args.easel,

		results: args.results,

		criteria: args.criteria,

		activePageNumber: undefined,

		showNextPage: function(args) { // e, showPrev, dontSetPage, dontProgress, dontConsultLocks, bootstrap, onlySetLocation

			args.direction = args.direction ? args.direction : 'forward';

			if (!args.iterationCount) {
				args.iterationCount = 1;
			}
	
			if (this.activePageNumber == 1 && args.direction == 'backward') {

				return; 
			}

			if (!args.bootstrap && this.activePageNumber == search.results.pageCount && args.direction == 'forward') {

				return;
			}	
		
			if (this.locks.showNextPage && !args.dontConsultLocks) {

				return;
			} else {
				this.locks.showNextPage = true;
			}


			if (args.iterationCount == 180 * 1000 / readyStateCheckInterval) {
				alert($t('DYNAMIC_RESULTS_ERROR_TIMEOUT', "We were unable to retreive more results due to a technical error.  Please try again."));
				this.locks.showNextPage = false;
				browser.toggleCursorState('revert', args.e);
				return;
			}
		
			if (!args.dontProgress) {
				this.easel.setCanvasOrder({ direction: args.direction });
				this.easel.rotateCanvasContext({ direction: args.direction });
			}

			var unitIncrement = args.direction == 'forward' ? 1 : -1;


			if (this.easel.activeCanvas.readyState == 'loading') {
				if (args.iterationCount == 1) {

				}
				setTimeout(
					function() { 
						this.showNextPage( {
							e: args.e, 
							direction: args.direction,
							dontSetPage: args.dontSetPage, 
							dontProgress: true, 
							dontConsultLocks: true,
							iterationCount: args.iterationCount + 1,
							bootstrap: args.bootstrap
						} ) 
					}.bind(this), 
					readyStateCheckInterval
				);
				return;

			} else if (this.easel.activeCanvas.readyState == 'uninitialized') {
				this.easel.activeCanvas.populateResults( { 
					pageNumber: this.activePageNumber + unitIncrement,
					callback: function() {
						this.showNextPage( {
							dontProgress: true,
							dontConsultLocks: true
						} );
					}.bind(this)
				} );
				return;
			}

			if (args.onlySetLocation) {

				browser.updateLocation( { args: { page: search.activePageNumber + unitIncrement } } );
				this.locks.showNextPage = false;
				this.pendingPagerLink = args.e;
				return;
			}

			var nextChapterNumber = parseInt(this.easel.activeCanvas.chapterNumber) + parseInt(unitIncrement);


			/* pre-fetch the next chapter if it looks like the user is paging through */
			if (
				nextChapterNumber > 0 
				&& searchResults.results[nextChapterNumber] == undefined 
				&& eval(
					'easel.activeCanvas.chapterPageNumber' + 
					(unitIncrement == 1 ? '>=' : '<=') + 
					'Math.round(pagesPerChapter / 2) + -1 * unitIncrement * Math.round(pagesPerChapter / 4)'
				)
				&& !searchResults.locks.chapterNumbers[nextChapterNumber]
				&& searchResults.count > nextChapterNumber * searchResults.resultsPerChapter
			) {

				this.results.fetch( { 
					searchCriteria: search.criteria.criteria, 
					chapterNumber: nextChapterNumber,
					unitIncrement: unitIncrement
				} );
			}
	

			this.easel.updateCanvasDisplayStack( { 
				pageScrollCallback: function(activePageNumber) { 
					this.activePageNumber = easel.activeCanvas.pageNumber;
					for (var i = 0; i < this.elements.currentPageIndicators.length; i++) { 
						this.elements.currentPageIndicators[i].value = this.activePageNumber;
					}
					window.scroll(0, 0);
				}.bind(this)
			} );

			searchControls.revertPagerLinkCursorStyles();

			this.locks.showNextPage = false;

			mouseoverEnabled = false;

			searchControls.syncPagerLinkClasses();
			
			var adjacentPageNumber = this.easel.activeCanvas.pageNumber + unitIncrement;

			if (adjacentPageNumber > 0 && adjacentPageNumber <= search.results.pageCount) {

				this.easel.nascentCanvas.populateResults( { pageNumber: adjacentPageNumber } );
			}
		},

		jumpToPage: function(pageNumber) {

			pageNumber = parseInt(pageNumber);
			if (pageNumber > search.results.pageCount) {
				pageNumber = search.results.pageCount;
			} else if (pageNumber < 1) {
				pageNumber = 1;
			}
			browser.toggleCursorState('progress', document.body);
			browser.updateLocation( { args: { page: pageNumber } } );
		},

		restoreResultsView: function(args) {
			args = args ? args : {};
			activeResultSlot = null;
			resultPreview.unPopulate( { dontClearCursor: true } );
			this.locks.detailsShowing = false;
		},

		showDetails: function(args) { // args: photoId, e

			if (this.locks.detailsClicks[args.photoId.toString()]) { 

				browser.toggleCursorState('revert');
				return;
			}

			browser.toggleCursorState('progress', args.e);

			this.canvasScrollOffset = document.viewport.getScrollOffsets().top;

			this.restoreResultsView();

			this.locks.detailsShowing = true;
			this.locks.detailsClicks[args.photoId.toString()] = true;

			new Ajax.Updater('pic-page-container', '/show_component.mhtml', {
				parameters: {
					component_path: 'pic.mhtml',
					id: args.photoId
				},
				evalScripts: true,
				onSuccess: function() {
					if (browser.isSafari) { 
						$('cursor-indicator').hide();
					}
					$('loading-indicator').hide();
					search.elements.resultsContainer.style.display = 'none';
					$('search-results-header').style.display = 'none';
					easel.activeCanvas.element.style.visibility = 'hidden';

					search.elements.detailsContainer.style.display = 'block';
					search.elements.detailsContainer.style.visibility = 'visible';
					search.elements.detailsContainer.style.position = 'static';
					if (window.hidePopupExplanation) {
						hidePopupExplanation();
					}
				},
				onFailure: function() {
					alert($t('DYNAMIC_RESULTS_ERROR_PHOTO_DETAILS', "Unfortunately there was a technical error getting details about this photo"));
				},
				onComplete: function() {
					document.body.scrollTo(); 
					this.activePhotoId = args.photoId;
					browser.toggleCursorState('revert', args.e);
					this.locks.detailsClicks[args.photoId.toString()] = false;
					searchControls.syncSearchInputsDisplay();
					setKeywordSearchHandlers();
				}.bind(this)
			});
		}

	};

	base.instantiate(this);

	this.elements.currentPageIndicators = $$('.current-results-page');
	this.elements.resultsContainer = document.getElementById('results-container');
	this.elements.detailsContainer = document.getElementById('pic-page-container');
}
/* Copyright (c) 2008 Shutterstock Images LLC */

function SearchResults(args) {

	this.properties = {

		locks: {
			chapterNumbers: {}
		},

		elements: args.elements,

		results: {},

		count: undefined,

		activeRequestNumber: 0,		

		resultsPerChapter: args.resultsPerChapter,

		fetch: function(args) { // chapterNumber, callback, searchCriteria, unitIncrement, interruptPendingRequests, resultsPerChapter, initialSearch

			if (!args.interruptPendingRequests) {

				if (this.locks.chapterNumbers[args.chapterNumber]) {

					return;
				}

				if (this.results[args.chapterNumber]) {
					if (typeof args.callback == 'function') {
						args.callback();
					}

					return;
				}
			}

			this.locks.chapterNumbers[args.chapterNumber] = true;





			this.activeRequestNumber++;


			var request = new Ajax.Request('/show_component.mhtml', {
				method: Prototype.Browser.Webkit ? 'post' : 'get',
				evalScripts: false,
				parameters: 
					$H(args.searchCriteria).merge( {
						component_path: 'get_chapter_results_data.md',
						results_per_chapter: this.resultsPerChapter,
						chapter_number: args.chapterNumber,
						requestNumber: this.activeRequestNumber,
						rows_per_page: args.rowsPerPage,
						thumb_size: args.thumbSize,
						initialSearch: args.initialSearch,
						sort_method: args.sortMethod || defaultSortMethod,
						language: document.language,
						safesearch: disableSafesearch ? 0 : 1
					} ).toObject(),

				onFailure: function(transport) {
					if (transport.status == 500) {
						alert($t('DYNAMIC_RESULTS_ERROR_NEXT_PAGE', "Unfortunately, there was a technical problem retrieving the next page of search results."));
					}
				},
				onSuccess: function(transport) {


					if (transport.request.parameters.requestNumber != this.activeRequestNumber) { 

						this.locks.chapterNumbers[args.chapterNumber] = false;	
						return;
					}

					var response;
					if (transport.responseText.isJSON()) {
						response = eval('(' + transport.responseText + ')');
					} else {
						log.fatal("got bad response: " + transport.status);
						this.locks.chapterNumbers[args.chapterNumber] = false;	
						browser.toggleCursorState('revert', args.e);
						return;
					}






					if (response.initialSearch) {
	
						this.count = response.resultsCount;
					    this.pageCount = Math.ceil(searchResults.count / resultsPerPage);

						this.normalizedQueryString = response.normalizedQueryString;
						this.sortMethod = response.sortMethod;

						if (window.easel) easel.activeCanvas.element.style.display = 'none';
						document.getElementById('loading-indicator').style.display = 'none';

						if (this.elements.header) {
							this.elements.header.innerHTML = response.searchResultsHeaderHTML;
						}

						response.searchResultsHeaderHTML.evalScripts();

						if (this.elements.recentSearches) {
							this.elements.recentSearches.innerHTML = response.recentSearchesHTML;
						}

						document.title = this.pageTitle = response.pageTitle;

					} else {
						if (response.normalizedQueryString != this.normalizedQueryString) {
							log.fatal('Got unexpected search results: ' + response.normalizedQueryString + ' vs ' + this.normalizedQueryString);
						}
					}
	
					this.results[response.chapterNumber] = response.results;

					if (typeof(args.callback) == 'function') {
						args.callback();
					}
					
					this.locks.chapterNumbers[args.chapterNumber] = false;


					var moribundChapterNumber = args.chapterNumber + -1 * args.unitIncrement * 2;
					if (moribundChapterNumber >= 0 && this.results[moribundChapterNumber]) {

						this.results[moribundChapterNumber] = undefined;
					}

				}.bind(this)
			} ).name = 'SearchResults#fetch';
		}
	}

	base.instantiate(this);
}
/* Copyright (c) 2008 Shutterstock Images LLC */

function SearchControls(args) {

	this.properties = {

		elementSelectors: args.elementSelectors,
	
		elements: args.elements || {},

		syncDisplayPrefSelects: function() {

			if (this.elements.rowsPerPageSelects) {
				for (var i = 0; i < this.elements.rowsPerPageSelects.length; i++) {
					var select = this.elements.rowsPerPageSelects[i];

					for (var j = 0; j < select.options.length; j++) {
						var option = select.options[j];

						if (option.value == rowsPerPage) {
							option.selected = true;
						} else {
							option.selected = false;
						}
					}
				}
			}

			if (this.elements.sortMethodSelects) {
				for (var i = 0; i < this.elements.sortMethodSelects.length; i++) {
					var select = this.elements.sortMethodSelects[i];

					for (var j = 0; j < select.options.length; j++) {
						var option = select.options[j];

						if (option.value == searchResults.sortMethod) {
							option.selected = true;
						} else {
							option.selected = false;
						}
					}
				}
			}

			if (this.elements.thumbSizeSelects) {
				for (var i = 0; i < this.elements.thumbSizeSelects.length; i++) {
					var select = this.elements.thumbSizeSelects[i];

					for (var j = 0; j < select.options.length; j++) {
						var option = select.options[j];

						if (option.value == activeThumbSize.name) {
							option.selected = true;
						} else {
							option.selected = false;
						}
					}
				}
			}
		},

		syncSearchInputsDisplay: function() {


			var pageArgs = browser.pageArgs;

			searchInputIds.each( function(inputElementId) {
				
				var e = $(inputElementId);
			
				if (inputElementId == 'color-search-checkbox') {
					if (pageArgs.color) {
						$('color-hex-input').value = pageArgs.color;
						e.checked = true;
						$('colortable').show();
					} else {
						$('colortable').hide();
						$('color-hex-input').value = '';
						e.checked = false;		
					}
					return;
				}

				if (inputElementId == 'similar-photo-id-input') {
					if (pageArgs.similar_photo_id) {
						$('similar-images-container').show();
						$('similar-photo-id-display').update(pageArgs.similar_photo_id);
						new Ajax.Updater( $('similar-images-container').select('.thumb-cell').shift(), '/show_component.mhtml', {
							parameters: { id: pageArgs.similar_photo_id, size: 'thumb_small', scale_percentage: 40, component_path: 'show_image.mh' }
						} );
					} else {
						clearSimilarPhotoCriteria();
					}
				}

				if (e.tagName == 'INPUT' && e.type == 'checkbox') {

					if (e.className == 'safesearch-checkbox') {
						e.checked = !disableSafesearch;
						return;
					}

					if (parseInt(pageArgs[e.name])) {
						e.checked = true;
						if (e.className != 'safesearch-checkbox') {
							toggleCheckboxHighlight(e);
						}
					} else {
						e.checked = false;
						toggleCheckboxHighlight(e);
					}

				} else {
					if (pageArgs[e.name]) {
						e.value = pageArgs[e.name];
					} else {
						if (e.type == 'text') {
							e.value = '';
						} else if (e.name == 'search_cat') {
							e.value = '';
						} else if (e.name == 'orient' || e.name == 'search_group') {
							e.value = 'all'
						}
					}
					if (!e.id.match(/^view-selector-input/)) { 
						toggleInputHighlight(e);
					}
				}
			} );

			if (window.updateReleaseOptions) {
				window.updateReleaseOptions();
			}
			
		},

		setDisplayPrefs: function(args) { // thumbSize, rowsPerPage, sortMethod, callback

			new Ajax.Request( '/show_component.mhtml', {
				method: 'get',
				parameters: {
					component_path: 'set_display_prefs.md',
					rows_per_page: args.rowsPerPage,
					thumb_size: args.thumbSize,
					sort_method: args.sortMethod
				},
				onFailure: function() {
					alert($t('DYNAMIC_RESULTS_TROUBLE_SAVING_PREFS', "Unfortunately there was a problem saving your preferences"));
				},
				onSuccess: function() {
					if (args.callback) {
						args.callback();
					}
				}
			} );
		},

		syncPagerLinkClasses: function() {
			$A([$('pager-link-next-1'), $('pager-link-next-2')]).each( function(e) {
				if (search.activePageNumber == search.results.pageCount) {
					e.addClassName('disabled-pager-link');
				} else {
					e.removeClassName('disabled-pager-link');
				}
			} );	
			$A([$('pager-link-prev-1'), $('pager-link-prev-2')]).each( function(e) {
				if (search.activePageNumber == 1) {
					e.addClassName('disabled-pager-link');
				} else {
					e.removeClassName('disabled-pager-link');
				}
			} );	
		},

		toggleSafeSearch: function(args) {
			var safesearch = args.e.checked ? 1 : 0;	
			disableSafesearch = !safesearch;
			browser.updateLocation( { args: { safesearch: safesearch ? 1 : 0 } } ); 
		},

		refreshSort: function(args) { // args: e

			browser.toggleCursorState('progress', args.e);
			search.restoreResultsView();
			defaultSortMethod = args.e.value;

			browser.updateLocation( { args: { sort_method: args.e.value }, e: args.e } );

			this.setDisplayPrefs( {sortMethod: args.e.value} );	
		},

		handleNextPageClick: function(e, direction) {
			if (search.locks.showNextPage) {
				browser.toggleCursorState('revert', e);
				return;
			}
			
			if (search.activePageNumber == 1 && direction == 'backward') {
				browser.toggleCursorState('revert', e);
				return;
			}

			if (search.activePageNumber == search.results.pageCount && direction == 'forward') {
				browser.toggleCursorState('revert', e);
				return;
			}

			setTimeout( function() {
				browser.toggleCursorState('progress', e);
				browser.updateLocation( { args: { page: search.activePageNumber + (direction == 'forward' ? 1 : -1) } } );
			}, 10);
		},
		
		revertPagerLinkCursorStyles: function() {
			for (var i = 0; i < this.elements.pagerLinks.length; i++) {
				var pagerLink = this.elements.pagerLinks[i];
				browser.toggleCursorState('revert', pagerLink);
			}
			
		}

	};
	
	base.instantiate(this);	

	$$(this.elementSelectors.sortMethodSelect).each(
		function(element) {
			element.observe('change', function() { log.debug("onchange"); this.refreshSort( { e: element } ) }.bind(this));
		},
		this 
	);

}
/* Copyright (c) 2008 Shutterstock Images LLC */

function SearchCriteria(args) {

	this.properties = {

		criteria: {},

		inconsequentialValues: {
			anyorall: 'all',
			search_group: 'all',
			orient: 'all',
			model_released: '0',
			commercial_ok: '0'
		},

		inconsequentialKeys: {	
			lang: 1, 	
			search_type: 1,
			page: 1,
			x: 1,
			y: 1
		},

		oldKeysMap: {
			submitter: 'submitter_id',
			gallery_id: 'submitter_id',
			cat: 'category_id',
			search_cat: 'category_id',
			orient: 'orientation',
			sortby: 'sort_method'
		},
	
		getNormalizedQueryString: function() {
		
			var pairs = [];
	
			$H(this.criteria).keys().sortBy( function (s) { return s } ).each(
				function(key) {
					if (this.inconsequentialKeys[key]) {
						return;
					}
					var normalizedKey = this.oldKeysMap[key] || key;
					pairs.push(normalizedKey + '=' + encodeURIComponent(this.criteria[key]));
				},
				this
			);

			return pairs.join('&');
		}
	};

	base.instantiate(this);

	$H(args.criteria).each( function(pair) {
		if (this.inconsequentialValues[pair.key] == pair.value) {
			return;
		}
		if (this.inconsequentialKeys[pair.key]) {
			return;
		}
		if (pair.value == undefined || pair.value == '') {
			return;
		}

		this.criteria[pair.key] = pair.value;

	}, this );
}
	
/* Copyright (c) 2008 Shutterstock Images LLC */

function ResultPreview(args) {

	var self = arguments.callee;
	if (self.instantiated) return;
	self.instantiated = true;

	this.properties = {

		elements: args.elements,

		showing: false,

		locks: {
			thumbLoad: {}
		},

		activeResultSlot: {},

		populate: function(args) {

			var resultSlot = args.resultSlot;

			this.showing = true;

			this.locks[resultSlot.id] = true;

			var imageSrc = resultSlot.previewThumbSrc ? resultSlot.previewThumbSrc : ['http:/', resultSlot.result.host, 'photos', 'display_pic_with_logo', resultSlot.result.set_name, resultSlot.result.filename].join('/');
			if (this.elements.thumb.src == imageSrc) {
				this.show();				
			} else {
				this.elements.thumb.src = imageSrc;
			}

			setTimeout(function() {
				if (this.locks[resultSlot.id]) {
					browser.toggleCursorState('progress', resultSlot.elements.thumb, 'local');
				}
			}.bind(this), 1000);

			var aspectRatio = args.resultSlot.result.aspect_ratio;

			var compThumbHeight = (aspectRatio < 1 ? 450 : Math.round(450 / aspectRatio));
			var compThumbWidth = (aspectRatio >= 1 ? 450 : Math.round(450 * aspectRatio));

			var thumbContainer = this.elements.thumb.parentNode;
			thumbContainer.style.width = compThumbWidth + 'px';
			thumbContainer.style.height = compThumbHeight + 'px';
			thumbContainer.style.overflow = 'hidden';

			if (this.elements.iframeBacking) {
				this.elements.iframeBacking.style.width = (compThumbWidth + 65) + 'px';
				this.elements.iframeBacking.style.height = (compThumbHeight + 65) + 'px';
			}

			this.position( { resultSlot: resultSlot, placement: args.placement, fixedContainer: args.fixedContainer, fixedAncestor: args.fixedAncestor } );
		},

		unPopulate: function(args) {
			if (!args) args = {};
			this.locks[this.activeResultSlot.id] = false;
			this.elements.container.style.display = 'none';	
			this.showing = false;
			if (this.activeResultSlot.elements && !args.dontClearCursor) {
				browser.toggleCursorState('revert', this.activeResultSlot.elements.thumb, 'local'); 
			}

			newlyActiveThumb = false;
		},

		position: function(args) { // resultSlot, placement

			this.activeResultSlot = args.resultSlot;

			var thumbPosition;

			if (args.fixedContainer && args.fixedAncestor) {
				thumbPosition = browser.getFixedPosition(args.fixedContainer, args.resultSlot.elements.container, args.fixedAncestor);
			} else {
				thumbPosition = browser.getElementScreenPosition(args.resultSlot.elements.container);
			}

			var viewportDimensions = document.viewport.getDimensions();
			var viewportOffsets = document.viewport.getScrollOffsets();

			var padding = 10; // pixels


			var dimensions = args.resultSlot.getDimensions(450);


			var previewHeight = dimensions.height + 60;
			var previewWidth = dimensions.width + 60;

			var thumbSize = activeThumbSize;
			var thumbHeight = thumbSize.max_dimension_pixels;
			var thumbWidth = thumbHeight;

			var berth = {
				top: thumbPosition.top - previewHeight,
				left: thumbPosition.left - previewWidth,
				bottom: viewportDimensions.height - thumbPosition.top - previewHeight,
				right: viewportDimensions.width - thumbPosition.left - thumbWidth - previewWidth
			}; 

			var bestPlacement;
			$H(berth).keys().each( function(placement) {
				bestPlacement = bestPlacement ? bestPlacement : placement;
				bestPlacement = berth[placement] > berth[bestPlacement] ? placement : bestPlacement;
			} );

			bestPlacement = bestPlacement ? bestPlacement : 'bottom';
			var previewPosition;

			switch (bestPlacement) {
				case 'top':
					previewPosition = {
						top: thumbPosition.top - previewHeight - padding,
						left: thumbPosition.left + (thumbWidth / 2) - (previewWidth / 2)
					};
					break;
				case 'left':
					previewPosition = {
						top: thumbPosition.top + (thumbHeight / 2) - (previewHeight / 2),
						left: thumbPosition.left - previewWidth - padding
					};
					break;
				case 'bottom':
					previewPosition = {
						top: thumbPosition.top + thumbHeight + padding,
						left: thumbPosition.left + (thumbWidth / 2) - (previewWidth / 2)
					};
					break;
				case 'right':
					previewPosition = {
						top: thumbPosition.top + (thumbHeight / 2) - (previewHeight / 2),
						left: thumbPosition.left + thumbWidth + padding
					};
					break;
			}

			var containerStyle = this.elements.container.style;
			$w('top left').each( function(dimension) {
				if (previewPosition[dimension] !== null) {

					if ((bestPlacement == 'left' || bestPlacement == 'right') && (dimension  == 'top')
						|| (bestPlacement == 'top' || bestPlacement == 'bottom') && (dimension  == 'left')) {
					
						if (previewPosition[dimension] < 0) {
							previewPosition[dimension] = padding;

						} else if (dimension == 'left' && previewPosition[dimension] + previewWidth > viewportDimensions.width) {
							previewPosition[dimension] = viewportDimensions.width - previewWidth - padding;

						} else if (dimension == 'top' && previewPosition[dimension] + previewHeight > viewportDimensions.height) {
							previewPosition[dimension] = viewportDimensions.height - previewHeight - padding;
						}
	
					}

					if (dimension == 'top' || dimension == 'bottom') {
						containerStyle[dimension] = previewPosition[dimension] + viewportOffsets.top + 'px';
					} else {
						containerStyle[dimension] = previewPosition[dimension] + 'px';
					}
				
				} else {
					containerStyle[dimensions] = null;
				}
			} );

		}, 
		show: function() {
			if (!this.showing) return; 
			this.elements.container.style.display = 'block'; 
			browser.toggleCursorState('revert', this.activeResultSlot.elements.thumb, 'local'); 
			this.locks[this.activeResultSlot.id] = false;
			if (window.hidePopupExplanation) {
				hidePopupExplanation();
			}
		}
	};
	
	base.instantiate(this);

	this.elements.thumb.observe('load', this.show.bind(this));
}



var legacyActiveThumb;
function previewThumb(e) {
	legacyActiveThumb = e;
	setTimeout( function() {
		if (legacyActiveThumb && legacyActiveThumb.src == e.src) {

			var container = legacyActiveThumb.parentNode.parentNode;

			var thumbWidth = parseInt(container.style.width);
			var thumbHeight = parseInt(container.style.height);

			if (!thumbWidth || !thumbHeight) {

			}

			var fakeResultSlot = {
				elements: {
					container: legacyActiveThumb.parentNode.parentNode
				},
				getDimensions: function(maxDimensionPixels) {
					
					var multiplier = maxDimensionPixels / Math.max(thumbWidth, thumbHeight);
					return { 
						width: thumbWidth * multiplier, 
						height: thumbHeight * multiplier
					};
				},
				result: {
					aspect_ratio: (thumbWidth / thumbHeight)
				},
				previewThumbSrc: legacyActiveThumb.src.replace(/\/thumb_(small|large)\//, '/display_pic_with_logo/')
			};

			if (window.resultPreview) {
				var lightboxContainer = document.getElementById('lightbox-contents-table');
				var lightboxFixedAncestor = document.getElementById('lightbox-preview-container');
				var fixedContainer = lightboxContainer && Element.extend(legacyActiveThumb).descendantOf(lightboxContainer) ? lightboxContainer: null;
				resultPreview.populate( { resultSlot: fakeResultSlot, fixedContainer: fixedContainer, fixedAncestor: lightboxFixedAncestor } );
			}
		}
	}, 250);
}
function cancelPreview(e) {
	legacyActiveThumb = null;
	if (window.resultPreview) {
		resultPreview.unPopulate();
	}
}
/* Copyright (c) 2008 Shutterstock Images LLC */

function Browser(args) {

	args = args ? args : {};

	this.properties = {

		pageArgs: {},

		mouseSpeed: undefined,

		mousePosition: {},

		prevMousePosition: {},

		mouseoverEnabled: false,

		showingCursorIndicator: false,

		updateLocationCallback: args.updateLocationCallback,

		currentLocation: undefined,

		historyEventHandler: args.historyEventHandler,

		parameterNames: args.parameterNames || [],

		history: YAHOO.util.History,

		pendingLinkElements: [],

		parseArgs: function(args) {
			args = args ? args : {};
			args.stateType = args.stateType ? args.stateType : 'current';
			var pageArgs = {}; 
			for (var i = 0; i < this.parameterNames.length; i++) {
				var parameterName = this.parameterNames[i];
				if (args.stateType == 'bookmarked') {
					pageArgs[parameterName] = this.history.getBookmarkedState(parameterName);
				} else {
					pageArgs[parameterName] = this.history.getCurrentState(parameterName);
				}
			}
			return pageArgs;
		},

		updateLocation: function(args) { // args: args, clear, e

			browser.toggleCursorState('progress', args.e);
			this.pendingLinkElements.push(args.e);

			if (args.clear) {
				this.pageArgs = {};
			}
			
			for (var i = 0; i < this.parameterNames.length; i++) {
				var parameterName = this.parameterNames[i];
				this.pageArgs[parameterName] = args.args[parameterName] !== undefined ?  args.args[parameterName] : this.pageArgs[parameterName] || '';
			}

			var queryString = $H(this.pageArgs).toQueryString();

			browser.history.multiNavigate(this.pageArgs);

			if (this.updateLocationCallback) {
				this.updateLocationCallback();
			}

			if (!args.args.photo_id) {
				window.name = queryString;
			}
		},


		getElementPosition: function(obj, containerId) {
				var left = 0, top = 0;
				if (obj.offsetParent) {
						do {
							if (containerId && obj.id == containerId) {
								break;
							}
							left += obj.offsetLeft;
							top += obj.offsetTop;
						} while (obj = obj.offsetParent);
				}
			
			return { left: left, top: top };
		},

		getElementScreenPosition: function(e, fixedOffsets) {
			
			var elementPagePosition = this.getElementPosition(e);
			var scrollOffsets = fixedOffsets ? fixedOffsets : document.viewport.getScrollOffsets();
	
			return { 
				left: elementPagePosition.left - scrollOffsets.left,
				top: elementPagePosition.top - scrollOffsets.top
			};
		},

		getFixedPosition: function(container, element, fixedAncestor) {

			var elementPosition = this.getElementPosition(element, container.id);

			var elementAdjustedTop = elementPosition.top - container.scrollTop;
			var elementAdjustedLeft = elementPosition.left - container.scrollLeft;
			
			var containerPosition;
			if (Element.getStyle(fixedAncestor, 'position') == 'fixed') {
				containerPosition = this.getElementPosition(container);
			} else {
				containerPosition = this.getElementScreenPosition(container);
			}

			var elementScreenTop = elementAdjustedTop + containerPosition.top;
			var elementScreenLeft = elementAdjustedLeft + containerPosition.left;

			return { top: elementScreenTop, left: elementScreenLeft };

		},

		toggleCursorState: function(state, e, scope) {

			if (this.isSafari) {
				
				var cursorIndicator = $('cursor-indicator');

				if (state == 'revert') {
					cursorIndicator.hide();	

				} else {
					this.showingCursorIndicator = true;
					this.positionCursorIndicator();
					cursorIndicator.show();
				}

			} else {

				if (state == 'revert') {
					if (e && e.style.cursor == 'progress') {
						e.style.cursor = initialElementCursorStyles[e.id];
					}
					if (scope != 'local') {
						document.body.style.cursor = 'auto';
					}

				} else {
					if (e && e.style.cursor != 'progress') {
						initialElementCursorStyles[e.id] = e.style.cursor;
					}

					if (e) e.style.cursor = state;

					if (scope != 'local') {
						document.body.style.cursor = state;
					}
				}
			}
		},

		updateMouseSpeed: function() {

			var localMouseSpeed = Math.sqrt(
				Math.pow(this.mousePosition.x - this.prevMousePosition.x, 2) + 
				Math.pow(this.mousePosition.y - this.prevMousePosition.y, 2)
			);

			if (!this.mouseoverEnabled && localMouseSpeed > 3) { 

				this.mouseoverEnabled = true;
				return;
			}		

			this.mouseSpeed = localMouseSpeed;

			this.prevMousePosition.x = this.mousePosition.x;
			this.prevMousePosition.y = this.mousePosition.y;


		},

		updateMousePosition: function(event) {

			this.mousePosition = {
				x: event.clientX,
				y: event.clientY
			};

			if (this.showingCursorIndicator) {
				this.positionCursorIndicator();	
			}

			return;
		},

		positionCursorIndicator: function() {
			var scrollOffsets = document.viewport.getScrollOffsets();

			this.containerOffsets = this.getElementPosition($('cursor-indicator-container'));

			$('cursor-indicator').style.top = this.mousePosition.y - this.containerOffsets.top + 16 + 'px';
			$('cursor-indicator').style.left = this.mousePosition.x - this.containerOffsets.left + 16 + 'px';
		},

		wait: function(args) {
			args.iterationCount = args.iterationCount ? args.iterationCount : 0;
			if (eval(args.condition)) {
				if (typeof(args.callback) == 'function') {
					args.callback();
				}
			} else if (args.iterationCount > 40) {
				log.fatal('waited too long for ' + args.condition);

			} else {

				setTimeout( function() { 
					browser.wait( { 
						retryInterval: args.retryInterval, 
						condition: args.condition, 
						iterationCount: args.iterationCount + 1 
					} ) 
				}, args.retryInterval);
			}
		},

		getHash: window.getLocationHash
/*
		isSupported: function() {

			var supportedBrowserVersions = {
				Explorer: 6,
				Opera: 9,
				Firefox: 2,
				Safari: 3 
			};

			if (BrowserDetect.version >= supportedBrowserVersions[ BrowserDetect.browser ]) {
				return true;
			} else {
				return false;
			}
		}
*/

	};

	base.instantiate(this);

	document.observe('mousemove', function(e) { this.updateMousePosition(e) }.bindAsEventListener(this) );
	setInterval( function() { this.updateMouseSpeed() }.bind(this), 100 );

	this.history.onReady( function() {
		if (args.historyReadyCallback) {
			args.historyReadyCallback();
		}
	} );

	for (var i = 0; i < this.parameterNames.length; i++) {
		var parameterName = this.parameterNames[i];
		this.history.register(parameterName, this.history.getBookmarkedState(parameterName), function() {} );
	}

	if (args.historyEventHandler) {
		try {
			YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe", args.historyEventHandler);

		} catch (e) {



			log.fatal('history error: ' + e.message);
		}
	}

	Event.observe(window, 'scroll', function() { 
		if (resultPreview.showing) {

			search.restoreResultsView();
		}
		this.mouseoverEnabled = false;
	}.bind(this) );

	this.isSafari = navigator.userAgent.indexOf('AppleWebKit/') > -1; 

}



