/*
 * .tabSwitch
 * Version: 1.0
 * http://www.hieu.co.uk/blog/index.php/tabswitch/
 *
 * Copyright (c) 2009 Hieu Pham - http://www.hieu.co.uk
 * COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
 * http://www.opensource.org/licenses/cddl1.php
 *
 * Date: 14/04/2009
 */
(function($){
	$.fn.tabSwitch=function(command,Arguements,EndFunction){
		var defaults={
			type:"slide",
			cols:2,
			toggle:"fade",
			ease:40,
			easeType:"linear",
			loopback:1,
			width:400,
			height:400,
			index:0,
			speed:500,
			interval:5000,
			step:1,
			wrapperClass:"",
			viewportClass:""
		};

		var Args=$.extend(defaults,Arguements);
		var Obj=this;
		var jFirstObj=Obj.eq(1);
		var DOMFirstObj=Obj.eq(1).get(0);
		if(!$.isFunction(EndFunction)){
			var Callback=function(){
				$.data(DOMFirstObj,"index",Args.index)
				}
			}else{
		var Callback=function(){
			$.data(DOMFirstObj,"index",Args.index);
			EndFunction()
			}
		}
	StoreToCache=function(){
	$.data(DOMFirstObj,"type",Args.type);
	$.data(DOMFirstObj,"toggle",Args.toggle);
	$.data(DOMFirstObj,"cols",Args.cols);
	$.data(DOMFirstObj,"ease",Args.ease);
	$.data(DOMFirstObj,"easeType",Args.easeType);
	$.data(DOMFirstObj,"index",Args.index);
	$.data(DOMFirstObj,"loopback",Args.loopback);
	if(jFirstObj.attr("style")){
		$.data(DOMFirstObj,"orgAttr",jFirstObj.attr("style"))
		}else{
		$.data(DOMFirstObj,"orgAttr","")
		}
	};

backFromCache=function(){
	Obj.attr("style",$.data(DOMFirstObj,"orgAttr"));
	var ViewPortObj=$("#ViewPort"+$.data(DOMFirstObj));
	ViewPortObj.replaceWith(Obj);
	stopAuto();
	$.removeData(DOMFirstObj)
	};

var createTab=function(){
	StoreToCache();
	if(Args.width){
		Obj.width(Args.width)
		}
		if(Args.height){
		Obj.height(Args.height)
		}
		var WraperSelector="WideDiv"+$.data(DOMFirstObj, "index");
	Obj.wrapAll("<div id='"+WraperSelector+"'></div>");
	var WraperObj=$("#"+WraperSelector);
	WraperObj.addClass(Args.wraperClass);
	WraperObj.css({
		position:"relative"
	});
	WraperObj.wrap("<div id='"+WraperSelector.replace("WideDiv","ViewPort")+"'></div>");
	var ViewPortObj=$("#"+WraperSelector.replace("WideDiv","ViewPort"));
	ViewPortObj.width(Args.width);
	ViewPortObj.height(Args.height);
	ViewPortObj.css({
		display:"block",
		overflow:"hidden",
		position:"relative"
	});
	ViewPortObj.addClass(Args.viewportClass);
	switch(Args.type){
		case"slide":
			Obj.css({
			"float":"left"
		});
		WraperObj.width((Args.width+2)*Obj.length);
			break;
		case"scroll":
			WraperObj.width(Args.width);
			WraperObj.height((Args.height+2)*Obj.length);
			break;
		case"toggle":
			WraperObj.width(Args.width);
			WraperObj.height(Args.height);
			Obj.css({
			position:"absolute",
			left:"-999px"
		});
		Obj.eq(Args.index).css({
			left:"0px",
			top:"0px"
		});
		Obj.eq(Args.index).css("opacity",1);
			break;
		case"table":
			WraperObj.width(Args.width*Args.cols);
			Obj.css("float","left")
			}
			moveTo()
	};

var moveTo=function(){
	var ease=0;
	if(!Args.easeType){
		Args.easeType=(DOMFirstObj,"easeType")
		}
		if(Args.index>Obj.length-1){
		if($.data(DOMFirstObj,"loopback")!=0){
			Args.index=0;
			ease=-$.data(DOMFirstObj,"ease")
			}else{
			return
		}
	}
	if(Args.index<0){
	if($.data(DOMFirstObj,"loopback")!=0){
		Args.index=Obj.length-1;
		ease=$.data(DOMFirstObj,"ease")
		}else{
		return
	}
}
var WraperSelector="WideDiv0";
var WraperObj=$("#"+WraperSelector);
switch($.data(DOMFirstObj,"type")){
	case"slide":
		if(ease!=0){
		var easeLevel=(parseInt(WraperObj.css("left").replace("px",""))+ease);
		WraperObj.animate({
			left:easeLevel+"px"
			},Args.speed,function(){
			WraperObj.animate({
				left:-(Obj.outerWidth(true)*Args.index)+"px"
				},Args.speed,Args.easeType,Callback())
			})
		}else{
		WraperObj.animate({
			left:-(Obj.outerWidth(true)*Args.index)+"px"
			},Args.speed,Args.easeType,Callback())
		}
		break;
	case"scroll":
		if(ease!=0){
		var easeLevel=(parseInt(WraperObj.css("top").replace("px",""))+ease);
		WraperObj.animate({
			top:easeLevel+"px"
			},Args.speed,function(){
			WraperObj.animate({
				top:-(Obj.outerHeight(true)*Args.index)+"px"
				},Args.speed,Args.easeType,Callback())
			})
		}else{
		WraperObj.animate({
			top:-(Obj.outerHeight(true)*Args.index)+"px"
			},Args.speed,Args.easeType,Callback())
		}
		break;
	case"toggle":
		Obj.eq(Args.index).css({
		left:"0px",
		top:"0px"
	});
	switch($.data(DOMFirstObj,"toggle")){
		case"fade":
			Obj.eq(Args.index).css({
			opacity:0
		});
		Obj.eq(Args.index).animate({
			opacity:1
		},Args.speed);
		if($.data(DOMFirstObj,"index")!=Args.index){
			Obj.eq($.data(DOMFirstObj,"index")).animate({
				opacity:0
			},Args.speed,function(){
				$(this).css("left",-999);
				Callback()
				})
			}
			break;
		case"toggle":
			if($.data(DOMFirstObj,"index")!=Args.index){
			Obj.eq(Args.index).css({
				display:"none"
			});
			Obj.eq($.data(DOMFirstObj,"index")).slideUp(Args.speed,function(){
				Obj.eq(Args.index).slideDown(Args.speed,function(){
					Callback()
					});
				$(this).css("left",-999)
				})
			}
			break;
		case"show":
			if($.data(DOMFirstObj,"index")!=Args.index){
			Obj.eq(Args.index).css({
				display:"none"
			});
			Obj.eq($.data(DOMFirstObj,"index")).hide(Args.speed,function(){
				Obj.eq(Args.index).show(Args.speed,function(){
					Callback()
					});
				$(this).css("left",-999)
				})
			}
			break;
		case"noeffect":
			if($.data(DOMFirstObj,"index")!=Args.index){
			Obj.eq($.data(DOMFirstObj,"index")).css("left",-999);
			Callback()
			}
			break
		}
		break;
	case"table":
		var cols=$.data(DOMFirstObj,"cols");
		var nextX=-(Args.index%cols)*Obj.width();
		var nextY=-Math.floor(Args.index/cols)*Obj.height();
		WraperObj.animate({
		left:nextX
	},Args.speed,Args.easeType,function(){
		WraperObj.animate({
			top:nextY
		},Args.speed,Args.easeType,Callback())
		});
	break;
	default:
		$("html,body").animate({
		scrollTop:Obj.eq(Args.index).offset().top
		},Args.speed);
	break
	}
	};

moveStep=function(){
	var currentIdx=$.data(DOMFirstObj,"index");
	Args.index=parseInt(currentIdx)+parseInt(Args.step);
	moveTo()
	};

startAuto=function(){
	$.data(DOMFirstObj,"AutoSwitch",setInterval(moveStep,Args.interval))
	};

stopAuto=function(){
	clearInterval($.data(DOMFirstObj,"AutoSwitch"));
	$.removeData(DOMFirstObj,"AutoSwitch")
	};

toggleAuto=function(){
	if(isAuto()){
		stopAuto()
		}else{
		startAuto()
		}
	};

isAuto=function(){
	if($.data(DOMFirstObj,"AutoSwitch")){
		return true
		}else{
		return false
		}
	};

if(!command){
	command=""
	}
	switch(command.toLowerCase()){
	case"index":
		if($.data(DOMFirstObj,"index")){
		return $.data(DOMFirstObj,"index")
		}else{
		return 0
		}
		break;
	case"moveto":
		moveTo();
		break;
	case"movestep":
		moveStep();
		break;
	case"destroy":
		backFromCache();
		break;
	case"create":
		createTab();
		break;
	case"isauto":
		return isAuto();
		break;
	case"toggleauto":
		toggleAuto();
		break;
	case"startauto":
		startAuto();
		break;
	case"stopauto":
		stopAuto();
		break
		}
	}
})(jQuery);
