(function($){
 $.fn.maincarousel = function (params) {
	 	var defaults = {
			container: '.items',
			items: 'div.sl-item',
			pages: '.pagination li',
			previous:'.prev' ,
			next: '.next',
			size : 1,
			duration : 1000,
			easing : 'easeInOutQuart',
			isajax : false,
			insideprevious : '.link-prev',
			insidenext : '.link-next',
			autoanimate: false
		};
 	return $(this).each(
 			function(){
				var options = $.extend({}, defaults, options, params);

				var me = $(this),
					previous = me.find(options.previous),
					next = me.find(options.next),
					insideprevious = me.find(options.insideprevious),
					insidenext = me.find(options.insidenext),
					container = me.find(options.container),
					pages = me.find(options.pages),
					items = container.find(options.items),
					size = options.size,
					elementSize = parseInt(items.eq(0).outerWidth("true")),
					increment = size * elementSize,
					count = items.length,
					curPos = 0,
					isAnimating = false;

				var container_width = 0;
					for (i=0; i<count; i++)
						container_width = container_width + items.eq(i).outerWidth(true);

				var reInit = function () {
					items = container.find(options.items);
					count = items.length;

					pageReinit();
				}

				var scrollPrev = function () {
					elementSize = items.eq(curPos).outerWidth('true');


					if (curPos-size >= 0 || options.isajax) {
						curPos = curPos - size;

						leftPos = items.eq(curPos).position().left;

						$(container).animate({'left': "-" + leftPos +"px"}, {duration:options.duration, easing:options.easing}).promise().done(function(){
							if (options.isajax && !me.hasClass('no-ajax')){
								items.eq(1).remove();
								container.css({'left':0});
								curPos = 0;
								reInit();
							}
							isAnimating = false;
						});

						checkArrows();
					}
				}

				var scrollNext = function () {
					elementSize = items.eq(curPos).outerWidth(true);

					if (curPos+size < count || options.isajax ) {
						curPos = curPos + size;

						leftPos = items.eq(curPos).position().left;

						$(container).animate({'left': "-" + leftPos + "px"}, {duration:options.duration, easing:options.easing}).promise().done(function(){
							if (options.isajax && !me.hasClass('no-ajax')) {
								items.filter(':not(:eq('+curPos+'))').remove();
								container.css({'left':0});
								curPos = 0;
								reInit();
							}
							isAnimating = false;
						});
						checkArrows();
					}
				}

				var scrollToPos = function (pos) {
					curPos = pos;
					// alert('2');
					leftPos = items.eq(curPos).position().left;

					$(container).animate({'left': "-" + leftPos + "px"}, {duration:options.duration, easing:options.easing}).promise().done(function(){isAnimating = false;});
					checkArrows();
				}

				var checkArrows = function () {
					if (options.isajax && !me.hasClass('no-ajax')) return;

					if (curPos == 0)
						previous.addClass('disabled');
					else
						previous.removeClass('disabled');

					if (curPos + size >= count)
						next.addClass('disabled');
					else
						next.removeClass('disabled');

/*
					if (-parseInt(container.css('left')) >= parseInt(container_width) || container_width < 400)
						next.addClass('disabled');
*/

					setPages();
				}

				var insertPrev = function (html) {
					curPos--;
					count = 2;

					newDiv = items.last().clone().prependTo(container).html(html);
					newDiv.html(newDiv.find(options.items).eq(0).html());
					container.css({'left':-elementSize});

					var topPos = 0;
					if (newDiv.find('.top-pos').length) topPos = newDiv.find('.top-pos').position().top;

					if (items.last().find('.first-col').length)
						var minHeight = items.last().find('.first-col').height() + topPos;
					else
						var minHeight = items.last().height();

					if (newDiv.find('.first-col').length)
						var newDivHeight = newDiv.find('.first-col').height() + topPos;
					else
						var newDivHeight = newDiv.height();

					me.css({'height':minHeight});
					me.stop(true,true).animate({'height':newDivHeight},1000);

					reInit();
				}

				var insertNext = function (html) {
					count = 2;
					items.eq(curPos).nextAll().remove();

					newDiv = items.last().clone().appendTo(container).html(html);
					newDiv.html(newDiv.find(options.items).eq(0).html());

					var topPos = 0;
					if (newDiv.find('.top-pos').length) topPos = newDiv.find('.top-pos').position().top;

					if (items.last().find('.first-col').length)
						var minHeight = items.last().find('.first-col').height() + topPos;
					else
						var minHeight = items.last().height();

					if (newDiv.find('.first-col').length)
						var newDivHeight = newDiv.find('.first-col').height() + topPos;
					else
						var newDivHeight = newDiv.height();


					me.css({'height':minHeight});
					me.stop(true,true).animate({'height':newDivHeight},1000);

					reInit();
				}

				var ajaxLoad = function(linkObj, napr, hash,pushHref){
					if (hash)
						link = hash;
					else
						link = $(linkObj).attr('href');

					if (link =='#' || !link || $(linkObj).hasClass('disabled') ) return false;
					clickedLink = 1;
					$.ajax({
						url: link,
						dataType: 'json',
						cache: true,
						beforeSend: function(){
							$('#ajaxloader').fadeIn();
						},
						success: function(data){
						  	html = data['full_page'];
						  	$('#left-menu').html(data['menu']);
						  	$(previous).eq(0).attr({'href':data['prev']['href'],'class':data['prev']['class']});
						  	$(next).eq(0).attr({'href':data['next']['href'],'class':data['next']['class']});

						    eval('insert'+napr+'(html)');
						    eval('scroll'+napr+'()');
						    document.title = data['page_title'];
						    container.promise().done(function(){
						    	$('#ajaxloader').fadeOut();
						    })
						    if (pushHref)
							    $.history.putHash(link);
						}
					});
				}

				var setPages = function () {
					pages.eq(curPos).addClass('active').siblings().removeClass('active');
				}
				checkArrows();

				pages.each(function (idx, el) {
					$(el).click(function () {
						scrollToPos(idx);
						setPages();
					});
				});

				$(previous).die('click').live('click', function(event){
					event.preventDefault();
					if (container.is(":animated")) return false;
					isAnimating = true;
					if ($(this).hasClass('disabled')) return false;
					if (options.isajax && !me.hasClass('no-ajax'))
						ajaxLoad($(this), 'Prev','',true);
					else
						scrollPrev()
				});

				$(next).die('click').live('click',function(event){
					event.preventDefault();
					if (container.is(":animated")) return false;
					isAnimating = true;
					if ($(this).hasClass('disabled')) return false;
					if (options.isajax && !me.hasClass('no-ajax'))
						ajaxLoad($(this), 'Next','',true);
					else
						scrollNext()
				});

				$(insideprevious).die('click').live('click', function(event){
					if (container.is(":animated")) return false;
					isAnimating = true
					event.preventDefault();
					me.removeClass('no-ajax');
					ajaxLoad($(this), 'Prev','',true);
				});

				$(insidenext).die('click').live('click',function(event){
					if (container.is(":animated")) return false;
					isAnimating = true
					event.preventDefault();
					me.removeClass('no-ajax');
					ajaxLoad($(this), 'Next','',true);
				});


				$(previous).add($(next)).mousedown(function(){
					$(this).addClass('clicked');
				})
				$(previous).add($(next)).bind('mouseup mouseout',function(){
					$(this).removeClass('clicked');
				})

				var commands = {
                        'ajaxLoad': ajaxLoad
                };

				me.data('maincarousel', commands);

				function autoChange(){
					if (curPos+1 >= count) curPos = -1;
					scrollNext();
				}
				if (options.autoanimate)
					inter = setInterval(autoChange,5000);

			}
		);
	}
})(jQuery);

