function jCarouselVertical(selectorUL, auto, animation, prev, next, initCallback, itemVisibleInCallback, itemVisibleOutCallback, visible) {
	if (isNaN(parseInt(auto))) {
		auto = 0;
	}
	if (isNaN(parseInt(animation))) {
		animation = 1000;
	}
	$(function() {
		$(selectorUL).jcarousel({
			wrap:"both",
			vertical:true,
			buttonNextHTML: next,
			buttonPrevHTML: prev,
			scroll: 1,
			visible:visible,
			auto:auto,
			easing: 'linear',
			animation:animation,
			initCallback:initCallback,
			itemVisibleInCallback: itemVisibleInCallback,
			itemVisibleOutCallback: itemVisibleOutCallback
		});
	});
}
function jCarouselVerticalConControles(selectorUL, selectorControles, auto, animation, initCallback, itemVisibleInCallback, itemVisibleOutCallback, visible, callbackControles) {
	if (callbackControles == null) {
		var callback = function(carousel) {
			setControls(carousel, selectorControles, initCallback);
		};
	}
	else {
		var callback = function(carousel) {
			callbackControles(carousel, selectorControles, initCallback);
		};
	}
	if (itemVisibleInCallback == null) {
		var itemVisibleInCallback = {
			onAfterAnimation: function(carousel, item, i, state, evt) {
				setearControlSelected(selectorControles,i-1);
			}
		};
	}
	jCarouselVertical(selectorUL, auto, animation, null, null, callback, itemVisibleInCallback, itemVisibleOutCallback, visible);
}
function jCarouselHorizontal(selectorUL, auto, animation, prev, next, initCallback, itemVisibleInCallback, itemVisibleOutCallback) {
	if (isNaN(parseInt(auto))) {
		auto = 0;
	}
	if (isNaN(parseInt(animation))) {
		animation = 1000;
	}
	$(function() {
		$(selectorUL).jcarousel({
			wrap:"both",
			buttonNextHTML: next,
			buttonPrevHTML: prev,
			scroll: 1,
			visible:1,
			auto:auto,
			easing: 'linear',
			animation:animation,
			initCallback:initCallback,
			itemVisibleInCallback: itemVisibleInCallback,
			itemVisibleOutCallback: itemVisibleOutCallback
		});
	});
}
/* ********* CON CONTROLES ************** */
function jCarouselHorizontalConControles(selectorUL, selectorControles, auto, animation, initCallback, itemVisibleInCallback, itemVisibleOutCallback, callbackControles) {
	if (callbackControles == null) {
		var callback = function(carousel) {
			setControls(carousel, selectorControles, initCallback);
		};
	}
	else {
		var callback = function(carousel) {
			callbackControles(carousel, selectorControles, initCallback);
		};
	}
	if (itemVisibleInCallback == null) {
		var itemVisibleInCallback = {
			onAfterAnimation: function(carousel, item, i, state, evt) {
				setearControlSelected(selectorControles,i-1);
			}
		};
	}
	jCarouselHorizontal(selectorUL, auto, animation, null, null, callback, itemVisibleInCallback, itemVisibleOutCallback);
}
function setControlNumeros(carousel, selectorControles, callback) {
	var $controles = $(selectorControles);
	$controles.addClass("jcarousel-controls");
	$controles.find("a").addClass("jcarousel-control");
	$controles.find("a").bind("click", function() {
		carousel.scroll(jQuery.jcarousel.intval(this.innerHTML));
		var index = this.innerHTML-1;
		setearControlSelected(selectorControles, index);
		carousel.stopAuto();
		carousel.startAuto();
		return false;
	});
	if (callback != null) {
		callback();
	}
}
function setControls(carousel, selectorControles, callback) {
	var $controles = $(selectorControles);
	$controles.addClass("jcarousel-controls");
	$controles.find("img").addClass("jcarousel-control");
	$controles.find("img").bind("click", function() {
		carousel.scroll(jQuery.jcarousel.intval(this.alt));
		var index = this.alt-1;
		setearControlSelected(selectorControles, index);
		carousel.stopAuto();
		carousel.startAuto();
		return false;
	});
	if (callback != null) {
		callback();
	}
}
function setearControlSelected(selectorControles, index) {
	$(selectorControles).find("li.controlSelected").removeClass("controlSelected");
	$(selectorControles).find("li:not(.separador)").eq(index).addClass("controlSelected");
}
function jCarouselHorizontalConControlesYCaption(selectorUL, selectorControles, selectorCaption, auto, animation, animationCaption, initCallback, itemVisibleInCallback, itemVisibleOutCallback) {
	var callbackIn = {
		onBeforeAnimation: function(carousel, item, i, state, evt) {
			var $caption = $(item).find(selectorCaption);
			$caption.css("bottom","-"+$caption.height());
			if (itemVisibleInCallback != null && itemVisibleInCallback.onBeforeAnimation != null) {
				itemVisibleInCallback.onBeforeAnimation(carousel, item, i, state, evt);
			}
		},
		onAfterAnimation: function(carousel, item, i, state, evt) {
			showCaption($(item).find(selectorCaption).eq(0), animationCaption);
			setearControlSelected(selectorControles,i-1);
			if (itemVisibleInCallback != null && itemVisibleInCallback.onAfterAnimation != null) {
				itemVisibleInCallback.onAfterAnimation(carousel, item, i, state, evt);
			}
		}
	};
	var callbackOut =  {
		onBeforeAnimation: function(carousel, item, i, state, evt) {
			hideCaption($(item).find(selectorCaption).eq(0), animationCaption);
			if (itemVisibleOutCallback != null && itemVisibleOutCallback.onBeforeAnimation != null) {
				itemVisibleOutCallback.onBeforeAnimation(carousel, item, i, state, evt);
			}
		},
		onAfterAnimation: function() { 
			if (itemVisibleOutCallback != null && itemVisibleOutCallback.onAfterAnimation != null) {
				itemVisibleOutCallback.onAfterAnimation(carousel, item, i, state, evt);
			}
		}
	};
	var $captions = $(selectorCaption);
	var altura = "-"+$captions.eq(0).height()+"px";
	$captions.addClass("caption");
	jQuery.each($captions, function(i) { $captions.eq(i).find("div:first").addClass("caption-content"); });
	$captions.css("bottom",altura);
	$captions.find(".caption-content").css("display","none");
	jCarouselHorizontalConControles(selectorUL, selectorControles, auto, animation, initCallback, callbackIn, callbackOut);
}
function jCarouselHorizontalConControlesYCaptionYFade(selectorUL, selectorControles, selectorCaption, auto, animation, animationCaption, initCallback, fadeTime) {
	var aparecer = function(carousel, item, i, state, evt) {
		$(item).find('.image_container img').css("display","none");
		$(item).find('.image_container img').fadeIn(fadeTime);
	}
	jCarouselHorizontalConControlesYCaption(selectorUL, selectorControles, selectorCaption, auto, animation, animationCaption, initCallback, { onBeforeAnimation:aparecer, onAfterAnimation:null });
}
function showCaption($caption,timeCaption) {
	var showCallback = function() { 
		var $content = $caption.find(".caption-content");
		$content.fadeIn(timeCaption/2);
	}
	$caption.animate({bottom:"0px"},timeCaption/2, null, showCallback);
}
function hideCaption($caption, timeCaption) {
	var $content = $caption.find(".caption-content");
	var altura = "-"+$caption.eq(0).height()+"px";
	var hideCallback = function() {
		$caption.animate({"bottom":altura},timeCaption/4);	
	};
	$content.fadeOut(timeCaption/4,hideCallback);
}
/* ********* CON PREV/NEXT ************** */
function jCarouselHorizontalConPrevNext(selectorUL, objPrevNext, auto, animation, initCallback, itemVisibleInCallback, itemVisibleOutCallback) {
	var callback = function(carousel) {};
	jCarouselHorizontal(selectorUL, auto, animation, objPrevNext.prev, objPrevNext.next, callback, itemVisibleInCallback, itemVisibleOutCallback);
}
function jCarouselHorizontalConPrevNextYCaption(selectorUL, objPrevNext, selectorCaption, auto, animation, animationCaption, initCallback, itemVisibleInCallback, itemVisibleOutCallback) {
	var callbackIn = {
		onBeforeAnimation: function(carousel, item, i, state, evt) {
			var $caption = $(item).find(selectorCaption);
			$caption.css("bottom","-"+$caption.height());
			if (itemVisibleInCallback != null && itemVisibleInCallback.onBeforeAnimation != null) {
				itemVisibleInCallback.onBeforeAnimation(carousel, item, i, state, evt);
			}
		},
		onAfterAnimation: function(carousel, item, i, state, evt) {
			showCaption($(item).find(selectorCaption).eq(0), animationCaption);
			if (itemVisibleInCallback != null && itemVisibleInCallback.onAfterAnimation != null) {
				itemVisibleInCallback.onAfterAnimation(carousel, item, i, state, evt);
			}
		}
	};
	var callbackOut =  {
		onBeforeAnimation: function(carousel, item, i, state, evt) {
			hideCaption($(item).find(selectorCaption).eq(0), animationCaption);
			if (itemVisibleOutCallback != null && itemVisibleOutCallback.onBeforeAnimation != null) {
				itemVisibleOutCallback.onBeforeAnimation(carousel, item, i, state, evt);
			}
		},
		onAfterAnimation: function() { 
			if (itemVisibleOutCallback != null && itemVisibleOutCallback.onAfterAnimation != null) {
				itemVisibleOutCallback.onAfterAnimation(carousel, item, i, state, evt);
			}
		}
	};
	var $captions = $(selectorCaption);
	var altura = "-"+$captions.eq(0).height()+"px";
	$captions.addClass("caption");
	jQuery.each($captions, function(i) { $captions.eq(i).find("div:first").addClass("caption-content"); });
	$captions.css("bottom",altura);
	$captions.find(".caption-content").css("display","none");
	jCarouselHorizontalConPrevNext(selectorUL, objPrevNext, auto, animation, initCallback, callbackIn, callbackOut);
}
function jCarouselHorizontalConPrevNextYCaptionYFade(selectorUL, objPrevNext, selectorCaption, auto, animation, animationCaption, initCallback, fadeTime) {
	var aparecer = function(carousel, item, i, state, evt) {
		$(item).find('.image_container img').css("display","none");
		$(item).find('.image_container img').fadeIn(fadeTime);
	}
	jCarouselHorizontalConPrevNextYCaption(selectorUL, objPrevNext, selectorCaption, auto, animation, animationCaption, initCallback, { onBeforeAnimation:aparecer, onAfterAnimation:null });
}
