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, wait, visible) {
	if (isNaN(parseInt(auto))) {
		auto = 0;
	}
	if (isNaN(parseInt(animation))) {
		animation = 1000;
	}
	$(function() {
		var config = {
			wrap:"both",
			scroll: 1,
			visible:visible,
			auto:auto,
			easing: 'easeOutQuad',
			animation:animation,
			initCallback:initCallback,
			itemVisibleInCallback: itemVisibleInCallback,
			itemVisibleOutCallback: itemVisibleOutCallback,
			wait: wait
		}
		if (prev != null) {
			config.buttonPrevHTML = prev;
		}
		if (next != null) {
			config.buttonNextHTML = next;
		}
		$(selectorUL).jcarousel(config);
	});
}
/* ********* CON CONTROLES ************** */
function jCarouselHorizontalConControles(selectorUL, selectorControles, auto, animation, initCallback, itemVisibleInCallback, itemVisibleOutCallback, callbackControles, wait) {
	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, wait);
}
function setControlNumeros(carousel, selectorControles, callback) {
	var $controles = $(selectorControles);
	$controles.addClass("jcarousel-controls");
	$controles.find("a").addClass("jcarousel-control");
	$controles.find("a").bind("click", function() {
		var pos = jQuery.jcarousel.intval(this.innerHTML);
		carousel.scroll(pos);
		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");
        var $buttons = $controles.find("img");
        if ($buttons.length == 0) {
            $buttons = $controles.find("a");
        }
	$buttons.addClass("jcarousel-control");
	$buttons.bind("click", function() {
		var _pos = $controles.find('.jcarousel-control').index(this);
		var pos;
		var index;
		if (_pos >= 0) {
			index = jQuery.jcarousel.intval(_pos);
			pos = index+1;
		}
		else {
			pos = jQuery.jcarousel.intval(this.alt);
			index = pos-1;
		}
		carousel.scroll(pos);
		setearControlSelected(selectorControles, index);
		carousel.stopAuto();
		carousel.startAuto();
		return false;
	});
	if (callback != null) {
		callback();
	}
}
function setearControlSelected(selectorControles, index) {
        $(selectorControles).find(".controlSelected").removeClass("controlSelected");
        $(selectorControles).children().eq(index).addClass("controlSelected");
}
function jCarouselHorizontalControlesYOpacity(selectorUL, selectorControles, auto, animation, opacity, initCallback, itemVisibleInCallback, itemVisibleOutCallback, callbackControles, opacityChangeTimeout) {
	if(!(opacityChangeTimeout > 0)) {
		opacityChangeTimeout = 500;
	}
	var initializeCallback = function() {
		$(selectorControles).hover(function(){
			$(this).animate({opacity:1}, opacityChangeTimeout);
		},function(){
			$(this).animate({opacity:opacity}, opacityChangeTimeout);
		});
		if($.isFunction(initCallback)) {
			initCallback();
		}
	}
	jCarouselHorizontalConControles(selectorUL, selectorControles, auto, animation, initializeCallback, itemVisibleInCallback, itemVisibleOutCallback, callbackControles);
}
function jCarouselHorizontalConControlesYCaption(selectorUL, selectorControles, selectorCaption, auto, animation, animationCaption, initCallback, itemVisibleInCallback, itemVisibleOutCallback, callbackControles, wait) {
	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, function() { carousel.list.trigger("doAnimation"); });
			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, callbackControles, true);
}
function jCarouselHorizontalConControlesYCaptionYFade(selectorUL, selectorControles, selectorCaption, auto, animation, animationCaption, initCallback, fadeTime, callbackControles) {
	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 }, null, callbackControles);
}
function showCaption($caption,timeCaption, callback) {
	var showCallback = function() { 
		var $content = $caption.find(".caption-content");
		$content.fadeIn(timeCaption, function() {
			if (callback != null) {
				callback();	
			}
		});
	}
	$caption.animate({bottom:"0px"},timeCaption, "easeInOutBack", showCallback);
}
function hideCaption($caption, timeCaption, callback) {
	var $content = $caption.find(".caption-content");
	var altura = "-"+$caption.eq(0).height()+"px";
	var hideCallback = function() {
		$caption.animate({"bottom":altura},timeCaption, "easeInOutBack", function() {
			if (callback != null) {
				callback();	
			}
		});
	};
	$content.fadeOut(timeCaption,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 });
}
