/*
 * shine
 * -----------------
 * makes a component shine
 *
 *
 * Copyright (c) 2011 e-Madgin - Rémi KLAJN
 *
 */

;(function($) {
	jQuery.fn.shine = function (options) {
		var settings = jQuery.extend({speed: 0.5}, options);
		var $objs = $(this);
		$objs.each(function(){
			var $shine_object = $(this);
			if (!($shine_object.parent().hasClass('shiner'))) { // if the slider has never been setted up
				$shine_object.wrap('<div class="shiner" />');
				$shine_object.after('<div class="shine_effect" />');
				$shine_object.loadAllImages(function(){$shine_object.make_it_shine()});
			}
			else {
				$shine_object.make_it_shine(options);
			}
		});
	};
	jQuery.fn.make_it_shine = function(options){	
		var settings = jQuery.extend({}, options);			
		var $shiners = $('.shiner');
		$shiners.each(function(){
			var $shiner = $(this);
			var $shine = $shiner.find('div.shine_effect');
			var $img = $shiner.find('.shine');
			$shine.stop();
			$shine.css("background-position","-399px 0");
			var $total_width = $img.width()+399;
			$shine.css(
				{
				'width':$img.width(),
				'height':$img.height()
				}
			);
			$shiner.css(
				{
				'width':$img.width()
				}
			);
			$shine.animate({backgroundPositionX : $total_width+"px"},($total_width/settings.speed));
		});
	}
	$.fn.loadAllImages = function(loadingOverCallback, everyLoadingImageCallback) {

        everyLoadingImageCallback = everyLoadingImageCallback || function() {};

        if ( ! $.isFunction(loadingOverCallback) ||  ! $.isFunction(everyLoadingImageCallback)) {
            throw {
                name: 'invalid_callback_function',
                message: 'An invalid callback was passed.'
            };
        };

        var container = $(this),
            imagesToLoad = container.find('img');
		if (container.is("img")){ // if called on an image, add it to the image collection
			imagesToLoad = imagesToLoad.add(container);
		}
        var imagesToLoadLength = imagesToLoad.length,
            imagesToLoadLoaded = 0;
        if (imagesToLoadLength == 0) {
            loadingOverCallback.call(this);
        };
		
		imagesToLoad.each(function() {
			var image = this;
			image.onload = function() {
				imagesToLoadLoaded++;
				everyLoadingImageCallback.call(image, imagesToLoadLoaded, imagesToLoadLength);
				if (imagesToLoadLoaded == imagesToLoadLength) {
					loadingOverCallback.call($(this));
					return false;
				};
			};
		});
    };
})(jQuery);

