var Tooltip = new Class({
	Extends:Fx.Morph,
	options:{duration:10,fps:100,link:"cancel",transition:Fx.Transitions.Sine.easeOut},
	hide:function(a){if(a){a.stop()}return this.start({opacity:0})},
	show:function(a){if(a){a.stop()}return this.start({opacity:1})},
	position:function(a){if($defined(a)){var d=this.link.getPosition();var b=d.y-(a.getPosition().y)-(this.element.getSize().y);var c=(a.getSize().x)-(this.element.getSize().x);this.element.setPosition({x:c,y:b})}return this}
});

Tooltip.Calendardate = new Class({
	Extends:Tooltip,
	options:{showatstart:true},
	initialize:function(c,b){var a=this;this.link=document.id(b);
	this.parent(document.id(c),this.options);this.element.setStyles({display:"",top:"auto"});
	this.link.onmouseover=null;if(this.options.showatstart){this.show()}
	this.link.erase("href").addEvents({mouseenter:function(d){a.show(d)},mouseleave:function(d){a.hide(d)}});
	this.setup()
	},
	setup:function(){
	this.element.getParent('table').addEvent('mouseleave',function(ev){ev.stop();}) // a.set({opacity:0}) : Removed 09/2009, caused JS error on hover.
	}
});

Tooltip.Amenities = new Class({
	Extends:Tooltip.Calendardate,
	options:{showatstart:false},
	initialize:function(tooltip,link){
	var self=this;
	this.parent(tooltip,link);
	},
	setup:function(){
	this.container = this.element.getElement('.tooltip-content');
	this.content = this.link.getParent().getNext().clone();
	this.set({'opacity':0})
	},
	show:function(ev){if(ev){this.container.grab(this.content)}return this.position($("map-results")).parent(ev)},
	hide:function(ev){return this.addEvent('complete',this.swapContent.bindWithEvent(this)).parent(ev)},
	swapContent:function(ev){this.removeEvents('complete').set({'left':'','top':''}).content.dispose().content=this.link.getParent().getNext().clone()},
	position:function(ev){this.parent(ev);this.set({left:this.element.getStyle("left").toInt()+33});return this}
});

Tooltip.Dark = new Class({
	Extends:Tooltip,
	options:{duration:250,fps:15},
	spot_over:false,
	initialize:function(c,b){
	if(!$defined(c)){return}
	this.image=document.id(c);
	this.image.onmouseover=null;
	this.parent(document.id(b),this.options);
	var a=this,
		d = this.image.getCoordinates();
	this.imagemap=$(this.image.get("usemap").substr(1)).getElements("area");
	this.imagemap.each(function(e){
		e.store("title", e.get("title")).store("text", !$defined(e.get("alt")) ? "" : e.get("alt")).erase("title").store('coords', a.calculateAreaCoords(e,d));
		e.addEvents({
			'mouseover':a.show.bindWithEvent(a,e),
			'mouseleave':a.hide.bindWithEvent(a)
		})
	});
	this.element.store("coords",this.element.getCoordinates()).getElement(".tooltip-close");
	this.set({opacity:0,display:""}).container=this.element.getElement(".tooltip-content");
	this.image.addEvent('mouseleave',function(ev){a.set({opacity:0})})
	},
	position:function(el){
		var c=this.element.retrieve("coords");
		var a=el.retrieve("coords");
		this.set({
			left:(a[0]-c.left)-(this.element.getSize().x/2)+3,
			bottom:(c.bottom-a[1])+20
		});
		return this
	},
	show:function(ev,el){
		var self=this;
		(function(){ev.stop()}).attempt();
		this.set({display:''});
		switch(this.element.getStyle('opacity').toInt()){
			case 0:
				this.container.erase("html").adopt(
					new Element("h4",{html:ev.target.retrieve("title")}),
					new Element("p",{html:ev.target.retrieve("text")})
				);
				this.set({
					height:'',
					height:(Browser.Engine.trident&&Browser.Engine.version==4) ? this.element.getSize().y : ''
				});
				break;
			default:
				this.set({opacity:1});
				break;
		}
		return this.position(el).parent(ev)
	},
	hide:function(ev){
		var self=this;
		(function(){ev.stop()}).attempt();
		this.set({display:''});
		return this.set({display:'none',opacity:0,display:''});
	},
	calculateAreaCoords:function(j,h){
		var i=j.coords.split(",").map(function(a){ return a.toInt() });
		if(i.length<=2){return null}
		var f=j.get("shape").toLowerCase();
		switch(f){
			case"circle":
			case"rect":
				return new Array(
					(h.left+(f=="circle"?i[0]:((i[0]+i[2])/2))).round(),
					(h.top+(f=="circle"?i[1]:((i[1]+i[3])/2))).round()
				);
				break;
			case"poly":
				var g=new Array(0,0);
				i.each(function(a,b){ g[b%2?1:0]=g[b%2?1:0]+a });
				return g.map(function(b,a){ return(b/(i.length/2)).round()+(a==0?h.left:h.top) });
				break
		}
	}
});

var homeslider = function(b){var a=new Fx.Slider(b.slider,b.slides,{autoplay:true});b.slidernav=new Element("ul",{id:"slidernav"}).adopt(b.slides.map(function(d,c){return new Element("li",{"class":(c==a.options.show)?"active":""}).adopt(new Element("div",{"class":"sliderbg",morph:{duration:100,transition:Fx.Transitions.Sine.easeOut}}),new Element("a",{"class":"sliderNavLink",text:c+1,href:"javascript\u003a\u003b"}))}));b.slidernav.inject(b.sliderBottom);a.addButton(b.leftBtn,"prev");a.addButton(b.rightBtn,"next");b.slidernav.getElements(".sliderNavLink").each(function(d,e){a.addButton(d,e)})}

Fx.Slider = new Class({
	Extends:Fx.CSS,
	options:{
		duration:1500,
		fps:25,
		link:'cancel',
		show:0, //initial element
		method:'fader', //slider method
		ltr:true, //direction of slides
		autoplay:true, //start automatically
		delay:6000 //delay for autoplay
	},
	prev:new Element("button",{events:{mouseenter:function(a){a.target.setStyle("cursor","pointer")},mouseleave:function(a){a.target.setStyle("cursor","")}}}),
	next:new Element("button",{events:{mouseenter:function(a){a.target.setStyle("cursor","pointer")},mouseleave:function(a){a.target.setStyle("cursor","")}}}),
	timer:null,
	jumplinks:[],
	initialize:function(){
		var self=this;
		var params = Array.link(arguments, {'container':Element.type, 'options':Object.type, 'slides':$defined});
		self.container = document.id(params.container);
		self.container.setStyles({'position':'relative','z-index':self.container.getParent().getStyle('z-index').toInt()+1});
		/* setup slides */
		self.slides = $$(params.slides).map(function(element,i){
			return element.set({'morph':self.options,'styles':{'position':'relative','top':0,'left':0,'z-index':self.container.getStyle('z-index').toInt()+5}}).addClass('fx-slider').store('index',i).store('coords', element.getCoordinates(self.container));
		});
		self.parent(params.options);
		/* set method */
		switch(self.options.method){
			case 'slider':self.method = self.slide;break;
			case 'fader':default:self.method = self.fade;break;
		}
		self.setMotion = function(ev){
			if(ev){ev.stop();ev.target.blur();}
			self.method(this==self.next?true:false);
		}
		self.prev.addEvent('click', self.setMotion);
		self.next.addEvent('click', self.setMotion);
		if(self.options.autoplay){self.timer = (function(){ (self.options.ltr?self.next:self.prev).fireEvent('click'); }).periodical(self.options.delay)}
		return self;
	},
	fade:function(){
		var self=this;
		var params = Array.link(arguments, {'dir':Boolean.type, 'event':Event.type});
		var dir = params.dir;
		self.prev.removeEvent('click', self.setMotion);
		self.next.removeEvent('click', self.setMotion);
		self.timer = $clear(self.timer);
		//fade
		self.slide = dir?self.slides[0]:self.slides.getLast(); //active slide
		self.slides.erase(self.slide); //remove active slide & reset visibility
		self.slide.setStyle('z-index',self.slide.getStyle('z-index').toInt()+1).fade(dir?'show':'hide');
		self.nextslide = self.slides[0]; //next slide
		self.jumplinks.each(function(link){//set jumplinks
			link = link.getParent();
			if(link.hasClass('active')){ link.getElement('.sliderbg').fade('out'); }
			link.removeClass('active');
		});
		var index = (dir?self.slides[0]:self.slide).retrieve('index');
		self.jumplinks[index].getParent().addClass('active');
		self.jumplinks[index].getPrevious('.sliderbg').fade('show');
		self.chain(
			function(){
				self.nextslide.setStyle('position','relative');
				self.slide.inject(self.container, dir?'bottom':'top').set('styles',{
					'z-index':self.slides[0].getStyle('z-index').toInt()
				}).fade('show');
			},
			function(){ //reinsert active slide into slides array
				self.slides = dir?(self.slides.include(self.slide)):([self.slide].combine(self.slides));
			},
			function(){ //if button clicked, reestablish click events
				self.prev.addEvent('click', self.setMotion);
				self.next.addEvent('click', self.setMotion);
				if(self.options.autoplay){
					self.timer = (function(){ (self.options.ltr?self.next:self.prev).fireEvent('click'); }).periodical(self.options.delay);
				}
			}
		);
		self.slide.get('morph').addEvent('start',function(el){ //set next slide to absolute position
			self.nextslide.setStyle('position','absolute');
			el.removeEvents('start');
		}).addEvent('complete',function(el){
			el.removeEvents('complete');
			(self.$chain.length).times(function(){ self.callChain(); }); //run chain series
		});
		self.slide.morph({'opacity':dir?0:1}); //fade out/in
	},
	slide:function(){
		var self=this;
		var params = Array.link(arguments, {'dir':Boolean.type, 'event':Event.type});
		var dir = params.dir;
		self.prev.removeEvent('click', self.setMotion);
		self.next.removeEvent('click', self.setMotion);
		self.timer = $clear(self.timer);
		//slide
		var slide = dir?self.slides[0]:self.slides.getLast();
		self.slides.erase(slide); //remove from slides
		self.jumplinks.each(function(link){//set jumplinks
			link = link.getParent();
			if(link.hasClass('active')){ link.getElement('.sliderbg').fade('out'); }
			link.removeClass('active');
		});
		var index = (dir?self.slides[0]:slide).retrieve('index');
		self.jumplinks[index].getParent().addClass('active');
		self.jumplinks[index].getPrevious('.sliderbg').fade('in');
		self.chain(
			function(){ //move slide to top or bottom of stack and reveal (if hidden)
				slide.setStyles({'width':0,'position':'absolute','margin-left':dir?'':-(slide.retrieve('coords').width)}).inject(self.container, dir?'bottom':'top').setStyles({'width':'','position':'relative'})
			},
			function(){ //reinsert active slide into slides array
				self.slides = dir?(self.slides.include(slide)):([slide].combine(self.slides))
			},
			function(){ //if button clicked, reestablish click events
				self.prev.addEvent('click', self.setMotion);
				self.next.addEvent('click', self.setMotion);
				if(self.options.autoplay){self.timer = (function(){(self.options.ltr?self.next:self.prev).fireEvent('click')}).periodical(self.options.delay)}
			}
		);
		slide.get('morph').addEvent('start',function(el){
		}).addEvent('complete',function(el){
			el.removeEvents('complete');
			if(dir){self.callChain()} //execute first chain inside if moving forward
			el.setStyle('margin-left',''); //clear left margin once slide is complete
			(self.$chain.length).times(function(){ self.callChain(); }); //run rest of chain
		});
		if(!dir){self.callChain()} //execute first chain outside if moving backwards
		slide.morph({'margin-left':dir?-(slide.retrieve('coords').width):0}); //execute morph
	},
	addButton:function(){var a=this;var b=Array.link(arguments,{button:Element.type,link:$defined});b.link=(!isNaN(b.link.toInt()))?b.link.toInt():b.link;b.button.fade("show");(function(){switch($type(b.link)){case"string":default:if(b.link=="next"){a.next=b.button.cloneEvents(a.next)}else{a.prev=b.button.cloneEvents(a.prev)}break;case"number":a.jumplinks.include(b.button);b.button.addEvent("click",function(c){a.jumpTo(b.link,c)});break}}).attempt();return this},
	jumpTo:function(){var c,b=this;var d=Array.link(arguments,{index:Number.type,event:Event.type});var a=(d.index)-b.slides[0].retrieve("index");if(a!=0){(Math.abs(a)).times(function(){(a+Math.abs(a)==0?b.prev:b.next).fireEvent("click")})}return}
});
