/*
 imagemonitor v1.0
 author: Restituto P. Rizal
 
 exmple:
 
$(document).ready(function()
{
	$('img').imagemonitor(
	{
		'init' : function()
		{
			// call when this plugin start execute
		},
		'onLoad' : function(loadedImage, totalImage)
		{
			// call every single image loaded
			// loadedImage: number of how many image/images are loaded
			// the total number of image/images loaded or not
		},
		'onComplete' : function(loadedImage)
		{
			// call when all image is loaded
			// loadedImage: number of how many image/images are loaded
		}
	});
});


*/
(function( $ ){
    $.fn.imagemonitor = function(imageEvent) 
    {
        var totalImage = 0;
        var loadedImage = 0;
        var loadedImageSrc = Array();
        var imageObject = Array();
        var isComplete = false;
        var loop_delay = 200; // in miliseconds
        var imgElement = this;
        if(imageEvent.init == null) imageEvent.init = function(){};
        if(imageEvent.onLoad == null) imageEvent.onLoad = function(){};
        if(imageEvent.onComplete == null) imageEvent.onComplete = function(){};
        function createImageObject()
        {
            imgElement.each(function(index)
            {
                imageObject[index] = new Image();
                $(imageObject[index]).attr('src', $(this).attr('src'));
            });
        }
        function count_loaded_image()
        {
            for(var i=0; imageObject[i]; i++)
            {
                if(!checkIfLoaded($(imageObject[i]).attr('src')))
                {
                    if(imageObject[i].complete || imageObject[i].readyState === 4) 
                    {
                        loadedImageSrc.push($(imageObject[i]).attr('src'));
                        loadedImage++;
                        imageEvent.onLoad(loadedImage, totalImage);
                    }
                }
            }
            if((loadedImage == totalImage) && !isComplete) 
            {
                isComplete = true;
                imageEvent.onComplete(loadedImage);
            }
            else setTimeout(count_loaded_image, loop_delay);
		
        }
        function getTotalImage()
        {
            var tempImageSrc = Array();
            imgElement.each(function(index)
            {
                var counted = false;
                for(i=0; tempImageSrc[i]; i++)
                {
                    if(tempImageSrc[i] == $(this).attr('src')) counted = true;
                }
                if(!counted) tempImageSrc.push($(this).attr('src'))
            });
            return tempImageSrc.length;
        }
        function checkIfLoaded(src)
        {
            var loaded = false;
            for(var i=0; loadedImageSrc[i]; i++)
            {
                if(loadedImageSrc[i] == src) loaded = true;
            }
            return loaded;
        }
        function setOnloadEvent()
        {
            imgElement.each(function(index)
            {
                $(this).load(function()
                {
                    if(!checkIfLoaded($(this).attr('src')))
                    {
                        loadedImage++;
                        loadedImageSrc.push($(this).attr('src'));
                        imageEvent.onLoad(loadedImage, totalImage);
                        if((loadedImage == totalImage) && !isComplete) 
                        {
                            isComplete = true;
                            imageEvent.onComplete(loadedImage);
                        }
                    }
                });	
            });
        }
        imageEvent.init();
        totalImage = getTotalImage();
        createImageObject();
        setOnloadEvent();
        count_loaded_image();
    };
})( jQuery );
