/**
 *
 * @param {Object} local_conf
 */
jQuery.fn.albumCarousel = function (local_conf) {
	//
    var conf = {};

	conf.listAjaxUrl = '/ajax/albums-navigator/';

	conf.startIndex = 0;
	conf.size = 0;
	conf.preloadSize = 10;
	conf.scrollBy = 5;

    //
	var boxJQ = jQuery(this);
	
	var listEntryTemplateJQ = null;

	/**
	 *
	 */
    var init = function (local_conf) {
		conf = jQuery.extend(conf, local_conf);

		//
		if(boxJQ.css('display') === 'none') {
			return;
		}

		//
		listEntryTemplateJQ = boxJQ.find('.list ul li').eq(0).clone();

		//
	    boxJQ.find('.boxBody').jcarousel({
	        itemLoadCallback: itemLoadCallback,
	        start: conf.startIndex + 1,
			offset: conf.startIndex + 1,
			size: Math.max(conf.size, (conf.startIndex + 1) * conf.scrollBy), // size: conf.size,
	        scroll: conf.scrollBy,
			animation: 500});
		//
		boxJQ.find('.jcarousel-prev, .jcarousel-next')
			.mouseover(function() {
				jQuery(this).addClass('hover');
			})
			.mouseout(function() {
				jQuery(this).removeClass('hover');
			});
		
        //
        init = function () {};
    };

	/**
	 * 
	 * @param {Object} carousel
	 * @param {Object} state
	 */
	function itemLoadCallback(carousel, state) {
	    var first = carousel.first - conf.preloadSize;
	    var last = carousel.last + conf.preloadSize;

	    while((carousel.has(first, first) || first <= 0) && first <= conf.size) {
	        first++;
	    }
	
	    while((carousel.has(last, last) || last > conf.size) && last >= 0) {
	        last--;
	    }

	    if(first > last) {
	        return;
	    }

		var url = conf.listAjaxUrl;
	    jQuery.ajax({
	        type: 'GET',
	        url: url,
	        data: {
				inpl_network_request: 1,
				firstIndex: first - 1,
				lastIndex: last - 1},
	        dataType: 'json',
	        success: function (json, textStatus) {
				var size = parseInt(json.total);
				conf.size = size;
	            carousel.size(size);

	            for(var i = 0; i < json.pack.length; i++) {
					var num = parseInt(json.firstIndex) + 1 + i;

					if(carousel.has(num, num)) {
						continue;
					}

					var entryJQ = listEntryTemplateJQ.clone();

					entryJQ
						.find('.image img').attr('src', json.pack[i].imageSrc).end()
						.find('.image a').attr('href', json.pack[i].imageLink).end()
						.find('.author a').text(json.pack[i].authorName).end()
						.find('.author a').attr('href', json.pack[i].authorLink).end();

	                carousel.add(num, entryJQ.contents());
	            }

	        },
	        error: function (XMLHttpRequest, textStatus, errorThrown) {
	        }
	    });
	};

    jQuery(document).ready(function () {
        init(local_conf);
    });

};

