/**
 *	Icon list - V1.00.080812 for jQuery
 *	---------------------------------------------
 *	(c) 2008 Lost Boys - http://www.lostboys.com
 *
 *	requires
 *		- jquery
 *		- jquery.lb.utils.js
 */

(function($){

	var STATE_COLD		= 1,
	STATE_HOT		= 2;


	var IconList = Class.extend(
		// super class
		$.SimpleMenu, 
		
		// constructor
		function(element, set) {
			this.itemType = 'dt';
			this.menuType = 'dd';
			this.scrollOffset = 0;



			this.initInterface();
		}, {
			
		initInterface:function() {
			var w = document.documentElement.scrollWidth || document.body.scrollWidth;
			
			this.items = $(this.itemType, this.root);
			
			for (var left, i=0; i<this.items.length; i++) {

				left = (i*95);
				if(left > (w-150)) left = -3000;
				/*
				$(this.items[i]).css({
					position:'absolute', 
					left: left + 'px', 
					top:0
				})
				*/
				startpos = 1800 + left;
				$(this.items[i]).css({
					position:'absolute', 
					left: startpos + 'px', 
					top:0,
					opacity: 0
				})
				$(this.items[i]).queue(function () {
					$(this).animate({opacity: 100},1).animate({left:left},2500);	
				});
			}

			$(this.items).dequeue();

			this.scrollLeft = $(this.root).append('<a href="#" class="scrollLeft">left</a>');
			this.scrollRight = $(this.root).append('<a href="#" class="scrollRight">right</a>');


			var self = this;
			$('a.scrollLeft, a.scrollRight', this.root).click(
				function(){ self.handleScroll(this);}
				
			)

			$(this.root).append('<div class="description"></div>');
			this.description = $('div.description', this.root);
			
		},

		handleScroll:function(link, toggle) {
			this.toggle(false);
			var mode = /left/i.test(link.className)? -1 : 1;
			var scrollAmount = 1;
			var w = document.documentElement.scrollWidth || document.body.scrollWidth;

			for (maxitems =0; maxitems < this.items.length; maxitems ++) {
				if ((maxitems*95) > (w-150)) break;
			}
			
			if (this.items.length > maxitems) { 
				if ((this.items.length/2) > maxitems) {
					scrollAmount = maxitems;
				} else {
					scrollAmount = this.items.length - maxitems;
				}
			} 

				this.scrollItems(mode, scrollAmount, maxitems, w );

		},

		scrollItems:function(direction, scrollAmount,maxitems, w ) {
			var l = this.items.length;
			var scrolldelay = 250;
			var halfscrolldelay = (scrolldelay / 2)-5;
			//var shortscrolldelay = scrolldelay - 50;		
			var rigthoverflow = (w + 95);
			var rigthappear = (maxitems * 95);
			var leftoverflow = -95;
			var k, thisleft;				
			var left = new Array();
			for (var i=0; i<this.items.length; i++) {
				left[i] = (i * 95);
			}
			
			for (t=0;t < scrollAmount; t++) {

				this.scrollOffset = (this.scrollOffset + direction)%l;
				//this.scrollOffset = (this.scrollOffset + direction)%l * 4;


				for (var i=0, j; i<this.items.length; i++) {
					thisleft = left[i];
					//if(thisleft > (w-150)) thisleft = -1000;
					j = (i + this.scrollOffset + l)%l;
					k = i + 1;
					if (direction == 1) {
						if (i == l) {
							$(this.items[j]).animate({left: leftoverflow, opacity: 0},scrolldelay );
						} 
						else if (k > maxitems  ) {
							$(this.items[j]).animate({left: leftoverflow},scrolldelay );
						}
						else if  (k == maxitems){
							$(this.items[j]).animate({left: rigthappear, opacity: 0},halfscrolldelay).animate({opacity: 100,left: thisleft},halfscrolldelay );
						}
						else{					
							$(this.items[j]).animate({left: thisleft},scrolldelay);
						}
					} else {
						if (i == maxitems  ) {
							$(this.items[j]).animate({left: rigthoverflow,opacity: 0},scrolldelay).animate({left: leftoverflow},1);
						}
						else if (i == 0 ){
							$(this.items[j]).animate({left: leftoverflow,opacity: 100},scrolldelay ).animate({left: thisleft},1 );
						}
						else if (i > (maxitems -1) ){
							$(this.items[j]).animate({left: leftoverflow},scrolldelay );
						}
						else {
							$(this.items[j]).animate({left: thisleft},scrolldelay);
						}
					}
				}
				
			}

		},

		// prototype
		toggleMenu:function(item, toggle) {
			var menu = $(item).next();
			var left = (item.offsetLeft + item.offsetWidth/2 + 21) ;
			var bot = (this.root.offsetHeight - 25)+ 'px';
			var overlay = $('.overlay');
			
			if (left < 140) {
				$(this.description).addClass("firstdesc");
			} 
			else 
			{
				$(this.description).removeClass("firstdesc");
			}

			var w = document.documentElement.scrollWidth || document.body.scrollWidth;			

			if (left + 140 > w) {
				$(this.description).addClass("lastdesc");
			} else {
				$(this.description).removeClass("lastdesc");
			}
			
			if (left + 140 > w) {
				left = Math.max(w-70-(w - left))+ 'px';
			}
			else {
				left = Math.max(Math.min(left, w-140), 140)+ 'px';
			}
			
			
			this.description.html($(menu).html());
			this.description.css({left:left, bottom:bot});
			
			switch(this.state) {
				case STATE_HOT:
					this.description[toggle? 'show':'hide']();
				break;
				default:
					this.description[toggle? 'fadeIn':'fadeOut']();
			}
			
			//if(toggle && this.item) { overlay.nonIEfadeIn(); }
			//if(!toggle && !this.item) { overlay.nonIEfadeOut(); }
			
			if(toggle && this.item) { 
				        OverlayManager.toggle(this.root, true, 11);
			}
			
			if(!toggle && !this.item) { 
				        OverlayManager.toggle(this.root, false);				
			}
			
		},

		// default SimpleMenu class is nested-based, 
		// IconList is sibling based using a definition list
		toggle: function(item) {
			var items = this.root.getElementsByTagName(this.itemType);
			for(var node,i=0; node=items[i++];)
				this.toggleMenu(node, false);

			item && this.toggleMenu(item, true);
			this.state = item? STATE_HOT : STATE_COLD;
		}
	});

	$.registerPlugin('iconList', IconList);

})(jQuery);
