//	in case namespace doesn't exist
		if ( !CLO ) var CLO = {};
/**
*	Comments User Interface
*
*	@author     Chris Constandinou <chris@constantology.com>
*
*/		
		Event.observe( window, 'load', function()
		{
			new CLO.CommentsUI(
				 {
					id : 'comments', 
/*					effect : {
						type : 'lightbox', 
						options : {
							center : false, 
							partial : true, 
							extraClassNames : 'comment-lightbox'
						}
					}, */
					trigger : 'displayForm' 
				}, 
				{
					action : 'addComment', 
					id : 'post-comment', 
					effect : { type : 'blind' }, 
/*					effect : { 
						type : 'lightbox', 
						options : { extraClassNames : 'post-lightbox' } 
					}, */
					trigger : 'com-post'
				}, 
				{
					effect : {
						type : 'lightbox', 
						options : { extraClassNames : 'preview-lightbox' }
					}, 
					trigger : 'com-preview', 
					url : '/comment.html'
				}
			);
		}, false );
		
		CLO.CommentsUI = Class.create();
		CLO.CommentsUI.prototype = {
/*
*	PUBLIC METHODS
*/
			initialize : function( oCommentView, oPostForm, oPreview )
			{
				this.args = arguments;
				this.COMMENTS = $( oCommentView.id );
				this.POST_COMMENT = $( oPostForm.id );
				
				if ( this.COMMENTS ) 
				{
					if ( oCommentView.effect )
					{
						if ( oCommentView.trigger )
						{
							this.TRIGGER = $( oCommentView.trigger );
							Event.observe( this.TRIGGER, 'click', this.commentShow.bind( this ), false );
						}
						this._createEffect.call( this, this.COMMENTS, oCommentView.effect, 'comment' );
					}
					else
					{
						if ( oCommentView.trigger )
						{
							this.TRIGGER = $( oCommentView.trigger );
							Event.observe( this.TRIGGER, 'click', function( evt ) { 
								new Effect.ScrollTo( this.COMMENTS, { afterFinish : this.postShow.bind( this, evt ) } ); 
								Event.stop( evt ); 
							}.bind( this ), false );
						}
					}
				}
				
				if ( this.POST_COMMENT && oPostForm.effect )
				{
					this.POST_TRIGGER = oPostForm.trigger;
					Event.observe( this.POST_TRIGGER, 'click', this.handlePost.bind( this ), false );
					
					if ( this._createPostDom.call( this, oPostForm.trigger ) )
						this._createEffect.call( this, this.postLoader, { type : 'lightbox', options : { extraClassNames : 'loader-lightbox', noScroll : true } }, 'loader' );
					
//	if there is a preview we want to set it to the original post action which should be to the preview screen
					if ( oPreview )
					{
						this._createPreviewButton.call( this, oPostForm.trigger, oPreview.trigger );
						oPreview.url = this.POST_COMMENT.getAttribute( 'action' );
					}
//	swap post action to the real one now
					this.POST_COMMENT.setAttribute( 'action', this.POST_COMMENT.getAttribute( 'action' ).replace( /^(.*\/).*$/, "$1" + oPostForm.action ) );
					
//					this.COMMENTS.appendChild( cssQuery( 'div.com-actions', this.COMMENTS )[0].cloneNode( true ) );
					
					cssQuery( 'a[href*="post-comment"]', this.COMMENTS ).each( function( a ) {
						Event.observe( a, 'click', this.postShow.bind( this ), false );
					}.bind( this ) );
					
					this._createEffect.call( this, this.POST_COMMENT, oPostForm.effect, 'post' );
				}
				
				if ( this.POST_COMMENT && oPreview && oPreview.url )
				{
					this.TRIGGER_PREVIEW = $( oPreview.trigger );
					Event.observe( this.TRIGGER_PREVIEW, 'click', this.previewComment.bindAsEventListener( this, oPreview.url ), false );
					
					if ( oPreview.effect && this._createPreviewDom.call( this, oPreview.trigger ) )
						this._createEffect.call( this, this.previewTarget, oPreview.effect, 'preview' );
				}
			}, 
			
			commentHide : function( evt )
			{
				if ( this.commentLightbox )
					this.commentLightbox.hide();
				Event.stop( evt );
			}, 
			
			commentShow : function( evt )
			{
				if ( this.commentLightbox )
					this.commentLightbox.show();
				else if ( this.commentEffectShow )
					this.commentEffectShow( this.COMMENTS );
					
				Event.stop( evt );
			}, 
			
			handlePost : function( evt )
			{
				this.previewHide.call( this );
				
				if ( this.validate.call( this ) )
				{
					new Ajax.Request( 
						this.POST_COMMENT.getAttribute( 'action' ), 
//						'/comments.inc', 
						{
							method : 'post', 
							postBody : Form.serialize( this.POST_COMMENT ), 
							onFailure : this._handleFailure.bind( this, 'loaderHide' ), 
							on404 : this._handleFailure.bind( this, 'loaderHide' ), 
							onLoaded : this._toggleIndicator.bind( this, 'loading', 'loaderShow' ), 
							onLoading : this._toggleIndicator.bind( this, 'loaded', 'loaderHide' ), 
							onSuccess : this._handlePost.bind( this ) 
						}
					);
				}
				
				Event.stop( evt );
			}, 
			
			loaderHide : function( evt )
			{
				if ( this.loaderLightbox )
					this.loaderLightbox.hide();
				
				if ( evt )
					Event.stop( evt );
			}, 
			
			loaderShow : function( evt )
			{
				if ( this.loaderLightbox )
					this.loaderLightbox.show();
				
				if ( evt )
					Event.stop( evt );
			}, 
			
			postHide : function( evt )
			{
				if ( this.postLightbox )
					this.postLightbox.hide();
					
				Event.stop( evt );
			}, 
			
			postShow : function( evt )
			{
				if ( !Element.visible( this.POST_COMMENT ) && this.postEffectShow )
					new this.postEffectShow( this.POST_COMMENT );
				
//	only scroll to the point if we are not using a lightbox effect
				if ( this.postEffectScrollTo && !this.commentLightbox )
					new this.postEffectScrollTo( this.POST_COMMENT );
				
				if ( this.postLightbox )
					this.postLightbox.show();
					
				Event.stop( evt );
			}, 
			
			previewComment : function( evt, url )
			{
				if ( this.validate.call( this ) )
				{
					new Ajax.Request( 
						url, 
						{
							method : 'post', 
							postBody : Form.serialize( this.POST_COMMENT ), 
							onFailure : this._handleFailure.bind( this, null ), 
							on404 : this._handleFailure.bind( this, null ), 
							onLoading : this._toggleIndicator.bind( this, 'loading', 'previewShow' ), 
							onLoaded : this._toggleIndicator.bind( this, 'loaded', false ), 
							onSuccess : this._handlePreview.bind( this ) 
						}
					);
				}
				
				Event.stop( evt );
			}, 
			
			previewHide : function( evt )
			{
				if ( this.previewLightbox )
				{
					this.previewLightbox.hide();
					if ( !this.postLightBox )
					{
//	IE is throwing an obscure JS error so I'm using a "non-effect" scroll function for it
						if(  !/MSIE/i.test( navigator.userAgent ) )
							new Effect.ScrollTo( this.POST_COMMENT );
						else 
							Element.scrollTo( this.POST_COMMENT );
					}
				}
					
				if ( evt )
					Event.stop( evt );
			}, 
			
			previewShow : function( evt )
			{
				if ( this.previewLightbox )
					this.previewLightbox.show();
					
				if ( evt )
					Event.stop( evt );
			}, 
			
			validate : function()
			{
				var valid = [];
				valid.push( this._validate.call( this, 'com-name', 'Please enter your name.' ) );
				valid.push( this._validate.call( this, 'com-email', 'Please enter a valid email address.', /^[^@]+@[^@.]+\.[^@]*\w\w$/ ) );
				valid.push( this._validate.call( this, 'comment', 'Please enter your comments.' ) );
					
				return valid.all();
			}, 
/*
*	PRIVATE METHODS
*/
			
			_buildErrorMessage : function( field, msg )
			{
				if ( cssQuery( 'span.error-msg', $( field ).parentNode ).length < 1 )
					$( field ).parentNode.appendChild( 
						Builder.node( 'span', { 'class' : 'error-msg' }, msg )
					);
			}, 
			
			_createCloseLighBoxButtons : function( obj, prefix )
			{
				var button = Builder.node( 
					'a', 
					{  
						'class' : 'com-close', 
						href  : '#close'
					}, 
					[ Builder.node( 'span', 'Close window' ) ]
				);
				
				var button2 = button.cloneNode( true );
				Element.addClassName( button2, 'bottom-align' );
				
				Element.observe( button, 'click', this[prefix + 'Hide'].bind( this ), false );
				
				Element.observe( button2, 'click', this[prefix + 'Hide'].bind( this ), false );
				
				obj.insertBefore( button, obj.firstChild );
				obj.appendChild( button2 );
			}, 
			
			_createEffect : function( obj, effect, prefix )
			{
				Element.toggle( obj );
				switch ( effect.type )
				{
					case 'blind' : 
						Element.addClassName( obj, 'blind-effect' );
						this[prefix + 'EffectShow'] = Effect.BlindDown;
						this[prefix + 'EffectScrollTo'] = Effect.ScrollTo;
						this[prefix + 'EffectHide'] = Effect.BlindUp;
						break;
					case 'lightbox' : 
						Element.addClassName( obj, 'lightbox-effect' );
						this[prefix + 'Lightbox'] = new CLO.LightBox( obj, ( effect.options || {} ) );
						if ( !/preview|loader/i.test( prefix ) )
							this._createCloseLighBoxButtons.call( this, obj, prefix );
						break;
				}
			}, 
			
			_createPreviewButton : function( insertBeforeObj, id )
			{
				var obj = $( insertBeforeObj );
				var previewButton = Builder.node(
					'a', 
					{ 'class' : 'button', href : '#', id : 'com-preview' }, 
					[Builder.node( 'span', 'Preview' )]
				);
				
				var actions = cssQuery( 'p.action', this.POST_COMMENT )[0];
				actions.insertBefore( previewButton, actions.firstChild );
			}, 
			
			_createPreviewDom : function( id )
			{
				try { 
					var previewCloseButton = Builder.node( 
							'a', 
							{ 'class' : 'com-close', href : '#' }, 
							[Builder.node( 'span', 'Close preview pane' )]
						);
					var previewPostButton = Builder.node( 
							'a', 
							{ 'class' : 'button', href : '#' }, 
							[
								Builder.node( 'span', 'Post Comment' )
							]
						);
						
					document.body.appendChild( 
						Builder.node( 
							'div', 
							{ 'id' : id + '-dom' }, 
							[
								Builder.node( 
									'div', 
									{ 'class' : id + '-taskbar' }, 
									[
										Builder.node( 
											'h3', 
											'This is only a preview'
										), 
										previewCloseButton
									]
								), 
								Builder.node(  'div', { 'class' : id + '-target' } ), 
								Builder.node( 
									'div', 
									{ 'class' : id + '-taskbar' }, 
									[
										Builder.node( 
											'h3', 
											'This is only a preview'
										), 
										previewPostButton
									]
								) 
							]
						)
					);
					Event.observe( previewCloseButton, 'click', this.previewHide.bind( this ), false );
					Event.observe( previewPostButton, 'click', this.handlePost.bind( this ), false );
					this.previewTarget = $( id + '-dom' );
				}
				catch ( e ) { return false; }
				
				return true;
			}, 
			
			_createPostDom : function( id )
			{
				try { 
					document.body.appendChild( 
						Builder.node( 
							'div', 
							{ 'id' : id + '-dom' }, 
							[
								Builder.node( 
									'h3', 
									'Please wait while we post your comment.'
								) 
							]
						)
					);
					this.postLoader = $( id + '-dom' );
				}
				catch ( e ) { return false; }
				
				return true;
			}, 
			
			_handleFailure : function( func, response )
			{
				if ( func ) this[func].call( this );
				
				console.log( "request failed. " + response.statusText );
				console.log( response );
			}, 
			
			_handlePreview : function( response )
			{
				if ( Element.hasClassName( this.previewTarget, 'loading' ) )
					Element.removeClassName( this.previewTarget, 'loading' );
				cssQuery( 'div[class*=target]', this.previewTarget )[0].innerHTML = response.responseText;
			}, 
			
			_handlePost : function( response )
			{
				var comments = document.createElement( 'div' );
				comments.innerHTML = response.responseText;
				
				try { 
					this.COMMENTS.innerHTML = comments.getElementsByTagName( 'div' )[0].innerHTML;
					this._handleResetPage.call( this );
				} catch ( e ) { }
				
				this.loaderHide.call( this );
			}, 
			
			_handleResetPage : function()
			{
				cssQuery( 'div[id$=-dom]' ).each( function( element )
				{
					document.body.removeChild( element );
				}.bind( this ) );
				
				cssQuery( 'div[class~=lightbox]' ).each( function( element )
				{
					document.body.removeChild( element );
				}.bind( this ) );
				
				this.initialize.call( this, this.args[0], this.args[1], this.args[2] );
			}, 
			
			_toggleIndicator : function( status, func, response )
			{
				if ( /loading/i.test( status ) )
					Element.addClassName( this.previewTarget, 'loading' );
				else
					Element.removeClassName( this.previewTarget, 'loading' );
				
				if ( func ) 
					this[func].call( this );
			}, 
			
			_validate : function( field, msg )
			{
				var valid = true;
				
				if ( $F( field ) == '' || ( arguments[2] && !arguments[2].test( $F( field ) ) ) )
				{
					Element.addClassName( $( field ).parentNode, 'error' );
					
					this._buildErrorMessage.call( this, field, msg )
					
					valid = false;
				}
				else
				{
					Element.removeClassName( $( field ).parentNode, 'error' );
					var errorMsg = cssQuery( 'span.error-msg', $( field ).parentNode )[0];
					if ( errorMsg )
						Element.remove( errorMsg );
				}
				
				return valid;
			}
		};
			
/**
*	LightBox UI effect
*
*	@author     Chris Constandinou <chris@constantology.com>
*
**/

		CLO.LightBox = Class.create();
		CLO.LightBox.prototype = {
			initialize : function( obj, options )
			{
				this.options = $H( {
					center : true, 
					noScroll : false, 
					partial : false
				} ).merge( options || {} );
				
				this.LIGHTBOX = Builder.node( 
					'div', 
					{ 
						'class' : 'lightbox', 
						'style' : 'display : none ;'
					},
					[
						Builder.node( 
							'div', 
							{ 'class' : 'lightbox-copy ' }
						)
					]
				);
				document.body.appendChild( this.LIGHTBOX );
				
				if ( this.options.extraClassNames )
					Element.addClassName( this.LIGHTBOX, this.options.extraClassNames );
				
				this.LIGHTBOX_COPY = $( obj );
		//	this is for IE mainly but we will use this also for a common centre effect
				document.body.appendChild( this.LIGHTBOX_COPY );
				
				this.LIGHTBOX.setAttribute( 'visible', 'false' );
				
				this.LIGHTBOX.style.height = this.getDimension()['docHeight'] + 'px';
				this.LIGHTBOX.style.width = this.getDimension()['docWidth'] + 'px';
				
		//	resize is crashing IE, so...
				if ( !window.attachEvent )
					Event.observe( window, 'resize', this.setDimensions.bind( this ), false );
				
				if ( this.options.partial && navigator.appVersion.match( /MSIE/i ) )
					document.body.appendChild( Builder.node( 'div', { id : 'ie-fix' } ) );
			},
			
			centerCopy : function()
			{
				if ( navigator.appVersion.match( /MSIE/i ) || document.defaultView.getComputedStyle( this.LIGHTBOX_COPY, null ) )
					this.LIGHTBOX_COPY.style.left = ( this.getDimension()['docWidth'] - parseInt( Element.getStyle( this.LIGHTBOX_COPY, 'width' ) ) ) / 2 + 'px';
				else
					this.LIGHTBOX_COPY.style.left = '15%';
			}, 
			
			getDimension : function()
			{
				return { 
					docHeight : document.body.clientHeight + 50, 
					docWidth : document.body.clientWidth, 
					winHeight : ( window.innerHeight || document.documentElement.offsetHeight ) - 50, 
					winWidth : ( window.innerWidth || document.documentElement.offsetWidth )
				};
			}, 
			
			hide : function( obj )
			{
				Effect.Fade( 
					this.LIGHTBOX_COPY, 
					{
						duration : 0.5, 
						afterFinish: function()
						{
							if ( this.options.extraClassNames )
								this.togglePageContainer.call( this, this.options.extraClassNames, 'remove' );
								
							Effect.Fade( this.LIGHTBOX,{duration : 0.5});
						}.bind(this) 
					} 
				);
				
				if ( this.options.partial && navigator.appVersion.match( /MSIE/i ) )
				{
					this.toggleIEPotisionFixed.call( this, false );
					this.toggleSelectLists.call( this, 'visible' );
				}
				
				this.LIGHTBOX.setAttribute( 'visible', 'false' );
				
				if ( obj )
					new Effect.ScrollTo( obj );
			}, 
			
			setDimensions : function()
			{
//			console.log( document.documentElement.offsetHeight );
				if ( this.options.partial )
				{
					this.LIGHTBOX_COPY.style.height = this.getDimension()['winHeight'] + 'px';
					
					this.LIGHTBOX.style.height = this.getDimension()['docHeight'] + 'px';
				}
				else
				{
					this.LIGHTBOX.style.height = this.getDimension()['docHeight'] + 'px';
					this.LIGHTBOX.style.width = this.getDimension()['docWidth'] + 'px';
				}
				
				if ( this.options.center )
					this.centerCopy.call( this );
			}, 

			show : function()
			{
				if ( this.options.partial )
				{
					if ( navigator.appVersion.match( /MSIE/i ) )
					{
						this.toggleSelectLists.call( this, 'hidden' );
						this.toggleIEPotisionFixed.call( this, true );
					}
					
					if ( this.options.extraClassNames )
						this.togglePageContainer.call( this, this.options.extraClassNames, 'add' );
				}
				this.setDimensions.call( this );
					
				Effect.Appear( 
					this.LIGHTBOX, 
					{ 
						duration : 0.5, 
						to: 0.8, 
						afterFinish: function()
						{
							if ( this.options.noScroll )
								this.LIGHTBOX_COPY.style.top = ( ( window.pageYOffset
															                || document.documentElement.scrollTop
															                || document.body.scrollTop
															                || 0 ) + 50 ) + 'px'; 
																			
							Effect.Appear( this.LIGHTBOX_COPY, { duration : 0.5 } );
						}.bind(this) 
					} 
				);
				
				this.LIGHTBOX.setAttribute( 'visible', 'true' );
				
				if ( !this.options.noScroll )
					new Effect.ScrollTo( document.body );
//				window.scroll( 0, 0 );
			}, 
			
			toggleIEPotisionFixed : function( showLightBox )
			{
				if ( showLightBox )
					$( 'ie-fix' ).appendChild( document.getElementsByTagName( 'div' )[0] );
				else
					document.body.insertBefore( $( 'ie-fix' ).getElementsByTagName( 'div' )[0], document.body.firstChild );
			}, 
			
			togglePageContainer : function( className, type )
			{
				Element[type + 'ClassName']( document.documentElement, className );
			}, 
			
			toggleSelectLists : function( visibility )
			{
				cssQuery( 'select' ).each( function( list )
				{
					list.style.visbility = visibility;
				} );
			}
		};

/*
	cssQuery, version 2.0.2 (2005-08-19)
	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
	License: http://creativecommons.org/licenses/LGPL/2.1/
*/
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 x=6(){7 1D="2.0.2";7 C=/\\s*,\\s*/;7 x=6(s,A){33{7 m=[];7 u=1z.32.2c&&!A;7 b=(A)?(A.31==22)?A:[A]:[1g];7 1E=18(s).1l(C),i;9(i=0;i<1E.y;i++){s=1y(1E[i]);8(U&&s.Z(0,3).2b("")==" *#"){s=s.Z(2);A=24([],b,s[1])}1A A=b;7 j=0,t,f,a,c="";H(j<s.y){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.Z(0,-1);c+="("+a+")"}A=(u&&V[c])?V[c]:21(A,t,f,a);8(u)V[c]=A}m=m.30(A)}2a x.2d;5 m}2Z(e){x.2d=e;5[]}};x.1Z=6(){5"6 x() {\\n  [1D "+1D+"]\\n}"};7 V={};x.2c=L;x.2Y=6(s){8(s){s=1y(s).2b("");2a V[s]}1A V={}};7 29={};7 19=L;x.15=6(n,s){8(19)1i("s="+1U(s));29[n]=12 s()};x.2X=6(c){5 c?1i(c):o};7 D={};7 h={};7 q={P:/\\[([\\w-]+(\\|[\\w-]+)?)\\s*(\\W?=)?\\s*([^\\]]*)\\]/};7 T=[];D[" "]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=X(f[i],t,n);9(j=0;(e=s[j]);j++){8(M(e)&&14(e,n))r.z(e)}}};D["#"]=6(r,f,i){7 e,j;9(j=0;(e=f[j]);j++)8(e.B==i)r.z(e)};D["."]=6(r,f,c){c=12 1t("(^|\\\\s)"+c+"(\\\\s|$)");7 e,i;9(i=0;(e=f[i]);i++)8(c.l(e.1V))r.z(e)};D[":"]=6(r,f,p,a){7 t=h[p],e,i;8(t)9(i=0;(e=f[i]);i++)8(t(e,a))r.z(e)};h["2W"]=6(e){7 d=Q(e);8(d.1C)9(7 i=0;i<d.1C.y;i++){8(d.1C[i]==e)5 K}};h["2V"]=6(e){};7 M=6(e){5(e&&e.1c==1&&e.1f!="!")?e:23};7 16=6(e){H(e&&(e=e.2U)&&!M(e))28;5 e};7 G=6(e){H(e&&(e=e.2T)&&!M(e))28;5 e};7 1r=6(e){5 M(e.27)||G(e.27)};7 1P=6(e){5 M(e.26)||16(e.26)};7 1o=6(e){7 c=[];e=1r(e);H(e){c.z(e);e=G(e)}5 c};7 U=K;7 1h=6(e){7 d=Q(e);5(2S d.25=="2R")?/\\.1J$/i.l(d.2Q):2P(d.25=="2O 2N")};7 Q=6(e){5 e.2M||e.1g};7 X=6(e,t){5(t=="*"&&e.1B)?e.1B:e.X(t)};7 17=6(e,t,n){8(t=="*")5 M(e);8(!14(e,n))5 L;8(!1h(e))t=t.2L();5 e.1f==t};7 14=6(e,n){5!n||(n=="*")||(e.2K==n)};7 1e=6(e){5 e.1G};6 24(r,f,B){7 m,i,j;9(i=0;i<f.y;i++){8(m=f[i].1B.2J(B)){8(m.B==B)r.z(m);1A 8(m.y!=23){9(j=0;j<m.y;j++){8(m[j].B==B)r.z(m[j])}}}}5 r};8(![].z)22.2I.z=6(){9(7 i=0;i<1z.y;i++){o[o.y]=1z[i]}5 o.y};7 N=/\\|/;6 21(A,t,f,a){8(N.l(f)){f=f.1l(N);a=f[0];f=f[1]}7 r=[];8(D[t]){D[t](r,A,f,a)}5 r};7 S=/^[^\\s>+~]/;7 20=/[\\s#.:>+~()@]|[^\\s#.:>+~()@]+/g;6 1y(s){8(S.l(s))s=" "+s;5 s.P(20)||[]};7 W=/\\s*([\\s>+~(),]|^|$)\\s*/g;7 I=/([\\s>+~,]|[^(]\\+|^)([#.:@])/g;7 18=6(s){5 s.O(W,"$1").O(I,"$1*$2")};7 1u={1Z:6(){5"\'"},P:/^(\'[^\']*\')|("[^"]*")$/,l:6(s){5 o.P.l(s)},1S:6(s){5 o.l(s)?s:o+s+o},1Y:6(s){5 o.l(s)?s.Z(1,-1):s}};7 1s=6(t){5 1u.1Y(t)};7 E=/([\\/()[\\]?{}|*+-])/g;6 R(s){5 s.O(E,"\\\\$1")};x.15("1j-2H",6(){D[">"]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=1o(f[i]);9(j=0;(e=s[j]);j++)8(17(e,t,n))r.z(e)}};D["+"]=6(r,f,t,n){9(7 i=0;i<f.y;i++){7 e=G(f[i]);8(e&&17(e,t,n))r.z(e)}};D["@"]=6(r,f,a){7 t=T[a].l;7 e,i;9(i=0;(e=f[i]);i++)8(t(e))r.z(e)};h["2G-10"]=6(e){5!16(e)};h["1x"]=6(e,c){c=12 1t("^"+c,"i");H(e&&!e.13("1x"))e=e.1n;5 e&&c.l(e.13("1x"))};q.1X=/\\\\:/g;q.1w="@";q.J={};q.O=6(m,a,n,c,v){7 k=o.1w+m;8(!T[k]){a=o.1W(a,c||"",v||"");T[k]=a;T.z(a)}5 T[k].B};q.1Q=6(s){s=s.O(o.1X,"|");7 m;H(m=s.P(o.P)){7 r=o.O(m[0],m[1],m[2],m[3],m[4]);s=s.O(o.P,r)}5 s};q.1W=6(p,t,v){7 a={};a.B=o.1w+T.y;a.2F=p;t=o.J[t];t=t?t(o.13(p),1s(v)):L;a.l=12 2E("e","5 "+t);5 a};q.13=6(n){1d(n.2D()){F"B":5"e.B";F"2C":5"e.1V";F"9":5"e.2B";F"1T":8(U){5"1U((e.2A.P(/1T=\\\\1v?([^\\\\s\\\\1v]*)\\\\1v?/)||[])[1]||\'\')"}}5"e.13(\'"+n.O(N,":")+"\')"};q.J[""]=6(a){5 a};q.J["="]=6(a,v){5 a+"=="+1u.1S(v)};q.J["~="]=6(a,v){5"/(^| )"+R(v)+"( |$)/.l("+a+")"};q.J["|="]=6(a,v){5"/^"+R(v)+"(-|$)/.l("+a+")"};7 1R=18;18=6(s){5 1R(q.1Q(s))}});x.15("1j-2z",6(){D["~"]=6(r,f,t,n){7 e,i;9(i=0;(e=f[i]);i++){H(e=G(e)){8(17(e,t,n))r.z(e)}}};h["2y"]=6(e,t){t=12 1t(R(1s(t)));5 t.l(1e(e))};h["2x"]=6(e){5 e==Q(e).1H};h["2w"]=6(e){7 n,i;9(i=0;(n=e.1F[i]);i++){8(M(n)||n.1c==3)5 L}5 K};h["1N-10"]=6(e){5!G(e)};h["2v-10"]=6(e){e=e.1n;5 1r(e)==1P(e)};h["2u"]=6(e,s){7 n=x(s,Q(e));9(7 i=0;i<n.y;i++){8(n[i]==e)5 L}5 K};h["1O-10"]=6(e,a){5 1p(e,a,16)};h["1O-1N-10"]=6(e,a){5 1p(e,a,G)};h["2t"]=6(e){5 e.B==2s.2r.Z(1)};h["1M"]=6(e){5 e.1M};h["2q"]=6(e){5 e.1q===L};h["1q"]=6(e){5 e.1q};h["1L"]=6(e){5 e.1L};q.J["^="]=6(a,v){5"/^"+R(v)+"/.l("+a+")"};q.J["$="]=6(a,v){5"/"+R(v)+"$/.l("+a+")"};q.J["*="]=6(a,v){5"/"+R(v)+"/.l("+a+")"};6 1p(e,a,t){1d(a){F"n":5 K;F"2p":a="2n";1a;F"2o":a="2n+1"}7 1m=1o(e.1n);6 1k(i){7 i=(t==G)?1m.y-i:i-1;5 1m[i]==e};8(!Y(a))5 1k(a);a=a.1l("n");7 m=1K(a[0]);7 s=1K(a[1]);8((Y(m)||m==1)&&s==0)5 K;8(m==0&&!Y(s))5 1k(s);8(Y(s))s=0;7 c=1;H(e=t(e))c++;8(Y(m)||m==1)5(t==G)?(c<=s):(s>=c);5(c%m)==s}});x.15("1j-2m",6(){U=1i("L;/*@2l@8(@\\2k)U=K@2j@*/");8(!U){X=6(e,t,n){5 n?e.2i("*",t):e.X(t)};14=6(e,n){5!n||(n=="*")||(e.2h==n)};1h=1g.1I?6(e){5/1J/i.l(Q(e).1I)}:6(e){5 Q(e).1H.1f!="2g"};1e=6(e){5 e.2f||e.1G||1b(e)};6 1b(e){7 t="",n,i;9(i=0;(n=e.1F[i]);i++){1d(n.1c){F 11:F 1:t+=1b(n);1a;F 3:t+=n.2e;1a}}5 t}}});19=K;5 x}();',62,190,'|||||return|function|var|if|for||||||||pseudoClasses||||test|||this||AttributeSelector|||||||cssQuery|length|push|fr|id||selectors||case|nextElementSibling|while||tests|true|false|thisElement||replace|match|getDocument|regEscape||attributeSelectors|isMSIE|cache||getElementsByTagName|isNaN|slice|child||new|getAttribute|compareNamespace|addModule|previousElementSibling|compareTagName|parseSelector|loaded|break|_0|nodeType|switch|getTextContent|tagName|document|isXML|eval|css|_1|split|ch|parentNode|childElements|nthChild|disabled|firstElementChild|getText|RegExp|Quote|x22|PREFIX|lang|_2|arguments|else|all|links|version|se|childNodes|innerText|documentElement|contentType|xml|parseInt|indeterminate|checked|last|nth|lastElementChild|parse|_3|add|href|String|className|create|NS_IE|remove|toString|ST|select|Array|null|_4|mimeType|lastChild|firstChild|continue|modules|delete|join|caching|error|nodeValue|textContent|HTML|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard||odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|Function|name|first|level2|prototype|item|scopeName|toUpperCase|ownerDocument|Document|XML|Boolean|URL|unknown|typeof|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try'.split('|'),0,{}))
