/*
 * jQuery 1.2.2 - New Wave Javascript
 *
 * Copyright (c) 2007 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2008-01-14 17:56:07 -0500 (Mon, 14 Jan 2008) $
 * $Rev: 4454 $
 */
(function(){if(window.jQuery)var _jQuery=window.jQuery;var jQuery=window.jQuery=function(selector,context){return new jQuery.prototype.init(selector,context);};if(window.$)var _$=window.$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;var isSimple=/^.[^:#\[\.]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}else 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);else{this[0]=elem;this.length=1;return this;}else
selector=[];}}else
return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.2",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;this.each(function(i){if(this==elem)ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],name)||undefined;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"),container2=document.createElement("div");container.appendChild(clone);container2.innerHTML=container.innerHTML;return container2.firstChild;}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!selector?this:this.pushStack(jQuery.merge(this.get(),selector.constructor==String?jQuery(selector).get():selector.length!=undefined&&(!selector.nodeName||jQuery.nodeName(selector,"form"))?selector:[selector]));},is:function(selector){return selector?jQuery.multiFilter(selector,this).length>0:false;},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;}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=value.constructor==Array?value:[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.length?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);},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.prototype.init.prototype=jQuery.prototype;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);}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==1){target=this;i=0;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){if(target===options[name])continue;if(deep&&options[name]&&typeof options[name]=="object"&&target[name]&&!options[name].nodeType)target[name]=jQuery.extend(target[name],options[name]);else if(options[name]!=undefined)target[name]=options[name];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,windowData={};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;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&&/function/i.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.appendChild(script);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){if(args){if(object.length==undefined){for(var name in object)if(callback.apply(object[name],args)===false)break;}else
for(var i=0,length=object.length;i<length;i++)if(callback.apply(object[i],args)===false)break;}else{if(object.length==undefined){for(var name in object)if(callback.call(object[name],name,object[name])===false)break;}else
for(var i=0,length=object.length,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;function color(elem){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=elem.style.display;elem.style.display="block";elem.style.display=save;}if(name.match(/float/i))name=styleFloat;if(!force&&elem.style&&elem.style[name])ret=elem.style[name];else if(document.defaultView&&document.defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var getComputedStyle=document.defaultView.getComputedStyle(elem,null);if(getComputedStyle&&!color(elem))ret=getComputedStyle.getPropertyValue(name);else{var swap=[],stack=[];for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(var i=0;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":(getComputedStyle&&getComputedStyle.getPropertyValue(name))||"";for(var 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 style=elem.style.left,runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}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=elem.toString();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 fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,""+value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(typeof array!="array")for(var i=0,length=array.length;i<length;i++)ret.push(array[i]);else
ret=array.slice(0);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){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
for(var i=0;second[i];i++)first.push(second[i]);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){if(typeof callback=="string")callback=eval("false||function(a,i){return "+callback+"}");var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv&&callback(elems[i],i)||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&&value!=undefined){if(value.constructor!=Array)value=[value];ret=ret.concat(value);}}return 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,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});jQuery.each({parent:"elem.parentNode",parents:"jQuery.dir(elem,'parentNode')",next:"jQuery.nth(elem,2,'nextSibling')",prev:"jQuery.nth(elem,2,'previousSibling')",nextAll:"jQuery.dir(elem,'nextSibling')",prevAll:"jQuery.dir(elem,'previousSibling')",siblings:"jQuery.sibling(elem.parentNode.firstChild,elem)",children:"jQuery.sibling(elem.firstChild)",contents:"jQuery.nodeName(elem,'iframe')?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes)"},function(name,fn){fn=eval("false||function(elem){return "+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");};});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:{"":"m[2]=='*'||jQuery.nodeName(a,m[2])","#":"a.getAttribute('id')==m[2]",":":{lt:"i<m[3]-0",gt:"i>m[3]-0",nth:"m[3]-0==i",eq:"m[3]-0==i",first:"i==0",last:"i==r.length-1",even:"i%2==0",odd:"i%2","first-child":"a.parentNode.getElementsByTagName('*')[0]==a","last-child":"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a","only-child":"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",parent:"a.firstChild",empty:"!a.firstChild",contains:"(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",visible:'"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',hidden:'"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',enabled:"!a.disabled",disabled:"a.disabled",checked:"a.checked",selected:"a.selected||jQuery.attr(a,'selected')",text:"'text'==a.type",radio:"'radio'==a.type",checkbox:"'checkbox'==a.type",file:"'file'==a.type",password:"'password'==a.type",submit:"'submit'==a.type",image:"'image'==a.type",reset:"'reset'==a.type",button:'"button"==a.type||jQuery.nodeName(a,"button")',input:"/input|select|textarea|button/i.test(a.nodeName)",has:"jQuery.find(m[3],a).length",header:"/h\\d/i.test(a.nodeName)",animated:"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;var re=quickChild;var 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 f=jQuery.expr[m[1]];if(typeof f!="string")f=jQuery.expr[m[1]][m[2]];f=eval("false||function(a,i){return "+f+"}");r=jQuery.grep(r,f,not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var 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&&(!elem||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!=undefined)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});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)for(var type in events)this.remove(elem,type);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(!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(this.fix({type:type,target:elem}));data[0].type=type;if(jQuery.isFunction(jQuery.data(elem,"handle")))val=jQuery.data(elem,"handle").apply(elem,data);if(!fn&&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;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var handlers=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in handlers){var handler=handlers[j];args[0].handler=handler;args[0].data=handler.data;if(!parts[1]||handler.type==parts[1]){var ret=handler.apply(this,args);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=originalEvent.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;},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;arguments[0].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;arguments[0].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){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},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){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);return undefined;},toggle:function(){var args=arguments;return this.click(function(event){this.lastToggle=0==this.lastToggle?1:0;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.apply(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:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("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=(new Date).getTime();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:{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){var jsonp,jsre=/=\?(&|$)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="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&&s.type.toLowerCase()=="get"){var ts=(new Date()).getTime();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if((!s.url.indexOf("http")||!s.url.indexOf("//"))&&(s.dataType=="script"||s.dataType=="json")&&s.type.toLowerCase()=="get"){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 xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async,s.username,s.password);try{if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");xml.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xml;},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||r.status==1223||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";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(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(fn,fn2):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);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(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.apply(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)return undefined;type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?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].apply(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:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(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.apply(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=(new Date()).getTime();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=(new Date()).getTime();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&&jQuery.isFunction(this.options.complete))this.options.complete.apply(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.fx.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,fixed=jQuery.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&&jQuery.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(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||jQuery.css(offsetChild,"position")=="absolute"))||(mozilla&&jQuery.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)||0;top+=parseInt(t)||0;}return results;};})();

jQuery.noConflict();

/* =========================================================

// jquery.innerfade.js

// Datum: 2007-01-29
// Firma: Medienfreunde Hofmann & Baldes GbR
// Autor: Torsten Baldes
// Mail: t.baldes@medienfreunde.com
// Web: http://medienfreunde.com

// based on the work of Matt Oakes http://portfolio.gizone.co.uk/applications/slideshow/

// ========================================================= */


(function($) {

$.fn.innerfade = function(options) {

	var self = this;
	this.each(function(){ 	
		
		var settings = {
			animationtype: 'fade',
			speed: 'normal',
			timeout: 2000,
			type: 'sequence',
			containerheight: 'auto',
			runningclass: 'innerfade'
		};
		
		if(options)
			$.extend(settings, options);
		
		var elements = $(this).children();
	
		if (elements.length > 1) {
		
			$(this).css('position', 'relative');
	
			$(this).css('height', settings.containerheight);
			$(this).addClass(settings.runningclass);
			
			for ( var i = 0; i < elements.length; i++ ) {
				$(elements[i]).css('z-index', String(elements.length-i)).css('position', 'absolute');
				$(elements[i]).hide();
			};
		
			if ( settings.type == 'sequence' ) {
				setTimeout(function(){
					self.next(elements, settings, 1, 0);
				}, settings.timeout);
				$(elements[0]).show();
			} else if ( settings.type == 'random' ) {
				setTimeout(function(){
					do { current = Math.floor ( Math.random ( ) * ( elements.length ) ); } while ( current == 0 )
					self.next(elements, settings, current, 0);
				}, settings.timeout);
				$(elements[0]).show();
			}	else {
				alert('type must either be \'sequence\' or \'random\'');
			}
			
		}
		
	});
	return this;
};


$.fn.next = function (elements, settings, current, last) {

	if (this.length == 0)
		return;
	
	if ( settings.animationtype == 'slide' ) {
		$(elements[last]).slideUp(settings.speed, $(elements[current]).slideDown(settings.speed));
	} else if ( settings.animationtype == 'fade' ) {
		$(elements[last]).fadeOut(settings.speed);
		$(elements[current]).fadeIn(settings.speed);
	} else {
		alert('animationtype must either be \'slide\' or \'fade\'');
	};
	
	if ( settings.type == 'sequence' ) {
		if ( ( current + 1 ) < elements.length ) {
			current = current + 1;
			last = current - 1;
		} else {
			current = 0;
			last = elements.length - 1;
		};
	}	else if ( settings.type == 'random' ) {
		last = current;
		while (	current == last ) {
			current = Math.floor ( Math.random ( ) * ( elements.length ) );
		};
	}	else {
		alert('type must either be \'sequence\' or \'random\'');
	};
	var self = this;
	setTimeout((function(){self.next(elements, settings, current, last);}), settings.timeout);
};
})(jQuery);

/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
 * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
 * Date: 1/2/2008
 * @author Ariel Flesler
 * @version 1.3
 */
;(function($){$.scrollTo=function(a,b,c){$($.browser.safari?'body':'html').scrollTo(a,b,c)};$.scrollTo.defaults={axis:'y',duration:1};$.fn.scrollTo=function(c,d,f){if(typeof d=='object'){f=d;d=0}f=$.extend({},$.scrollTo.defaults,f);if(!d)d=f.speed||f.duration;f.queue=f.queue&&f.axis.length==2;if(f.queue)d=Math.ceil(d/2);if(typeof f.offset=='number')f.offset={left:f.offset,top:f.offset};return this.each(function(){var e=this,$e=$(e),t=c,toff,j={},w=$e.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t={top:t,left:t};break}t=$(t,this);case'object':if(t.is||t.style)toff=(t=$(t)).offset()}$.each(f.axis.split(''),parse);animate(f.onAfter);function parse(i,a){var P=a=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,u=e[k];if(toff){j[k]=toff[p]+(w?0:u-$e.offset()[p]);if(f.margin){j[k]-=parseInt(t.css('margin'+P))||0;j[k]-=parseInt(t.css('border'+P+'Width'))||0}if(f.offset&&f.offset[p])j[k]+=f.offset[p]}else{j[k]=t[p]}if(/^\d+$/.test(j[k]))j[k]=j[k]<=0?0:Math.min(j[k],max(a));if(!i&&f.queue){if(u!=j[k])animate(f.onAfterFirst);delete j[k]}};function animate(a){$e.animate(j,d,f.easing,function(){if(a)a.call(this,$e,j,t)})};function max(a){var b=w?$.browser.opera?document.body:document.documentElement:e,D=a=='x'?'Width':'Height';return b['scroll'+D]-b['client'+D]}})}})(jQuery);
/*  Prototype JavaScript framework, version 1.3.1
 *  (c) 2005 Sam Stephenson <sam@conio.net>
 *
 *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
 *  against the source tree, available from the Prototype darcs repository. 
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *
 *  For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.3.1',
  emptyFunction: function() {}
}

var Class = {
  create: function() {
    return function() { 
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.prototype.extend = function(object) {
  return Object.extend.apply(this, [this, object]);
}

Function.prototype.bind = function(object) {
  var __method = this;
  return function() {
    __method.apply(object, arguments);
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    __method.call(object, event || window.event);
  }
}

Number.prototype.toColorPart = function() {
  var digits = this.toString(16);
  if (this < 16) return '0' + digits;
  return digits;
}

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0; i < arguments.length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}

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

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try { 
        this.currentlyExecuting = true;
        this.callback(); 
      } finally { 
        this.currentlyExecuting = false;
      }
    }
  }
}

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

function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1) 
      return element;

    elements.push(element);
  }

  return elements;
}

if (!Array.prototype.push) {
  Array.prototype.push = function() {
		var startLength = this.length;
		for (var i = 0; i < arguments.length; i++)
      this[startLength + i] = arguments[i];
	  return this.length;
  }
}

if (!Function.prototype.apply) {
  // Based on code from http://www.youngpup.net/
  Function.prototype.apply = function(object, parameters) {
    var parameterStrings = new Array();
    if (!object)     object = window;
    if (!parameters) parameters = new Array();
    
    for (var i = 0; i < parameters.length; i++)
      parameterStrings[i] = 'parameters[' + i + ']';
    
    object.__apply__ = this;
    var result = eval('object.__apply__(' + 
      parameterStrings.join(', ') + ')');
    object.__apply__ = null;
    
    return result;
  }
}

String.prototype.extend({
  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  escapeHTML: function() {
    var div = document.createElement('div');
    var text = document.createTextNode(this);
    div.appendChild(text);
    return div.innerHTML;
  },

  unescapeHTML: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0].nodeValue;
  }
});

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
      function() {return new XMLHttpRequest()}
    ) || false;
  }
}

Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      parameters:   ''
    }.extend(options || {});
  },

  responseIsSuccess: function() {
    return this.transport.status == undefined
        || this.transport.status == 0 
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

  responseIsFailure: function() {
    return !this.responseIsSuccess();
  }
}

Ajax.Request = Class.create();
Ajax.Request.Events = 
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = (new Ajax.Base()).extend({
  initialize: function(url, options) {
    this.transport = Ajax.getTransport();
    this.setOptions(options);
    this.request(url);
  },

  request: function(url) {
    var parameters = this.options.parameters || '';
    if (parameters.length > 0) parameters += '&_=';

    try {
      if (this.options.method == 'get')
        url += '?' + parameters;

      this.transport.open(this.options.method, url,
        this.options.asynchronous);

      if (this.options.asynchronous) {
        this.transport.onreadystatechange = this.onStateChange.bind(this);
        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
      }

      this.setRequestHeaders();

      var body = this.options.postBody ? this.options.postBody : parameters;
      this.transport.send(this.options.method == 'post' ? body : null);

    } catch (e) {
    }
  },

  setRequestHeaders: function() {
    var requestHeaders = 
      ['X-Requested-With', 'XMLHttpRequest',
       'X-Prototype-Version', Prototype.Version];

    if (this.options.method == 'post') {
      requestHeaders.push('Content-type', 
        'application/x-www-form-urlencoded');

      /* Force "Connection: close" for Mozilla browsers to work around
       * a bug where XMLHttpReqeuest sends an incorrect Content-length
       * header. See Mozilla Bugzilla #246651. 
       */
      if (this.transport.overrideMimeType)
        requestHeaders.push('Connection', 'close');
    }

    if (this.options.requestHeaders)
      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);

    for (var i = 0; i < requestHeaders.length; i += 2)
      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState != 1)
      this.respondToReadyState(this.transport.readyState);
  },

  respondToReadyState: function(readyState) {
    var event = Ajax.Request.Events[readyState];

    if (event == 'Complete')
      (this.options['on' + this.transport.status]
       || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
       || Prototype.emptyFunction)(this.transport);

    (this.options['on' + event] || Prototype.emptyFunction)(this.transport);

    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
    if (event == 'Complete')
      this.transport.onreadystatechange = Prototype.emptyFunction;
  }
});

Ajax.Updater = Class.create();
Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';

Ajax.Updater.prototype.extend(Ajax.Request.prototype).extend({
  initialize: function(container, url, options) {
    this.containers = {
      success: container.success ? $(container.success) : $(container),
      failure: container.failure ? $(container.failure) :
        (container.success ? null : $(container))
    }

    this.transport = Ajax.getTransport();
    this.setOptions(options);

    var onComplete = this.options.onComplete || Prototype.emptyFunction;
    this.options.onComplete = (function() {
      this.updateContent();
      onComplete(this.transport);
    }).bind(this);

    this.request(url);
  },

  updateContent: function() {
    var receiver = this.responseIsSuccess() ?
      this.containers.success : this.containers.failure;

    var match    = new RegExp(Ajax.Updater.ScriptFragment, 'img');
    var response = this.transport.responseText.replace(match, '');
    var scripts  = this.transport.responseText.match(match);

    if (receiver) {
      if (this.options.insertion) {
        new this.options.insertion(receiver, response);
      } else {
        receiver.innerHTML = response;
      }
    }

    if (this.responseIsSuccess()) {
      if (this.onComplete)
        setTimeout((function() {this.onComplete(
          this.transport)}).bind(this), 10);
    }

    if (this.options.evalScripts && scripts) {
      match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
      setTimeout((function() {
        for (var i = 0; i < scripts.length; i++)
          eval(scripts[i].match(match)[1]);
      }).bind(this), 10);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = (new Ajax.Base()).extend({
  initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = 1;

    this.updater = {};
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Ajax.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ? 
        this.decay * this.options.decay : 1);

      this.lastText = request.responseText;
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this), 
      this.decay * this.frequency * 1000);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});

document.getElementsByClassName = function(className) {
  var children = document.getElementsByTagName('*') || document.all;
  var elements = new Array();
  
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    var classNames = child.className.split(' ');
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] == className) {
        elements.push(child);
        break;
      }
    }
  }
  
  return elements;
}

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

if (!window.Element) {
  var Element = new Object();
}

Object.extend(Element, {
  toggle: function() {
    for (var i = 0; i < arguments.length; i++) {
      var element = $(arguments[i]);
      element.style.display = 
        (element.style.display == 'none' ? '' : 'none');
    }
  },

  hide: function() {
    for (var i = 0; i < arguments.length; i++) {
      var element = $(arguments[i]);
      element.style.display = 'none';
    }
  },

  show: function() {
    for (var i = 0; i < arguments.length; i++) {
      var element = $(arguments[i]);
      element.style.display = '';
    }
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
  },
   
  getHeight: function(element) {
    element = $(element);
    return element.offsetHeight; 
  },

  hasClassName: function(element, className) {
    element = $(element);
    if (!element)
      return;
    var a = element.className.split(' ');
    for (var i = 0; i < a.length; i++) {
      if (a[i] == className)
        return true;
    }
    return false;
  },

  addClassName: function(element, className) {
    element = $(element);
    Element.removeClassName(element, className);
    element.className += ' ' + className;
  },

  removeClassName: function(element, className) {
    element = $(element);
    if (!element)
      return;
    var newClassName = '';
    var a = element.className.split(' ');
    for (var i = 0; i < a.length; i++) {
      if (a[i] != className) {
        if (i > 0)
          newClassName += ' ';
        newClassName += a[i];
      }
    }
    element.className = newClassName;
  },
  
  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    var element = $(element);
    for (var i = 0; i < element.childNodes.length; i++) {
      var node = element.childNodes[i];
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 
        Element.remove(node);
    }
  }
});

var Toggle = new Object();
Toggle.display = Element.toggle;

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

Abstract.Insertion = function(adjacency) {
  this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $(element);
    this.content = content;
    
    if (this.adjacency && this.element.insertAdjacentHTML) {
      this.element.insertAdjacentHTML(this.adjacency, this.content);
    } else {
      this.range = this.element.ownerDocument.createRange();
      if (this.initializeRange) this.initializeRange();
      this.fragment = this.range.createContextualFragment(this.content);
      this.insertContent();
    }
  }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },
  
  insertContent: function() {
    this.element.parentNode.insertBefore(this.fragment, this.element);
  }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(true);
  },
  
  insertContent: function() {  
    this.element.insertBefore(this.fragment, this.element.firstChild);
  }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(this.element);
  },
  
  insertContent: function() {
    this.element.appendChild(this.fragment);
  }
});

Insertion.After = Class.create();
Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({
  initializeRange: function() {
    this.range.setStartAfter(this.element);
  },
  
  insertContent: function() {
    this.element.parentNode.insertBefore(this.fragment, 
      this.element.nextSibling);
  }
});

var Field = {
  clear: function() {
    for (var i = 0; i < arguments.length; i++)
      $(arguments[i]).value = '';
  },

  focus: function(element) {
    $(element).focus();
  },
  
  present: function() {
    for (var i = 0; i < arguments.length; i++)
      if ($(arguments[i]).value == '') return false;
    return true;
  },
  
  select: function(element) {
    $(element).select();
  },
   
  activate: function(element) {
    $(element).focus();
    $(element).select();
  }
}

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

var Form = {
  serialize: function(form) {
    var elements = Form.getElements($(form));
    var queryComponents = new Array();
    
    for (var i = 0; i < elements.length; i++) {
      var queryComponent = Form.Element.serialize(elements[i]);
      if (queryComponent)
        queryComponents.push(queryComponent);
    }
    
    return queryComponents.join('&');
  },
  
  getElements: function(form) {
    var form = $(form);
    var elements = new Array();

    for (tagName in Form.Element.Serializers) {
      var tagElements = form.getElementsByTagName(tagName);
      for (var j = 0; j < tagElements.length; j++)
        elements.push(tagElements[j]);
    }
    return elements;
  },
  
  getInputs: function(form, typeName, name) {
    var form = $(form);
    var inputs = form.getElementsByTagName('input');
    
    if (!typeName && !name)
      return inputs;
      
    var matchingInputs = new Array();
    for (var i = 0; i < inputs.length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) ||
          (name && input.name != name)) 
        continue;
      matchingInputs.push(input);
    }

    return matchingInputs;
  },

  disable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.blur();
      element.disabled = 'true';
    }
  },

  enable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.disabled = '';
    }
  },

  focusFirstElement: function(form) {
    var form = $(form);
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      if (element.type != 'hidden' && !element.disabled) {
        Field.activate(element);
        break;
      }
    }
  },

  reset: function(form) {
    $(form).reset();
  }
}

Form.Element = {
  serialize: function(element) {
    var element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);
    
    if (parameter)
      return encodeURIComponent(parameter[0]) + '=' + 
        encodeURIComponent(parameter[1]);                   
  },
  
  getValue: function(element) {
    var element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);
    
    if (parameter) 
      return parameter[1];
  }
}

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'submit':
      case 'hidden':
      case 'password':
      case 'text':
        return Form.Element.Serializers.textarea(element);
      case 'checkbox':  
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
    }
    return false;
  },

  inputSelector: function(element) {
    if (element.checked)
      return [element.name, element.value];
  },

  textarea: function(element) {
    return [element.name, element.value];
  },

  select: function(element) {
    var value = '';
    if (element.type == 'select-one') {
      var index = element.selectedIndex;
      if (index >= 0)
        value = element.options[index].value || element.options[index].text;
    } else {
      value = new Array();
      for (var i = 0; i < element.length; i++) {
        var opt = element.options[i];
        if (opt.selected)
          value.push(opt.value || opt.text);
      }
    }
    return [element.name, value];
  }
}

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

var $F = Form.Element.getValue;

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

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
  initialize: function(element, frequency, callback) {
    this.frequency = frequency;
    this.element   = $(element);
    this.callback  = callback;
    
    this.lastValue = this.getValue();
    this.registerCallback();
  },
  
  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },
  
  onTimerEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create();
Form.Observer.prototype = (new Abstract.TimedObserver()).extend({
  getValue: function() {
    return Form.serialize(this.element);
  }
});

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

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;
    
    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },
  
  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },
  
  registerFormCallbacks: function() {
    var elements = Form.getElements(this.element);
    for (var i = 0; i < elements.length; i++)
      this.registerCallback(elements[i]);
  },
  
  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':  
        case 'radio':
          element.target = this;
          element.prev_onclick = element.onclick || Prototype.emptyFunction;
          element.onclick = function() {
            this.prev_onclick(); 
            this.target.onElementEvent();
          }
          break;
        case 'password':
        case 'text':
        case 'textarea':
        case 'select-one':
        case 'select-multiple':
          element.target = this;
          element.prev_onchange = element.onchange || Prototype.emptyFunction;
          element.onchange = function() {
            this.prev_onchange(); 
            this.target.onElementEvent();
          }
          break;
      }
    }    
  }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = (new Abstract.EventObserver()).extend({
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = (new Abstract.EventObserver()).extend({
  getValue: function() {
    return Form.serialize(this.element);
  }
});


if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,

  element: function(event) {
    return event.target || event.srcElement;
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX + 
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY + 
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) { 
      event.preventDefault(); 
      event.stopPropagation(); 
    } else {
      event.returnValue = false;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,
  
  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },
  
  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0; i < Event.observers.length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;
    
    if (name == 'keypress' &&
        ((navigator.appVersion.indexOf('AppleWebKit') > 0) 
        || element.attachEvent))
      name = 'keydown';
    
    this._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;
    
    if (name == 'keypress' &&
        ((navigator.appVersion.indexOf('AppleWebKit') > 0) 
        || element.detachEvent))
      name = 'keydown';
    
    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      element.detachEvent('on' + name, observer);
    }
  }
});

/* prevent memory leaks in IE */
Event.observe(window, 'unload', Event.unloadCache, false);

var Position = {

  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false, 

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset 
                || document.documentElement.scrollLeft 
                || document.body.scrollLeft 
                || 0;
    this.deltaY =  window.pageYOffset 
                || document.documentElement.scrollTop 
                || document.body.scrollTop 
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0; 
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] && 
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] && 
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {  
    if (!mode) return 0;  
    if (mode == 'vertical') 
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) / 
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) / 
        element.offsetWidth;
  },

  clone: function(source, target) {
    source = $(source);
    target = $(target);
    target.style.position = 'absolute';
    var offsets = this.cumulativeOffset(source);
    target.style.top    = offsets[1] + 'px';
    target.style.left   = offsets[0] + 'px';
    target.style.width  = source.offsetWidth + 'px';
    target.style.height = source.offsetHeight + 'px';
  }
}
var Rico = {
  Version: '1.1-beta2'
}

Rico.ArrayExtensions = new Array();

if (Object.prototype.extend) {
   // in prototype.js...
   Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend;
}

if (Array.prototype.push) {
   // in prototype.js...
   Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.push;
}

if (!Array.prototype.remove) {
   Array.prototype.remove = function(dx) {
      if( isNaN(dx) || dx > this.length )
         return false;
      for( var i=0,n=0; i<this.length; i++ )
         if( i != dx )
            this[n++]=this[i];
      this.length-=1;
   };
  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.remove;
}

if (!Array.prototype.removeItem) {
   Array.prototype.removeItem = function(item) {
      for ( var i = 0 ; i < this.length ; i++ )
         if ( this[i] == item ) {
            this.remove(i);
            break;
         }
   };
  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.removeItem;
}

if (!Array.prototype.indices) {
   Array.prototype.indices = function() {
      var indexArray = new Array();
      for ( index in this ) {
         var ignoreThis = false;
         for ( var i = 0 ; i < Rico.ArrayExtensions.length ; i++ ) {
            if ( this[index] == Rico.ArrayExtensions[i] ) {
               ignoreThis = true;
               break;
            }
         }
         if ( !ignoreThis )
            indexArray[ indexArray.length ] = index;
      }
      return indexArray;
   }
  Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.indices;
}

// Create the loadXML method and xml getter for Mozilla
if ( window.DOMParser &&
	  window.XMLSerializer &&
	  window.Node && Node.prototype && Node.prototype.__defineGetter__ ) {

   if (!Document.prototype.loadXML) {
      Document.prototype.loadXML = function (s) {
         var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
         while (this.hasChildNodes())
            this.removeChild(this.lastChild);

         for (var i = 0; i < doc2.childNodes.length; i++) {
            this.appendChild(this.importNode(doc2.childNodes[i], true));
         }
      };
	}

	Document.prototype.__defineGetter__( "xml",
	   function () {
		   return (new XMLSerializer()).serializeToString(this);
	   }
	 );
}

document.getElementsByTagAndClassName = function(tagName, className) {
  if ( tagName == null )
     tagName = '*';

  var children = document.getElementsByTagName(tagName) || document.all;
  var elements = new Array();

  if ( className == null )
    return children;

  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    var classNames = child.className.split(' ');
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] == className) {
        elements.push(child);
        break;
      }
    }
  }

  return elements;
}


//-------------------- ricoAccordion.js

Rico.Accordion = Class.create();

Rico.Accordion.prototype = {

   initialize: function(container, options) {
      this.container            = $(container);
      this.lastExpandedTab      = null;
      this.accordionTabs        = new Array();
      this.setOptions(options);
      this._attachBehaviors();

      this.container.style.borderBottom = '1px solid ' + this.options.borderColor;

      // set the initial visual state...
      for ( var i=1 ; i < this.accordionTabs.length ; i++ )
      {
         this.accordionTabs[i].collapse();
         this.accordionTabs[i].content.style.display = 'none';
      }
      this.lastExpandedTab = this.accordionTabs[0];
      this.lastExpandedTab.content.style.height = this.options.panelHeight + "px";
      this.lastExpandedTab.showExpanded();
      this.lastExpandedTab.titleBar.style.fontWeight = this.options.expandedFontWeight;
   },

   setOptions: function(options) {
      this.options = {
         expandedBg          : '#63699c',
         hoverBg             : '#63699c',
         collapsedBg         : '#6b79a5',
         expandedTextColor   : '#ffffff',
         expandedFontWeight  : 'bold',
         hoverTextColor      : '#ffffff',
         collapsedTextColor  : '#ced7ef',
         collapsedFontWeight : 'normal',
         hoverTextColor      : '#ffffff',
         borderColor         : '#1f669b',
         panelHeight         : 200,
         onHideTab           : null,
         onShowTab           : null
      }.extend(options || {});
   },

   showTabByIndex: function( anIndex, animate ) {
      var doAnimate = arguments.length == 1 ? true : animate;
      this.showTab( this.accordionTabs[anIndex], doAnimate );
   },

   showTab: function( accordionTab, animate ) {

      var doAnimate = arguments.length == 1 ? true : animate;

      if ( this.options.onHideTab )
         this.options.onHideTab(this.lastExpandedTab);

      this.lastExpandedTab.showCollapsed(); 
      var accordion = this;
      var lastExpandedTab = this.lastExpandedTab;

      this.lastExpandedTab.content.style.height = (this.options.panelHeight - 1) + 'px';
      accordionTab.content.style.display = '';

      accordionTab.titleBar.style.fontWeight = this.options.expandedFontWeight;

      if ( doAnimate ) {
         new Effect.AccordionSize( this.lastExpandedTab.content,
                                   accordionTab.content,
                                   1,
                                   this.options.panelHeight,
                                   100, 10,
                                   { complete: function() {accordion.showTabDone(lastExpandedTab)} } );
         this.lastExpandedTab = accordionTab;
      }
      else {
         this.lastExpandedTab.content.style.height = "1px";
         accordionTab.content.style.height = this.options.panelHeight + "px";
         this.lastExpandedTab = accordionTab;
         this.showTabDone(lastExpandedTab);
      }
   },

   showTabDone: function(collapsedTab) {
      collapsedTab.content.style.display = 'none';
      this.lastExpandedTab.showExpanded();
      if ( this.options.onShowTab )
         this.options.onShowTab(this.lastExpandedTab);
   },

   _attachBehaviors: function() {
      var panels = this._getDirectChildrenByTag(this.container, 'DIV');
      for ( var i = 0 ; i < panels.length ; i++ ) {

         var tabChildren = this._getDirectChildrenByTag(panels[i],'DIV');
         if ( tabChildren.length != 2 )
            continue; // unexpected

         var tabTitleBar   = tabChildren[0];
         var tabContentBox = tabChildren[1];
         this.accordionTabs.push( new Rico.Accordion.Tab(this,tabTitleBar,tabContentBox) );
      }
   },

   _getDirectChildrenByTag: function(e, tagName) {
      var kids = new Array();
      var allKids = e.childNodes;
      for( var i = 0 ; i < allKids.length ; i++ )
         if ( allKids[i] && allKids[i].tagName && allKids[i].tagName == tagName )
            kids.push(allKids[i]);
      return kids;
   }

};

Rico.Accordion.Tab = Class.create();

Rico.Accordion.Tab.prototype = {

   initialize: function(accordion, titleBar, content) {
      this.accordion = accordion;
      this.titleBar  = titleBar;
      this.content   = content;
      this._attachBehaviors();
   },

   collapse: function() {
      this.showCollapsed();
      this.content.style.height = "1px";
   },

   showCollapsed: function() {
      this.expanded = false;
      this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg;
      this.titleBar.style.color           = this.accordion.options.collapsedTextColor;
      this.titleBar.style.fontWeight      = this.accordion.options.collapsedFontWeight;
      this.content.style.overflow = "hidden";
   },

   showExpanded: function() {
      this.expanded = true;
      this.titleBar.style.backgroundColor = this.accordion.options.expandedBg;
      this.titleBar.style.color           = this.accordion.options.expandedTextColor;
      this.content.style.overflow         = "visible";
   },

   titleBarClicked: function(e) {
      if ( this.accordion.lastExpandedTab == this )
         return;
      this.accordion.showTab(this);
   },

   hover: function(e) {
		this.titleBar.style.backgroundColor = this.accordion.options.hoverBg;
		this.titleBar.style.color           = this.accordion.options.hoverTextColor;
   },

   unhover: function(e) {
      if ( this.expanded ) {
         this.titleBar.style.backgroundColor = this.accordion.options.expandedBg;
         this.titleBar.style.color           = this.accordion.options.expandedTextColor;
      }
      else {
         this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg;
         this.titleBar.style.color           = this.accordion.options.collapsedTextColor;
      }
   },

   _attachBehaviors: function() {
      this.content.style.border = "1px solid " + this.accordion.options.borderColor;
      this.content.style.borderTopWidth    = "0px";
      this.content.style.borderBottomWidth = "0px";
      this.content.style.margin            = "0px";

      this.titleBar.onclick     = this.titleBarClicked.bindAsEventListener(this);
      this.titleBar.onmouseover = this.hover.bindAsEventListener(this);
      this.titleBar.onmouseout  = this.unhover.bindAsEventListener(this);
   }

};


//-------------------- ricoAjaxEngine.js

Rico.AjaxEngine = Class.create();

Rico.AjaxEngine.prototype = {

   initialize: function() {
      this.ajaxElements = new Array();
      this.ajaxObjects  = new Array();
      this.requestURLS  = new Array();
   },

   registerAjaxElement: function( anId, anElement ) {
      if ( arguments.length == 1 )
         anElement = $(anId);
      this.ajaxElements[anId] = anElement;
   },

   registerAjaxObject: function( anId, anObject ) {
      this.ajaxObjects[anId] = anObject;
   },

   registerRequest: function (requestLogicalName, requestURL) {
      this.requestURLS[requestLogicalName] = requestURL;
   },

   sendRequest: function(requestName, options) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 2 )
         queryString = this._createQueryString(arguments, 2);

      var requestOptions = this._requestOptions(queryString);
      requestOptions.extend(options);

      new Ajax.Request(requestURL, requestOptions);
   },

   sendRequestWithData: function(requestName, xmlDocument) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 2 )
         queryString = this._createQueryString(arguments, 2);

      new Ajax.Request(requestURL + "?" + queryString, this._requestOptions(null,xmlDocument));
   },

   sendRequestAndUpdate: function(requestName,container,options) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 3 )
         queryString = this._createQueryString(arguments, 3);

      var updaterOptions = this._requestOptions(queryString);
      updaterOptions.onComplete = null;
      updaterOptions.extend(options);

      new Ajax.Updater(container, requestURL, updaterOptions);
   },

   sendRequestWithDataAndUpdate: function(requestName,xmlDocument,container,options) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 4 )
         queryString = this._createQueryString(arguments, 4);


      var updaterOptions = this._requestOptions(queryString,xmlDocument);
      updaterOptions.onComplete = null;
      updaterOptions.extend(options);

      new Ajax.Updater(container, requestURL + "?" + queryString, updaterOptions);
   },

   // Private -- not part of intended engine API --------------------------------------------------------------------

   _requestOptions: function(queryString,xmlDoc) {
      var self = this;

      var requestHeaders = ['X-Rico-Version', Rico.Version ];
      var sendMethod = "post"
      if ( arguments[1] )
         requestHeaders.push( 'Content-type', 'text/xml' );
      else
         sendMethod = "get";

      return { requestHeaders: requestHeaders,
               parameters:     queryString,
               postBody:       arguments[1] ? xmlDoc : null,
               method:         sendMethod,
               onComplete:     self._onRequestComplete.bind(self) };
   },

   _createQueryString: function( theArgs, offset ) {
      var queryString = ""
      for ( var i = offset ; i < theArgs.length ; i++ ) {
          if ( i != offset )
            queryString += "&";

          var anArg = theArgs[i];

          if ( anArg.name != undefined && anArg.value != undefined ) {
            queryString += anArg.name +  "=" + escape(anArg.value);
          }
          else {
             var ePos  = anArg.indexOf('=');
             var argName  = anArg.substring( 0, ePos );
             var argValue = anArg.substring( ePos + 1 );
             queryString += argName + "=" + escape(argValue);
          }
      }

      return queryString;
   },

   _onRequestComplete : function(request) {

      //!!TODO: error handling infrastructure?? 
      if (request.status != 200)
        return;

      var response = request.responseXML.getElementsByTagName("ajax-response");
      if (response == null || response.length != 1)
         return;
      this._processAjaxResponse( response[0].childNodes );
   },

   _processAjaxResponse: function( xmlResponseElements ) {
      for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) {
         var responseElement = xmlResponseElements[i];

         // only process nodes of type element.....
         if ( responseElement.nodeType != 1 )
            continue;

         var responseType = responseElement.getAttribute("type");
         var responseId   = responseElement.getAttribute("id");

         if ( responseType == "object" )
            this._processAjaxObjectUpdate( this.ajaxObjects[ responseId ], responseElement );
         else if ( responseType == "element" )
            this._processAjaxElementUpdate( this.ajaxElements[ responseId ], responseElement );
         else
            alert('unrecognized AjaxResponse type : ' + responseType );
      }
   },

   _processAjaxObjectUpdate: function( ajaxObject, responseElement ) {
      ajaxObject.ajaxUpdate( responseElement );
   },

   _processAjaxElementUpdate: function( ajaxElement, responseElement ) {
      ajaxElement.innerHTML = RicoUtil.getContentAsString(responseElement);
   }

}

var ajaxEngine = new Rico.AjaxEngine();

//-------------------- ricoUtil.js

var RicoUtil = {

   getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) {
      if ( arguments.length == 2 )
         mozillaEquivalentCSS = cssProperty;

      var el = $(htmlElement);
      if ( el.currentStyle )
         return el.currentStyle[cssProperty];
      else
         return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);
   },

   createXmlDocument : function() {
      if (document.implementation && document.implementation.createDocument) {
         var doc = document.implementation.createDocument("", "", null);

         if (doc.readyState == null) {
            doc.readyState = 1;
            doc.addEventListener("load", function () {
               doc.readyState = 4;
               if (typeof doc.onreadystatechange == "function")
                  doc.onreadystatechange();
            }, false);
         }

         return doc;
      }

      if (window.ActiveXObject)
          return Try.these(
            function() { return new ActiveXObject('MSXML2.DomDocument')   },
            function() { return new ActiveXObject('Microsoft.DomDocument')},
            function() { return new ActiveXObject('MSXML.DomDocument')    },
            function() { return new ActiveXObject('MSXML3.DomDocument')   }
          ) || false;

      return null;
   },

   getContentAsString: function( parentNode ) {
      return parentNode.xml != undefined ? 
         this._getContentAsStringIE(parentNode) :
         this._getContentAsStringMozilla(parentNode);
   },

   _getContentAsStringIE: function(parentNode) {
      var contentStr = "";
      for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
         contentStr += parentNode.childNodes[i].xml;
      return contentStr;
   },

   _getContentAsStringMozilla: function(parentNode) {
      var xmlSerializer = new XMLSerializer();
      var contentStr = "";
      for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
         contentStr += xmlSerializer.serializeToString(parentNode.childNodes[i]);
      return contentStr;
   },

   toViewportPosition: function(element) {
      return this._toAbsolute(element,true);
   },

   toDocumentPosition: function(element) {
      return this._toAbsolute(element,false);
   },

   /**
    *  Compute the elements position in terms of the window viewport
    *  so that it can be compared to the position of the mouse (dnd)
    *  This is additions of all the offsetTop,offsetLeft values up the
    *  offsetParent hierarchy, ...taking into account any scrollTop,
    *  scrollLeft values along the way...
    *
    * IE has a bug reporting a correct offsetLeft of elements within a
    * a relatively positioned parent!!!
    **/
   _toAbsolute: function(element,accountForDocScroll) {

      if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 )
         return this._toAbsoluteMozilla(element,accountForDocScroll);

      var x = 0;
      var y = 0;
      var parent = element;
      while ( parent ) {

         var borderXOffset = 0;
         var borderYOffset = 0;
         if ( parent != element ) {
            var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" ));
            var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" ));
            borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
            borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
         }

         x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
         y += parent.offsetTop - parent.scrollTop + borderYOffset;
         parent = parent.offsetParent;
      }

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   /**
    *  Mozilla did not report all of the parents up the hierarchy via the
    *  offsetParent property that IE did.  So for the calculation of the
    *  offsets we use the offsetParent property, but for the calculation of
    *  the scrollTop/scrollLeft adjustments we navigate up via the parentNode
    *  property instead so as to get the scroll offsets...
    *
    **/
   _toAbsoluteMozilla: function(element,accountForDocScroll) {
      var x = 0;
      var y = 0;
      var parent = element;
      while ( parent ) {
         x += parent.offsetLeft;
         y += parent.offsetTop;
         parent = parent.offsetParent;
      }

      parent = element;
      while ( parent &&
              parent != document.body &&
              parent != document.documentElement ) {
         if ( parent.scrollLeft  )
            x -= parent.scrollLeft;
         if ( parent.scrollTop )
            y -= parent.scrollTop;
         parent = parent.parentNode;
      }

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   docScrollLeft: function() {
      if ( window.pageXOffset )
         return window.pageXOffset;
      else if ( document.documentElement && document.documentElement.scrollLeft )
         return document.documentElement.scrollLeft;
      else if ( document.body )
         return document.body.scrollLeft;
      else
         return 0;
   },

   docScrollTop: function() {
      if ( window.pageYOffset )
         return window.pageYOffset;
      else if ( document.documentElement && document.documentElement.scrollTop )
         return document.documentElement.scrollTop;
      else if ( document.body )
         return document.body.scrollTop;
      else
         return 0;
   }

};
PageManager = Class.create();
PageManager.prototype = {

	initialize: function() {
		this.init = true;
	},

	start: function(defaultLang) {
		var qs = getQueryStringArray();
		this.selectedPageMenuNode = null;
		this.showPageOnLoad = qs["page"];
		if (this.showPageOnLoad == undefined)
			this.showPageOnLoad = parseInt(readCookie("showPageOnLoad"));
		var lang = qs["lang"];
		if (lang == undefined || lang == "")
			lang = readCookie("lang");
		if (lang == null || lang == undefined)
			lang = defaultLang != undefined ? defaultLang : "en";
		this.setLanguage(lang);
	},
	
	setLanguage: function(lang) {
		this.lang = lang;
		this.updateDocument();
	},
	
	loadHeader: function() {
		this.loadPage("header", "header");
	},
	
	loadLangMenu: function() {
		if ($("langMenu") == null)
			return;
		var self = this;
		AjaxUtil.loadXml("langmenu.xml", function(ajaxResponseNode) {
			self.ajaxLangMenuNode = ajaxResponseNode;
			self.updateLangMenu();
		});
	},
	
	loadPageMenu: function() {
		var self = this;
		AjaxUtil.loadXml("pagemenu.xml", function(ajaxResponseNode) {
			self.ajaxPageMenuNode = ajaxResponseNode;
			self.updatePageMenu();
		});
	},
	
	loadPage: function(page, elementId, f) {
		if (!elementId)
			elementId = "content";
		AjaxUtil.loadXhtml(elementId, "/pages/" + this.lang + '/' + page + ".xml", f);
	},

	loadFooter: function() {
		this.loadPage("footer", "footer");
	},
	
	updateDocument: function() {
		if (this.ajaxLangMenuNode == null)
			this.loadLangMenu();
		else
			this.updateLangMenu();
		this.loadHeader();
		if (this.ajaxPageMenuNode == null)
			this.loadPageMenu();
		else
			this.updatePageMenu();
		if (this.selectedPageMenuNode != null)
			this.onMenuClick(this.selectedPageMenuNode);
		this.loadFooter();
	},

	updateLangMenu: function() {
		this.updateMenu("langMenu", this.ajaxLangMenuNode, false);
	},
	
	updatePageMenu: function() {
		this.updateMenu("pageMenu", this.ajaxPageMenuNode, this.init);
		this.init = false;
	},
	
	updateMenu: function(menuId, ajaxMenuNode, showPageOnLoad) {
		var div = $(menuId);
		if (!div) {
			if (this.showPageOnLoad) {
				if (this.showPageOnLoad.indexOf('(') != -1)
					eval(this.showPageOnLoad);
				else
					this.loadPage(this.showPageOnLoad);
			}
			return;
		}
		while (div.firstChild != null)
			div.removeChild(div.firstChild);
		var ul = document.createElement("ul");
		var nodes = ajaxMenuNode.childNodes;
		var menuItemCount = 0;
		var firstMenuNode = null;
		var pageOnLoadFound = !showPageOnLoad;
		for (var i = 0 ; i < nodes.length ; i++) {
			var node = nodes[i];
			var menuItem = this.createMenuElement(node);
			if (menuItem != null) {
				if (firstMenuNode == null)
					firstMenuNode = node;
				if (node.getAttribute("displayed") != "false") {
					ul.appendChild(menuItem);
					menuItemCount++;
					node.setAttribute("pageNumber", menuItemCount);
				}
				if (!pageOnLoadFound) {
					pageOnLoadFound = (this.showPageOnLoad == menuItemCount || this.showPageOnLoad == node.getAttribute("page")) && ajaxMenuNode == this.ajaxPageMenuNode && this.selectedPageMenuNode == null; 
					if (pageOnLoadFound)
						this.onMenuClick(node);
				}
			}
		}
		if (!pageOnLoadFound)
			this.onMenuClick(firstMenuNode);
		/*
		var width = div.offsetWidth / nodes.length;
		for (var i = 0 ; i < nodes.length ; i++)
			nodes[i].style.width = width + "px";
		*/
		div.appendChild(ul);
		nodes = ul.childNodes;
		var textWidth = 0;
		for (var i = 0 ; i < nodes.length ; i++)
			textWidth += nodes[i].offsetWidth;
		var padding = (div.offsetWidth - textWidth) / (nodes.length + 1); 
		for (var i = 0 ; i < nodes.length ; i++) {
			nodes[i].style.paddingLeft = (i == 0 ? padding : padding / 2) + "px";
			nodes[i].style.paddingRight = (i == nodes.length - 1 ? padding - 1 : padding / 2) + "px";
		}
	},
	
	createMenuElement: function(node) {
		try {
			var menuItem = document.createElement("li");
			menuItem.setAttribute("class", "clickable");
			menuItem.setAttribute("className", "clickable");
			menuItem.onclick = function() {pageManager.onMenuClick(node); return false;};
			var text = node.getAttribute("text_" + this.lang);
			if (text == null)
				text = node.getAttribute("text");
			if (text == null)
				text = node.getAttribute("text_en");
			var textNode = document.createTextNode(text);
			if (jQuery.browser.msie) {
				var a = document.createElement("a");
				a.setAttribute("href", "#");
				a.style.textDecoration = "none";
				a.style.color = "black";
				a.onclick = menuItem.onclick;
				a.appendChild(textNode);
				textNode = a;
			}
			menuItem.appendChild(textNode);
			/*
			menuItem.onmouseover = function() {menuItem.style.background = "url(/images/menu.png) -" + menuItem.offsetLeft + "px -" + menuItem.offsetHeight + "px";};
			menuItem.onmouseout = function() {menuItem.style.background = "";};
			*/
			return menuItem;
		} catch (e) {
			return null;
		}
	},
	
	onMenuClick: function(node) {
		if (node.parentNode == this.ajaxPageMenuNode)
			this.selectedPageMenuNode = node;
		var script = node.getAttribute("script")
		if (script != null)
			eval(script);
		else
			this.loadPage(node.getAttribute("page"));
		this.backup(); // backup() est normalement appelé sur onunload sauf avec Opéra, donc on le fait ici.
	},
	
	backup: function() {
		writeCookie("lang", this.lang, new Date(2100,0,1));
		if (this.selectedPageMenuNode)
			writeCookie("showPageOnLoad", this.selectedPageMenuNode.getAttribute("pageNumber"));
	}
}
	
var pageManager = new PageManager();


AjaxUtil = Class.create();
var nocache = "time=" + new Date().getTime();
var baseUrl = "";
var xmlCache = new Array();

AjaxUtil.loadXml = function(url, f, a1, a2, a3, a4, a5, a6) {
		var cachedResponse = xmlCache[url];
		if (cachedResponse) {
			setTimeout(function() {f(cachedResponse);}, 10);
			return;
		}
		var f2 = function(request) {
			var response = request.responseXML.getElementsByTagName("ajax-response");
			if (response == null || response.length != 1)
				return;
			response = response[0].childNodes; 
			for ( var i = 0 ; i < response.length ; i++ ) {
				var responseElement = response[i];
				if ( responseElement.nodeType != 1 )
					continue;
				if (typeof responseElement.getAttribute != "undefined" && responseElement.getAttribute("cache"))
					xmlCache[responseElement.getAttribute("cache")] = responseElement;
				else
					f(responseElement);
			}
		}
		url = baseUrl + url;
		ajaxEngine.registerRequest(url, url);
		if (a6 != undefined)
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache, a1, a2, a3, a4, a5, a6);
		else if (a5 != undefined)
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache, a1, a2, a3, a4, a5);
		else if (a4 != undefined)
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache, a1, a2, a3, a4);
		else if (a3 != undefined)
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache, a1, a2, a3);
		else if (a2 != undefined)
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache, a1, a2);
		else if (a1 != undefined)
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache, a1);
		else
				ajaxEngine.sendRequest(url, {onComplete: f2}, nocache);
	}

var loadedRequests = new Array();

AjaxUtil.loadXhtml = function(elementId, page, f) {
		if ($(elementId) == null) {
			trace("Loading " + page + " aborted because element " + elementId + " doesn't exist");
			return;
		}
		page = baseUrl + page;
		ajaxEngine.registerRequest("loadXhtml", page);
		ajaxEngine.registerAjaxElement(elementId);
		document.body.style.cursor = "progress";
		ajaxEngine.sendRequest("loadXhtml", {onComplete: function(request) {
			document.body.style.cursor = "auto";
			var oldRequest = loadedRequests[elementId];
			if (oldRequest) {
				var onunload = oldRequest.responseXML.lastChild.getAttribute("onunload");
				if (onunload)
					eval(onunload);
			}
			loadedRequests[elementId] = request;
			ajaxEngine._onRequestComplete(request);
			var onload = request.responseXML.documentElement.getAttribute("onload");
			if (onload)
				eval(onload);
			if (typeof onPageUpdated != "undefined")
				onPageUpdated();
			if (f != undefined)
				f();
		}}, nocache);
	}

function writeCookie(nom, valeur) {
	var argv=writeCookie.arguments;
	var argc=writeCookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=nom+"="+escape(valeur)+
	((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
	((path==null) ? "" : ("; path="+path))+
	((domain==null) ? "" : ("; domain="+domain))+
	((secure==true) ? "; secure" : "");
}

function removeCookie(nom) {
	date=new Date;
	date.setFullYear(date.getFullYear()-1);
	writeCookie(nom,null,date); 
}

function getCookieVal(offset) {
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1) endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr)); 
}

function readCookie(nom) {
	var arg=nom+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i<clen) {
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
		i=document.cookie.indexOf(" ",i)+1;
		if (i==0) break;
	}
	return null; 
}

var qs = null;

function getQueryStringArray() {
	if (qs != null)
		return qs; 
	qs = new Array();
	var req = window.location.search.substr(1);
	var dbl = req.split('&');
	for (var i = 0; i < dbl.length; i++) {
		var p = dbl[i].indexOf('=');
		var name =  dbl[i].substring(0, p);
		var value = unescape(dbl[i].substring(p + 1));
		qs[name] = value;
	}
	return qs;
}
FormManager = Class.create();
FormManager.prototype = {

	initialize: function(modelFileName, formFileName, contentId) {
		this.elementId = 0;
		this.triggerRP = false;
		this.persist = true;
		this.dataModel = null;
		this.modelFileName = modelFileName != undefined ? modelFileName : "datamodel.xml";
		this.formFileName = formFileName != undefined ? formFileName : "form.xml";
		this.contentId = contentId != undefined ? contentId : "content";
	},

	showForm: function(lang, onComplete) {
		$(this.contentId).innerHTML = "<center><img src='images/waitingbar.gif' border='0' style='margin: 30px'/></center>"
		this.loadForm(lang, onComplete);
	},
	
	loadForm: function(lang, onComplete) {
		var self = this;
		var f = function() {setTimeout(function() {self.loadForm(lang, onComplete);}, 10);};
		if (lang && labelManager.lang != lang)
			labelManager.loadLabels(lang, f);
		else if (this.dataModel == null)
			this.dataModel = new DataModel(this, f);
		else {
			trace("Loading form ...");
			this.dataModel.elementsByClassName = new Array();
			this.dataModel.setFieldValue("lang", lang);
			AjaxUtil.loadXml("form/" + labelManager.lang + "/" + this.formFileName, function(ajaxResponseNode) {
				self.pageInDocument = false;
				self.ajaxResponseNode = ajaxResponseNode;
				/*var qs =*/ getQueryStringArray();
				var form_step = parseInt(qs["form_step"]);
				if (!isNaN(form_step))
					self.dataModel.setFieldValue("form_step", form_step, false);
				self.triggerRefreshPage();
				qs = new Array();
				if (onComplete)
					onComplete();
			});
		}
	},
	
	triggerRefreshPage: function() {
		if (this.triggerRP == false) {
			this.triggerRP = true;
			var self = this;
			setTimeout(function() {self.triggerRP = false; self.refreshPage();} , 10);
		}
	},
	
	refreshPage: function() {
		trace("Refreshing page...");
		var node = this.preprocessNode(this.ajaxResponseNode);
		if (!this.pageInDocument) {
			var content = $(this.contentId);
			while (content.firstChild != null)
				content.removeChild(content.firstChild);
			node.style.display = "none";
			content.appendChild(node);
			this.pageInDocument = true;
		}
		this.dataModel.fireRules();
		if (typeof onPageUpdated != "undefined")
			onPageUpdated();
		if (node)
			node.style.display = "";
	},
	
	preprocessNode: function(node, replace) {
		var node2 = null;
		var parentNode = null;
		var newNode = null;
		var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
		if (tagName == "LABEL") {
			node2 = parentNode = labelManager.getLabelNode(node.getAttribute("label"));
			replace = true;
		} else if (tagName == "FIELDLABEL")
			node2 = this.dataModel.getFieldLabelNode(node.getAttribute("field"));
		else if (tagName == "FIELDCELL")
			node2 = this.dataModel.getFieldCellNode(node.getAttribute("field"), node);
		else if (tagName == "FIELDVALUE") {
			node2 = this.dataModel.getFieldValueNode(node.getAttribute("field"));
		} else {
			parentNode = node;
			if (replace)
				node2 = node;
			else
				node2 = newNode = this.pageInDocument ? null : this.shallowCloneNode(node);
		}
		
		if (parentNode != null) {
			var nodes = parentNode.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var oldChildNode = nodes[i];
				var newChildNode = this.preprocessNode(oldChildNode, replace);
				if (newChildNode != null) {
					if (newNode != null)
						newNode.appendChild(newChildNode);
					else if (oldChildNode != newChildNode && replace)
						parentNode.replaceChild(newChildNode, oldChildNode);
					else if (typeof newChildNode.getAttribute != "undefined" && newChildNode.getAttribute("override") == "true") {
						newChildNode.setAttribute("override", "false");
						var oldCell = $(newChildNode.getAttribute("id"));
						oldCell.parentNode.replaceChild(newChildNode, oldCell);
					}
				}
			}
		}
		
		if (node.nodeType == 1) { // 3 = TEXT_NODE
			if (node2 != null) {
				if (node2.nodeType != 1) {
					var span = document.createElement("span"); // encapsulation du text dans un span pour pouvoir mettre un id
					span.appendChild(node2);
					node2 = span;
				}
				var nodeId2 = node2.getAttribute("id");
				if (!this.pageInDocument && node != node2)
					this.copyStandardAttributes(node, node2);
				if (nodeId2 == null || nodeId2 == "") {
					var nodeId = node.getAttribute("id");
					if (nodeId == null || nodeId == "") {
						nodeId = this.elementId++;
						node.setAttribute("id", nodeId);
						node2.setAttribute("id", nodeId);
					} else {
						node2.setAttribute("id", nodeId);
						var node3 = $(nodeId);
						if (node3 != null) {
							var className = node.getAttribute("class");
							node3.parentNode.replaceChild(node2, node3);
							var elements = this.dataModel.elementsByClassName[className];
							if (elements) {
								for (var i = 0; i < elements.length; i++)
								    if (elements[i] == node3) {
									elements.remove(i);
									break;
								    }
								elements.push(node2);
								//trace(className + " : " + elements.length);
							}
						}
					}
				}
			}
		}
		return node2;
	},
	
	shallowCloneNode: function(node) {
		if (node.nodeType == 3) { // 3 = TEXT_NODE
			var text = node.nodeValue;
			text = text.replace("\n", "").replace("\t", "");
			if (text == "")
				return null;
			return document.createTextNode(text);
		}
		var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
		if (tagName == "RESPONSE")
			tagName = "DIV";
		var clone = document.createElement(tagName);
		return this.copyStandardAttributes(node, clone);
	},
	
	copyStandardAttributes: function(src, dst) {
		this.copyAttribute("id", src, dst);
		this.copyAttribute("class", src, dst);
		this.copyAttribute("style", src, dst);
		this.copyAttribute("onclick", src, dst);
		this.copyAttribute("disabled", src, dst);
		this.copyAttribute("colspan", src, dst);
		this.copyAttribute("src", src, dst);
		this.copyAttribute("href", src, dst);
		this.copyAttribute("target", src, dst);
		this.copyAttribute("type", src, dst);
		this.copyAttribute("name", src, dst);
		if (jQuery.browser.msie) { // pb avec style, onclick et colspan sous IE
			var div = document.createElement("div");
			var html = "<span";
			if (src.getAttribute("style")) html += " style=\"" + src.getAttribute("style") + "\"";
			if (src.getAttribute("onclick")) html += " onclick=\"" + src.getAttribute("onclick") + "\"";
			html += "/>";
			div.innerHTML = html;
			var e = div.firstChild;
			if (src.getAttribute("style"))	this.copyAttributes(e.style, dst.style);
			if (src.getAttribute("onclick")) dst.onclick = e.onclick;
			if (src.getAttribute("colspan")) dst.colSpan = src.getAttribute("colspan");
			if (src.getAttribute("class")) dst.setAttribute("className", src.getAttribute("class")); 
		}
		return dst;
	},
	
	copyAttributes: function(src, dst) {
		for (var attr in src) {
			try {
				var value = src.getAttribute(attr);
				if (value != null && value != "")
					dst.setAttribute(attr, value);
			} catch (e) {
				break;
			};
		}
	},
	
	copyAttribute: function(attrKey, src, dst) {
		try {
			var attrValue = src.getAttribute(attrKey);
			if (attrValue != null && attrValue != "")
				dst.setAttribute(attrKey, attrValue);
		} catch (e) {alert(e);}
	},
	
	nextStep: function(backup) {
		return this.increaseStep(1, backup);
	},
	
	previousStep: function(backup) {
		return this.increaseStep(-1, backup);
	},
	
	increaseStep: function(inc, backup) {
		var newStep = parseInt(this.dataModel.getFieldValue("form_step")) + inc;
		return this.setStep(newStep, backup);
	},
	
	setStep: function(step, backup) {
		trace("step = " + step);
		this.dataModel.setFieldValue("form_step", step, false);
		if (this.pageInDocument) {
			this.refreshPage();
			setTimeout(scrollToTop, 10);
		}
		this.writeCookie("form_step", this.dataModel.getFieldValue("form_step"));
		if (backup)
			this.backup(true);
		return false;
	},
	
	relocate: function(step, sendmail) {
		this.dataModel.storeFields(function() {
			var url = window.location.href;
			if (url.indexOf('?') != -1)
				url = url.substring(0, url.indexOf('?'));
			url += '?id=' + this.dataModel.getFieldValue('id') + '&form_step=' + step;
			window.location = url;
		}, sendmail);
	},
	
	backup: function(evenIfCreation) {
		if (this.dataModel && (this.dataModel.getFieldValue("id") != "-1" || evenIfCreation))
			this.dataModel.backup();
	},
	
	readCookie: function(name) {
		return readCookie(this.formFileName + '_' + this.modelFileName + '_' + name);
	},
	
	writeCookie: function(name, value) {
		writeCookie(this.formFileName + '_' + this.modelFileName + '_' + name, value);
	}
}

LabelManager = Class.create();
LabelManager.prototype = {

	initialize: function() {
		this.labels = new Array();
		this.lang = null;
	},
	
	loadLabels: function(lang, onLoad) {
		trace("Loading labels ...");
		this.lang = lang;
		var self = this;
		AjaxUtil.loadXml("form/" + lang + "/label.xml", function(ajaxResponseNode) {
			var nodes = ajaxResponseNode.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var node = nodes[i];
				try {
					self.labels[node.getAttribute("key")] = node;
				} catch (e) {
				}
			}
			if (onLoad)
				onLoad();
		});
	},
	
	getLabel: function(key) {
		var node = typeof key == 'string' ? this.labels[key] : null;		
		if (node == null)
			return key;
		var label = this.extractLabel(node, this.lang);
		if (label == null && this.lang != "en")
			label = this.extractLabel(node, "en");
		return label != null ? label : key;
	},
	
	extractLabel: function(node, lang) {
		var attr = node.getAttribute(lang);
		if (attr != null)
			return attr;
		var nodes = node.childNodes;
		for (var i = 0 ; i < nodes.length ; i++)
			try {
				if (nodes[i].getAttribute("lang") == lang)
					return nodes[i];
			} catch (e) {
			}
		return null;
	},
	
	getLabelNode: function(key) {
		var label = this.getLabel(key);
		if (typeof label == "string")
			return document.createTextNode(label);
		if (typeof label == typeof key && label == key) {
			var text = label.getAttribute(this.lang);
			if (text != null)
				return document.createTextNode(text);
			var label2 = label.getAttribute("label");
			if (label2 != null)
				return this.getLabelNode(label2);
		}
		var tmp = document.createElement("span");
		tmp.innerHTML = RicoUtil.getContentAsString(label);
		return tmp;
	}

}

var labelManager = new LabelManager();

DataModel = Class.create();
DataModel.prototype = {

	initialize: function(formManager, onLoad) {
		trace("Initializing DataModel ...");
		this.fields = new Array();
		this.rules = new Array();
		this.disabledOptions = new Array(); // fieldKey => [option1, option2, ...]
		this.choiceValues = new Array();
		this.elementsByClassName = new Array();
		this.triggers = new Array();
		this.cellCount = 0;
		this.formManager = formManager;
		this.needsToRestore = false;
		var self = this;
		AjaxUtil.loadXml("form/" + this.formManager.modelFileName, function(ajaxResponseNode) {
			var nodes = ajaxResponseNode.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var node = nodes[i];
				var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
				if (tagName == "FIELD")
					self.fields[node.getAttribute("key")] = node;
				else if (tagName == "RULE")
					self.rules[self.rules.length] = node;
			}
			self.reinitFields(true);
			var qs = getQueryStringArray();
			var id = qs["id"];
			if (id != undefined) {
				self.setFieldValue("id", id);
				self.loadFields(function() {
					for (var fieldKey in qs)
						if (typeof qs[fieldKey] == "string")
							self.setFieldValue(fieldKey, qs[fieldKey]);
					if (self.formManager.pageInDocument)
						self.formManager.triggerRefreshPage();
				});
			}
			/* security problem with form reload
			var blank = qs["blank"];
			if (blank == undefined)
				self.restore(onLoad); // au cas où un backup a été fait
			else if (blank == "false")
				self.restore(function(){ self.reinitFields(false); if (onLoad) onLoad(); self.storeFields();});
			else if (onLoad)
				onLoad();
			*/
			if (qs["form_step"] == "5" || self.formManager.readCookie("form_step") == "5")
				self.restore(onLoad);
			else if (onLoad)
				onLoad();
		});
	},
	
	reinitFields: function(allFields) {
		for (var fieldKey in this.fields) {
			var field = this.fields[fieldKey];
			if (typeof field != "object")
				continue;		
			if (!allFields && this.getFieldAttribute(fieldKey, "reinit") != "true")
				continue;
			var initialValue = this.getFieldAttribute(fieldKey, "initialValue");
			if (initialValue == undefined)
				this.fields[fieldKey].removeAttribute("fieldValue");
			else
				this.setFieldValue(fieldKey, initialValue);
		}
	},
	
	getFieldAttribute: function(fieldKey, attrKey) {
		var field = this.fields[fieldKey];
		return field == null ? null : field.getAttribute(attrKey);
	},
	
	setFieldAttribute: function(fieldKey, attrKey, attrValue, fireRules) {
		trace(fieldKey + "." + attrKey + " = " + attrValue);
		var field = this.fields[fieldKey];
		if (field == null) {
			trace("Unknown field " + fieldKey);
			return false;
		}
		if (attrValue != null)
			attrValue = "" + attrValue;
		field.setAttribute(attrKey, attrValue);
		if (attrKey == "fieldValue") {
			var triggerKeys = field.getAttribute("trigger");
			if (triggerKeys) {
				var p0 = 0;
				while (true) {
					var p1 = triggerKeys.indexOf(',', p0);
					var triggerKey = p1 != -1 ? triggerKeys.substring(p0, p1) : triggerKeys.substring(p0);
					this.triggers[triggerKey]();
					if (p1 == -1)
						break;
					p0 = p1 + 1;					
				}
			}
		}
		if (fireRules)
			this.fireRules();
		return true;
	},
	
	checkFieldsChanges: function() {
		var changes = false;
		for (var fieldKey in this.fields) {
			var field = this.fields[fieldKey];
			if (typeof field != "object")
				continue;
			changes |= this.checkFieldAttributeChange(field, "fieldValue");
			changes |= this.checkFieldAttributeChange(field, "label");
			changes |= this.checkFieldAttributeChange(field, "editable");
		}
		return changes;
	},
	
	checkFieldAttributeChange: function(field, attrKey) {
		try {
			var previousAttrKey = "previous_" + attrKey;
			var previousAttrValue = field.getAttribute(previousAttrKey);
			var attrValue = field.getAttribute(attrKey);
			if (attrValue == previousAttrValue || attrValue == null && previousAttrValue == "")
				return false;
			field.setAttribute(previousAttrKey, attrValue);
			return true;
		} catch (e) {
			return false;
		}
	},
	
	getFieldValue: function(fieldKey) {
		var attrKey = "fieldValue";
		var p3 = fieldKey.indexOf('.');
		if (p3 != -1) {
			attrKey = fieldKey.substring(p3 + 1);
			fieldKey = fieldKey.substring(0, p3);
		}
		return this.getFieldAttribute(fieldKey, attrKey);
	},

	setFieldValue: function(fieldKey, fieldValue, fireRules) {
		var attrKey = "fieldValue";
		var p3 = fieldKey.indexOf('.');
		if (p3 != -1) {
			attrKey = fieldKey.substring(p3 + 1);
			fieldKey = fieldKey.substring(0, p3);
		}
		this.setFieldAttribute(fieldKey, attrKey, fieldValue, fireRules);
	},

	isFieldEditable: function(fieldKey) {
		return this.getFieldAttribute(fieldKey, "editable") != "false";
	},
	
	getFieldLabelNode: function(fieldKey) {
		var field = this.fields[fieldKey];
		var labelKey = field == null ? null : field.getAttribute("label");
		return labelManager.getLabelNode(labelKey == null ? fieldKey : labelKey);
	},
	
	getFieldValueNode: function(fieldKey) {
		var value = this.getFieldValue(fieldKey);
		if (this.getFieldAttribute(fieldKey, "type") == "Choice") {
			var choiceValuesNode = this.getChoiceValuesNode(fieldKey, function() {/*self.formManager.triggerRefreshPage*/});
			if (choiceValuesNode != null) {
				var nodes = choiceValuesNode.childNodes;
				for (var i = 0; i < nodes.length; i++) {
					var node = nodes[i];
					try {if (node.getAttribute("value") == value) {
						if (node.getAttribute("label") != undefined || node.getAttribute(labelManager.lang) != undefined)
							value = labelManager.getLabelNode(node);
						break;
					}} catch(e) {}
				}
			}
		}
		if (value == null || typeof value == "string")
			value = document.createTextNode(value == null ? "" : value) 
		return value;
	},
	
	getFieldCellNode: function(fieldKey, node) {
		var field = this.fields[fieldKey];
		if (field == null)
			return null;
		var type = field.getAttribute("type");
		var fieldValue = field.getAttribute("fieldValue");
		var cellId = node.getAttribute("id");
		if (!cellId) {
			cellId = "formcell_" + this.cellCount++;
			node.setAttribute("id", cellId);
		}
		var cell = this.formManager.pageInDocument ? $(cellId) : null;
		var deprecated = cell != null && cell.getAttribute("deprecated") == "true";
		if (deprecated)
			cell = null;
		var self = this;
		if (type == "Boolean") {
			if (cell == null) {
				var checkbox = document.createElement("input");
				var radioGroup = field.getAttribute("radioGroup");
				if (!radioGroup)
					checkbox.setAttribute("type", "checkbox");
				else if (jQuery.browser.msie)
					checkbox = document.createElement("<input type='radio' name='" + radioGroup + "'/>");
				else {
					checkbox.setAttribute("type", "radio");
					checkbox.setAttribute("name", radioGroup);
				}
				if (fieldValue != null && fieldValue != "false") {
					checkbox.setAttribute("checked", "true"); // FF
					checkbox.setAttribute("defaultChecked", "true"); // IE
				}
				checkbox.onclick = function() {
					if (radioGroup) {
						for (var fk in self.fields) {
							var f = self.fields[fk];
							try {
								if (fk != fieldKey && typeof field == "object" && f.getAttribute("radioGroup") == radioGroup)
									self.setFieldValue(fk, "false");
							} catch(e) {}
						}
					}
					self.setFieldValue(fieldKey, checkbox.checked, true);
				};
				checkbox.id = cellId + "_checkbox";
				var label = document.createElement("label");
				label.setAttribute("for", checkbox.id);
				label.appendChild(checkbox);
				label.appendChild(this.getFieldLabelNode(fieldKey));
				//if (jQuery.browser.mozilla) checkbox.style.verticalAlign = "middle";
				cell = label;
			}
			var checkbox = cell.firstChild;
			if (checkbox) {
				checkbox.disabled = !this.isFieldEditable(fieldKey);
				checkbox.checked = fieldValue == "true";
			}
		} else if (type == "Choice") {
			if (cell == null) {
				var style = field.getAttribute("style");
				if (jQuery.browser.msie) {
					cell = document.createElement("<select" + (style ? " style='" + style + "'" : "") + "/>");
				} else {
					cell = document.createElement("select");
					if (style)
						cell.setAttribute("style", style);
				}
				cell.innerHTML = "<option style='background-image: url(images/spinner.gif) no-repeat;'>loading ...</option>"
				cell.setAttribute("field", fieldKey);
				cell.onchange = function() {if (cell.options[cell.selectedIndex].getAttribute("disabled") == true) cell.selectedIndex = 0; else self.setFieldValue(fieldKey, cell.options[cell.selectedIndex].value, true);};
				cell.onkeyup = cell.onchange; // FF : pour réagir au changement fait à l'aide du clavier.
				var groupField = field.getAttribute("groupField") == "true";
				var parentGroupField = field.getAttribute("parentGroupField");
				var setup = function() {
					self.getChoiceValuesNode(fieldKey, function(ajaxResponseNode) {
						var nodes = ajaxResponseNode.childNodes;
						while (cell.firstChild != null)
							cell.removeChild(cell.firstChild);
						if (jQuery.browser.msie)
							cell.size = 2;
						var disabledOptions = self.disabledOptions[fieldKey];
						var firstItem_value = field.getAttribute("firstItem");;
						if (firstItem_value) {
							var firstItem_label = firstItem_value;
							var p = firstItem_value ? firstItem_value.indexOf(',') : -1;
							if (p != -1) {
								firstItem_label = firstItem_value.substring(p + 1);
								firstItem_value = firstItem_value.substring(0, p);
							}
							var option = document.createElement("option");
							option.setAttribute("value", firstItem_value);
							if (fieldValue == firstItem_value)
								option.setAttribute("selected", "true");
							option.appendChild(labelManager.getLabelNode(firstItem_label));
							cell.appendChild(option);
						}
						var parentGroupValue = parentGroupField ? self.getFieldValue(parentGroupField) : null;
						var currentGroup = null;
						for (var i = 0; i < nodes.length; i++) {
							var node = nodes[i];
							var value = null;
							var group = false;
							try {
								value = node.getAttribute("value");
								group = node.getAttribute("group") == "true";
								if (group)
									currentGroup = value;
							} catch (e) {
							}
							if (group && !groupField && !parentGroupField) {
								var optgroup = document.createElement("optgroup");
								optgroup.setAttribute("label", labelManager.getLabel(node.getAttribute("label")));
								cell.appendChild(optgroup);
								continue;
							}
							if (value == null || !group && groupField || parentGroupField && (group || currentGroup != parentGroupValue))
								continue;
							var option = document.createElement("option");
							option.setAttribute("value", value);
							var disabled = node.getAttribute("disabled") == "true" || disabledOptions && disabledOptions[value] == true;
							if (disabled) {
								option.setAttribute("disabled", "true");
								if (jQuery.browser.msie)
									option.style.color = "graytext";
							}
							if (value == fieldValue) {
								if (disabled)
									self.setFieldValue(fieldKey, "", true);
								else
									option.setAttribute("selected", "true");
							}
							var label = node.getAttribute("label") != undefined || node.getAttribute(labelManager.lang) != undefined ? labelManager.getLabelNode(node) : document.createTextNode(value);
							option.appendChild(label);
							cell.appendChild(option);
						}
						var lastItem_value = field.getAttribute("lastItem");;
						if (lastItem_value) {
							var lastItem_label = lastItem_value;
							var p = lastItem_value ? lastItem_value.indexOf(',') : -1;
							if (p != -1) {
								lastItem_label = lastItem_value.substring(p + 1);
								lastItem_value = lastItem_value.substring(0, p);
							}
							var option = document.createElement("option");
							option.setAttribute("value", lastItem_value);
							if (fieldValue == lastItem_value)
								option.setAttribute("selected", "true");
							option.appendChild(labelManager.getLabelNode(lastItem_label));
							cell.appendChild(option);
						}
						if (jQuery.browser.msie)
							cell.size = 1;
					}, true);
				}
				if (deprecated)
					this.choiceValues[fieldKey] = null;
				setup();
				if (parentGroupField) {
					this.triggers[cellId] = setup;
					var pgf = this.fields[parentGroupField];
					var trigger = pgf.getAttribute("trigger");
					if (trigger)
						trigger += ',' + cellId;
					else
						trigger = cellId;
					pgf.setAttribute("trigger", trigger);
				}
			}
			if (cell.selectedIndex == -1 || cell.options[cell.selectedIndex].value != fieldValue) {
				var nodes = cell.childNodes;
				var nboptgroups = 0;
				for (var i = 0; i < nodes.length; i++) {
					var node = nodes[i];
					var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
					if (tagName != "OPTION") // ex : optgroup
						nboptgroups++;
					else if (node.getAttribute("value") == fieldValue) {
						cell.selectedIndex = i - nboptgroups;
						break;
					}
				}
			}
		} else {
			if (cell == null) {
				var style = field.getAttribute("style");
				var isTextArea = field.getAttribute("textarea") == "true";
				var tag = isTextArea ? "textarea" : "input";
				if (style && jQuery.browser.msie)
					tag = "<" + tag + " style='" + style + "'/>";
				cell = document.createElement(tag);
				if (!isTextArea)
					cell.setAttribute("type", "text");
				if (style && !jQuery.browser.msie)
					cell.setAttribute("style", style);
				if (fieldValue != null)
					cell.setAttribute("value", fieldValue);
				if (type == "Integer" || type == "Price")
					cell.style.textAlign = "right";
				if (!this.isFieldEditable(fieldKey)) 
					cell.setAttribute("disabled", "true");
				cell.onchange = function() {
					if (type=="Price")
						cell.value = parseInt(cell.value.replace(',', '.') * 100) / 100;
					setTimeout(function() {self.setFieldValue(fieldKey, cell.value, true);}, 10);
				};
				var lastKeyDown = 0;
				cell.onkeydown = function() {
					var thisKeyDown = lastKeyDown = new Date().getTime();
					setTimeout(function() { if (lastKeyDown == thisKeyDown) cell.onchange();}, 2000);
				};
			}
			cell.value = fieldValue == null ? "" : fieldValue;
		}
		cell.setAttribute("id", cellId);
		cell.setAttribute("name", cellId);
		cell.disabled = !this.isFieldEditable(fieldKey);
		/* nasty focus behaviour
		if (this.lastFocusId == cellId) {
			try {cell.focus();} catch(e) {} // IE OK FF KO
			setTimeout(function() {try {$(self.lastFocusId).focus()} catch (e) {}}, 10);  // pour FF
		}
		*/
		cell.onfocus = function() {self.lastFocusId = cellId;};
		if (deprecated)
			cell.setAttribute("override", "true");
		return cell;
	},
	
	getChoiceValuesNode: function(fieldKey, onLoad, callOnLoadEvenIfMemory) {
		var choiceValuesNode = this.choiceValues[fieldKey];
		if (choiceValuesNode) {
			if (callOnLoadEvenIfMemory)
				onLoad(choiceValuesNode);
			return choiceValuesNode;
		}
		var values = this.getFieldAttribute(fieldKey, "values");
		var self = this;
		if (values != null && values != "")
			AjaxUtil.loadXml(values, function(ajaxResponseNode) {
				self.choiceValues[fieldKey] = ajaxResponseNode;
				if (onLoad)
					onLoad(ajaxResponseNode);
				//self.fireRules();
			});
		return null;
	},
	
	rebuildCell: function(cellId) {
		var cell = $(cellId);
		cell.setAttribute("deprecated", "true");
		this.formManager.triggerRefreshPage();
	},
	
	enableOption: function(cellId, value, enable) {
		var cell = $(cellId);
		if (!cell) {
			return;
		}
		var fieldKey = cell.getAttribute("field");
		var disabledOptions = this.disabledOptions[fieldKey];
		if (disabledOptions == null)
			disabledOptions = this.disabledOptions[fieldKey] = new Array();
		disabledOptions[value] = !enable;
		var options = cell.childNodes;
		for (var i = 0; i < options.length; i++)
			if (typeof options[i].getAttribute != "undefined" && options[i].getAttribute("value") == value) {
				if (enable)
					options[i].removeAttribute("disabled");
				else {
					options[i].setAttribute("disabled", "true");
					if (this.getFieldValue(fieldKey) == value)
						this.setFieldValue(fieldKey, "", true);
				}
				if (jQuery.browser.msie)
					options[i].style.color = enable ? "black" : "graytext";
				return;
			}
	},
	
	fireRules: function() {
		var t0 = new Date();
		trace("Firing rules ...");
		this.checkFieldsChanges();
		var forceRefresh = false;
		for (var pass = 1; ; pass++) {
			trace("Pass " + pass);
			for (var i = 0 ; i < this.rules.length ; i++) {
				forceRefresh |= this.fireRule(this.rules[i]);
			}
			if (!this.checkFieldsChanges()) {
				if ((forceRefresh || pass > 1) && this.formManager.ajaxResponseNode)
					this.formManager.triggerRefreshPage();
				break;
			}
		}
		var t1 = new Date();
		trace("Rules fired in " + (t1.getTime() - t0.getTime()) + "ms");
	},
	
	fireRule: function(rule) {
		var ifexpr = rule.getAttribute("if");
		if (ifexpr != null) {
			var value = this.evalAsString(ifexpr);
			if (value != "true")
				return false;
		}
		var onchangedexpr = rule.getAttribute("onchanged");
		if (onchangedexpr != null) {
			var oldValue = rule.getAttribute("oldOnchangedValue");
			var newValue = this.evalAsString(onchangedexpr);
			rule.setAttribute("oldOnchangedValue", newValue);
			if (oldValue == null && rule.getAttribute("onfirsttime") != "true" || oldValue == newValue)
				return false;
		}
		var onexpr = rule.getAttribute("on");
		if (onexpr != null) {
			var oldValue = rule.getAttribute("oldOnValue");
			var newValue = this.evalAsString(onexpr);
			rule.setAttribute("oldOnValue", newValue);
			if (oldValue == null && rule.getAttribute("onfirsttime") != "true" || oldValue == "true" || newValue != "true")
				return false;
		}
		
		var forceRefresh = false;
		var elementId = rule.getAttribute("element");
		var className = rule.getAttribute("class");
		if (elementId != null || className != null) {
			var visible = rule.getAttribute("visible");
			visible = this.evalAsString(visible) == "false" ? "none" : "";
			if (elementId != null) {
				var element = document.getElementById(elementId);
				if (element == null)
					trace("Unknown element " + elementId);
				else
					element.style.display = visible;
			}
			if (className != null) {
				var elements = this.elementsByClassName[className];
				if (elements == undefined) {
					//elements = document.getElementsByClassName(className);
					elements = jQuery.makeArray(jQuery("." + className));
					if (elements.length == 0)
						trace("No element found for class " + className);
					this.elementsByClassName[className] = elements;
				}
				for (var i = 0; i < elements.length; i++)
					elements[i].style.display = visible;
			}
		}
		var fieldValue = rule.getAttribute("value");
		if (fieldValue != null) {
			fieldValue = this.evalAsString(fieldValue);
			var fieldKeys = rule.getAttribute("field");
			if (fieldKeys != null) {
				var forceRefreshOnChanged = rule.getAttribute("forceRefreshOnChanged") == "true";
				var p0 = 0;
				while (true) {
					var p1 = fieldKeys.indexOf(',', p0);
					var fieldKey = p1 != -1 ? fieldKeys.substring(p0, p1) : fieldKeys.substring(p0);
					if (forceRefreshOnChanged && !forceRefresh)
						forceRefresh = fieldValue != this.getFieldValue(fieldKey);
					this.setFieldValue(fieldKey, fieldValue, false);
					if (p1 == -1)
						break;
					p0 = p1 + 1;					
				}
			}
		}

		var childRules = rule.childNodes;
		for (var i = 0 ; i < childRules.length ; i++) {
			var childRule = childRules[i];
			var tagName = childRule.tagName ? childRule.tagName.toUpperCase() : childRule.tagName;
			if (tagName == "RULE")
				forceRefresh |= this.fireRule(childRule);
		}
		
		return forceRefresh;
	},
	
	evalAsString: function(expression) {
		var value = this.evalExpression(expression);
		return value == null ? "" : "" + value;
	},
	
	evalExpression: function(expression) {
		var preprocessedExpression = null;
		try {
			preprocessedExpression = this.preprocessExpression(expression);
			return eval(preprocessedExpression);
		} catch(e) {
			trace(e + " : " + preprocessedExpression + " from " + expression);
			return null;
		}
	},
	
	preprocessExpression: function(expression) {
		while (true) {
			var p = expression.indexOf("${");
			var p2 = expression.indexOf('}', p);
			if (p == -1 || p2 == -1)
				break;
			var fieldKey = expression.substring(p + 2, p2);
			var fieldValue = this.getFieldValue(fieldKey);
			if (fieldValue)
				fieldValue = fieldValue.replace("'", "\\'");
			expression = expression.substring(0, p) + fieldValue + expression.substring(p2 + 1);
		}
		return expression;
	},
	
	storeFields: function(onComplete) {
		trace("Storing fields ...");
		if (this.formManager.persist == false) {
			if (onComplete)
				onComplete();
			return;
		}
		var self = this;
		var fields = "";
		var values = "";
		for (var fieldKey in this.fields) {
			var field = this.fields[fieldKey];
			if (typeof field != "object")
				continue;
			if (fieldKey != "id" && field.getAttribute("persist") == "true") {
				var first = fields == "";
				fields += (first ? "" : "~") + fieldKey;
				var value = "" + this.getFieldValue(fieldKey);
				if (typeof value == "string") {
					value = cleanValue(value);
					this.setFieldValue(fieldKey, value);
				}
				values += (first ? "" : "~") + value;
			}
		}
		//trace("form/storefields.php?id=" + encodeURI(this.getFieldValue("id") + "&fields=" + fields + "&values=" + values + "&lang=" + labelManager.lang + "supportsCookies=" + (document.cookie != "")));
		AjaxUtil.loadXml("form/storefields.php", function(request) {
			trace("Fields stored");
			var nodes = request.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var node = nodes[i];
				var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
				if (tagName == "FIELD")
					self.setFieldValue(node.getAttribute("key"), node.getAttribute("value"));
			}
			if (self.formManager.pageInDocument)
				self.formManager.refreshPage();
			if (onComplete)
				onComplete();
		},
		"id=" + this.getFieldValue("id"), "fields=" + fields, "values=" + values, "lang=" + labelManager.lang, "supportsCookies=" + (document.cookie != ""), this.formManager.table == undefined ? undefined : "table=" + this.formManager.table);
	},
	
	loadFields: function(onComplete) {
		trace("Loading fields ...");
		if (this.formManager.persist == false) {
			if (onComplete)
				onComplete();
			return;
		}
		var self = this;
		AjaxUtil.loadXml("form/loadfields.php", function(request) {
			trace("Fields loaded");
			var nodes = request.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var node = nodes[i];
				var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
				if (tagName == "FIELD")
					self.setFieldValue(node.getAttribute("key"), node.getAttribute("value"), false);
			}
			if (self.formManager.pageInDocument)
				self.formManager.refreshPage();
			if (onComplete)
				onComplete();
		}, "id=" + this.getFieldValue("id"), "lang=" + labelManager.lang, this.formManager.table == undefined ? undefined : "table=" + this.formManager.table);
	},
	
	backup: function(onComplete) {
		this.formManager.writeCookie("form_step", this.getFieldValue("form_step"));
		this.storeFields(onComplete);
	},
	
	restore: function(onComplete) {
		var form_step = this.formManager.readCookie("form_step");
		if (form_step != null)
			this.setFieldValue("form_step", form_step);
		this.loadFields(onComplete);
	}
}

function trace(msg) {
	if (window.debugService) {
		var date = new Date();
		window.debugService.trace(date.toLocaleString() + ' ' + msg);
	}
	//else if (opera && opera.postError) opera.postError(msg);
}	

function isNotWhite(text) {
	return (/(^\s*$)*^\s*\S+/m.test(text));
}

function isWhite(text) {
	return !isNotWhite(text);
}

function isNumeric(text) {
	return testValidChars(text, "0123456789.");
}

function isInteger(text) {
	return testValidChars(text, "0123456789");
}

function testValidChars(text, validChars) {
	var n = text == null ? 0 : text.length;
	if (n == 0)
		return false;
	var test = true;
	for (var i = 0; i < n && test; i++)
		test = validChars.indexOf(text.charAt(i)) != -1 || i == 0 && text.charAt(0) == '-';
	return test;
}

function isValidEmail(emailAddress) {
	var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
	return re.test(emailAddress);
}

function isValidPhone(phoneNumber) {
	var stripped = phoneNumber.replace(/[\(\)\.\-\ ]/g, '');
	return !isNaN(parseInt(stripped));
}

function scrollToTop() {
	jQuery.scrollTo(0, {duration:1000, axis:'y'});
}

function scrollToBottom() {
	jQuery.scrollTo("+=1000px", {duration:800, axis:'y'});
}

function cleanValue(value) {
	value = cleanString(value, '~');
	value = cleanString(value, '&');
	return value;
}

function cleanString(value, pattern) {
	if (typeof value == "string" && value.indexOf(pattern) != -1) {
		while (value.indexOf(pattern) != -1)
			value = value.replace(pattern, "");
	}
	return value;
}var bookingForm;
var contactForm;
var kidsForm;
var centerID = 21;
var eventID = 6;
var IDHash = "igenaw";
var kemUrl = "http://63.150.179.55/nktevents/0.9.3.8/"; //"http://nktevents.kadampahosting.net/0.9.3.8/";
var paymentUrl = "http://www.kadampafestivalparis.org/form/doPayment.php";
var kidsPaymentUrl = "http://www.kadampafestivalparis.org/form/doKidsPayment.php";

function onLoad() {
	bookingForm = new FormManager("bookingModel.xml", "bookingForm.xml");
	pageManager.start("en");
}

function onUnload() {
	pageManager.backup();
	bookingForm.backup();
}

function showBookingForm() {
	bookingForm.showForm(pageManager.lang);
}

function showContactForm() {
	if (!contactForm) {
		contactForm = new FormManager("contactModel.xml", "contactForm.xml");
		contactForm.persist = false;
	}
	contactForm.showForm(pageManager.lang);
}

function startContact(bookingEnquiry, subject) {
	if (!contactForm) {
		contactForm = new FormManager("contactModel.xml", "contactForm.xml");
		contactForm.persist = false;
		contactForm.showForm(pageManager.lang, function() {startContact(bookingEnquiry, subject);});
		return false;
	}
	contactForm.dataModel.setFieldValue("contact_booking", bookingEnquiry ? "true" : "false");
	if (subject)
		contactForm.dataModel.setFieldValue("contact_subject", subject);
	contactForm.setStep(1);
	return false;
}

function showKidsForm() {
	if (!kidsForm) {
		kidsForm = new FormManager("kidsModel.xml", "kidsForm.xml");
		kidsForm.table = "kids2008";
	}
	kidsForm.showForm(pageManager.lang == "fr" ? "fr" : "en");
}

function validateKidsBooking() {
	kidsForm.setStep(4); // Message d'attente
	var kidsModel = kidsForm.dataModel;
	kidsModel.setFieldValue("validate", "true");
	kidsModel.backup(doKidsPayment);
}

function doKidsPayment() {
	window.location = kidsPaymentUrl + "?id=" + kidsForm.dataModel.getFieldValue("id");
}

function displayKidsFinalPage() {
	kidsForm.setStep(5);
}

function startAnotherKidsBooking(blank) {
	var agree = kidsForm.dataModel.getFieldValue("agree");
	kidsForm.dataModel.reinitFields(blank);
	kidsForm.dataModel.setFieldValue("agree", agree);
	kidsForm.setStep(2);
}


function sendMessage() {
	var contactModel = contactForm.dataModel;
	var isBooking = contactModel.getFieldValue("contact_booking") == "true";
	AjaxUtil.loadXml("form/sendmessage.php", function(request) {
		contactModel.reinitFields(false);
		contactForm.setStep(2);
		setTimeout(function() {contactForm.setStep(0)}, 5000);
	}, "fields=name~email~subject~content", "values=" + cleanValue(contactModel.getFieldValue("contact_name")) + '~' + cleanValue(contactModel.getFieldValue("contact_email")) + '~' + cleanValue((isBooking ? contactModel.getFieldValue("contact_booking_subject") : contactModel.getFieldValue("contact_subject"))) + '~' + cleanValue(contactModel.getFieldValue("contact_content")), "booking=" + cleanValue((isBooking ? contactModel.getFieldValue("contact_booking_ref") : "false")));
}

function startBooking(festival, retreat) {
	var bookingModel = bookingForm.dataModel;
	bookingModel.setFieldValue("festival", festival);
	bookingModel.setFieldValue("retreat", retreat);
	//var agree = bookingModel.getFieldValue("agree");
	//bookingForm.setStep(agree == "true" && liveStamp < 0 ? 2 : 1, true);
	bookingForm.setStep(1, true);
}


function startAnotherBooking(blank) {
	//nocache = "time=" + new Date().getTime();
	var bookingModel = bookingForm.dataModel;
	var agree = bookingModel.getFieldValue("agree");
	bookingModel.reinitFields(blank);
	bookingModel.setFieldValue("agree", agree);
	bookingForm.setStep(0);
}

function fillTestBooking() {
	var bookingModel = bookingForm.dataModel;
	bookingModel.setFieldValue("firstName", "test");
	bookingModel.setFieldValue("lastName", "TEST");
	bookingModel.setFieldValue("address", "Chateau de Segrais");
	bookingModel.setFieldValue("town", "Saint-Mars-d'Outille");
	bookingModel.setFieldValue("postCode", "72220");
	bookingModel.setFieldValue("country", "France");
	bookingModel.setFieldValue("male", "true");
	bookingModel.setFieldValue("email", "test@gmail.com");
	bookingModel.setFieldValue("email2", "test@gmail.com");
	bookingModel.setFieldValue("phone", "+33 6 61 70 94 74");
	bookingModel.setFieldValue("center_country", "France");
	bookingModel.setFieldValue("wholeevent", bookingModel.getFieldValue("festival"));
	bookingModel.setFieldValue("wholeevent_nomeals", "false");
	bookingModel.setFieldValue("partialevent", "false");
	bookingModel.setFieldValue("retreat_wholeevent", bookingModel.getFieldValue("retreat"));
	bookingModel.setFieldValue("retreat_partialevent", "false");
	bookingModel.setFieldValue("translation", "3");
	bookingModel.setFieldValue("center_name", "Centre Bouddhiste Bodhitchitta");
	bookingForm.refreshPage();
}

function validateBooking() {
	var bookingModel = bookingForm.dataModel;
	bookingModel.setFieldValue("validate", "true");
	bookingModel.setFieldValue("price_paymentState", "");
	bookingForm.setStep(4); // Message d'attente
	bookingModel.backup(validateBooking2);
}

var submitUrl = kemUrl + "submit.php";
function validateBooking2() {
	var bookingModel = bookingForm.dataModel;
	var div = $("KEM");
	while (div.firstChild != null)
		div.removeChild(div.firstChild);
	var request = {body : "", detailsCount: 0, form: document.createElement("form")};
	appendArg(request, "centerID", centerID);
	appendArg(request, "eventID", eventID);
	appendArg(request, "IDHash", IDHash);
	appendArg(request, "id", bookingModel.getFieldValue("id"));
	appendArg(request, "firstName", bookingModel.getFieldValue("firstName"));
	appendArg(request, "lastName", bookingModel.getFieldValue("lastName"));
	appendArg(request, "gender", (bookingModel.getFieldValue("male") == "true" ? 'm' : 'f'));
	var isOrdained = bookingModel.getFieldValue("ordained") == "true";
	appendArg(request, "isOrdained", isOrdained, true);
	if (isOrdained)
		appendArg(request, "passportFirstName", bookingModel.getFieldValue("layName"));
	else if (bookingModel.getFieldValue("familyMember") == "true") {
		appendArg(request, "passportFirstName", bookingModel.getFieldValue("practitionerName"));
		appendArg(request, "passportLastName", bookingModel.getFieldValue("practitionerRelationship"));
	}
	appendArg(request, "street", concatValues(bookingModel.getFieldValue("address"), bookingModel.getFieldValue("address2"), ' '));
	appendArg(request, "city", bookingModel.getFieldValue("town"));
	appendArg(request, "state", bookingModel.getFieldValue("state"));
	appendArg(request, "postCode", bookingModel.getFieldValue("postcode"));
	appendArg(request, "country", bookingModel.getFieldValue("country"));
	appendArg(request, "centre", bookingModel.getFieldValue("centre_name"));
	appendArg(request, "phone", bookingModel.getFieldValue("phone"));
	appendArg(request, "email", bookingModel.getFieldValue("email"));
	appendArg(request, "age", (bookingModel.getFieldValue("adult") == "true" ? '-1' : bookingModel.getFieldValue("childAge")));
	appendArg(request, "specialNeeds", concatValues(bookingModel.getFieldValue("wheelchairAccess") == "true" ? "Wheelchair access" : "", bookingModel.getFieldValue("specialNeeds"), ", "));
	appendArg(request, "carer1", bookingModel.getFieldValue("gardianName"));
	appendArg(request, "comments", bookingModel.getFieldValue("notAffiliatedComment"));
	appendArg(request, "fee", bookingModel.getFieldValue("price_net"));
	if (bookingModel.getFieldValue("familyMember") == "false") {
		appendDetailArg(request, 0, 0); // teachings
		if (bookingModel.getFieldValue("child") == "true")
			appendDetailArg(request, 1, 2); // complément meals enfant
		if (bookingModel.getFieldValue("translation") != "")
			appendDetailArg(request, 2, bookingModel.getFieldValue("translation")); // translation
	}
	appendDetailArg(request, 1, 1); // meals
	appendArg(request, "otherTranslation", bookingModel.getFieldValue("otherTranslation"));
	if (bookingModel.getFieldValue("hearingImpaired") == "true")
		appendDetailArg(request, 2, 1); // translation Hearing-impaired
	if (bookingModel.getFieldValue("freeDay_option1") == "true")
		appendDetailArg(request, 4, 1);
	if (bookingModel.getFieldValue("freeDay_option2") == "true")
		appendDetailArg(request, 4, 2);
	if (bookingModel.getFieldValue("freeDay_language") != "")
		appendDetailArg(request, 6, bookingModel.getFieldValue("freeDay_language"));
	if (bookingModel.getFieldValue("retreat") == "true")
		appendDetailArg(request, 0, 6); // teachings retreat
	if (bookingModel.getFieldValue("retreat_onsite") == "true") {
		for (var detailValue = 1; detailValue <= 5; detailValue++)
			if (bookingModel.getFieldValue("retreat_acco" + detailValue) == "true")
				appendDetailArg(request, 0, detailValue); // accommodation
	}
	if (bookingModel.getFieldValue("retreat_coach") == "true")
		appendDetailArg(request, 4, 3);
	if (bookingModel.getFieldValue("retreat_shuttle") == "true")
		appendDetailArg(request, 4, 4);
	request.form.setAttribute("action", submitUrl);
	request.form.setAttribute("method", "POST");
	div.appendChild(request.form);
	//alert(request.body);
	request.form.submit();
}

function getBaseUrl() {
   var s = window.location.href;
   return s.substring(0, s.lastIndexOf('/') + 1);
}

function doPayment() {
	window.location = paymentUrl + "?id=" + bookingForm.dataModel.getFieldValue("id");
}

function concatValues(v1, v2, sep) {
	if (!v1 || v1 == "")
		return v2;
	if (!v2 || v2 == "")
		return v1;
	return v1 + sep + v2;
}

function appendArg(request, name, value, boolean) {
	if (request.body != '')
		request.body += '&';
	request.body += name + '=' + value;
	var input = document.createElement("input");
	input.setAttribute("name", name);
	if (boolean) {
		input.setAttribute("type", "checkbox");
		input.setAttribute("checked", value); // FF
		input.setAttribute("defaultChecked", value); // IE
		input.checked = value == "true" || value == true;
	} else {
		input.setAttribute("type", "text");
		input.value = value;
	}
	request.form.appendChild(input);
}

function appendDetailArg(request, detailType, detailValue) {
	var dates = getAttendanceDates(detailType, detailValue);
	for (var i = 0; i < dates.length; i++) {
		appendArg(request, "startDate" + request.detailsCount, dates[i].startDate);
		appendArg(request, "endDate" + request.detailsCount, dates[i].endDate);
		appendArg(request, "detailType" + request.detailsCount, detailType);
		appendArg(request, "detailValue" + request.detailsCount, detailValue);
		request.detailsCount++;
	}
}

function getAttendanceDates(detailType, detailValue) {
	var teachings = detailType == 0 && detailValue == 0;
	var meals = detailType == 1;
	var translation = detailType == 2 && detailValue != 0;
	var accommodation = detailType == 0 && detailValue != 0 || detailType == 3 && detailValue == 2; // accommodation or shuttle
	var excursion1 = detailType == 4 && detailValue == 1;
	var excursion2 = detailType == 4 && detailValue == 2;
	var excursionLanguage = detailType == 6;
	var coach = detailType == 4 && detailValue == 3;
	var shuttle = detailType == 4 && detailValue == 4;
	
	var bookingModel = bookingForm.dataModel;
	var fullfestival = bookingModel.getFieldValue("wholeevent") == "true";
	var fullfestival_nomeals = bookingModel.getFieldValue("wholeevent_nomeals") == "true";
	var partialfestival_meals = bookingModel.getFieldValue("partialevent_meals") == "true";
	var fullretreat = bookingModel.getFieldValue("retreat_wholeevent") == "true";
	
	var festival_common = fullfestival && (teachings || meals || translation) || fullfestival_nomeals && (teachings || translation);
	var retreat_common = fullretreat && (translation || accommodation || shuttle);
	
	var days = new Array();
	days[0]  = festival_common || (bookingModel.getFieldValue("day1") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[1]  = festival_common || (bookingModel.getFieldValue("day2") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[2]  = festival_common || (bookingModel.getFieldValue("day3") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[3]  = festival_common || (bookingModel.getFieldValue("day4") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[4]  = fullfestival && (teachings || meals) || fullfestival_nomeals && teachings || (excursion1 || excursion2 || excursionLanguage);
	days[5]  = festival_common || (bookingModel.getFieldValue("day6") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[6]  = festival_common || (bookingModel.getFieldValue("day7") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[7]  = festival_common || (bookingModel.getFieldValue("day8") == "true") && (teachings || translation || meals && partialfestival_meals);
	days[8]  = retreat_common  || (bookingModel.getFieldValue("retreat_day1") == "true") && (translation || accommodation || shuttle) || coach;
	days[9]  = retreat_common  || (bookingModel.getFieldValue("retreat_day2") == "true") && (translation || accommodation || shuttle);
	days[10] = retreat_common  || (bookingModel.getFieldValue("retreat_day3") == "true") && (translation || accommodation || shuttle);
	days[11] = retreat_common  || (bookingModel.getFieldValue("retreat_day4") == "true") && (translation || accommodation || shuttle);
	days[12] = retreat_common  || (bookingModel.getFieldValue("retreat_day5") == "true") && (translation || accommodation || shuttle);
	days[13] = retreat_common  || (bookingModel.getFieldValue("retreat_day6") == "true") && (translation || accommodation || shuttle);
	days[14] = retreat_common  || (bookingModel.getFieldValue("retreat_day7") == "true") && (translation || accommodation || shuttle);
	
	var dates = new Array();
	var beginSegment = null;
	var n = days.length;
	for (var i = 0; i < n; i++) {
		if (beginSegment == null && days[i] == true)
			beginSegment = i;
		else if (beginSegment != null && days[i] == false) {
			addSegmentDate(beginSegment, i - 1, dates);
			beginSegment = null;
		}
	}
	if (beginSegment != null)
		addSegmentDate(beginSegment, n - 1, dates);
	return dates;
}

function addSegmentDate(beginSegmentIndex, endSegmentIndex, dates) {
	dates[dates.length] = {startDate: indexToDate(beginSegmentIndex), endDate: indexToDate(endSegmentIndex)};
}

function indexToDate(index) {
	return index == 0 ? "2008-10-31" : "2008-11-" + (index <= 9 ? '0' : "") + index;
}

function goToInputStep() {
	$("step1_nextButton").disabled = true;
	//checkLiveTime();
	//checkQueueTime();
	checkLimits();
}

var liveTime = 0;
var liveStamp = 0;

function checkLiveTime() {
	if (liveTime == 0) {
		jQuery("#connectingServer1").show();
		AjaxUtil.loadXml("form/livestamp.php", function(ajaxResponseNode) {
			jQuery("#connectingServer1").hide();
			var nodes = ajaxResponseNode.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var node = nodes[i];
				var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
				if (tagName == "LIVESTAMP") {
					liveTime = new Date().getTime() + parseInt(node.getAttribute("value"));
					checkLiveTime();
				}
			}
		});
		return;
	}
	liveStamp = parseInt((liveTime - new Date().getTime()) / 1000);
	if (liveStamp >= 0) {
		var text = $("waitLiveTime");
		if (text && text.style.display == "none") {
			text.style.display = "";
			scrollToBottom();
		}
		text = $("liveStamp");
		if (text)
			text.innerHTML = "<span>" + stampToString(liveStamp) + "</span>";
	}
	if (liveStamp <= 0) 
		checkQueueTime();
	else
		setTimeout(checkLiveTime, 1000);
}

var queueTime = 0;
var queueStamp = 0;

function checkQueueTime() {
	if (bookingForm.dataModel.getFieldValue("form_step") != "1") {
		jQuery("#waitQueueTime").hide();
		return;
	}
	if (queueTime == 0) {
		jQuery("#connectingServer1").show();
		AjaxUtil.loadXml("form/queuestamp.php", function(ajaxResponseNode) {
			jQuery("#connectingServer1").hide();
			jQuery("#waitLiveTime").hide();
			var nodes = ajaxResponseNode.childNodes;
			for (var i = 0 ; i < nodes.length ; i++) {
				var node = nodes[i];
				var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
				if (tagName == "QUEUESTAMP") {
					queueStamp = parseInt(node.getAttribute("value"));
					queueTime = new Date().getTime() + queueStamp;
					queueStamp = queueStamp / 1000;
					bookingForm.dataModel.setFieldValue("queueStamp", queueStamp)
					checkQueueTime();
				}
			}
		});
		return;
	}
	queueStamp = parseInt((queueTime - new Date().getTime()) / 1000);
	if (queueStamp >= 0) {
		var text = $("waitQueueTime");
		if (text && text.style.display == "none" && queueStamp > 0) {
			text.style.display = "";
			scrollToBottom();
		}
		text = $("queueStamp");
		if (text)
			text.innerHTML = "<span>" + stampToString(queueStamp) + "</span>";
	}
	if (queueStamp <= 0)
		checkLimits();
	else
		setTimeout(checkQueueTime, 1000);
}

function checkLimits() {
	jQuery("#connectingServer1").show();
	AjaxUtil.loadXml("form/eventsBookingOptions.php", function(ajaxResponseNode) {
		jQuery("#connectingServer1").hide();
		var nodes = ajaxResponseNode.childNodes;
		for (var i = 0 ; i < nodes.length ; i++) {
			var node = nodes[i];
			var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
			if (tagName == "LIMIT") {
				var soldout = node.getAttribute("soldout");
				if (soldout == "true") {
					var detailType = node.getAttribute("detailType");
					var detailValue = node.getAttribute("detailValue");
					var bookingModel = bookingForm.dataModel;
					// Contrôle limite festival
					if (detailType == "0" && detailValue == "0" && bookingModel.getFieldValue("festival") == "true") {
						bookingModel.setFieldValue("wholeevent", false);
						bookingModel.setFieldValue("wholeevent.editable", false);
						bookingModel.setFieldValue("wholeevent_nomeals", false);
						bookingModel.setFieldValue("wholeevent_nomeals.editable", false);
						bookingModel.setFieldValue("partialevent", false);
						bookingModel.setFieldValue("partialevent.editable", false);
					}
					// Contrôle limite repas festival
					if (detailType == "1" && detailValue == "1") {
						bookingModel.setFieldValue("familyMember", false);
						bookingModel.setFieldValue("familyMember.editable", false);
						bookingModel.setFieldValue("wholeevent", false);
						bookingModel.setFieldValue("wholeevent.editable", false);
					}
					// Contrôle limite retraite
					if (detailType == "0" && detailValue == "6" && bookingModel.getFieldValue("retreat") == "true") {
						bookingModel.setFieldValue("retreat_wholeevent", false);
						bookingModel.setFieldValue("retreat_wholeevent.editable", false);
						bookingModel.setFieldValue("retreat_partialevent", false);
						bookingModel.setFieldValue("retreat_partialevent.editable", false);
					}
					// Contrôle limite hebergement Dortoir
					if (detailType == "0" && detailValue == "1" && bookingModel.getFieldValue("retreat") == "true") {
						bookingModel.setFieldValue("retreat_acco1", false);
						bookingModel.setFieldValue("retreat_acco1.editable", false);
					}
					// Contrôle limite hebergement Chambre partagee
					if (detailType == "0" && detailValue == "2" && bookingModel.getFieldValue("retreat") == "true") {
						bookingModel.setFieldValue("retreat_acco2", false);
						bookingModel.setFieldValue("retreat_acco2.editable", false);
					}
					// Contrôle limite shuttle Formule 1
					if (detailType == "4" && detailValue == "4" && bookingModel.getFieldValue("retreat") == "true") {
						bookingModel.setFieldValue("retreat_shuttle", false);
						bookingModel.setFieldValue("retreat_shuttle.editable", false);
					}
				}
			}
		}
		goToStep2();
		jQuery("#waitQueueTime").hide();
	}, "centerID=" + centerID, "eventID=" + eventID, "IDHash=" + IDHash, "restricted=0");
}

function goToStep2() {
	bookingForm.setStep(2, true);
	$("step1_nextButton").disabled = false;
}

function stampToString(stamp) {
	var s = "";
	var count = stamp;
	var duration = 3600 * 24;
	var days = parseInt(count / duration);
	if (days > 0) {
		s += days + "d";
		count -= days * duration;
	}
	duration = 3600;
	var hours = parseInt(count / duration);
	if (hours > 0 || days > 0) {
		s += " " + hours + "h";
		count -= hours * duration;
	}
	duration = 60;
	var minutes = parseInt(count / duration);
	if (minutes > 0 || hours > 0) {
		s += " " + minutes + "mn";
		count -= minutes * duration;
	}
	var seconds = count;
	s += " " + seconds + "s";
	return s;
}

function onQueueButton(stayInQueue) {
	if (stayInQueue)
		jQuery("#queueButtons").hide();
	else {
		var bookingModel = bookingForm.dataModel;
		bookingModel.setFieldValue("queueStamp", "-" + bookingModel.getFieldValue("queueStamp"));
		bookingModel.storeFields(function() {startAnotherBooking(true); queueTime = 0;});
	}
}

var bookingNumber = "";

function submitBookingNumber() {
	var userNumber = contactForm.dataModel.getFieldValue("contact_booking_ref");
	AjaxUtil.loadXml("form/checkBookingNumber.php", function(ajaxResponseNode) {
		var nodes = ajaxResponseNode.childNodes;
		for (var i = 0 ; i < nodes.length ; i++) {
			var node = nodes[i];
			var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
			if (tagName == "RESULT") {
				if (node.getAttribute("checked") == "true") {
					bookingNumber = userNumber;
				} else
					alert( labelManager.getLabel("code_pass_wrong"));
			} else if (tagName == "FIELD") {
				var field = node.getAttribute("key");
				var value = node.getAttribute("value");
				if (field == "firstName")
					contactForm.dataModel.setFieldValue("contact_name", value);
				else if (field == "lastName")
					contactForm.dataModel.setFieldValue("contact_name", contactForm.dataModel.getFieldValue("contact_name") + " " + value);					
				else if (field == "email") {
					contactForm.dataModel.setFieldValue("contact_email", value, true);
					contactForm.refreshPage();
				}					
			}
		}
	}, "ref=" + userNumber);
}

function loadPage(page, elementId, checkBookingNumber, defilement) {


	if(defilement == null)
	{
		defilement = true;
	}

	if (checkBookingNumber && bookingNumber == "") {
		if (labelManager.lang != pageManager.lang)
			labelManager.loadLabels(pageManager.lang, function() {loadPage(page, elementId, checkBookingNumber);});
		else {
			var userNumber = prompt(labelManager.getLabel("code_pass_ask"));
			if (userNumber == null) // cancel
				return false;
			AjaxUtil.loadXml("/form/checkBookingNumber.php", function(ajaxResponseNode) {
				var nodes = ajaxResponseNode.childNodes;
				for (var i = 0 ; i < nodes.length ; i++) {
					var node = nodes[i];
					var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName;
					if (tagName == "RESULT") {
						if (node.getAttribute("checked") == "true") {
							bookingNumber = userNumber;
							loadPage(page, elementId);
						} else
							alert( labelManager.getLabel("code_pass_wrong"));
						return false;
					}
				}
			}, "ref=" + userNumber);
		}
	} else {


			pageManager.loadPage(page, elementId, function() {

				if(defilement == true)
				{
					var element = $(elementId);
					var top = RicoUtil.toViewportPosition(element).y;
					var height = jQuery.browser.msie ? element.offsetHeight : element.clientHeight;
					var bottom = top + height;
					var docBottom = jQuery.browser.opera ? document.body.clientHeight : document.documentElement.clientHeight;
					var minVisibleHeight = Math.min(height, 1000);
					if (top > docBottom - minVisibleHeight) {
						//alert("top = " + top +"\nelement.clientHeight = " + element.clientHeight + "\ndocument.documentElement.clientHeight = " + document.documentElement.clientHeight + "\nwindow.scrollY = " + window.scrollY);
						//window.scrollTo(0, window.scrollY + (top - docBottom + minVisibleHeight));
						if (!jQuery.browser.safari)
							jQuery.scrollTo(element, {offset: minVisibleHeight - docBottom, duration:500, axis:'y'});
						else
							jQuery.scrollTo("+=" + (top - docBottom + minVisibleHeight), {duration:500, axis:'y'});
					}
					var title = jQuery("#" + elementId + " table td b")[0];
					title.style.padding = "2px";
					//Rico.Corner.round(title, {compact:true});
					var n = 5;
					var f = function() {title.style.backgroundColor = Math.round(n/2) * 2 == n ? "" : "orange"; if (--n >= 0) setTimeout(f, 300);};
					f();

					// mise en place de l appel regulier de la fonction toutes les 0.5 secondes
					setInterval("clignotement('booking')", 1000); 
					setInterval("clignotement('rate')", 1000); 
					setInterval("clignotement('kadampa')", 1000); 
				}
			});
	}
	return false;
}

var diapo_hotels, diapo_paris_h, diapo_paris_v, diapo_play;
function startInformationPageAnimation() {
	var timeout = 6500;
	var speed = 3500;
	diapo_hotels = jQuery('#diapo_hotels').innerfade({speed: speed,timeout: timeout, type: 'sequence', containerheight: '148px'});
	diapo_offsite = jQuery('#diapo_offsite').innerfade({speed: speed,timeout: timeout, type: 'sequence', containerheight: '166px'});
	diapo_paris_h = jQuery('#diapo_tout_paris_h, #diapo_paris_ma_h').innerfade({speed: speed,timeout: timeout, type: 'sequence', containerheight: '170px'});
	diapo_paris_v = jQuery('#diapo_tout_paris_v, #diapo_paris_ma_v').innerfade({speed: speed,timeout: timeout, type: 'sequence', containerheight: '230px'});
	diapo_play = jQuery('#diapo_play').innerfade({speed: speed,timeout: timeout, type: 'sequence', containerheight: '158px'});
}

function stopInformationPageAnimation() {
	if (diapo_hotels)
		diapo_hotels.length = 0;
	if (diapo_paris_h)
		diapo_paris_h.length = 0;
	if (diapo_paris_v)
		diapo_paris_v.length = 0;
	if (diapo_play)
		diapo_play.length = 0;
}

function clignotement(id){

	if(document.getElementById(id) != null )
	{
		if (document.getElementById(id).style.backgroundColor=="orange")
		{  
			document.getElementById(id).style.backgroundColor="white";
			document.getElementById(id).style.color="black";
		}
	    else
	    {
			document.getElementById(id).style.backgroundColor="orange";
			document.getElementById(id).style.color="white";
		}
	}
}

function downloadBookingForm(file)
{
 var msg_hotel_booking = " To reserve your accommodation, please return the form duly completed no later than September 15th 2008. After this date, your request will be subject to availability. \n\n You hereby expressly authorize Euro Disney to directly debit the total amount of the booking from your credit card, details of which must be completed hereunder. Please note that the debit of your credit card will occur as follows : \n\n >> UPON RESERVATION : amount of 1 (one) night accommodation + registration fee. This ONE NIGHT DEPOSIT and the REGISTRATION FEE are NON REFUNDABLE. \n\n >> As of October 6th 2008 : total amount of accommodation including registration fee. \n\n Should such debit prove to be impossible for any reason whatsoever, Euro Disney may cancel the booking and shall inform you of such cancellation. \n\n In the event of no-show, partial or complete cancellation of the hotel booking as of October 6th 2008 , you hereby expressly agree that any amount paid be totally retained by Euro Disney as cancellation fee. \n\n Cancellations must be made in writing at the fax number or e-mail address indicated in the booking form you are downloading. ";

 if(confirm(msg_hotel_booking) == true)
 {
  window.open(file);
 }
}