;(function($){

$.fn.slider2 = function(options) {
	
	var defaults = {
		sliderID:			"sldr0",
		showColumns:		1,
		columnsPerSlide:	1,
		totalItems:			1,
		itemsPerColumn:		1,
		sliderContainer:	"div[rel=sldr2_slider]",
		columnDiv:			"div[rel=sldr2_column]",
		btnPrev:			"[rel=sldr2_prev]",
		btnNext:			"[rel=sldr2_next]",
		infoContainer:		"[rel=sldr2_info]",
		contentURL:			"",
		slideDuration:		200,
		onColumnAdd:		null,
		onError:			"onError",
		autoLoad:			false,
		loadingImage:		"loading.gif"
	};

	var options = $.extend(defaults, options);

	return this.each(function() {
		
		var $viewport		= $(this);
		var $slider			= $(options.sliderContainer, $viewport);
		var $btnPrev		= $(options.btnPrev+"[slider='"+options.sliderID+"']");
		var $btnNext		= $(options.btnNext+"[slider='"+options.sliderID+"']");
		var $infoContainer	= $(options.infoContainer+"[slider='"+options.sliderID+"']");
		
		var curSlidePos		= 0;
		var curPage			= 1;
		var preventClick	= false;
		var from 			= 0;
		var limit			= options.columnsPerSlide * options.itemsPerColumn;
		var columnHeight	= $(options.columnDiv, $slider).outerHeight({margin:true});
		var totalColumns	= options.totalItems > (options.showColumns*options.itemsPerColumn) ? (Math.ceil(options.totalItems/options.itemsPerColumn.toFixed(2))-options.showColumns)+1 : 1;

		$slider.getColumnCount = function() {
			return this.find(options.columnDiv).size();
		};

		$btnPrev.click(function() { slidePrev(); });
		$btnNext.click(function() { slideNext(); });
		
		showHideNav();
		setInfo();
		
		// PUBLIC FUNCTIONS
		
		$viewport.reset = function() {
			$btnPrev.unbind();
			$btnNext.unbind();
			$btnPrev.hide();
			$btnNext.hide();
			$slider.css('top','0px');
			$infoContainer.html("&nbsp;");
		}
		
		$viewport.updateInfo = function(action) {
			
			if(action == 'delete'){
				options.totalItems--;
			} else if(action == 'add'){
				options.totalItems++;
			}
			
			$viewport.refresh();
		}
		
		$viewport.refresh = function() {
			
			from = 0;
			curSlidePos = 0;
			curPage = 1;
			
			totalColumns	= options.totalItems > (options.showColumns*options.itemsPerColumn) ? (Math.ceil(options.totalItems/options.itemsPerColumn.toFixed(2))-options.showColumns)+1 : 1;
			
			showHideNav();
			setInfo();
			
			$slider.empty();
			$slider.css('top','0px');
			var posWidth = ($viewport.width()/2)-16;
			
			this.append('<img src="/site/'+ys_site+'/design/graphics/'+options.loadingImage+'" id="sldr2_img_loading" style="margin-top:' + posWidth + 'px;" />');
			limit = (options.showColumns * options.itemsPerColumn) + (options.itemsPerColumn * options.columnsPerSlide);
			addColumns("top");
		}
		
		$viewport.deleteItem = function(nItemID) {
			$.ajax({
				type: "POST",
				dataType: "json",
				url: options.contentURL,
				data: "action=delete&itemID="+nItemID,
				cache: false,
				success: function(json) {
					if ( json.status == "ERROR" ) {
						if ( options.onError != null )
							eval(options.onError+"('"+json.msg+"')");
					} else if ( json.status == "OK" ) {
						$viewport.updateInfo('delete');
					}
				},
				error: function(oRequest, sErrType) {
					if ( options.onError != null )
						eval(options.onError+"('Er is een onbekende fout opgetreden')");
				}
			});
		}
		
		if ( options.autoLoad ) $viewport.refresh();
		
		// PRIVATE FUNCTIONS
		
		function slidePrev() {
			if ( !preventClick && curPage > 1 ) {
				preventClick	= true;
				curSlidePos 	+= columnHeight;
				curPage 		-= 1;
				from 			= (options.itemsPerColumn * options.columnsPerSlide) * (curPage-2);
				$slider.animate({top: curSlidePos+"px"}, options.slideDuration, function() {
					if ( curPage > 1 ) {
						limit = options.itemsPerColumn;
						addColumns("top");
					} else if ( $slider.getColumnCount() > (options.showColumns+1) ) {
						removeColumns("bottom");
					} else {
						preventClick = false;
					}
				});
				showHideNav();
				setInfo();
			}
		}

		function slideNext() {
			if ( !preventClick && curPage < totalColumns ) {
				preventClick 	= true;
				curSlidePos 	-= columnHeight;
				curPage 		+= 1;
				from 			= (options.showColumns*options.itemsPerColumn) + ((curPage-1) * options.itemsPerColumn * options.columnsPerSlide);
				$slider.animate({top: curSlidePos+"px"}, options.slideDuration, function() {
					if ( curPage < totalColumns ) {
						limit = options.itemsPerColumn;
						addColumns("bottom");
					} else if ( $slider.getColumnCount() > (options.showColumns+1) ) {
						removeColumns("top");
					} else {
						preventClick = false;
					}
				});
				showHideNav();
				setInfo();
			}
		}

		function addColumns(strSide) {
			$.ajax({
				type: "POST",
				dataType: "json",
				url: options.contentURL,
				data: "curPage="+curPage+"&from="+from+"&limit="+limit+"&side="+strSide+"&itemsPerColumn="+options.itemsPerColumn,
				cache: false,
				success: function(json) {
					if ( json.status == "ERROR" ) {
						if ( options.onError != null )
							eval(options.onError+"('"+json.msg+"')");
					} else if ( json.status == "OK" ) {
						if ( $("img#sldr2_img_loading", $viewport).size() > 0 )
							$("img#sldr2_img_loading", $viewport).remove();
						if ( json.result != "" ) {	
							var $column = null;
							if ( strSide == "top" ) {
								$column = $(json.result);
								$slider.prepend($column);
								if ( $slider.getColumnCount() > (options.showColumns+2) ) {
									removeColumns("bottom");
								} else {
									preventClick = false;
								}
							} else if ( strSide == "bottom" ) {
								$column = $(json.result);
								$column.appendTo($slider);
								if ( $slider.getColumnCount() > (options.showColumns+2) ) {
									removeColumns("top");
								} else {
									preventClick = false;
								}
							}
							columnHeight	= $(options.columnDiv, $slider).outerHeight({margin:true});
							fixPosition();
							if ( options.onColumnAdd != null )
								eval(options.onColumnAdd+"($column)");
						}
					}
				},
				error: function(oRequest, sErrType) {
					if ( options.onError != null )
						eval(options.onError+"('Er is een onbekende fout opgetreden')");
				}
			});
		}

		function removeColumns(strSide) {
			if ( strSide == "top" ) {
				$slider.find(options.columnDiv+":first").remove();
			} else if ( strSide == "bottom" ) {
				$slider.find(options.columnDiv+":last").remove();
			}
			fixPosition();
			preventClick = false;
		}

		function fixPosition() {
			if ( $slider.getColumnCount() == (options.showColumns+2) || curPage == totalColumns && $slider.getColumnCount() > options.showColumns ) {
				curSlidePos = -columnHeight;
				$slider.css("top", curSlidePos+"px");
			}
		}

		function showHideNav() {
			curPage == 1 ? $btnPrev.hide() : $btnPrev.show();
			curPage == totalColumns ? $btnNext.hide() : $btnNext.show();
		}
		
		function setInfo() {
			if ( options.totalItems <= 0 ) {
				$infoContainer.html("&nbsp;");
			} else {
				var nFrom	= 1 + ((options.itemsPerColumn*options.columnsPerSlide) * (curPage-1));
				var nTo	= (options.itemsPerColumn * options.showColumns) + ((curPage-1) * options.itemsPerColumn);
				if ( nTo > options.totalItems ) nTo = options.totalItems;
				$infoContainer.html(nFrom+"-"+nTo+" van "+options.totalItems);
			}
		}
		
		function onError(strErrMsg) {
			$("img#sldr2_img_loading", $viewport).remove();
			$viewport.append('<span style="color:red;font-weight:bold">'+strErrMsg+'</span>');
		}
		
		$.sliders.insert(options.sliderID, $viewport);
		
		return this;
	});
};

$.sliders = {
	
	sliders: {},
	
	insert: function(nSliderID, $slider) {
		this.sliders[nSliderID] = $slider;
	},
	
	remove: function(nSliderID) {
		this.sliders[nSliderID].reset();
		this.sliders[nSliderID] = null;
	},
	
	get: function(nSliderID) {
		return this.sliders[nSliderID];
	}
};

})(jQuery);