(function($) {
	
	$.tm = $.tm || {};
	
	$.tm.dock = { 
		conf: {	
			version: '0.0.1',
			compare: true,
			favorites: true,
			recent: true,
			maxCompareItems: 4
		}
	};

	function userDock(el, conf) { 
		
		// private variables
		var self = this, $self = $(this);		
		var compareDockVisible = false, favoritesDockVisible = false, recentDockVisible = false;
		var favoritesPage = false;
		var favoritesPerPage = 6;
		var closeTimeout = false;
		// bind all callbacks from configuration
		$.each(conf, function(name, fn) {
			if ($.isFunction(fn)) { $self.bind(name, fn); }
		});	 
		
		var menu_id = $('#activeFilterContent').attr('rel');
		if (!menu_id) {
			menu_id = $('#productContent').attr('rel');	
		}
		

		
		// private methods
		function setCookie(name,value,days,asArray) {
			
			if (name == "compare") {
				setCookie("compareMenu",menu_id,3650,false);				
			}
			
			if (days) {
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
			}
			else var expires = "";
			
			if (typeof asArray != 'undefined' && asArray) {
				value = value.join('||');	
			}
			
			document.cookie = name+"="+value+expires+"; path=/";
		}
		
		function getCookie(name,asArray) {
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) {
					if (typeof asArray == 'undefined' || !asArray)
						return c.substring(nameEQ.length,c.length);
					var res = c.substring(nameEQ.length,c.length);
					if (!res.length) return [];
					return res.split('||');
				}
			}
			if (typeof asArray == 'undefined' || !asArray)
				return '';
			return [];
		}
		
		function eraseCookie(name) {
			createCookie(name,"",-1);
		}

		
		function addRecent() {
            var recentItems = getCookie("recent",true);
			el.append($('<div class="recentview'+(recentItems.length>1?' active':'')+'"><a href="#"><strong>Recently viewed [<span class="count">'+parseInt(recentItems.length)+'</span>]</strong></a></div><div style="display:none;" class="dockLayer dockRecentLayer"><a href="#" class="closeLayer"></a><div class="layerContent"></div></div>'));					
			el.find(".recentview a").click(onRecentClick);

			
			$('.dockRecentLayer a.closeLayer').live("click",function(e){
				e.preventDefault();																		 
				recentDockVisible = false;
				$(".dockRecentLayer").hide();
				return false;
				
			});				
		}
		
		function onRecentClick(e) {
			e.preventDefault();
            var recentItems = getCookie("recent",true);
			if (recentDockVisible) {
				recentDockVisible = false;
				$(".dockRecentLayer").hide();
				return;
			}
			
			$(".dockRecentLayer .layerContent").load("/userDock/recent",{'items[]': recentItems},function(){
				
																						
			});
			recentDockVisible = true;
			showRecentDock(false);	
		}
		
		function showRecentDock(autoClose) {
			$(".dockLayer").hide();
			$(".dockRecentLayer").show();
			recentDockVisible = true;
			favoritesDockVisible = false;
			compareDockVisible = false;
			if (autoClose) {
				if (closeTimeout) clearTimeout(closeTimeout);
				closeTimeout = setTimeout(function(){
					recentDockVisible = false;
					$(".dockRecentLayer").hide();				
				},10000);
				
			}
			
		}		
		
		function addCompare() {
            var compareItems = getCookie("compare",true);
			el.append($('<div class="compareview'+(compareItems.length>1?' active':'')+'"><a href="#"><strong>'+$.i18n._('Compare')+' [<span class="count">'+parseInt(compareItems.length)+'</span>]</strong></a></div><div style="display:none;" class="dockLayer dockCompareLayer"><a href="#" class="closeLayer"></a><div class="layerContent"></div></div><div style="display:none;" class="dockLayer dockCompareResults"><a href="#" class="closeLayer"></a><div class="layerContent"></div></div>'));					
			el.find(".compareview a").click(onCompareClick);
			$('.dockCompareLayer a.removeDockItem').live("click",function(e){

				e.preventDefault();																		 
				var rel = $(this).closest(".dockItem").attr("rel");
				removeFromCompare(rel);														 
			});
			
			$('.dockCompareLayer a.closeLayer').live("click",function(e){
				e.preventDefault();																		 
				compareDockVisible = false;
				$(".dockCompareLayer").hide();
				return false;
				
			});	
			
			$('.dockCompareLayer a.compareNow').live("click",function(e){
                var compareItems = getCookie("compare",true);
				e.preventDefault();																		 
				if (compareItems.length < 2) {
					alert('Select atleast 2 items for compare.');	
					return;
				}
				$('.blinder').show();
				compareDockVisible = false;
				$(".dockCompareLayer").hide();
				$(".dockCompareResults .layerContent").load("/products/compare",{'items[]': compareItems},function(){
					$(".dockCompareResults").show();																		
				});				
				
			});	
			
			$('.dockCompareResults a.closeLayer').live("click",function(e){
				e.preventDefault();																		 
				$(".dockCompareResults").hide();
				$('.blinder').hide();
				return false;
				
			});	
			
		}

		function onCompareClick(e) {
			e.preventDefault();
            var compareItems = getCookie("compare",true);
			if (compareDockVisible) {
				compareDockVisible = false;
				$(".dockCompareLayer").hide();
				return;
			}
			
			$(".dockCompareLayer .layerContent").load("/userDock/compare",{'items[]': compareItems},function(){
				
																						
			});
			compareDockVisible = true;
			showCompareDock(false);	
		}

		function showCompareDock(autoClose) {
			$(".dockFavoritesLayer").hide();
			$(".dockCompareLayer").show();
			compareDockVisible = true;
			favoritesDockVisible = false;
			if (autoClose) {
				if (closeTimeout) clearTimeout(closeTimeout);
				closeTimeout = setTimeout(function(){
					compareDockVisible = false;
					$(".dockCompareLayer").hide();				
				},10000);
				
			}
			
		}
		
		function addToCompare(compareItem) {
			if (getCookie("compareMenu") == menu_id) {
				compareItems = getCookie("compare",true);
			} else {
				compareItems = new Array();	
			}
			var ind = $.inArray(compareItem,compareItems);
			if (ind > -1) {
				compareItems.splice(ind,1);
				el.find(".compareview span.count").html(compareItems.length);
				
				if(compareItems.length>1) {
					el.find('.compareview').addClass("active");
				} else {
					el.find('.compareview').removeClass("active");
				}
				
				setCookie("compare",compareItems,3650,true);
				$(".dockCompareLayer .layerContent").load("/userDock/compare",{'items[]': compareItems});
				return false;
			}
			if (compareItems.length >= conf.maxCompareItems) {
				alert('Maximum products you can compare at a time is '+conf.maxCompareItems);
				return false;
			}
			
			if (!compareDockVisible) {
				if (closeTimeout) clearTimeout(closeTimeout);
				closeTimeout = setTimeout(function(){
					compareDockVisible = false;
					$(".compareview .dockLayer").hide();				
				},10000);			
			}
			compareItems[compareItems.length] = compareItem;
			el.find(".compareview span.count").html(compareItems.length);
				if(compareItems.length>1) {
					el.find('.compareview').addClass("active");
				} else {
					el.find('.compareview').removeClass("active");
				}
			setCookie("compare",compareItems,3650,true);
			$(".dockCompareLayer .layerContent").load("/userDock/compare",{'items[]': compareItems});			
			showCompareDock(true);				
			return true;
		}

		function removeFromCompare(compareItem) {
			if (closeTimeout) clearTimeout(closeTimeout);
            var compareItems = getCookie("compare",true);
			var ind = $.inArray(compareItem,compareItems);
			if (ind > -1) {
				compareItems.splice(ind,1);
				 	el.find(".compareview span.count").html(compareItems.length);
				if(compareItems.length>1) {
					el.find('.compareview').addClass("active");
				} else {
					el.find('.compareview').removeClass("active");
				}
				setCookie("compare",compareItems,3650,true);
				$(".dockCompareLayer .layerContent").load("/userDock/compare",{'items[]': compareItems});
			}
			
			return false;
		}

		function addFavorites() {	
            var favoritesItems = getCookie("favorites",true);

			el.append($('<div class="favorites'+(favoritesItems.length>0?' active':'')+'"><a href="#"><strong>'+$.i18n._('Favorites')+' [<span class="count">'+favoritesItems.length+'</span>]</strong></a></div><div style="display:none;" class="dockLayer dockFavoritesLayer"><a href="#" class="closeLayer"></a><div class="layerContent"></div></div>'));		
			el.find(".favorites a").click(onFavoritesClick);
			
			$('.dockFavoritesLayer a.removeDockItem').live("click",function(e){
				e.preventDefault();																		 
				var rel = $(this).closest(".dockItem").attr("rel");
				removeFromFavorites(rel);														 
			});
			
			$('.dockFavoritesLayer a.closeLayer').live("click",function(e){
				e.preventDefault();																		 
				favoritesDockVisible = false;
				$(".dockFavoritesLayer").hide();
				return false;				
			});	

			$('.dockFavoritesLayer a.pageBack').live("click",function(e){
				e.preventDefault();	
				if (closeTimeout) clearTimeout(closeTimeout);
				if ($(this).hasClass("active")) onFavoritesBack();														 
			});
			
			$('.dockFavoritesLayer a.pageForward').live("click",function(e){
				e.preventDefault();	
				if (closeTimeout) clearTimeout(closeTimeout);
				if ($(this).hasClass("active")) onFavoritesForward();														 
			});
		}
		
		
		
		function onFavoritesClick(e) {
			e.preventDefault();

			if (favoritesDockVisible) {
				favoritesDockVisible = false;
				$(".dockFavoritesLayer").hide();
				return;
			}
            var favoritesItems = getCookie("favorites",true);	
			var pages = Math.ceil(favoritesItems.length/favoritesPerPage);
			if (!favoritesPage) favoritesPage = pages;
			$(".dockFavoritesLayer .layerContent").load("/userDock/favorites",{'items[]': favoritesItems, 'page': favoritesPage},function(){
																		
			});
			favoritesDockVisible = true;
			showFavoritesDock(false);	
			
		}
		
		function onFavoritesBack() {
            var favoritesItems = getCookie("favorites",true);
			var pages = Math.ceil(favoritesItems.length/favoritesPerPage);
			if (!favoritesPage) favoritesPage = pages;
			favoritesPage -= 1;
			if (favoritesPage < 1) favoritesPage = 1;
			$(".dockFavoritesLayer .layerContent").load("/userDock/favorites",{'items[]': favoritesItems, 'page': favoritesPage});			
		}
		
		function onFavoritesForward() {
            var favoritesItems = getCookie("favorites",true);
			var pages = Math.ceil(favoritesItems.length/favoritesPerPage);
			if (!favoritesPage) favoritesPage = 1;
			favoritesPage += 1;
			if (favoritesPage > pages) favoritesPage = pages;
			$(".dockFavoritesLayer .layerContent").load("/userDock/favorites",{'items[]': favoritesItems, 'page': favoritesPage});			
		}
		
		function showFavoritesDock(autoClose) {
			$(".dockCompareLayer").hide();			
			$(".dockFavoritesLayer").show();
			favoritesDockVisible = true;
			compareDockVisible = false;
			if (autoClose) {
				if (closeTimeout) clearTimeout(closeTimeout);
				closeTimeout = setTimeout(function(){
					favoritesDockVisible = false;
					$(".dockFavoritesLayer").hide();				
				},10000);
			}
		}
		
		
		function addToFavorites(favoritesItem) {

			var favoritesItems = getCookie("favorites",true);
			var ind = $.inArray(favoritesItem,favoritesItems);
			if (ind > -1) {
				favoritesItems.splice(ind,1);
				el.find(".favorites span.count").html(favoritesItems.length);
				if(favoritesItems.length>0) {
					el.find('.favorites').addClass("active");
				} else {
					el.find('.favorites').removeClass("active");
				}
				setCookie("favorites",favoritesItems,3650,true);
				var pages = Math.ceil(favoritesItems.length/favoritesPerPage);
				if (!favoritesPage) favoritesPage = pages;
				if (favoritesDockVisible) $(".dockFavoritesLayer .layerContent").load("/userDock/favorites",{'items[]': favoritesItems, 'page': favoritesPage });
				return false;
			}

			if (!favoritesDockVisible) {
				if (closeTimeout) clearTimeout(closeTimeout);
				closeTimeout = setTimeout(function(){
					favoritesDockVisible = false;
					$(".dockFavoritesLayer").hide();				
				},10000);			
			}

			favoritesItems[favoritesItems.length] = favoritesItem;
			var pages = Math.ceil(favoritesItems.length/favoritesPerPage);
			favoritesPage = pages;
			el.find(".favorites span.count").html(favoritesItems.length);
				if(favoritesItems.length>0) {
					el.find('.favorites').addClass("active");
				} else {
					el.find('.favorites').removeClass("active");
				}
			setCookie("favorites",favoritesItems,3650,true);
			$(".dockFavoritesLayer .layerContent").load("/userDock/favorites",{'items[]': favoritesItems, 'page': favoritesPage });			
			showFavoritesDock(true);	

			
			return true;
		}

		function removeFromFavorites(favoritesItem) {
			if (closeTimeout) clearTimeout(closeTimeout);
			$('#activeFilterContent div.item[rel='+favoritesItem+'] a.favorites').removeClass("active");
            var favoritesItems = getCookie("favorites",true);
			var ind = $.inArray(favoritesItem,favoritesItems);
			if (ind > -1) {
				favoritesItems.splice(ind,1);
				el.find(".favorites span.count").html(favoritesItems.length);
				if(favoritesItems.length>0) {
					el.find('.favorites').addClass("active");
				} else {
					el.find('.favorites').removeClass("active");
				}
				setCookie("favorites",favoritesItems,3650,true);
				$(".dockFavoritesLayer .layerContent").load("/userDock/favorites",{'items[]': favoritesItems,'page': favoritesPage});
			}
			
			return false;
		}

		//init 
		if (conf.favorites) addFavorites();		
		if (conf.compare) addCompare();
//		if (conf.recent) addRecent();
		
		// public methods
		$.extend(this, {		
			addFavorites: function() {
				if (!conf.favorites) addFavorites();
				conf.favorites = true;
			},
			addToFavorites: addToFavorites,
			addToCompare: addToCompare,
			addCompare: function() {
				if (!conf.compare) addCompare();
				conf.compare = true;
			}
		});
			
	}
	
	$.fn.userDock = function(conf) {
		
		var el = this.eq(typeof conf == 'number' ? conf : 0).data("dock");
		if (el) { return el; }
				
		var defaults = $.extend({}, $.tm.dock.conf);
		conf = $.extend(defaults, conf);		

		// construct exposes
		this.each(function() {
			el = new userDock($(this), conf);
			$(this).data("dock", el);	 
		});		
		
		return el;		
	};		
	
})(jQuery);





$(document).ready(function() {
	$('#user_dock').userDock();
});
