﻿(function ($) {
	var settings;
	$.fn.roller = function (userSettings) {
		settings = $.extend({
			items: '.js-roller_line',
			itemName: 'js-roller_line_item',
			page: '.js-roller_pager_item',
			runner: '.js-roller_pager_runner',
			auto: true
		}, userSettings || {});

		var roller = $(this);
		var items = $(settings.items, roller);

		var w = $('.' + settings.itemName, items).width();
		var count = $('.' + settings.itemName, items).length;
		var lineW = 0;
		for (var i = 1; i <= count; i++) {
			lineW += $('#' + settings.itemName + i).width();
		}
		var timeout;

		var pageWidth = $(settings.page, roller).width();
		var runner = $(settings.runner, roller);

		var forceAnimation = false;

		var animate = function (n) {
			if (settings.allowNextFunc && $.isFunction(settings.allowNextFunc)) {
				if (!settings.allowNextFunc() && !forceAnimation) {
					timeout = setTimeout(function () {
						animate(n);
					}, 8000);
					return;
				}
				forceAnimation = false;
			}
			var mLeft = 0;
			for (var i = 1; i <= n; i++) {
				mLeft += $('#' + settings.itemName + i).width();
			}

			var runnerLeft = pageWidth * n;

			if (runnerLeft > 0) {
				runnerLeft += 2 * n; /* marginRight = 2px */
				runner.animate({
					left: "+" + runnerLeft
				}, 550);
			} else {
				runner.css('left', -pageWidth + 'px');
				runner.animate({
					left: "+" + runnerLeft
				}, 550);
			}

			items.animate({
				marginLeft: '-' + mLeft
			}, 550, function () {

				if (mLeft < lineW) {
					clearTimeout(timeout);
					timeout = setTimeout(function () {
						n += 1;
						animate(n);
					}, 8000);
				} else {
					items.css('marginLeft', $('#' + settings.itemName + '1').width() + 'px');

					n = 0;
					animate(n);
				}
			});

		}

		if (settings.auto) {
			timeout = setTimeout(function () {
				animate(1);
			}, 8000);
		}

		var page = $(settings.page, roller);
		page.click(function () {
			var number = $(settings.page, roller).index(this);
			forceAnimation = true;
			animate(number);
		});
	}
})(jQuery);
