//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

Fx.Slide=new Class({
	Extends:Fx,
	options:{
		mode:"vertical"
	},
	initialize:function(B,A){
		this.addEvent("complete",function(){
			this.open=(this.wrapper["offset"+this.layout.capitalize()]!=0);
			if(this.open&&Browser.Engine.webkit419){
				this.element.dispose().inject(this.wrapper);
			}
		},true);
	this.element=this.subject=$(B);
	this.parent(A);
	var C=this.element.retrieve("wrapper");
	this.wrapper=C||new Element("div",{
		styles:$extend(this.element.getStyles("margin","position"),{
			overflow:"hidden"
		})
		}).wraps(this.element);
	this.element.store("wrapper",this.wrapper).setStyle("margin",0);
	this.now=[];
	this.open=true;
},
vertical:function(){
	this.margin="margin-top";
	this.layout="height";
	this.offset=this.element.offsetHeight;
},
horizontal:function(){
	this.margin="margin-left";
	this.layout="width";
	this.offset=this.element.offsetWidth;
},
set:function(A){
	this.element.setStyle(this.margin,A[0]);
	this.wrapper.setStyle(this.layout,A[1]);
	return this;
},
compute:function(E,D,C){
	var B=[];
	var A=2;
	A.times(function(F){
		B[F]=Fx.compute(E[F],D[F],C);
	});
	return B;
},
start:function(B,E){
	if(!this.check(arguments.callee,B,E)){
		return this;
	}
	this[E||this.options.mode]();
	var D=this.element.getStyle(this.margin).toInt();
	var C=this.wrapper.getStyle(this.layout).toInt();
	var A=[[D,C],[0,this.offset]];
	var G=[[D,C],[-this.offset,0]];
	var F;
	switch(B){
		case"in":
			F=A;
			break;
		case"out":
			F=G;
			break;
		case"toggle":
			F=(this.wrapper["offset"+this.layout.capitalize()]==0)?A:G;
	}
	return this.parent(F[0],F[1]);
},
slideIn:function(A){
	return this.start("in",A);
},
slideOut:function(A){
	return this.start("out",A);
},
hide:function(A){
	this[A||this.options.mode]();
	this.open=false;
	return this.set([-this.offset,0]);
},
show:function(A){
	this[A||this.options.mode]();
	this.open=true;
	return this.set([0,this.offset]);
},
toggle:function(A){
	return this.start("toggle",A);
}
});
Element.Properties.slide={
	set:function(B){
		var A=this.retrieve("slide");
		if(A){
			A.cancel();
		}
		return this.eliminate("slide").store("slide:options",$extend({
			link:"cancel"
		},B));
	},
	get:function(A){
		if(A||!this.retrieve("slide")){
			if(A||!this.retrieve("slide:options")){
				this.set("slide",A);
			}
			this.store("slide",new Fx.Slide(this,this.retrieve("slide:options")));
		}
		return this.retrieve("slide");
	}
};

Element.implement({
	slide:function(D,E){
		D=D||"toggle";
		var B=this.get("slide"),A;
		switch(D){
			case"hide":
				B.hide(E);
				break;
			case"show":
				B.show(E);
				break;
			case"toggle":
				var C=this.retrieve("slide:flag",B.open);
				B[(C)?"slideOut":"slideIn"](E);
				this.store("slide:flag",!C);
				A=true;
				break;
			default:
				B.start(D,E);
		}
		if(!A){
			this.eliminate("slide:flag");
		}
		return this;
	}
});
Fx.Scroll=new Class({
	Extends:Fx,
	options:{
		offset:{
			x:0,
			y:0
		},
		wheelStops:true
	},
	initialize:function(B,A){
		this.element=this.subject=$(B);
		this.parent(A);
		var D=this.cancel.bind(this,false);
		if($type(this.element)!="element"){
			this.element=$(this.element.getDocument().body);
		}
		var C=this.element;
		if(this.options.wheelStops){
			this.addEvent("start",function(){
				C.addEvent("mousewheel",D);
			},true);
			this.addEvent("complete",function(){
				C.removeEvent("mousewheel",D);
			},true);
		}
	},
set:function(){
	var A=Array.flatten(arguments);
	this.element.scrollTo(A[0],A[1]);
},
compute:function(E,D,C){
	var B=[];
	var A=2;
	A.times(function(F){
		B.push(Fx.compute(E[F],D[F],C));
	});
	return B;
},
start:function(C,H){
	if(!this.check(arguments.callee,C,H)){
		return this;
	}
	var E=this.element.getSize(),F=this.element.getScrollSize();
	var B=this.element.getScroll(),D={
		x:C,
		y:H
	};
	for(var G in D){
		var A=F[G]-E[G];
		if($chk(D[G])){
			D[G]=($type(D[G])=="number")?D[G].limit(0,A):A;
		}else{
			D[G]=B[G];
		}
		D[G]+=this.options.offset[G];
	}
	return this.parent([B.x,B.y],[D.x,D.y]);
},
toTop:function(){
	return this.start(false,0);
},
toLeft:function(){
	return this.start(0,false);
},
toRight:function(){
	return this.start("right",false);
},
toBottom:function(){
	return this.start(false,"bottom");
},
toElement:function(B){
	var A=$(B).getPosition(this.element);
	return this.start(A.x,A.y);
}
});
Fx.Elements=new Class({
	Extends:Fx.CSS,
	initialize:function(B,A){
		this.elements=this.subject=$$(B);
		this.parent(A);
	},
	compute:function(G,H,I){
		var C={};
		
		for(var D in G){
			var A=G[D],E=H[D],F=C[D]={};
			
			for(var B in A){
				F[B]=this.parent(A[B],E[B],I);
			}
			}
			return C;
},
set:function(B){
	for(var C in B){
		var A=B[C];
		for(var D in A){
			this.render(this.elements[C],D,A[D],this.options.unit);
		}
		}
		return this;
},
start:function(C){
	if(!this.check(arguments.callee,C)){
		return this;
	}
	var H={},I={};
	
	for(var D in C){
		var F=C[D],A=H[D]={},G=I[D]={};
		
		for(var B in F){
			var E=this.prepare(this.elements[D],B,F[B]);
			A[B]=E.from;
			G[B]=E.to;
		}
		}
		return this.parent(H,I);
}
});
var Drag=new Class({
	Implements:[Events,Options],
	options:{
		snap:6,
		unit:"px",
		grid:false,
		style:true,
		limit:false,
		handle:false,
		invert:false,
		preventDefault:false,
		modifiers:{
			x:"left",
			y:"top"
		}
	},
initialize:function(){
	var B=Array.link(arguments,{
		options:Object.type,
		element:$defined
	});
	this.element=$(B.element);
	this.document=this.element.getDocument();
	this.setOptions(B.options||{});
	var A=$type(this.options.handle);
	this.handles=(A=="array"||A=="collection")?$$(this.options.handle):$(this.options.handle)||this.element;
	this.mouse={
		now:{},
		pos:{}
};

this.value={
	start:{},
	now:{}
};

this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";
this.bound={
	start:this.start.bind(this),
	check:this.check.bind(this),
	drag:this.drag.bind(this),
	stop:this.stop.bind(this),
	cancel:this.cancel.bind(this),
	eventStop:$lambda(false)
	};
this.attach();
},
attach:function(){
	this.handles.addEvent("mousedown",this.bound.start);
	return this;
},
detach:function(){
	this.handles.removeEvent("mousedown",this.bound.start);
	return this;
},
start:function(C){
	if(this.options.preventDefault){
		C.preventDefault();
	}
	this.fireEvent("beforeStart",this.element);
	this.mouse.start=C.page;
	var A=this.options.limit;
	this.limit={
		x:[],
		y:[]
	};
	
	for(var D in this.options.modifiers){
		if(!this.options.modifiers[D]){
			continue;
		}
		if(this.options.style){
			this.value.now[D]=this.element.getStyle(this.options.modifiers[D]).toInt();
		}else{
			this.value.now[D]=this.element[this.options.modifiers[D]];
		}
		if(this.options.invert){
			this.value.now[D]*=-1;
		}
		this.mouse.pos[D]=C.page[D]-this.value.now[D];
		if(A&&A[D]){
			for(var B=2;B--;B){
				if($chk(A[D][B])){
					this.limit[D][B]=$lambda(A[D][B])();
				}
			}
			}
	}
	if($type(this.options.grid)=="number"){
	this.options.grid={
		x:this.options.grid,
		y:this.options.grid
		};
}
this.document.addEvents({
	mousemove:this.bound.check,
	mouseup:this.bound.cancel
	});
this.document.addEvent(this.selection,this.bound.eventStop);
},
check:function(A){
	if(this.options.preventDefault){
		A.preventDefault();
	}
	var B=Math.round(Math.sqrt(Math.pow(A.page.x-this.mouse.start.x,2)+Math.pow(A.page.y-this.mouse.start.y,2)));
	if(B>this.options.snap){
		this.cancel();
		this.document.addEvents({
			mousemove:this.bound.drag,
			mouseup:this.bound.stop
			});
		this.fireEvent("start",this.element).fireEvent("snap",this.element);
	}
},
drag:function(A){
	if(this.options.preventDefault){
		A.preventDefault();
	}
	this.mouse.now=A.page;
	for(var B in this.options.modifiers){
		if(!this.options.modifiers[B]){
			continue;
		}
		this.value.now[B]=this.mouse.now[B]-this.mouse.pos[B];
		if(this.options.invert){
			this.value.now[B]*=-1;
		}
		if(this.options.limit&&this.limit[B]){
			if($chk(this.limit[B][1])&&(this.value.now[B]>this.limit[B][1])){
				this.value.now[B]=this.limit[B][1];
			}else{
				if($chk(this.limit[B][0])&&(this.value.now[B]<this.limit[B][0])){
					this.value.now[B]=this.limit[B][0];
				}
			}
		}
	if(this.options.grid[B]){
		this.value.now[B]-=(this.value.now[B]%this.options.grid[B]);
	}
	if(this.options.style){
		this.element.setStyle(this.options.modifiers[B],this.value.now[B]+this.options.unit);
	}else{
		this.element[this.options.modifiers[B]]=this.value.now[B];
	}
	}
	this.fireEvent("drag",this.element);
},
cancel:function(A){
	this.document.removeEvent("mousemove",this.bound.check);
	this.document.removeEvent("mouseup",this.bound.cancel);
	if(A){
		this.document.removeEvent(this.selection,this.bound.eventStop);
		this.fireEvent("cancel",this.element);
	}
},
stop:function(A){
	this.document.removeEvent(this.selection,this.bound.eventStop);
	this.document.removeEvent("mousemove",this.bound.drag);
	this.document.removeEvent("mouseup",this.bound.stop);
	if(A){
		this.fireEvent("complete",this.element);
	}
}
});
Element.implement({
	makeResizable:function(A){
		return new Drag(this,$merge({
			modifiers:{
				x:"width",
				y:"height"
			}
		},A));
}
});
Drag.Move=new Class({
	Extends:Drag,
	options:{
		droppables:[],
		container:false
	},
	initialize:function(C,B){
		this.parent(C,B);
		this.droppables=$$(this.options.droppables);
		this.container=$(this.options.container);
		if(this.container&&$type(this.container)!="element"){
			this.container=$(this.container.getDocument().body);
		}
		C=this.element;
		var D=C.getStyle("position");
		var A=(D!="static")?D:"absolute";
		if(C.getStyle("left")=="auto"||C.getStyle("top")=="auto"){
			C.position(C.getPosition(C.offsetParent));
		}
		C.setStyle("position",A);
		this.addEvent("start",function(){
			this.checkDroppables();
		},true);
	},
	start:function(B){
		if(this.container){
			var D=this.element,J=this.container,E=J.getCoordinates(D.offsetParent),F={},A={};
			["top","right","bottom","left"].each(function(K){
				F[K]=J.getStyle("padding-"+K).toInt();
				A[K]=D.getStyle("margin-"+K).toInt();
			},this);
			var C=D.offsetWidth+A.left+A.right,I=D.offsetHeight+A.top+A.bottom;
			var H=[E.left+F.left,E.right-F.right-C];
			var G=[E.top+F.top,E.bottom-F.bottom-I];
			this.options.limit={
				x:H,
				y:G
			};
		
	}
	this.parent(B);
},
checkAgainst:function(B){
	B=B.getCoordinates();
	var A=this.mouse.now;
	return(A.x>B.left&&A.x<B.right&&A.y<B.bottom&&A.y>B.top);
},
checkDroppables:function(){
	var A=this.droppables.filter(this.checkAgainst,this).getLast();
	if(this.overed!=A){
		if(this.overed){
			this.fireEvent("leave",[this.element,this.overed]);
		}
		if(A){
			this.overed=A;
			this.fireEvent("enter",[this.element,A]);
		}else{
			this.overed=null;
		}
	}
},
drag:function(A){
	this.parent(A);
	if(this.droppables.length){
		this.checkDroppables();
	}
},
stop:function(A){
	this.checkDroppables();
	this.fireEvent("drop",[this.element,this.overed]);
	this.overed=null;
	return this.parent(A);
}
});
Element.implement({
	makeDraggable:function(A){
		return new Drag.Move(this,A);
	}
});
Hash.Cookie=new Class({
	Extends:Cookie,
	options:{
		autoSave:true
	},
	initialize:function(B,A){
		this.parent(B,A);
		this.load();
	},
	save:function(){
		var A=JSON.encode(this.hash);
		if(!A||A.length>4096){
			return false;
		}
		if(A=="{}"){
			this.dispose();
		}else{
			this.write(A);
		}
		return true;
	},
	load:function(){
		this.hash=new Hash(JSON.decode(this.read(),true));
		return this;
	}
});
Hash.Cookie.implement((function(){
	var A={};
	
	Hash.each(Hash.prototype,function(C,B){
		A[B]=function(){
			var D=C.apply(this.hash,arguments);
			if(this.options.autoSave){
				this.save();
			}
			return D;
		};
	
	});
return A;
})());
var Color=new Native({
	initialize:function(B,C){
		if(arguments.length>=3){
			C="rgb";
			B=Array.slice(arguments,0,3);
		}else{
			if(typeof B=="string"){
				if(B.match(/rgb/)){
					B=B.rgbToHex().hexToRgb(true);
				}else{
					if(B.match(/hsb/)){
						B=B.hsbToRgb();
					}else{
						B=B.hexToRgb(true);
					}
				}
			}
	}
C=C||"rgb";
switch(C){
	case"hsb":
		var A=B;
		B=B.hsbToRgb();
		B.hsb=A;
		break;
	case"hex":
		B=B.hexToRgb(true);
		break;
}
B.rgb=B.slice(0,3);
B.hsb=B.hsb||B.rgbToHsb();
B.hex=B.rgbToHex();
return $extend(B,this);
}
});
Color.implement({
	mix:function(){
		var A=Array.slice(arguments);
		var C=($type(A.getLast())=="number")?A.pop():50;
		var B=this.slice();
		A.each(function(D){
			D=new Color(D);
			for(var E=0;E<3;E++){
				B[E]=Math.round((B[E]/100*(100-C))+(D[E]/100*C));
			}
			});
	return new Color(B,"rgb");
},
invert:function(){
	return new Color(this.map(function(A){
		return 255-A;
	}));
},
setHue:function(A){
	return new Color([A,this.hsb[1],this.hsb[2]],"hsb");
},
setSaturation:function(A){
	return new Color([this.hsb[0],A,this.hsb[2]],"hsb");
},
setBrightness:function(A){
	return new Color([this.hsb[0],this.hsb[1],A],"hsb");
}
});
function $RGB(C,B,A){
	return new Color([C,B,A],"rgb");
}
function $HSB(C,B,A){
	return new Color([C,B,A],"hsb");
}
function $HEX(A){
	return new Color(A,"hex");
}
Array.implement({
	rgbToHsb:function(){
		var B=this[0],C=this[1],J=this[2];
		var G,F,H;
		var I=Math.max(B,C,J),E=Math.min(B,C,J);
		var K=I-E;
		H=I/255;
		F=(I!=0)?K/I:0;
		if(F==0){
			G=0;
		}else{
			var D=(I-B)/K;
			var A=(I-C)/K;
			var L=(I-J)/K;
			if(B==I){
				G=L-A;
			}else{
				if(C==I){
					G=2+D-L;
				}else{
					G=4+A-D;
				}
			}
			G/=6;
		if(G<0){
			G++;
		}
	}
	return[Math.round(G*360),Math.round(F*100),Math.round(H*100)];
	},
	hsbToRgb:function(){
		var C=Math.round(this[2]/100*255);
		if(this[1]==0){
			return[C,C,C];
		}else{
			var A=this[0]%360;
			var E=A%60;
			var F=Math.round((this[2]*(100-this[1]))/10000*255);
			var D=Math.round((this[2]*(6000-this[1]*E))/600000*255);
			var B=Math.round((this[2]*(6000-this[1]*(60-E)))/600000*255);
			switch(Math.floor(A/60)){
				case 0:
					return[C,B,F];
				case 1:
					return[D,C,F];
				case 2:
					return[F,C,B];
				case 3:
					return[F,D,C];
				case 4:
					return[B,F,C];
				case 5:
					return[C,F,D];
			}
		}
		return false;
}
});
String.implement({
	rgbToHsb:function(){
		var A=this.match(/\d{1,3}/g);
		return(A)?hsb.rgbToHsb():null;
	},
	hsbToRgb:function(){
		var A=this.match(/\d{1,3}/g);
		return(A)?A.hsbToRgb():null;
	}
});
var Group=new Class({
	initialize:function(){
		this.instances=Array.flatten(arguments);
		this.events={};
		
		this.checker={};
	
},
addEvent:function(B,A){
	this.checker[B]=this.checker[B]||{};
	this.events[B]=this.events[B]||[];
	if(this.events[B].contains(A)){
		return false;
	}else{
		this.events[B].push(A);
	}
	this.instances.each(function(C,D){
		C.addEvent(B,this.check.bind(this,[B,C,D]));
	},this);
	return this;
},
check:function(C,A,B){
	this.checker[C][B]=true;
	var D=this.instances.every(function(F,E){
		return this.checker[C][E]||false;
	},this);
	if(!D){
		return ;
	}
	this.checker[C]={};
	
	this.events[C].each(function(E){
		E.call(this,this.instances,A);
	},this);
}
});
var Asset=new Hash({
	javascript:function(F,D){
		D=$extend({
			onload:$empty,
			document:document,
			check:$lambda(true)
			},D);
		var B=new Element("script",{
			src:F,
			type:"text/javascript"
		});
		var E=D.onload.bind(B),A=D.check,G=D.document;
		delete D.onload;
		delete D.check;
		delete D.document;
		B.addEvents({
			load:E,
			readystatechange:function(){
				if(["loaded","complete"].contains(this.readyState)){
					E();
				}
			}
		}).setProperties(D);
	if(Browser.Engine.webkit419){
	var C=(function(){
		if(!$try(A)){
			return ;
		}
		$clear(C);
		E();
	}).periodical(50);
}
return B.inject(G.head);
},
css:function(B,A){
	return new Element("link",$merge({
		rel:"stylesheet",
		media:"screen",
		type:"text/css",
		href:B
	},A)).inject(document.head);
},
image:function(C,B){
	B=$merge({
		onload:$empty,
		onabort:$empty,
		onerror:$empty
	},B);
	var D=new Image();
	var A=$(D)||new Element("img");
	["load","abort","error"].each(function(E){
		var F="on"+E;
		var G=B[F];
		delete B[F];
		D[F]=function(){
			if(!D){
				return ;
			}
			if(!A.parentNode){
				A.width=D.width;
				A.height=D.height;
			}
			D=D.onload=D.onabort=D.onerror=null;
			G.delay(1,A,A);
			A.fireEvent(E,A,1);
		};
	
	});
D.src=A.src=C;
if(D&&D.complete){
	D.onload.delay(1);
}
return A.setProperties(B);
},
images:function(D,C){
	C=$merge({
		onComplete:$empty,
		onProgress:$empty
	},C);
	if(!D.push){
		D=[D];
	}
	var A=[];
	var B=0;
	D.each(function(F){
		var E=new Asset.image(F,{
			onload:function(){
				C.onProgress.call(this,B,D.indexOf(F));
				B++;
				if(B==D.length){
					C.onComplete();
				}
			}
		});
	A.push(E);
});
return new Elements(A);
}
});
var Sortables=new Class({
	Implements:[Events,Options],
	options:{
		snap:4,
		opacity:1,
		clone:false,
		revert:false,
		handle:false,
		constrain:false
	},
	initialize:function(A,B){
		this.setOptions(B);
		this.elements=[];
		this.lists=[];
		this.idle=true;
		this.addLists($$($(A)||A));
		if(!this.options.clone){
			this.options.revert=false;
		}
		if(this.options.revert){
			this.effect=new Fx.Morph(null,$merge({
				duration:250,
				link:"cancel"
			},this.options.revert));
		}
	},
attach:function(){
	this.addLists(this.lists);
	return this;
},
detach:function(){
	this.lists=this.removeLists(this.lists);
	return this;
},
addItems:function(){
	Array.flatten(arguments).each(function(A){
		this.elements.push(A);
		var B=A.retrieve("sortables:start",this.start.bindWithEvent(this,A));
		(this.options.handle?A.getElement(this.options.handle)||A:A).addEvent("mousedown",B);
	},this);
	return this;
},
addLists:function(){
	Array.flatten(arguments).each(function(A){
		this.lists.push(A);
		this.addItems(A.getChildren());
	},this);
	return this;
},
removeItems:function(){
	var A=[];
	Array.flatten(arguments).each(function(B){
		A.push(B);
		this.elements.erase(B);
		var C=B.retrieve("sortables:start");
		(this.options.handle?B.getElement(this.options.handle)||B:B).removeEvent("mousedown",C);
	},this);
	return $$(A);
},
removeLists:function(){
	var A=[];
	Array.flatten(arguments).each(function(B){
		A.push(B);
		this.lists.erase(B);
		this.removeItems(B.getChildren());
	},this);
	return $$(A);
},
getClone:function(B,A){
	if(!this.options.clone){
		return new Element("div").inject(document.body);
	}
	if($type(this.options.clone)=="function"){
		return this.options.clone.call(this,B,A,this.list);
	}
	return A.clone(true).setStyles({
		margin:"0px",
		position:"absolute",
		visibility:"hidden",
		width:A.getStyle("width")
		}).inject(this.list).position(A.getPosition(A.getOffsetParent()));
},
getDroppables:function(){
	var A=this.list.getChildren();
	if(!this.options.constrain){
		A=this.lists.concat(A).erase(this.list);
	}
	return A.erase(this.clone).erase(this.element);
},
insert:function(C,B){
	var A="inside";
	if(this.lists.contains(B)){
		this.list=B;
		this.drag.droppables=this.getDroppables();
	}else{
		A=this.element.getAllPrevious().contains(B)?"before":"after";
	}
	this.element.inject(B,A);
	this.fireEvent("sort",[this.element,this.clone]);
},
start:function(B,A){
	if(!this.idle){
		return ;
	}
	this.idle=false;
	this.element=A;
	this.opacity=A.get("opacity");
	this.list=A.getParent();
	this.clone=this.getClone(B,A);
	this.drag=new Drag.Move(this.clone,{
		snap:this.options.snap,
		container:this.options.constrain&&this.element.getParent(),
		droppables:this.getDroppables(),
		onSnap:function(){
			B.stop();
			this.clone.setStyle("visibility","visible");
			this.element.set("opacity",this.options.opacity||0);
			this.fireEvent("start",[this.element,this.clone]);
		}.bind(this),
		onEnter:this.insert.bind(this),
		onCancel:this.reset.bind(this),
		onComplete:this.end.bind(this)
		});
	this.clone.inject(this.element,"before");
	this.drag.start(B);
},
end:function(){
	this.drag.detach();
	this.element.set("opacity",this.opacity);
	if(this.effect){
		var A=this.element.getStyles("width","height");
		var B=this.clone.computePosition(this.element.getPosition(this.clone.offsetParent));
		this.effect.element=this.clone;
		this.effect.start({
			top:B.top,
			left:B.left,
			width:A.width,
			height:A.height,
			opacity:0.25
		}).chain(this.reset.bind(this));
	}else{
		this.reset();
	}
},
reset:function(){
	this.idle=true;
	this.clone.destroy();
	this.fireEvent("complete",this.element);
},
serialize:function(){
	var C=Array.link(arguments,{
		modifier:Function.type,
		index:$defined
	});
	var B=this.lists.map(function(D){
		return D.getChildren().map(C.modifier||function(E){
			return E.get("id");
		},this);
	},this);
	var A=C.index;
	if(this.lists.length==1){
		A=0;
	}
	return $chk(A)&&A>=0&&A<this.lists.length?B[A]:B;
}
});
var Tips=new Class({
	Implements:[Events,Options],
	options:{
		onShow:function(A){
			A.setStyle("visibility","visible");
		},
		onHide:function(A){
			A.setStyle("visibility","hidden");
		},
		showDelay:100,
		hideDelay:100,
		className:null,
		offsets:{
			x:16,
			y:16
		},
		fixed:false
	},
	initialize:function(){
		var C=Array.link(arguments,{
			options:Object.type,
			elements:$defined
		});
		this.setOptions(C.options||null);
		this.tip=new Element("div").inject(document.body);
		if(this.options.className){
			this.tip.addClass(this.options.className);
		}
		var B=new Element("div",{
			"class":"tip-top"
		}).inject(this.tip);
		this.container=new Element("div",{
			"class":"tip"
		}).inject(this.tip);
		var A=new Element("div",{
			"class":"tip-bottom"
		}).inject(this.tip);
		this.tip.setStyles({
			position:"absolute",
			top:0,
			left:0,
			visibility:"hidden"
		});
		if(C.elements){
			this.attach(C.elements);
		}
	},
attach:function(A){
	$$(A).each(function(D){
		var G=D.retrieve("tip:title",D.get("title"));
		var F=D.retrieve("tip:text",D.get("rel")||D.get("href"));
		var E=D.retrieve("tip:enter",this.elementEnter.bindWithEvent(this,D));
		var C=D.retrieve("tip:leave",this.elementLeave.bindWithEvent(this,D));
		D.addEvents({
			mouseenter:E,
			mouseleave:C
		});
		if(!this.options.fixed){
			var B=D.retrieve("tip:move",this.elementMove.bindWithEvent(this,D));
			D.addEvent("mousemove",B);
		}
		D.store("tip:native",D.get("title"));
		D.erase("title");
	},this);
	return this;
},
detach:function(A){
	$$(A).each(function(C){
		C.removeEvent("mouseenter",C.retrieve("tip:enter")||$empty);
		C.removeEvent("mouseleave",C.retrieve("tip:leave")||$empty);
		C.removeEvent("mousemove",C.retrieve("tip:move")||$empty);
		C.eliminate("tip:enter").eliminate("tip:leave").eliminate("tip:move");
		var B=C.retrieve("tip:native");
		if(B){
			C.set("title",B);
		}
	});
return this;
},
elementEnter:function(B,A){
	$A(this.container.childNodes).each(Element.dispose);
	var D=A.retrieve("tip:title");
	if(D){
		this.titleElement=new Element("div",{
			"class":"tip-title"
		}).inject(this.container);
		this.fill(this.titleElement,D);
	}
	var C=A.retrieve("tip:text");
	if(C){
		this.textElement=new Element("div",{
			"class":"tip-text"
		}).inject(this.container);
		this.fill(this.textElement,C);
	}
	this.timer=$clear(this.timer);
	this.timer=this.show.delay(this.options.showDelay,this);
	this.position((!this.options.fixed)?B:{
		page:A.getPosition()
		});
},
elementLeave:function(A){
	$clear(this.timer);
	this.timer=this.hide.delay(this.options.hideDelay,this);
},
elementMove:function(A){
	this.position(A);
},
position:function(D){
	var B=window.getSize(),A=window.getScroll();
	var E={
		x:this.tip.offsetWidth,
		y:this.tip.offsetHeight
		};
	var C={
		x:"left",
		y:"top"
	};
	
	for(var F in C){
		var G=D.page[F]+this.options.offsets[F];
		if((G+E[F]-A[F])>B[F]){
			G=D.page[F]-this.options.offsets[F]-E[F];
		}
		this.tip.setStyle(C[F],G);
	}
	},
fill:function(A,B){
	(typeof B=="string")?A.set("html",B):A.adopt(B);
},
show:function(){
	this.fireEvent("show",this.tip);
},
hide:function(){
	this.fireEvent("hide",this.tip);
}
});
var SmoothScroll=new Class({
	Extends:Fx.Scroll,
	initialize:function(B,C){
		C=C||document;
		var E=C.getDocument(),D=C.getWindow();
		this.parent(E,B);
		this.links=(this.options.links)?$$(this.options.links):$$(E.links);
		var A=D.location.href.match(/^[^#]*/)[0]+"#";
		this.links.each(function(G){
			if(G.href.indexOf(A)!=0){
				return ;
			}
			var F=G.href.substr(A.length);
			if(F&&$(F)){
				this.useLink(G,F);
			}
		},this);
	if(!Browser.Engine.webkit419){
		this.addEvent("complete",function(){
			D.location.hash=this.anchor;
		},true);
	}
},
useLink:function(B,A){
	B.addEvent("click",function(C){
		this.anchor=A;
		this.toElement(A);
		C.stop();
	}.bind(this));
}
});
var Slider=new Class({
	Implements:[Events,Options],
	options:{
		onTick:function(A){
			if(this.options.snap){
				A=this.toPosition(this.step);
			}
			this.knob.setStyle(this.property,A);
		},
		snap:false,
		offset:0,
		range:false,
		wheel:false,
		steps:100,
		mode:"horizontal"
	},
	initialize:function(E,A,D){
		this.setOptions(D);
		this.element=$(E);
		this.knob=$(A);
		this.previousChange=this.previousEnd=this.step=-1;
		this.element.addEvent("mousedown",this.clickedElement.bind(this));
		if(this.options.wheel){
			this.element.addEvent("mousewheel",this.scrolledElement.bindWithEvent(this));
		}
		var F,B={},C={
			x:false,
			y:false
		};
		
		switch(this.options.mode){
			case"vertical":
				this.axis="y";
				this.property="top";
				F="offsetHeight";
				break;
			case"horizontal":
				this.axis="x";
				this.property="left";
				F="offsetWidth";
		}
		this.half=this.knob[F]/2;
		this.full=this.element[F]-this.knob[F]+(this.options.offset*2);
		this.min=$chk(this.options.range[0])?this.options.range[0]:0;
		this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;
		this.range=this.max-this.min;
		this.steps=this.options.steps||this.full;
		this.stepSize=Math.abs(this.range)/this.steps;
		this.stepWidth=this.stepSize*this.full/Math.abs(this.range);
		this.knob.setStyle("position","relative").setStyle(this.property,-this.options.offset);
		C[this.axis]=this.property;
		B[this.axis]=[-this.options.offset,this.full-this.options.offset];
		this.drag=new Drag(this.knob,{
			snap:0,
			limit:B,
			modifiers:C,
			onDrag:this.draggedKnob.bind(this),
			onStart:this.draggedKnob.bind(this),
			onComplete:function(){
				this.draggedKnob();
				this.end();
			}.bind(this)
			});
		if(this.options.snap){
			this.drag.options.grid=Math.ceil(this.stepWidth);
			this.drag.options.limit[this.axis][1]=this.full;
		}
	},
set:function(A){
	if(!((this.range>0)^(A<this.min))){
		A=this.min;
	}
	if(!((this.range>0)^(A>this.max))){
		A=this.max;
	}
	this.step=Math.round(A);
	this.checkStep();
	this.end();
	this.fireEvent("tick",this.toPosition(this.step));
	return this;
},
clickedElement:function(C){
	var B=this.range<0?-1:1;
	var A=C.page[this.axis]-this.element.getPosition()[this.axis]-this.half;
	A=A.limit(-this.options.offset,this.full-this.options.offset);
	this.step=Math.round(this.min+B*this.toStep(A));
	this.checkStep();
	this.end();
	this.fireEvent("tick",A);
},
scrolledElement:function(A){
	var B=(this.options.mode=="horizontal")?(A.wheel<0):(A.wheel>0);
	this.set(B?this.step-this.stepSize:this.step+this.stepSize);
	A.stop();
},
draggedKnob:function(){
	var B=this.range<0?-1:1;
	var A=this.drag.value.now[this.axis];
	A=A.limit(-this.options.offset,this.full-this.options.offset);
	this.step=Math.round(this.min+B*this.toStep(A));
	this.checkStep();
},
checkStep:function(){
	if(this.previousChange!=this.step){
		this.previousChange=this.step;
		this.fireEvent("change",this.step);
	}
},
end:function(){
	if(this.previousEnd!==this.step){
		this.previousEnd=this.step;
		this.fireEvent("complete",this.step+"");
	}
},
toStep:function(A){
	var B=(A+this.options.offset)*this.stepSize/this.full*this.steps;
	return this.options.steps?Math.round(B-=B%this.stepSize):B;
},
toPosition:function(A){
	return(this.full*Math.abs(this.min-A))/(this.steps*this.stepSize)-this.options.offset;
}
});
var Scroller=new Class({
	Implements:[Events,Options],
	options:{
		area:20,
		velocity:1,
		onChange:function(A,B){
			this.element.scrollTo(A,B);
		}
	},
initialize:function(B,A){
	this.setOptions(A);
	this.element=$(B);
	this.listener=($type(this.element)!="element")?$(this.element.getDocument().body):this.element;
	this.timer=null;
	this.coord=this.getCoords.bind(this);
},
start:function(){
	this.listener.addEvent("mousemove",this.coord);
},
stop:function(){
	this.listener.removeEvent("mousemove",this.coord);
	this.timer=$clear(this.timer);
},
getCoords:function(A){
	this.page=(this.listener.get("tag")=="body")?A.client:A.page;
	if(!this.timer){
		this.timer=this.scroll.periodical(50,this);
	}
},
scroll:function(){
	var B=this.element.getSize(),A=this.element.getScroll(),E=this.element.getPosition(),D={
		x:0,
		y:0
	};
	for(var C in this.page){
		if(this.page[C]<(this.options.area+E[C])&&A[C]!=0){
			D[C]=(this.page[C]-this.options.area-E[C])*this.options.velocity;
		}else{
			if(this.page[C]+this.options.area>(B[C]+E[C])&&B[C]+B[C]!=A[C]){
				D[C]=(this.page[C]-B[C]+this.options.area-E[C])*this.options.velocity;
			}
		}
	}
	if(D.y||D.x){
	this.fireEvent("change",[A.x+D.x,A.y+D.y]);
}
}
});
var Accordion=new Class({
	Extends:Fx.Elements,
	options:{
		display:0,
		show:false,
		height:true,
		width:false,
		opacity:true,
		fixedHeight:false,
		fixedWidth:false,
		wait:false,
		alwaysHide:false
	},
	initialize:function(){
		var C=Array.link(arguments,{
			container:Element.type,
			options:Object.type,
			togglers:$defined,
			elements:$defined
		});
		this.parent(C.elements,C.options);
		this.togglers=$$(C.togglers);
		this.container=$(C.container);
		this.previous=-1;
		if(this.options.alwaysHide){
			this.options.wait=true;
		}
		if($chk(this.options.show)){
			this.options.display=false;
			this.previous=this.options.show;
		}
		if(this.options.start){
			this.options.display=false;
			this.options.show=false;
		}
		this.effects={};
		
		if(this.options.opacity){
			this.effects.opacity="fullOpacity";
		}
		if(this.options.width){
			this.effects.width=this.options.fixedWidth?"fullWidth":"offsetWidth";
		}
		if(this.options.height){
			this.effects.height=this.options.fixedHeight?"fullHeight":"scrollHeight";
		}
		for(var B=0,A=this.togglers.length;B<A;B++){
			this.addSection(this.togglers[B],this.elements[B]);
		}
		this.elements.each(function(E,D){
			if(this.options.show===D){
				this.fireEvent("active",[this.togglers[D],E]);
			}else{
				for(var F in this.effects){
					E.setStyle(F,0);
				}
				}
				},this);
if($chk(this.options.display)){
	this.display(this.options.display);
}
},
addSection:function(E,C,G){
	E=$(E);
	C=$(C);
	var F=this.togglers.contains(E);
	var B=this.togglers.length;
	this.togglers.include(E);
	this.elements.include(C);
	if(B&&(!F||G)){
		G=$pick(G,B-1);
		E.inject(this.togglers[G],"before");
		C.inject(E,"after");
	}else{
		if(this.container&&!F){
			E.inject(this.container);
			C.inject(this.container);
		}
	}
	var A=this.togglers.indexOf(E);
E.addEvent("click",this.display.bind(this,A));
if(this.options.height){
	C.setStyles({
		"padding-top":0,
		"border-top":"none",
		"padding-bottom":0,
		"border-bottom":"none"
	});
}
if(this.options.width){
	C.setStyles({
		"padding-left":0,
		"border-left":"none",
		"padding-right":0,
		"border-right":"none"
	});
}
C.fullOpacity=1;
if(this.options.fixedWidth){
	C.fullWidth=this.options.fixedWidth;
}
if(this.options.fixedHeight){
	C.fullHeight=this.options.fixedHeight;
}
C.setStyle("overflow","hidden");
if(!F){
	for(var D in this.effects){
		C.setStyle(D,0);
	}
	}
	return this;
},
display:function(A){
	A=($type(A)=="element")?this.elements.indexOf(A):A;
	if((this.timer&&this.options.wait)||(A===this.previous&&!this.options.alwaysHide)){
		return this;
	}
	this.previous=A;
	var B={};
	
	this.elements.each(function(E,D){
		B[D]={};
		
		var C=(D!=A)||(this.options.alwaysHide&&(E.offsetHeight>0));
		this.fireEvent(C?"background":"active",[this.togglers[D],E]);
		for(var F in this.effects){
			B[D][F]=C?0:E[this.effects[F]];
		}
		},this);
return this.start(B);
}
});
