/*
 * jQuery 1.2.6 - New Wave Javascript
 *
 * Copyright (c) 2008 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2008/10/06 16:08:32 $
 * $Rev: 5685 $
 */
(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();// Reassign jQuery from $ (already used by the FT) to $jq.
var $jq = jQuery.noConflict();

var benchvar = false;
var showtimer = false;
var hidetimer = false;
var menuhidetimer = false;

// Collapse or expand the container holding the search filter lists
function toggleSearchFilters() {
	var controlele = $jq("#collapseexpandfilters");
	if (controlele.html() == "Show advanced search filters") {
		controlele.addClass("expanded").html("Hide advanced search filters");
		$jq("#searchfilters").show();
	} else {
		controlele.removeClass("expanded").html("Show advanced search filters");
		$jq("#searchfilters").hide();
	}
	controlele.get(0).blur();
	repositionRankingsTable();
}

// Collapse or expand the container holding the field toggle checkboxes
function toggleRankingsControls() {
	var controlele = $jq("#collapseexpandcontrol");
	if (controlele.html() == "Show all available fields") {
		controlele.addClass("expanded").html("Show featured fields");
		$jq(".fieldhidden", $jq("#columncontrol")).show();
	} else {
		controlele.removeClass("expanded").html("Show all available fields");
		$jq(".fieldhidden", $jq("#columncontrol")).hide();
	}
	controlele.get(0).blur();
	repositionRankingsTable();
}

// Show a column as a result of checking the control.  Mark the column as visible and redraw the table.
function showRankingsColumn(columnid) {
	if (!rankingstabledetails.loaded) initRankingsTable();
	
	// Log an event
	logActionToWebtrends("addcolumn", decodeURIComponent(rankingstabledetails.columns[columnid].title));

	rankingstabledetails.activecolumns[rankingstabledetails.columns[columnid].colnum] = columnid;
	startWaiting("Adding new column");
	setTimeout(recreateRankingsTable, 100);
}

// Hide a column, either as a result of closing the column via the "X" or unchecking a control.
// Update the interface if necessary, mark the column as hidden, and redraw the table.
function hideRankingsColumn(e, columnid) {
	if (e !== false) {
		if (!e) var e = window.event;
		if (e) {
			e.cancelBubble = true;
			if (e.stopPropagation) e.stopPropagation();
		}
	}
	var controlele = $jq("#field"+columnid);
	var listele = controlele.parent().parent();
	if (!rankingstabledetails.loaded) initRankingsTable();

	// Log an event
	logActionToWebtrends("removecolumn", decodeURIComponent(rankingstabledetails.columns[columnid].title));

	delete(rankingstabledetails.activecolumns[rankingstabledetails.columns[columnid].colnum]);
	if (controlele.attr("checked")) {
		listele.addClass("fieldoff").removeClass("fieldon");	
		controlele.uncheck();
	}
	startWaiting("Removing column");
	setTimeout(recreateRankingsTable, 100);
}

// Called as a result of a column control being toggled.  Update the interface to match, and call the
// appropriate action function.
function toggleFieldControl(columnid) {
	var controlele = $jq("#field"+columnid);
	var listele = controlele.parent().parent();
	if (controlele.attr("checked")) {
		listele.addClass("fieldon").removeClass("fieldoff");
		showRankingsColumn(columnid);
	} else {
		listele.addClass("fieldoff").removeClass("fieldon");	
		hideRankingsColumn(false, columnid);
	}
}

// Called as a result of the user clicking in a table header or on the sort control
function sortRankingsTable(columnid) {
	if (!rankingstabledetails.loaded) initRankingsTable();
	if ($jq("#waitspinner").css("display")=="none") {
		startWaiting("Sorting");
		setTimeout("sortRankingsTable("+columnid+")", 100);
		return false;
	}

	// Determine sort direction (either last used for col or opposite of current sort)
	var alreadysorted = rankingstabledetails.activecolumns[rankingstabledetails.cursort]==columnid;
	if (alreadysorted) {
		var sortdir = ($jq("#th"+columnid).is(".ascsort")) ? "desc" : "asc";
	} else {
		var sortdir = rankingstabledetails.columns[columnid].sort;
	}
	var columndefaultsort = rankingstabledetails.columns[columnid].initsort;

	// Log an event
	logActionToWebtrends("sort", decodeURIComponent(rankingstabledetails.columns[columnid].title)+" ("+sortdir+")");
	
	// Set global sort parameters for visual effects when redrawing the table
	rankingstabledetails.cursort = rankingstabledetails.columns[columnid].colnum;
	rankingstabledetails.columns[columnid].sort = sortdir;

	// Perform sort
	var type = rankingstabledetails.columns[columnid].type;
	if (type == "text") {
		rankingstabledetails.table.sort(rtSortText);
	} else if (type == "numberwithmeta") {
		rankingstabledetails.table.sort(rtSortNumericWithMeta);
	} else {
		rankingstabledetails.table.sort(rtSortNumeric);
	}

	// Redraw the table
	recreateRankingsTable();

	// Sort callbacks
	// Alphabetic sort for text, numeric sort for all numbers.  Formatted 
	// number and regular number can use same sort callback, since in each
	// case we're just interested in the numeric part of the string.
	// Number-with-meta needs a slightly different preprocessing function so
	// it gets it's own sort callback.  Final note: Numeric sorts are
	// overridden if one of the values is non-numeric, forcing those
	// rows to the bottom of the table.
	function rtSortText(a,b) {
		var x = a[rankingstabledetails.cursort].val;
		var y = b[rankingstabledetails.cursort].val;
		var ret = ((x<y)?-1 : ((x>y)?1:0));
		return (sortdir=="desc") ? -1 * ret : ret;
	}
	function rtSortNumeric(a,b) {
		var x = a[rankingstabledetails.cursort].val.replace(/[^0-9\.]/, "");
		var y = b[rankingstabledetails.cursort].val.replace(/[^0-9\.]/, "");
		var ret = x-y;
		if ((x === "" || isNaN(x)) && (y !== "" && !isNaN(y))) ret = (columndefaultsort=="desc") ? -1 : 1;
		if ((y === "" || isNaN(y)) && (x !== "" && !isNaN(x))) ret = (columndefaultsort=="desc") ? 1 : -1;
		if ((y === "" || isNaN(y)) && (x === "" || isNaN(x))) ret = 0;
		return (sortdir=="desc") ? -1 * ret : ret;
	}
	function rtSortNumericWithMeta(a,b) {
		var x = a[rankingstabledetails.cursort].val.replace(/^([0-9\.]+)[\s\(].*$/, "$1");
		var y = b[rankingstabledetails.cursort].val.replace(/^([0-9\.]+)[\s\(].*$/, "$1");
		var ret = x-y;
		if ((x === "" || isNaN(x)) && (y !== "" && !isNaN(y))) ret = (columndefaultsort=="desc") ? -1 : 1;
		if ((y === "" || isNaN(y)) && (x !== "" && !isNaN(x))) ret = (columndefaultsort=="desc") ? 1 : -1;
		if ((y === "" || isNaN(y)) && (x === "" || isNaN(x))) ret = 0;
		return (sortdir=="desc") ? -1 * ret : ret;
	}
}

function searchRankings() {
	
	// Check the advanced filters, if present, and reset the activefilters as appropriate
	// rankingstabledetails.filters maps the filter select offset to the column ID filtered by that box
	if (rankingstabledetails.filters) {
		rankingstabledetails.activefilters = {length:0};

		// For each filter list, fetch all the options
		for (var i=rankingstabledetails.filters.length; i>=0; i--) {
			var selecteditems = new Array();
			var filteroptions = $jq("option", $jq("#filterlist"+rankingstabledetails.filters[i]));

			// For each option, collate all the selected ranges into an array
			// Each option's value will be either a range in the form low|high or a single value
			for (var j=filteroptions.length-1; j>=0; j--) {
				if (filteroptions[j].selected) {
					var filtervalue = filteroptions[j].value;
					filtervalue = filtervalue.split("|");
					if (filtervalue.length == 2) {
						var filterout = {low:parseFloat(filtervalue[0]), high:parseFloat(filtervalue[1]), val:false};
					} else {
						var filterout = {low:false, high:false, val:parseFloat(filtervalue[0])};
					}
					selecteditems[selecteditems.length] = filterout;
				}
			}

			// Save the selected ranges against the relevant column
			if (selecteditems.length && selecteditems.length != filteroptions.length) {
				rankingstabledetails.activefilters[rankingstabledetails.filters[i]] = selecteditems;
				rankingstabledetails.activefilters.length++;
			}
		}
	}

	$jq("#rankingssearchsubmit").get(0).blur();
	$jq("#rankingsadvsearchsubmit").get(0).blur();
	$jq("#advsearchpreview").html("");
	var q = $jq("#rankingssearchtext").val();
	if (!q.length && !rankingstabledetails.activefilters.length) {
		alert("Please enter a search word or phrase");
		$jq("#rankingssearchtext").get(0).focus();
		return false;
	}

	if (q) {
		
		// Send to webtrends if the search string has changed
		var querystrings = getQueryStrings();
		if (!querystrings["search"] || decodeURIComponent(querystrings["search"].replace(/\+/g, " ")) != q) {
			logActionToWebtrends("search", q);
		}
	
		$jq("#rankingssearchreset").css("display", "inline");
		$jq("#rankingssearchtext").css("background-color", "#FFC");
		rankingstabledetails.filter = q.replace(/[^\w ]/gi, "").replace(/^\s+|\s+$/g, '').toLowerCase();
	} else {
		rankingstabledetails.filter = "";
		$jq("#rankingssearchreset").css("display", "none");
		$jq("#rankingssearchtext").css("background-color", "#FFF");
	}

	startWaiting("Searching");
	setTimeout(recreateRankingsTable, 100);
	return false;
}

function resetRankingSearch(resetsearchtext, resetadvfilters) {
	if (typeof(resetsearchtext) == "undefined") resetsearchtext = true;
	if (typeof(resetadvfilters) == "undefined") resetadvfilters = true;
	
	if (resetsearchtext) {
		$jq("#rankingssearchreset").hide();
		rankingstabledetails.filter = false;
		$jq("#rankingssearchreset").css("display", "none");
		$jq("#rankingssearchtext").css("background-color", "#FFF");
	}
	
	if (resetadvfilters && rankingstabledetails.filters) {
		rankingstabledetails.activefilters = {length:0};
		for (var i=rankingstabledetails.filters.length; i>=0; i--) {
			$jq("option", $jq("#filterlist"+rankingstabledetails.filters[i])).attr("selected", false);
		}
		$jq("select.filterlistselect option").css("color", "menutext").each(function() { this.disabled=false });
		$jq("#advsearchpreview").html("");
	}

	
	startWaiting("Clearing search");
	setTimeout(recreateRankingsTable, 100);
	return false;
}

function updateAdvancedFilters() {
	
	// Get all options and current selections from filter boxes
	var filters = new Object();
	for (var i=rankingstabledetails.filters.length-1; i>=0; i--) {
		var filteroptions = $jq("option", $jq("#filterlist"+rankingstabledetails.filters[i]));
		filters[rankingstabledetails.filters[i]] = {numselected:0};
		filters[rankingstabledetails.filters[i]].opts = new Array(); // "The filter for column n has these options"

		// For each option, collate all the available ranges
		// Each option's value will be either a range in the form low|high or a single value
		for (var j=filteroptions.length-1; j>=0; j--) {
			var filtervalue = filteroptions[j].value;
			filtervalue = filtervalue.split("|");
			if (filtervalue.length == 2) {
				var opt = {low:parseFloat(filtervalue[0]), high:parseFloat(filtervalue[1]), val:false};
			} else {
				var opt = {low:false, high:false, val:parseFloat(filtervalue[0])};
			}
			opt.selected = filteroptions[j].selected;
			if (opt.selected) filters[rankingstabledetails.filters[i]].numselected++;
			filters[rankingstabledetails.filters[i]].opts[j] = opt;
		}
	}

	// Get list of rows that match current selections
	var itemcount = rankingstabledetails.table.length;
	var validrowcount = 0;
	var colmap = new Array();
	for (var key in rankingstabledetails.columns) colmap[colmap.length] = key;
	for (var i=0; i<itemcount; i++) {
		var rowitems = rankingstabledetails.table[i];
		var rowitemlength = rowitems.length;
		var filtermatchfail = false;
		var optsmatched = new Object();
		for (var j=1; j<rowitemlength; j++) {
			if (filters[colmap[j-1]]) {
				var advfiltermatched = false;
				var celldata = rowitems[j].val;
				celldata = celldata.replace(/^([\-0-9\.]+)[\s?\(].*$/, "$1");
				celldata = celldata.replace(/[^\-0-9\.]/g, "");
				celldata = parseFloat(celldata);
				optsmatched[j-1] = new Object();
				var filtertocheck = filters[colmap[j-1]].opts;
				for (var k=0; k<filtertocheck.length; k++) {
					var v = filtertocheck[k];
					if (v.val === false) {
						if (celldata <= v.high && celldata >= v.low) {
							if (v.selected) advfiltermatched = true;
							optsmatched[j-1][k] = true;
						}
					} else {
						if (celldata == v.val) {
							if (v.selected) advfiltermatched = true;
							optsmatched[j-1][k] = true;
						}
					}
				}
				if (filters[colmap[j-1]].numselected && filters[colmap[j-1]].numselected != filters[colmap[j-1]].opts.length && !advfiltermatched) {
					filtermatchfail = true;
					break;
				}
			}
		}
		if (!filtermatchfail) {
			validrowcount++;
			for (coloffset in optsmatched) {
				for (optionoffset in optsmatched[coloffset]) {
					if (optsmatched[coloffset][optionoffset]) filters[colmap[coloffset]].opts[optionoffset].matched=true;
				}
			}
		}
	}
	$jq("#advsearchpreview").html("Your new selections match "+validrowcount+" entr"+((validrowcount==1)?"y":"ies")+".  Click apply to update the table.");

	// Grey out options in unused select boxes that would yield zero results
	for (var colid in filters) {
		if (filters[colid].numselected) {
			$jq("option", $jq("#filterlist"+colid)).each(function() { this.disabled=false });
		} else {
			for (var i=0; i<filters[colid].opts.length; i++) {
				$jq("#filterlist"+colid+" option").get(i).disabled = (filters[colid].opts[i].matched) ? false : true;
				$jq("#filterlist"+colid+" option").eq(i).css("color", (filters[colid].opts[i].matched) ? "menutext" : "graytext");
			}
		}
	}
}

function compareRankings() {
	$jq("#notepopup").hide();
	rankingstabledetails.compareEnabled = (rankingstabledetails.compareEnabled) ? 0 : 1;
	var numtocompare = 0;
	if (rankingstabledetails.compareEnabled) {
		for (var i=(rankingstabledetails.table.length-1); i>=0; i--) {
			if (rankingstabledetails.table[i][0].val.indexOf("checked=\"checked") != -1) numtocompare++;
		}
		if (!numtocompare) {
			alert("You must tick one or more rows to compare before clicking the compare button");
			rankingstabledetails.compareEnabled = 0;
			return false;
		} else {
		
			// Log an event
			logActionToWebtrends("compare", numtocompare+" rows");
		}
	}
	startWaiting("Please wait");
	setTimeout(recreateRankingsTable, 100);
}

function toggleCompareState(evt) {
	var chk = evt.target;
	var el = chk;
	var rowindex = 0;
	while (el.tagName!="TR") el = el.parentNode;
	if (el.id.substr(0,9)=='rowoffset') {
		rowindex = el.id.substr(9);
	} else {
		while (el = el.previousSibling) if (el.tagName=="TR") rowindex++;
	}
	rankingstabledetails.table[rowindex][0].val = "<input type=\"checkbox\" name=\"comp\" class=\"compcheck\""+((chk.checked)?" checked=\"checked\"":"")+" />";
}

function startWaiting(str) {
	var wh = (self.innerHeight) ? self.innerHeight : document.documentElement.clientHeight;
	var y = (self.pageYOffset) ? self.pageYOffset : document.documentElement.scrollTop;
	var x = (self.pageXOffset) ? self.pageXOffset : document.documentElement.scrollLeft;
	$jq("#waitspinner div").html(str);
	$jq("#waitspinner").css({top:(y+(wh/2))+'px',left:(x+365)+'px',display:'block'});
}

// Read in the rankings table and construct a javascript array of all the values for easy rebuilds.
function initRankingsTable() {
	if (rankingstabledetails.loading) return;
	rankingstabledetails.loading = true;

	// Create the note popup bubble
	createNoteBubble();
	
	// Remove accessible note markers
	$jq("sup", "#rankingstable").remove();

	// Initialise table data structure
	rankingstabledetails.notetexts = new Array();
	rankingstabledetails.onmouseovers = new Array();
	rankingstabledetails.headerdescs = new Array();
	rankingstabledetails.activecolumns = new Array();
	rankingstabledetails.table = new Array();
	rankingstabledetails.filters = new Array();
	rankingstabledetails.activefilters = {length:0};
	
	// Load notes into memory (located at end of HTML source)
	$jq(".notes p").each(function(i) {
		var ele = $jq(this);
		var note = $jq(this).html().replace(/^[0-9]+\.\s+/, "");
		rankingstabledetails.notetexts[i+1] = note;
	});

	// Load note index from inline JS in HTML source
	var notes = rankingstabledetails.notes;
	
	// Store default sort orders
	for (var key in rankingstabledetails.columns) {
		if (rankingstabledetails.columns[key].sort) rankingstabledetails.columns[key].initsort = rankingstabledetails.columns[key].sort;
	}

	// Establish array of active columns, and mark sort column
	// Note the use of i (column offset) and colid (unique field id from db)
	// Read column header metadata from source
	var idstring;
	var jstablehead = new Array();
	var tableheadings = $jq("#rankingstable thead").get(0).childNodes;
	for (var i=tableheadings[0].childNodes.length-1; i>=0; i--) {
		var el = tableheadings[0].childNodes[i];
		idstring = el.id;
		if (idstring) {
			colid = idstring.substring(2);
			if (colid == rankingstabledetails.entityfield) rankingstabledetails.activecolumns[i] = colid;
			if ($jq("#field"+colid).attr("checked")) rankingstabledetails.activecolumns[i] = colid;
		}
		if ($jq(el).is(".cursort")) rankingstabledetails.cursort = i;
		rankingstabledetails.headerdescs[i] = el.title;
		el.title = "";
		rankingstabledetails.onmouseovers[i] = el.onmouseover;
		jstablehead[i] = el.innerHTML;
	}
	rankingstabledetails.headings = jstablehead.slice(0);
	
	// Prepare to create a table based on the cells present in the HTML source
	var currenttable = $jq("#rankingstable tbody").get(0).childNodes;
	var jstable = new Array();

	// Last row containing compare button is not counted, iterate over all others
	var numrows = (currenttable.length - 1); 
	for (var i=numrows-1; i>=0; i--) {
		var tablerow = new Array();
		var rowitems = currenttable[i].childNodes;

		// Iterate over the cells in the row
		for (var j=rowitems.length-1; j>=0; j--) {
			tablerow[j] = {val:rowitems[j].innerHTML};

			// If the row has a note (looked up from note index) add it to the row object in memory
			if (notes[i] && notes[i][j]) {
				rowitems[j].innerHTML = "<span>"+rowitems[j].innerHTML+"</span>";
				tablerow[j].noteid = notes[i][j];
			}
		}
		
		// Add the entity id to the comparison cell
		if (currenttable[i].id) tablerow[0].id = currenttable[i].id.substring(3);

		// Construct the whole row by copying the row array into a jstable element keyed on the row offset
		jstable[i] = tablerow.slice(0);
	}

	// Construct the whole table by copying the jstable array
	rankingstabledetails.table = jstable.slice(0);
	
	// Read in any filters
	if ($jq("#searchfilters").length) {
		var filterlists = $jq(".filterlistselect", $jq("#searchfilters"));
		for (var i=filterlists.length - 1; i>=0; i--) {
			var filterid = filterlists[i].id;
			filterid = filterid.substring("filterlist".length);
			rankingstabledetails.filters[i] = filterid;
		}
	}

	// Set up event handlers
	$jq("#footcompa").click(compareRankings);
	$jq("#compcolheader").click(compareRankings);
	$jq("#rankingstable input.compcheck").click(toggleCompareState);
	$jq("select.filterlistselect").change(updateAdvancedFilters);

	$jq(".featuredicon").each(function() {
		var oldtitle = $jq(this).attr("title");
		var dispnote = displayNoteBubble('<p>'+oldtitle+'</p>', $jq(this).get(0));
		$jq(this).attr("title", "");
		$jq(this).mouseover(function() { showtimer = window.setTimeout(dispnote, 50); }).mouseout(hideRankingsNotes);
	});

	// Reposition the table if the default view is too wide.
	if ($jq("#rankingstable").get(0).offsetWidth > 658) repositionRankingsTable();
	
	// Done
	rankingstabledetails.loaded = true;

	// Trigger a search if one is provided on querystring
	var querystrings = getQueryStrings();
	if (querystrings["search"]) searchRankings();
}

// Function to parse notes on the entities table page and set up any intra-page ranking navigation.
function initProfileTables() {
	if (typeof(profiletables) == "undefined" || profiletables.loading) return;
	profiletables.loading = true;
	var notetexts = {};
	var notes = profiletables.notes;
	$jq('#locallink-'+rankingtoshow).css("font-weight", "bold");
	
	// Create the notes popup bubble
	createNoteBubble();
	
	// Construct inter-ranking navigation elements for insertion into each present ranking
	var rankingslugs = new Array();
	var rankingnames = new Array();
	$jq("a", $jq("#entitylinks")).each(function (i) {
		rankingslugs[i] = $jq(this).attr("href").replace(/.*\#/, "");
		rankingnames[i] = $jq(this).html();
	});
	if (rankingslugs.length) {
		var rankingmenudivhtml = '<div id="rankingnavmenu" onmouseout="profileRankingMenuMouseout()" onmouseover="if (menuhidetimer) clearTimeout(menuhidetimer)">';
		for (var i=0; i<rankingslugs.length; i++) {
			rankingmenudivhtml += '<div><a href="#'+rankingslugs[i]+'" onclick="profileSwitchToRanking(\''+rankingslugs[i]+'\'); return false;" class="navmenuitem-'+rankingslugs[i]+'"><span>'+rankingnames[i]+'</span></a></div>';
		}
		rankingmenudivhtml += '</div>';
		$jq(document.body).append(rankingmenudivhtml);
		$jq(".rankingtitleh2").addClass("rankingnavpadding");
	}

	// Step through any available entityrankingsdata divs
	$jq("div.entityrankingsdata").each(function(i) {
		var thisrankingdiv = $jq(this);
	
		// In each div, find any notes, and add them to the notetexts array
		$jq(".notes p", thisrankingdiv).each(function(j) {
			var note = $jq(this).html().replace(/^[0-9]+\.\s+/, "");
			notetexts['table'+i+'data'+j] = note;
		});
		
		// Select the data keys, select their titles, and add them to the notetexts array
		$jq("td.headcol", thisrankingdiv).each(function(j) {
			var ele = $jq(this).get(0);
			var fieldnote = '';
			if (ele.title) {
				fieldnote = ele.title;
				ele.title = '';
			}
			if (typeof(notes[i]) != "undefined" && typeof(notes[i][j]) != "undefined") {
				if (fieldnote) fieldnote += '<br /><br />';
				fieldnote += notetexts['table'+i+'data'+notes[i][j]];
			}
			if (fieldnote) {
				$jq(ele).addClass('tnote');
				notetexts['table'+i+'col'+j] = fieldnote;
			}
		});
		
		// Select the slug of this item, and add ranking navigation as appropriate
		if (rankingslugs.length > 1) {
			
			// Add the "previous" link if this isn't the first ranking
			if (i != 0) $jq(".rankingtitle", thisrankingdiv).append('<div class="prevlink" onclick="profileSwitchToRanking(\''+rankingslugs[i-1]+'\'); return false;"><div></div>Prev</div>');
			
			// Add a control to access the dropdown menu.
			$jq(".rankingtablelink", thisrankingdiv).prepend('<span onmousedown="showRankingNavMenu(\''+rankingslugs[i]+'\')" class="rankingsmenulink">Change ranking</span>').parent();
			
			// Add the "next" link if this isn't the last ranking
			if (i < rankingslugs.length - 1) $jq(".rankingtitle", thisrankingdiv).append('<div class="nextlink" onclick="profileSwitchToRanking(\''+rankingslugs[i+1]+'\'); return false;"><div></div>Next</div>');
		}
	});

	profiletables.notetexts = notetexts;
	profiletables.loaded = true;
}

// Initialise additional notes where javascript is not already being called.
function initNoteData() {

	// Create the notes popup bubble
	createNoteBubble();

	$jq(".featuredicon").each(function() {
		var oldtitle = $jq(this).attr("title");
		var dispnote = displayNoteBubble('<p>'+oldtitle+'</p>', $jq(this).get(0));
		$jq(this).attr("title", "");
		$jq(this).mouseover(function() { showtimer = window.setTimeout(dispnote, 50); }).mouseout(hideRankingsNotes);
	});
}

// Switch to hightlight a different ranking on a profile page
function profileSwitchToRanking(slug) {
	if (menuhidetimer) clearTimeout(menuhidetimer);
	$jq('#entityranking'+rankingtoshow).hide();
	$jq(".rankingtitleh2 span", $jq("#entityranking"+rankingtoshow)).css("background-color", "#F2F2F2");
	$jq("#rankingnavmenu").hide();
	$jq('#locallink-'+rankingtoshow).css("font-weight", "normal");
	rankingtoshow = slug;
	$jq('#entityranking'+slug).show();
	$jq('#locallink-'+slug).css("font-weight", "bold");
}

// Show and position the navigation rankings menu
function showRankingNavMenu(slug) {
	if (menuhidetimer) clearTimeout(menuhidetimer);
	var themenu = $jq("#rankingnavmenu");
	if (themenu.css("display") == "block") return;
	
	// Set the initial position of the menu
	var initialposition = $jq("#entityranking"+slug+" .rankingtablelink").offset();
	themenu.css({left:"1px", top:initialposition.top+"px", width:"530px", visibility:"hidden", display:"block"});
	
	// Step through the menu items to calculate negative height offset and new width
	var menuwidth = 0;
	var activemenufound = false;
	var heightoffset = 0;
	$jq("a", themenu).each(function() {
		if ($jq(this).attr("href").replace(/.*#/, "") == slug) {
			$jq(this).addClass("active").addClass("initialhover").mouseout(function() { $jq(this).removeClass("initialhover"); });
			activemenufound = true;
		} else {
			if (!activemenufound) heightoffset += $jq(this).parent().height();
			$jq(this).removeClass("active").removeClass("initialhover");
		}
		var itemwidth = $jq("span", $jq(this)).width();
		if (itemwidth) menuwidth = Math.max(menuwidth, itemwidth);
	});
	var targetwidth = (menuwidth && menuwidth < 530)?menuwidth+40:530;
	themenu.css({left:($jq("#entityranking"+slug).width()-targetwidth+8)+"px", top:(initialposition.top - heightoffset - 5)+"px", width:targetwidth+"px", visibility:"visible"});
}

// Hide the navigation rankings menu on mouseout.
function profileRankingMenuMouseout() {
	menuhidetimer = window.setTimeout(function() {
		$jq("#rankingnavmenu").hide();
	}, 300);
}

// Output a new rankings table from the javascript array, based on column selection, search criteria and compare settings
function recreateRankingsTable() {
	$jq("#rankingstable").removeClass("initialrender");

	// Create local vars for rapid lookups
	var tablebody = $jq("#rankingstable tbody");
	var colmap = new Array();
	var newtableop = new Array();
	var rankingstableitems = rankingstabledetails.table;
	var activecols = rankingstabledetails.activecolumns;
	var sortcol = rankingstabledetails.cursort;
	var itemcount = rankingstableitems.length;
	var rowitemlength = rankingstabledetails.headings.length;
	var visiblecolcount = 1;
	var columnclasses = new Array();
	newtableop.push("<thead><tr><th class=\"compcol"+((sortcol==1)?" presort":"")+"\" onmouseout=\"hideRankingsNotes()\" onmouseover=\"showNote(event);\">"+rankingstabledetails.headings[0]+"</th>");
	
	// Build up a column map of column ids to indexes.  Previously marked as AB review, so: AB:REVIEW
	// Add a zero-column for the checkboxes
	for (var key in rankingstabledetails.columns) {
		colmap[colmap.length] = key;
	}

	for (var i=1; i<=rowitemlength; i++) {
		if (!isNaN(activecols[i])) {
			newtableop.push("<th style=\"text-align: left;\""+((i == sortcol)?" class=\"cursort "+rankingstabledetails.columns[activecols[i]].sort+"sort\"":"")+" onclick=\"sortRankingsTable("+activecols[i]+")\" onmouseout=\"hideRankingsNotes()\" id=\"th"+activecols[i]+"\">"+rankingstabledetails.headings[i]+"</th>");
			visiblecolcount++;

			var thiscolclasses = new Array();
			if (rankingstabledetails.columns[activecols[i]].type == "text") thiscolclasses.push("text");
			if (i == sortcol) thiscolclasses.push("cursort");
			columnclasses[i] = thiscolclasses.join(" ");
		}
	}

	newtableop.push("</tr></thead><tbody>");
	var oprowcount = 0;
	var shaderow = false;
	for (var i=0; i<itemcount; i++) {
		if (!rankingstabledetails.compareEnabled || rankingstableitems[i][0].val.indexOf("checked=\"checked") != -1) {
			var rowitems = rankingstableitems[i];
			var filtermatch = (rankingstabledetails.filter || rankingstabledetails.activefilters.length) ? false : true;
			var filtermatchfail = false;
			
			// First cell in the row always contains a checkbox for comparisons
			var tablerowop = "<tr"+((shaderow)?" class=\"shade\"":"")+" id=\"rowoffset"+i+"\"><th"+((rankingstabledetails.compareEnabled)?" class=\"compareenabled\"":"")+">"+rowitems[0].val+"</th>";
			var searchtext = new String();
			for (var j=1; j<rowitemlength && !filtermatchfail; j++) {
				if (!filtermatch || rankingstabledetails.activefilters[colmap[j-1]]) {
					var celldata = rowitems[j].val;
					if (rankingstabledetails.filter) {
						searchtext = celldata.replace(/(<([^>]+)>)/ig,"").replace(/[^\w ]/gi, "").toLowerCase();
						if (searchtext.indexOf(rankingstabledetails.filter) != -1) filtermatch = true;
					} else {
						filtermatch = true;
					}
					if (rankingstabledetails.activefilters[colmap[j-1]]) {
						var advfiltermatched = false;
						celldata = celldata.replace(/^([\-0-9\.]+)[\s?\(].*$/, "$1");
						celldata = celldata.replace(/[^\-0-9\.]/g, "");
						celldata = parseFloat(celldata);
						var filtertocheck = rankingstabledetails.activefilters[colmap[j-1]];
						for (var k=0; k<filtertocheck.length; k++) {
							var v = filtertocheck[k];
							if (v.val === false) {
								if (celldata <= v.high && celldata >= v.low) advfiltermatched = true;
							} else {
								if (celldata == v.val) advfiltermatched = true;
							}
						}
						if (!advfiltermatched) {
							filtermatchfail = true;
							break;
						}
					}
				}
				if (!isNaN(activecols[j])) {
					if (!isNaN(rowitems[j].noteid)) {
						tablerowop += "<td class=\""+columnclasses[j]+" tnote\" onmouseover=\"showNote(event, "+rowitems[j].noteid+")\" onmouseout=\"hideRankingsNotes(event)\"><span>"+rowitems[j].val+"</span></td>";
					} else {
						var colclass = columnclasses[j];
						tablerowop += "<td"+((colclass)?" class=\""+colclass+"\"":"")+">"+rowitems[j].val+"</td>";
					}
				}
			}
			tablerowop += "</tr>";

			// Only add the completed row to the output if it matches the active search filter (or if there isn't one)
			if (filtermatch && !filtermatchfail) {
				newtableop.push(tablerowop);
				oprowcount++;
				shaderow = !shaderow;
			}
		}
	}

	// Write table footer and render new DOM
	if (oprowcount) {
		newtableop.push("<tr class=\"comprow\"><td class=\"compcol\" colspan=\""+(activecols.length+2)+"\"><span></span><a href=\"javascript:saveAsPDF();\" class=\"pdf\">Download this view as a PDF</a> <a href=\"javascript:saveAsExcel();\" class=\"excel\">Output this view to Excel</a><a href=\"javascript:void(0);\" onmouseover=\"showNote(event);\" onmouseout=\"hideRankingsNotes();\" id=\"footcompa\"> </a></td></tr>");
		var htmlout = "<table id=\"rankingstable\">"+newtableop.join("")+"</tbody></table>";
	} else {
		var htmlout = "<table id=\"rankingstable\">"+newtableop.join("")+"<tr><td colspan=\""+visiblecolcount+"\" style=\"font-style:italic; text-align: center\">No entries match your search.  <a href=\"javascript:void(0)\" onclick=\"resetRankingSearch()\">Reset?</a></td></tr></tbody></table>";
	}
	document.getElementById("rankingstablediv").innerHTML = htmlout;
	repositionRankingsTable();	

	// Re-map mouseover events (AB: ick)
	for (var key in rankingstabledetails.activecolumns) {
		if (typeof(rankingstabledetails.activecolumns[key]) == "undefined") continue;
		$jq("#th"+rankingstabledetails.activecolumns[key]).mouseover(rankingstabledetails.onmouseovers[key]);
	}
	
	// If a compare is active, disable comparison checkboxes
	if (rankingstabledetails.compareEnabled) {
		$jq("input.compcheck").attr("disabled", "disabled");
	} else {
		$jq("input.compcheck").click(toggleCompareState);
	}
	$jq("#footcompa").click(compareRankings);
	$jq("#compcolheader").click(compareRankings);
	$jq("#waitspinner").css("display", "none");

}

// Display a note bubble with text appropriate to the source element and note reference ID
function showNote(e, noteref) {
	if (!$jq("#notepopup").length) return;
	if ((typeof(rankingstabledetails) != "undefined" && !rankingstabledetails.loaded) || (typeof(profiletables) != "undefined" && !profiletables.loaded)) return;
	var el = getEventSrc(e);
	var notestr = new String();

	// Work out the correct note target if possible by walking up the tree to a TH/TD.
	var hovertarget = el;
	var parTag = el.parentNode.tagName;
	if (el.id != "footcompa") {
		if (el.tagName == "STRONG" || parTag == "TH" || parTag == "TD" || parTag == "LABEL") hovertarget = el.parentNode;
		parParTag = el.parentNode.parentNode.tagName;
		if (parTag == "DIV" && (parParTag == "TH" || parParTag == "TD" || parParTag == "LABEL")) hovertarget = el.parentNode.parentNode;
	}

	// Work out what kind of note is required...
	if (typeof(profiletables) == "undefined") {
	
		/* Rankings table page */
		
		// Advanced filter note
		if (hovertarget.id == "advfiltershelp") {
			notestr = "<p>The advanced search filters can be used to narrow down your results.  Select values and trigger the search to see only rankings that match the selected values.</p><p>Click or click and drag to select items in the lists.  To select separate items in the list, or to deselect items, hold down the "+((navigator.platform.toLowerCase().indexOf("mac") != -1)?"Command (Apple)":"Control")+" key and click on the item.</p>";
		
		// Cell note
		} else if (hovertarget.tagName=="TD" && hovertarget.parentNode.parentNode.parentNode.id=="rankingstable") {
			notestr = "<p>"+rankingstabledetails.notetexts[noteref]+"</p>";
	
		// Control box note
		} else if (hovertarget.tagName=="LABEL" && hovertarget.parentNode.parentNode.id=="columncontrollist") {
			var col = rankingstabledetails.columns[noteref];
			notestr = "<strong>"+decodeURIComponent(col.title)+"</strong>";
			if (col.noteref) notestr += "<p>"+rankingstabledetails.notetexts[col.noteref]+"</p>";
			notestr += "<p><em>Click to "+((rankingstabledetails.activecolumns[noteref])?"remove this column from":"add this column to")+" the table.</em></p>";
	
		// Filter area
		} else if (hovertarget.className == "filterlist") {
			var col = rankingstabledetails.columns[noteref];
			notestr = "<strong>"+decodeURIComponent(col.title)+"</strong>";
			if (col.noteref) notestr += "<p>"+rankingstabledetails.notetexts[col.noteref]+"</p>";
		
		// Comparison column button note
		} else if (el.id == "footcompa" || (el.tagName=="A" && el.parentNode.parentNode && $jq(el.parentNode.parentNode).is(".compcol"))) {
			notestr = "<strong>Compare selected rows</strong>" + ((rankingstabledetails.compareEnabled)?"<p>Click to remove the comparison filter.</p>":"<p>Click to show only the rows you have selected for comparison.</p>");
	
		// Column header note
		} else if (hovertarget.tagName=="TH" && hovertarget.parentNode.parentNode.parentNode.id=="rankingstable" && noteref) {
			var col = rankingstabledetails.columns[noteref];
			if (col) {
				notestr = "<strong>"+decodeURIComponent(col.title)+"</strong>";
				if (col.noteref) notestr += "<p>"+rankingstabledetails.notetexts[col.noteref]+"</p>";
				if (el.tagName=="A") {
					notestr += "<p><em>Click to remove this column from the table.</em></p>";
				} else if (rankingstabledetails.cursort == noteref) {
					notestr += "<p><em>Click to re-sort this column in "+(($jq("#th"+rankingstabledetails.activecolumns[noteref]).is(".ascsort"))?"descending":"ascending")+" order.</em></p>";
				} else {
					notestr += "<p><em>Click to sort the table using this column.</em></p>";
				}
			}
		}
	} else {
	
		/* Profile page */

		if (noteref && profiletables.notetexts[noteref]) notestr = "<p>"+profiletables.notetexts[noteref]+"</p>";
		if ($jq("span", hovertarget).length) hovertarget = $jq("span", hovertarget).get(0);
	}

	if (notestr.length) {
		if (showtimer) clearTimeout(showtimer);
		if (hidetimer) clearTimeout(hidetimer);
		var dispnote = displayNoteBubble(notestr, hovertarget);
		if ($jq("#notepopup").css("display") != "none") {
			dispnote();
		} else {
			showtimer = setTimeout(dispnote, 250);
		}
	}
}

// Display a note bubble pointing at the top centre of an element
function displayNoteBubble(notetext, refel) {
	return (function() {
		var initialposition = $jq(refel).offset();
		var elewidth = refel.offsetWidth;
		var popuptype = "top";
		var arrowoffset = 0;
		var maxwidthele = (typeof(profiletables) == "object")?$jq("#entityview"):$jq("#rankingstable");
		var widthlimit = $jq(maxwidthele).width() + 300; // Table width (variable) + sidebar.
		var adleftpx = 667; // Hardcoded for simplicity/speed.
		var adrightpx = 977; // Hardcoded for simplicity/speed.
	
		// Set a default bubble width of 200 and increase if there's lots of text
		var notewidth = 200;
		if (notetext.length > 350) {
			notewidth = 300;
			if (notetext.length > 700) notewidth = 390;
		}
		
		// Set the starting top and left positions
		var toppx = initialposition.top;
		var leftpx = initialposition.left + Math.floor((elewidth - notewidth)/2);
		
		// If the note bubble appears to conflict with the advert, trigger repositioning logic.
		if (leftpx + notewidth > adleftpx && leftpx < adrightpx && toppx > 250 && toppx < 700) {
			
			// If we can shuffle the note bubble to the left while keeping the arrow on the element, do so.
			if (initialposition.left + elewidth/2 + 10 < adleftpx) {
				var correction = (leftpx + notewidth) - 5 - adleftpx;
				leftpx -= correction;
				arrowoffset += correction;
			
			// Or if we can shuffle the note bubble to the right:
			} else if (initialposition.left + elewidth/2 - 10 > adrightpx) {
				var correction = 5 + adrightpx - leftpx;
				leftpx += correction;
				arrowoffset -= correction;
			
			// If both aren't possible, we must use a note bubble positioned to the left.
			} else {
				popuptype = "left";
				leftpx = initialposition.left - notewidth;
				toppx = initialposition.top - 5;
			}
		}
		
		// Use additional checks and limits if we're positioning above the element - can conflict with
		// the screen edges.  If it does, reposition inwards.
		if (popuptype == "top") {
			if (leftpx < 10) {
				arrowoffset += leftpx - 10;
				leftpx = 10;
			} else if (leftpx + notewidth > widthlimit + 10) {
				arrowoffset += leftpx + notewidth - 10 - widthlimit;
				leftpx = widthlimit + 10 - notewidth;
			}
		}
		
		// Initially render of the notes div - in the correct location to the left, but if above is
		// rendered directly over the element to allow height to be set before we move upwards.		
		$jq("#notetext").html(notetext);
		$jq("#notepopup").css({left:leftpx+"px", top:toppx+"px", width:notewidth+"px", visibility:"hidden", display:"block"});
		
		// Switch to orientation-appropriate rendering
		if (popuptype == "top") {

			// Add appropriate popup class and position arrow, as well as moving iframe if it exists.
			$jq("#notepopup").removeClass("popupleft").addClass("popupabove");
			$jq("#noteiframe").css({width:(notewidth+2)+"px", left:"-1px", top:"-1px", height:($jq("#notepopup").height() + 9)+"px", display:"block", filter:"alpha(opacity=0)"});
			$jq("#notearrow").css({top:"auto", left:(Math.floor(notewidth / 2)+arrowoffset-7)+"px"});

			// Calculate the offset position and move the bubble
			toppx -= $jq("#notepopup").height();
			$jq("#notepopup").css({top:toppx+"px", visibility:"visible"});
	
		} else {
		
			// Add the correct popup class, hide the iframe if it exists, and display the note.
			$jq("#notepopup").removeClass("popupabove").addClass("popupleft");
			$jq("#notearrow").css({top:Math.floor(refel.offsetHeight/2)+"px", left:"auto"});
			$jq("#noteiframe").hide();
			$jq("#notepopup").css("visibility", "visible");
		}
	});
}

// Function to create the hidden note element - should be called from page initialisation functions.
function createNoteBubble() {
	var iframestr = '';
	
	// If this is IE 6, we need to iframe the popup to avoid <select> problems
	if ($jq.browser.msie && parseInt($jq.browser.version) < 7) {
		iframestr = '<iframe id="noteiframe" src="javascript:\'<html></html>\';" scrolling="no" frameborder="no"></iframe>';
	}
	
	var notebubblehtml = '<div id="notepopup">'+iframestr+'<div id="noteboundary"><div id="noteinner"><div class="nw"></div><div class="ne"></div><div id="notetext"></div><div class="sw"></div><div class="se"></div></div></div><div id="notearrow"></div></div>';
	$jq(document.body).append(notebubblehtml);
}

function hideRankingsNotes() {
	if (hidetimer) clearTimeout(hidetimer);
	if (showtimer) clearTimeout(showtimer);
	hidetimer = setTimeout(function() { $jq("#noteiframe").hide(); $jq("#notepopup").hide(); }, 50);
}

// Reposition the table as necessary so the ads aren't covered
function repositionRankingsTable() {
	// If the table is wider than the original space, we need to ensure the ad isn't covered
	if ($jq("#rankingstable").get(0).offsetWidth > 658) {
		var rankingstablediv = $jq("#rankingstablediv");
		var adholder = $jq("#ad-placeholder-mpu");
		var colcontrol = $jq("#columncontrol");
		var currentTableTop = rankingstablediv.get(0).offsetTop;
		rankingstablediv.css("margin-top", Math.max(0, (adholder.get(0).offsetHeight - colcontrol.get(0).offsetTop - colcontrol.get(0).offsetHeight + ((document.all)?7:10))));
		var metatop = Math.max(0, (colcontrol.get(0).offsetHeight + colcontrol.get(0).offsetTop - adholder.get(0).offsetHeight));
		$jq("#tablemetalinkscont").css({left:($jq("#rankingstable").get(0).offsetWidth - 657), top:metatop});
		$jq("#rankingslistcontainer").css({left:($jq("#rankingstable").get(0).offsetWidth - 657), top:metatop});
		$jq("#searchbox").css({left:($jq("#rankingstable").get(0).offsetWidth - 657), top:metatop});

	// Otherwise, reset positioning CSS.
	} else {
		$jq("#rankingstablediv").css("margin-top", 0);
		$jq("#tablemetalinkscont").css({left:0, top:0});
		$jq("#rankingslistcontainer").css({left:0, top:0});
		$jq("#searchbox").css({left:0, top:0});
	}
}

// On page ready, initialise the table
$jq(document).ready(function() {
	if (typeof(rankingstabledetails) != "undefined") initRankingsTable();
});

// Log an action to the FT stats system by calling the webtrends function dcsMultiTrack.
function logActionToWebtrends(action, detail) {
	// REVIEW:AB:20080621: DCS Multitrack has been deprecated by FT.
	//if (typeof(detail) == "undefined") detail = false;
	//dcsMultiTrack("WT.rankingsAction", action, "WT.rankingsActionDetail", detail);
}

// Trigger a request for the current table view as a PDF.
function saveAsPDF() {
	if (!rankingstabledetails.loaded) initRankingsTable();
	var visiblecols = fetchActiveColIDs();
	var visiblerows = fetchActiveRowIDs();

	if (!visiblecols.length || !visiblerows.length) {
		alert("You must have some data visible to download this table as a PDF.");
	}
	
	// Log an event
	logActionToWebtrends("custompdfdownload", visiblecols.length+" cols and "+visiblerows.length+" rows");
	
	startWaiting("Generating PDF");
	setTimeout(function() {
		if ($jq.browser.msie) {
			$jq("#waitspinner").css("display", "none");
			var wh = (self.innerHeight) ? self.innerHeight : document.documentElement.clientHeight;
			var y = (self.pageYOffset) ? self.pageYOffset : document.documentElement.scrollTop;
			var x = (self.pageXOffset) ? self.pageXOffset : document.documentElement.scrollLeft;
			var ielink = document.createElement("div");
			ielink.id = "iedownload";
			ielink.innerHTML = "<iframe src=\"javascript:'<html></html>';\" scrolling=\"no\" frameborder=\"no\"></iframe><a onclick=\"$jq('#iedownload div').show(); window.location = '/exportranking"+window.location.pathname+"/pdf?cols="+visiblecols.join("|")+"&rows="+visiblerows.join("|")+"&sortby="+rankingstabledetails.activecolumns[rankingstabledetails.cursort]+"'; setTimeout(function() { $jq('#iedownload').remove(); }, 5000);\"><div></div></a>";
			$jq(ielink).css({top:(y+(wh/2)-75)+'px', left:(x+365)+'px'}).appendTo("#content");
			$jq("#iedownload iframe").css("filter", "alpha(opacity=0)");
			$jq("#iedownload a").css("top", 0);
		} else {
			setTimeout(function() { $jq("#waitspinner").css("display", "none"); }, 3000);
			window.location = "/exportranking"+window.location.pathname+"/pdf?cols="+visiblecols.join("|")+"&rows="+visiblerows.join("|")+"&sortby="+rankingstabledetails.activecolumns[rankingstabledetails.cursort];
		}
	}, 1100);
}

// Trigger a request for the current table view as an Excel 2003/XML file.
function saveAsExcel() {
	if (!rankingstabledetails.loaded) initRankingsTable();
	var visiblecols = fetchActiveColIDs();
	var visiblerows = fetchActiveRowIDs();

	if (!visiblecols.length || !visiblerows.length) {
		alert("You must have some data visible to download this table as an Excel file.");
	}
	
	// Log an event
	logActionToWebtrends("customexceldownload", visiblecols.length+" cols and "+visiblerows.length+" rows");
	
	startWaiting("Generating Excel file");
	setTimeout(function() {
		if ($jq.browser.msie) {
			$jq("#waitspinner").css("display", "none");
			var wh = (self.innerHeight) ? self.innerHeight : document.documentElement.clientHeight;
			var y = (self.pageYOffset) ? self.pageYOffset : document.documentElement.scrollTop;
			var x = (self.pageXOffset) ? self.pageXOffset : document.documentElement.scrollLeft;
			var ielink = document.createElement("div");
			ielink.id = "iedownload";
			ielink.innerHTML = "<iframe src=\"javascript:'<html></html>';\" scrolling=\"no\" frameborder=\"no\"></iframe><a onclick=\"$jq('#iedownload div').show(); window.location = '/exportranking"+window.location.pathname+"/excel?cols="+visiblecols.join("|")+"&rows="+visiblerows.join("|")+"&sortby="+rankingstabledetails.activecolumns[rankingstabledetails.cursort]+"'; setTimeout(function() { $jq('#iedownload').remove(); }, 5000);\"><div></div></a>";
			$jq(ielink).css({top:(y+(wh/2)-75)+'px', left:(x+365)+'px'}).appendTo("#content");
			$jq("#iedownload iframe").css("filter", "alpha(opacity=0)");
			$jq("#iedownload a").css("top", 0);
		} else {
			setTimeout(function() { $jq("#waitspinner").css("display", "none"); }, 3000);
			window.location = "/exportranking"+window.location.pathname+"/excel?cols="+visiblecols.join("|")+"&rows="+visiblerows.join("|")+"&sortby="+rankingstabledetails.activecolumns[rankingstabledetails.cursort];
		}
	}, 1100);
}

// Return an array containing the id of each visible column in the current table view
function fetchActiveColIDs() {
	var activecols = new Array();
	
	for (var i=0; i<rankingstabledetails.activecolumns.length; i++) {
		if (typeof(rankingstabledetails.activecolumns[i]) != "undefined") activecols.push(rankingstabledetails.activecolumns[i]);
	}
	
	return activecols;
}

// Return an array containing the id of each visible row in the current table view
function fetchActiveRowIDs() {
	var activerows = new Array();
	var colmap = new Array();

	// Build up a column map of column ids to indexes.  Previously marked as AB review, so: AB:REVIEW
	// Add a zero-column for the checkboxes
	for (var key in rankingstabledetails.columns) {
		colmap[colmap.length] = key;
	}

	for (var i=0; i<rankingstabledetails.table.length; i++) {
		if (!rankingstabledetails.compareEnabled || rankingstabledetails.table[i][0].val.indexOf("checked=\"checked") != -1) {
			var searchtext = new String();
			var filtermatch = (rankingstabledetails.filter || rankingstabledetails.activefilters.length) ? false : true;
			var filtermatchfail = false;
			var rowitems = rankingstabledetails.table[i];
			for (var j=1; j<rowitems.length; j++) {
				if (!filtermatch || rankingstabledetails.activefilters[colmap[j-1]]) {
					var celldata = rowitems[j].val;
					if (rankingstabledetails.filter) {
						searchtext = celldata.replace(/(<([^>]+)>)/ig,"").replace(/[^\w ]/gi, "").toLowerCase();
						if (searchtext.indexOf(rankingstabledetails.filter) != -1) filtermatch = true;
					} else {
						filtermatch = true;
					}
					if (rankingstabledetails.activefilters[colmap[j-1]]) {
						var advfiltermatched = false;
						celldata = celldata.replace(/^([\-0-9\.]+)[\s?\(].*$/, "$1");
						celldata = celldata.replace(/[^\-0-9\.]/g, "");
						celldata = parseFloat(celldata);
						var filtertocheck = rankingstabledetails.activefilters[colmap[j-1]];
						for (var k=0; k<filtertocheck.length; k++) {
							var v = filtertocheck[k];
							if (v.val === false) {
								if (celldata <= v.high && celldata >= v.low) advfiltermatched = true;
							} else {
								if (celldata == v.val) advfiltermatched = true;
							}
						}
						if (!advfiltermatched) filtermatchfail = true;
					}
				}
			}
			if (filtermatch && !filtermatchfail) {
				activerows.push(rankingstabledetails.table[i][0].id);
			}
		}
	}

	return activerows;
}

function DoBench(benchtext){
	var curTime;
	var localvar = benchvar;
	curTime = new Date().getTime();
	if (typeof(benchtext) != "undefined") {
		//if (typeof(console) != "undefined") console.log(benchtext+" took "+((curTime - localvar)/1000)+" seconds.");
		//else $jq("#rankingssearchtext").val(benchtext+" took "+((curTime - localvar)/1000)+" seconds.");
	}
	benchvar = curTime;
}

// Browser compliant method of returning source of event.
function getEventSrc(e) {
	if (!e) var e = window.event;
	if (!e) return false;
	var ele;
	if (e.target) ele = e.target;
	else if (e.srcElement) ele = e.srcElement;

	// If element is text node, select parent
	if (ele.nodeType == 3) ele = ele.parentNode;
	return ele;
}

function getQueryStrings() {
	var queryStringParams = new Array();
	var querystring = window.location.search.substring(1);
	var params = querystring.split("&");
	for (var i=0; i<params.length; i++) {
		var position = params[i].indexOf("=");
		if (position > 0) {
			queryStringParams[params[i].substring(0, position)] = params[i].substring(position+1);
		}
	}
	return queryStringParams;
}

// Provide javascript array push for IE 5 - thankyou quirksmode.org!
function Array_push() {
	var A_p = 0
	for (A_p = 0; A_p < arguments.length; A_p++) {
		this[this.length] = arguments[A_p]
	}
	return this.length
}
if (typeof Array.prototype.push == "undefined") {
	Array.prototype.push = Array_push
}

jQuery.fn.extend({
	check: function(shouldcheck) {
		if (typeof(shouldcheck) == "undefined") shouldcheck = true;
		return this.each(function() { this.checked = shouldcheck; });
	},
	uncheck: function() {
		return this.each(function() { this.checked = false; });
	}
});var campusmaps = {};
var currentmapaddresses = {};

// Initialise a campus map
function loadCampusMap(mapid, lat, lng, zoom, addressdetails) {
	var map = new GMap2($jq("#campusmap"+mapid).get(0), {size:new GSize(276, 276)});
	map.setCenter(new GLatLng(parseFloat(lat), parseFloat(lng)), parseInt(zoom));
	var mapmarker = new GMarker(new GLatLng(parseFloat(lat), parseFloat(lng)));
	map.addOverlay(mapmarker);
	map.addControl(new GSmallZoomControl());

	campusmaps[mapid] = map;
	currentmapaddresses[mapid] = addressdetails;

	GEvent.addListener(campusmaps[mapid], "click", function(marker, point) {
		if (marker && typeof(marker.getLatLng) == "function" && currentmapaddresses[mapid]) {
			campusmaps[mapid].openInfoWindowHtml(marker.getLatLng(), currentmapaddresses[mapid]);
		}
	});
}

// Alter a campus map
function updateCampusMap(mapid, lat, lng, zoom, addressdetails) {
	var map = campusmaps[mapid];

	map.clearOverlays();
	map.closeInfoWindow();

	map.setCenter(new GLatLng(parseFloat(lat), parseFloat(lng)), parseInt(zoom));
	var mapmarker = new GMarker(new GLatLng(parseFloat(lat), parseFloat(lng)));
	map.addOverlay(mapmarker);

	currentmapaddresses[mapid] = addressdetails;
}

// Set any slideshows with multiple images animating
jQuery(document).ready(function() {
	jQuery(".slidecontainer").each(function(i) {
		if (jQuery("img", jQuery(this)).length > 1) {
			var parentele = jQuery(this).parent();
			jQuery(this).cycle({fx:"fade", speed:1000, timeout:4000, pause:1, prev:"#"+jQuery("span.left", parentele).get(0).id, next:"#"+jQuery("span.right", parentele).get(0).id});
			jQuery("span", parentele).css({opacity:0, display:"block"});
			parentele.bind("mouseover", function() {
				jQuery("span", jQuery(this)).animate({opacity:1}, {duration:250, queue: false});
			});
			parentele.bind("mouseout", function() {
				jQuery("span", jQuery(this)).animate({opacity:0}, {duration:250, queue: false});
			});
			
		}
	});
});


// Provide the jQuery slideshow plugin
(function($){var ver='2.22';var ie6=$.browser.msie&&/MSIE 6.0/.test(navigator.userAgent);function log(){if(window.console&&window.console.log)
window.console.log('[cycle] '+Array.prototype.join.call(arguments,''));};$.fn.cycle=function(options){return this.each(function(){options=options||{};if(options.constructor==String){switch(options){case'stop':if(this.cycleTimeout)clearTimeout(this.cycleTimeout);this.cycleTimeout=0;return;case'pause':this.cyclePause=1;return;case'resume':this.cyclePause=0;return;default:options={fx:options};};}
if(this.cycleTimeout)clearTimeout(this.cycleTimeout);this.cycleTimeout=0;this.cyclePause=0;var $cont=$(this);var $slides=options.slideExpr?$(options.slideExpr,this):$cont.children();var els=$slides.get();if(els.length<2){log('terminating; too few slides: '+els.length);return;}
var opts=$.extend({},$.fn.cycle.defaults,options||{},$.metadata?$cont.metadata():$.meta?$cont.data():{});if(opts.autostop)
opts.countdown=opts.autostopCount||els.length;opts.before=opts.before?[opts.before]:[];opts.after=opts.after?[opts.after]:[];opts.after.unshift(function(){opts.busy=0;});if(opts.continuous)
opts.after.push(function(){go(els,opts,0,!opts.rev);});if(ie6&&opts.cleartype&&!opts.cleartypeNoBg)
clearTypeFix($slides);var cls=this.className;opts.width=parseInt((cls.match(/w:(\d+)/)||[])[1])||opts.width;opts.height=parseInt((cls.match(/h:(\d+)/)||[])[1])||opts.height;opts.timeout=parseInt((cls.match(/t:(\d+)/)||[])[1])||opts.timeout;if($cont.css('position')=='static')
$cont.css('position','relative');if(opts.width)
$cont.width(opts.width);if(opts.height&&opts.height!='auto')
$cont.height(opts.height);if(opts.random){opts.randomMap=[];for(var i=0;i<els.length;i++)
opts.randomMap.push(i);opts.randomMap.sort(function(a,b){return Math.random()-0.5;});opts.randomIndex=0;opts.startingSlide=opts.randomMap[0];}
else if(opts.startingSlide>=els.length)
opts.startingSlide=0;var first=opts.startingSlide||0;$slides.css({position:'absolute',top:0,left:0}).hide().each(function(i){var z=first?i>=first?els.length-(i-first):first-i:els.length-i;$(this).css('z-index',z)});$(els[first]).css('opacity',1).show();if($.browser.msie)els[first].style.removeAttribute('filter');if(opts.fit&&opts.width)
$slides.width(opts.width);if(opts.fit&&opts.height&&opts.height!='auto')
$slides.height(opts.height);if(opts.pause)
$cont.hover(function(){this.cyclePause=1;},function(){this.cyclePause=0;});var init=$.fn.cycle.transitions[opts.fx];if($.isFunction(init))
init($cont,$slides,opts);else if(opts.fx!='custom')
log('unknown transition: '+opts.fx);$slides.each(function(){var $el=$(this);this.cycleH=(opts.fit&&opts.height)?opts.height:$el.height();this.cycleW=(opts.fit&&opts.width)?opts.width:$el.width();});opts.cssBefore=opts.cssBefore||{};opts.animIn=opts.animIn||{};opts.animOut=opts.animOut||{};$slides.not(':eq('+first+')').css(opts.cssBefore);if(opts.cssFirst)
$($slides[first]).css(opts.cssFirst);if(opts.timeout){if(opts.speed.constructor==String)
opts.speed={slow:600,fast:200}[opts.speed]||400;if(!opts.sync)
opts.speed=opts.speed/2;while((opts.timeout-opts.speed)<250)
opts.timeout+=opts.speed;}
if(opts.easing)
opts.easeIn=opts.easeOut=opts.easing;if(!opts.speedIn)
opts.speedIn=opts.speed;if(!opts.speedOut)
opts.speedOut=opts.speed;opts.slideCount=els.length;opts.currSlide=first;if(opts.random){opts.nextSlide=opts.currSlide;if(++opts.randomIndex==els.length)
opts.randomIndex=0;opts.nextSlide=opts.randomMap[opts.randomIndex];}
else
opts.nextSlide=opts.startingSlide>=(els.length-1)?0:opts.startingSlide+1;var e0=$slides[first];if(opts.before.length)
opts.before[0].apply(e0,[e0,e0,opts,true]);if(opts.after.length>1)
opts.after[1].apply(e0,[e0,e0,opts,true]);if(opts.click&&!opts.next)
opts.next=opts.click;if(opts.next)
$(opts.next).bind('click',function(){return advance(els,opts,opts.rev?-1:1)});if(opts.prev)
$(opts.prev).bind('click',function(){return advance(els,opts,opts.rev?1:-1)});if(opts.pager)
buildPager(els,opts);opts.addSlide=function(newSlide){var $s=$(newSlide),s=$s[0];if(!opts.autostopCount)
opts.countdown++;els.push(s);if(opts.els)
opts.els.push(s);opts.slideCount=els.length;$s.css('position','absolute').appendTo($cont);if(ie6&&opts.cleartype&&!opts.cleartypeNoBg)
clearTypeFix($s);if(opts.fit&&opts.width)
$s.width(opts.width);if(opts.fit&&opts.height&&opts.height!='auto')
$slides.height(opts.height);s.cycleH=(opts.fit&&opts.height)?opts.height:$s.height();s.cycleW=(opts.fit&&opts.width)?opts.width:$s.width();$s.css(opts.cssBefore);if(typeof opts.onAddSlide=='function')
opts.onAddSlide($s);};if(opts.timeout||opts.continuous)
this.cycleTimeout=setTimeout(function(){go(els,opts,0,!opts.rev)},opts.continuous?10:opts.timeout+(opts.delay||0));});};function go(els,opts,manual,fwd){if(opts.busy)return;var p=els[0].parentNode,curr=els[opts.currSlide],next=els[opts.nextSlide];if(p.cycleTimeout===0&&!manual)
return;if(!manual&&!p.cyclePause&&((opts.autostop&&(--opts.countdown<=0))||(opts.nowrap&&!opts.random&&opts.nextSlide<opts.currSlide))){if(opts.end)
opts.end(opts);return;}
if(manual||!p.cyclePause){if(opts.before.length)
$.each(opts.before,function(i,o){o.apply(next,[curr,next,opts,fwd]);});var after=function(){if($.browser.msie&&opts.cleartype)
this.style.removeAttribute('filter');$.each(opts.after,function(i,o){o.apply(next,[curr,next,opts,fwd]);});};if(opts.nextSlide!=opts.currSlide){opts.busy=1;if(opts.fxFn)
opts.fxFn(curr,next,opts,after,fwd);else if($.isFunction($.fn.cycle[opts.fx]))
$.fn.cycle[opts.fx](curr,next,opts,after);else
$.fn.cycle.custom(curr,next,opts,after);}
if(opts.random){opts.currSlide=opts.nextSlide;if(++opts.randomIndex==els.length)
opts.randomIndex=0;opts.nextSlide=opts.randomMap[opts.randomIndex];}
else{var roll=(opts.nextSlide+1)==els.length;opts.nextSlide=roll?0:opts.nextSlide+1;opts.currSlide=roll?els.length-1:opts.nextSlide-1;}
if(opts.pager)
$.fn.cycle.updateActivePagerLink(opts.pager,opts.currSlide);}
if(opts.timeout&&!opts.continuous)
p.cycleTimeout=setTimeout(function(){go(els,opts,0,!opts.rev)},opts.timeout);else if(opts.continuous&&p.cyclePause)
p.cycleTimeout=setTimeout(function(){go(els,opts,0,!opts.rev)},10);};$.fn.cycle.updateActivePagerLink=function(pager,currSlide){$(pager).find('a').removeClass('activeSlide').filter('a:eq('+currSlide+')').addClass('activeSlide');};function advance(els,opts,val){var p=els[0].parentNode,timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0;}
opts.nextSlide=opts.currSlide+val;if(opts.nextSlide<0){if(opts.nowrap)return false;opts.nextSlide=els.length-1;}
else if(opts.nextSlide>=els.length){if(opts.nowrap)return false;opts.nextSlide=0;}
if(opts.prevNextClick&&typeof opts.prevNextClick=='function')
opts.prevNextClick(val>0,opts.nextSlide,els[opts.nextSlide]);go(els,opts,1,val>=0);return false;};function buildPager(els,opts){var $p=$(opts.pager);$.each(els,function(i,o){var $a=(typeof opts.pagerAnchorBuilder=='function')?$(opts.pagerAnchorBuilder(i,o)):$('<a href="#">'+(i+1)+'</a>');if($a.parents('body').length==0)
$a.appendTo($p);$a.bind(opts.pagerEvent,function(){opts.nextSlide=i;var p=els[0].parentNode,timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0;}
if(typeof opts.pagerClick=='function')
opts.pagerClick(opts.nextSlide,els[opts.nextSlide]);go(els,opts,1,!opts.rev);return false;});});$.fn.cycle.updateActivePagerLink(opts.pager,opts.startingSlide);};function clearTypeFix($slides){function hex(s){var s=parseInt(s).toString(16);return s.length<2?'0'+s:s;};function getBg(e){for(;e&&e.nodeName.toLowerCase()!='html';e=e.parentNode){var v=$.css(e,'background-color');if(v.indexOf('rgb')>=0){var rgb=v.match(/\d+/g);return'#'+hex(rgb[0])+hex(rgb[1])+hex(rgb[2]);}
if(v&&v!='transparent')
return v;}
return'#ffffff';};$slides.each(function(){$(this).css('background-color',getBg(this));});};$.fn.cycle.custom=function(curr,next,opts,cb){var $l=$(curr),$n=$(next);$n.css(opts.cssBefore);var fn=function(){$n.animate(opts.animIn,opts.speedIn,opts.easeIn,cb)};$l.animate(opts.animOut,opts.speedOut,opts.easeOut,function(){if(opts.cssAfter)$l.css(opts.cssAfter);if(!opts.sync)fn();});if(opts.sync)fn();};$.fn.cycle.transitions={fade:function($cont,$slides,opts){$slides.not(':eq('+opts.startingSlide+')').css('opacity',0);opts.before.push(function(){$(this).show()});opts.animIn={opacity:1};opts.animOut={opacity:0};opts.cssBefore={opacity:0};opts.cssAfter={display:'none'};}};$.fn.cycle.ver=function(){return ver;};$.fn.cycle.defaults={fx:'fade',timeout:4000,continuous:0,speed:1000,speedIn:null,speedOut:null,next:null,prev:null,prevNextClick:null,pager:null,pagerClick:null,pagerEvent:'click',pagerAnchorBuilder:null,before:null,after:null,end:null,easing:null,easeIn:null,easeOut:null,shuffle:null,animIn:null,animOut:null,cssBefore:null,cssAfter:null,fxFn:null,height:'auto',startingSlide:0,sync:1,random:0,fit:0,pause:0,autostop:0,autostopCount:0,delay:0,slideExpr:null,cleartype:0,nowrap:0};})(jQuery);