var carousel={
	size_small:[125,84],
	size_full:[163,111],
	delay:0.3,
	delta_default:-2,
	
	element:null,
	list:null,
	//overlay:null,
	row_length:0,
	delta_target:0,
	delta:0,
	focus:null,
	active:false,
	active_delay:0,
	
	ie_version:null,
	
	init:function(){
		if(this.ie_version=navigator.userAgent.match(/MSIE (\d+)/))
			this.ie_version=parseInt(this.ie_version[1]);
			
		if(navigator.userAgent.match(/blackberry/i)){
			//blackberry
			
			items=$$('#carousel > ul > li').each(function(element){
				element.observe('click',function(event){
					var content=element.select('.content');
					content=content&&content.length?content[0].innerHTML:'';
					
					var images=element.select('.images > a');
					if(images&&images.length){
						content+='<div class="images">';
						for(var I=0;I<images.length;I++)
							if(images[I].href.match(/\.(jpg|jpeg|gif|png)$/))
								content+='<a href="'+images[I].href+'" target="_blank"><img src="/th.ashx?filename='+escape(images[I].href)+'&amp;width=180&amp;height=105" /></a>';
						content+='</div>';
					}
					
					if(content){				
						$$('div.elContent')[0].update('<a name="content"></a>'+content);
						$$('div.elContent')[1].update('');
						try{Cufon.replace('.elContent h1');}catch(err){}
					}else{
						event.stop();
						return false;
					}
				});
			});
			items=$$('#carousel > ul > li > a').each(function(element){element.href='#content';});
			return;
		}else{
			var self=this;
			this.delta_target=this.delta=this.delta_default;
			this.element=$('carousel');
			this.list=this.element.select('ul')[0];
			//this.overlay=this.element.select('.overlay')[0];
			var items=$$('#carousel > ul > li');
			
			this.element.onselectstart=function(){return false;}

			var element=$('carousel_outer');
			{
				element.observe('mouseover',function(event,element){
					this.delta_target=event.pointerX()<element.getWidth()/2?+10:-10;
				}.bindAsEventListener(self,element));
				element.observe('mouseout',function(event,element){
					this.delta_target=this.delta_default;
				}.bindAsEventListener(self,element));
			}
			var element=this.element;
			{
				element.observe('mouseover',function(event,element){
					this.delta_target=this.delta_default;
					event.stop();
				}.bindAsEventListener(self,element));
				element.observe('mouseout',function(event,element){
					this.delta_target=this.delta_default;
					event.stop();
				}.bindAsEventListener(self,element));
			}
			this.element.select('.overlay_right').each(function(element){
				element.observe('mouseover',function(event,element){
					this.delta_target=-10;
					event.stop();
				}.bindAsEventListener(self,element));
				element.observe('mouseout',function(event,element){
					this.delta_target=this.delta_default;
				}.bindAsEventListener(self,element));
			});
			this.element.select('.overlay_left').each(function(element){
				element.observe('mouseover',function(event,element){
					this.delta_target=+10;
					this.event_unhover();
					event.stop();
				}.bindAsEventListener(self,element));
				element.observe('mouseout',function(event,element){
					this.delta_target=this.delta_default;
				}.bindAsEventListener(self,element));
			});
			this.element.select('.overlay_right').each(function(element){
				element.observe('mouseover',function(event,element){
					this.delta_target=-10;
					this.event_unhover();
					event.stop();
				}.bindAsEventListener(self,element));
				element.observe('mouseout',function(event,element){
					this.delta_target=this.delta_default;
				}.bindAsEventListener(self,element));
			});
			
			var count=items.length<24?24:Math.ceil(items.length/3)*3;
			while(items.length<count){
				items.each(function(element){
					self.list.insert('<li>'+element.innerHTML+'</li>');
					items=$$('#carousel > ul > li');
					if(items.length>=count)throw $break;
				});
			}
			
			this.row_length=count/3;
			var row=['','',''];
			for(var I=0;I<this.row_length;I++){
				row[0]+='<li>'+items[I+this.row_length*0].innerHTML+'</li>';
				row[1]+='<li>'+items[I+this.row_length*1].innerHTML+'</li>';
				row[2]+='<li>'+items[I+this.row_length*2].innerHTML+'</li>';
			}
			
			items[this.row_length*3-1].insert({after:row[2].replace(/\bshadowbox\[([^\]]*)\]/g,'shadowbox[$1_2]')});
			items[this.row_length*2-1].insert({after:row[1].replace(/\bshadowbox\[([^\]]*)\]/g,'shadowbox[$1_2]')});
			items[this.row_length*1-1].insert({after:row[0].replace(/\bshadowbox\[([^\]]*)\]/g,'shadowbox[$1_2]')});
			/*items[this.row_length*3-1].insert({after:row[2]});
			items[this.row_length*2-1].insert({after:row[1]});
			items[this.row_length*1-1].insert({after:row[0]});*/
			
			this.list.style.width=(this.row_length*2)*126+'px';
			
			items=$$('#carousel > ul > li');
			items.each(function(element){
				element.observe('mouseover',function(event,element){
					this.event_hover(element);
					event.stop();
				}.bindAsEventListener(self,element));
				element.observe('mouseout',function(event,element){
					event.stop();

					for(var I=0;I<element.childElements().length;I++)
						if(Position.within(element.childElements()[I],event.pointerX(),event.pointerY()))
							return;

					this.event_unhover();
				}.bindAsEventListener(self,element));
				element.observe('mousedown',function(event,element){
					this.event_open(element);
				}.bindAsEventListener(self,element));
				
				var object=element.select('a');
				if(object)with(object[0]){
					var position=positionedOffset();
					store('position.left',position.left);
					store('position.top',position.top);
				}
			});

			/*this.overlay.observe('mousedown',function(event){
				this.element_unlock();
			}.bindAsEventListener(self));*/

			new PeriodicalExecuter(this.update.bindAsEventListener(this),1/25);
		}
	},
	
	event_hover:function(element){if(this.focus!=element){
		this.element_off();
		this.focus=element;
		window.clearTimeout(this.active_delay);
		this.active_delay=0;
		this.active_delay=this.element_on.bindAsEventListener(this).delay(this.delay);
	}},
	event_unhover:function(){
		{
			this.element_off();
			this.focus=null;
		}
	},
	
	event_open:function(element){
		if(element)
			this.focus=element;
		else
			element=this.focus;

		if(this.active){
			if(this.active_delay){
				window.clearTimeout(this.active_delay);
				this.active_delay=0;
				this.element_on();
			}
			var content=element.select('.content');
			if(content&&content.length){
				content=content[0].innerHTML;
				
				$$('div.elContent')[0].update('<a name="content"></a>'+content);
				$$('div.elContent')[1].update('');
				try{Cufon.replace('.elContent h1');}catch(err){}
				var links=$$('div.elContent a');
				if(links.length)Shadowbox.setup(links);
			}
		}else
			this.element_on();
	},
	
	element_on:function(){
		this.element_off();
		
		var element=this.focus;
		
		window.clearTimeout(this.active_delay);
		this.active_delay=0;

		if(element){
			var image;if(image=element.select('img')){
				image[0].src=image[0].src.replace(/\.inactive\./,'.active.');
				this.element_image_size(image[0],this.size_full[0],this.size_full[1],true);
				image[0].style.zIndex=1;
			};
			element.addClassName('active');
			this.element.addClassName('active');
			//this.overlay.setStyle({display:'block'});
			this.active=true;
			this.delta=this.delta_target=0;
		}
	},
	element_off:function(){
		var element=this.focus;
		
		if(element&&this.active){
			var image;if(image=element.select('img')){
				image[0].src=image[0].src.replace(/\.active\./,'.inactive.');
				this.element_image_size(image[0],this.size_small[0],this.size_small[1],false);
				image[0].style.zIndex=0;
			};
			element.removeClassName('active');
			this.element.removeClassName('active');
			//this.overlay.setStyle({display:'none'});
			this.active=false;
			this.delta_target=this.delta_default;
		}
	},

	update:function(){
		this.delta+=(this.delta_target-this.delta)*0.1;
		var x=parseInt(this.list.style.left);if(!x)x=0;
		var width=this.row_length*126;
		
		if(Math.abs(this.delta)>0.5)
			x+=this.delta;
		
		if(x>0)
			x-=width;
		else if(x<-width)
			x+=width;
			
		this.list.style.left=x+'px';
	},
	
	element_image_size:function(image,width_set,height_set,active){
		var object=image.up();
		
		var animation=image.retrieve('animation');
		if(animation){
			image.store('animation',null);
			window.clearTimeout(animation);
		}
		var size=image.getDimensions();
		var width=width_set;
		var height=height_set;
		var height_extra=active?25:0;
		var delta=[width_set-size.width,height_set-size.height];
		
		var animate=false;
		
		if(Math.abs(delta[1])>2){
			//console.log("height is currently "+size.height+" requiring delta of "+delta[1]+" to reach "+height_set);
			height=size.height+(delta[1]>0?delta[1]/3*2:delta[1]/4*3);
			//console.log("ease height by "+(delta[1]>0?delta[1]/3*2:delta[1]/4*3)+" of "+delta[1]+" giving "+height);
		}else
			height=height_set;
		
		if(Math.abs(delta[0])>2){
			width=size.width+(delta[0]>0?delta[0]/3*2:delta[0]/4*3);
		}else{
			width=width_set;
		}

		if(width==this.size_small[0]&&height==this.size_small[1]){
			object.style.position='';
			object.style.width='';
			object.style.height='';
			image.style.position='';
			image.style.width='';
			image.style.height='';
		}else{
			var parent=object.up();
			var position={left:object.retrieve('position.left'),top:object.retrieve('position.top')};
			var top=parent.positionedOffset().top+size.height+height_extra>=255?84-height_extra-height:parent.positionedOffset().top>1?-(height-84)/2:0;
			var left=-(width-125)/2;
			if(this.ie_version&&this.ie_version<=8)top++;
			
			object.style.position='absolute';
			object.style.top=position.top+top+'px';
			object.style.left=position.left+left+'px';
			object.style.width=width+'px';
			object.style.height=height+height_extra+'px';
			
			image.style.width=width+'px';
			image.style.height=height+'px';
		}
		
		if(width!=width_set||height!=height_set)
			image.store('animation',this.element_image_size.bind(this,image,width_set,height_set,active).delay(1/25));
	}
};