;(function () {
	function sanityCheck(opts) {
		if(!opts.selector) return false;
		if(opts.srcs && !(opts.srcs[0] && opts.alts && typeof opts.alts[0] !== 'undefined' && opts.srcs.length === opts.alts.length)) return false;
		return true;
	}
	function sanityCheckCreate(opts) {
		return sanityCheck(opts) && opts.srcs;
	}
	function rotate(el, opts) {
		function f() {
			var last = el.find('.' + CLASS).length - 1;
			var current = el.find('.' + CLASS_CURRENT).removeClass(CLASS_CURRENT);
			var next = (current.hasClass(CLASS + '_' + last) ? el.find('.' + CLASS + '_0') : current.next());
			next.addClass(CLASS_CURRENT);
			if(fade === false || isNaN(fade)) {
				next.show();
				current.hide();
			}
			else {
				next.fadeIn(fade, function () {
					current.hide();
				});
			}
			return setTimeout(f, interval);
		}
		var interval = opts.interval || DEFAULT_INTERVAL;
		var fade = (typeof opts.fade !== 'undefined' ? opts.fade : DEFAULT_FADE);
		el.find('.' + CLASS + '_0').addClass(CLASS_CURRENT).show();
		return (el.find('.' + CLASS).length > 1 ? setTimeout(f, interval) : false);
	}
	function create(el, opts) {
		if (!sanityCheckCreate(opts)) return false;
		var count = opts.srcs.length;
		var queryString = opts.queryString || '';
		var html = [];
		for (var i = 0; i < count; i++) {
			html[i] = '<li class="' + CLASS + ' ' + CLASS + '_' + i + (i === 0 ? ' ' + CLASS_CURRENT : '" style="display: none;') + '">';
			html[i] += '<a href="' + opts.alts[i] + '" target=_blank><img src="' + opts.srcs[i] + queryString + '" alt="' + opts.alts[i] + '"></a></li>';
		}
		el.html('<ol class="' + CLASS_CONTAINER + '">' + html.join('') + '</ol>');
		return true;
	}
	function init(key) {
		var el = $(key);
		var opts = allOpts[key];
		create(el, opts);
		if(!el.length) return false;
		rotate(el, opts);
		return true;
	}
	function initAll() {
		for (key in allOpts) {
			init(key);
		}
	}
	function add(opts) {
		if(!sanityCheck(opts)) return false;
		allOpts[opts.selector] = opts;
		return true;
	}
	// Constants
	var CLASS = 'carousel_item';
	var CLASS_CURRENT = 'current';
	var CLASS_CONTAINER = 'carousel_container';
	var DEFAULT_SELECTOR = '.carousel';
	var DEFAULT_INTERVAL = 5000;
	var DEFAULT_FADE = 500;
	// Object containing all carousel options
	var allOpts = {};
	// Elements added by default
	allOpts[DEFAULT_SELECTOR] = {
		selector: DEFAULT_SELECTOR
	};
	// Make global object
	window.carousels = {
			add: add
	};
	// On DOM ready
	$(function () {
		initAll();
		window.carousels.add = function(opts) {
			var success = add(opts);
			if(success) return init(opts.selector);
			return success;
		};
	});
})();

