(function($) {
    $.debug = function(message) {if(window.console) {console.log(message);} else {/*alert(message);*/}};
    $.debug_list = function(message) {if(window.console) {console.dir(message);} else {alert(message);}};
    $.fn.exists = function(){if(jQuery(this).length == 0){return false;}else{return true;}};
    $.browser_size = function() {
        if ($.browser.msie) {
            var document_width = $(window).height();
            var document_height = $(document).height();
            return [
                window.innerWidth || 						// ie7+
                        document.documentElement.clientWidth || 	// ie6
                        document.body.clientWidth, 					// ie6 quirks mode
                document_height - document_width < 20 ? document_width : document_height
            ];
        }
        return [$(window).width(), $(window).height()];
    };
    // LOADER OF IMAGES
    $.fn.images_loader = function(callback) {
        var self = this;
        var $self = $(this);
        var total_img_to_loaded;
        var images_loaded = false;
        var number_of_images_preloaded = 0;
        $.extend(self, {
            image_loaded: function(number_of_images,total_img_to_load,images_loaded) {
                number_of_images++;
                number_of_images_preloaded = number_of_images;
                if(number_of_images_preloaded >= total_img_to_load && images_loaded != true){
                    images_loaded = true;
                    callback.call(this,$self);
                }
                return self;
            }
        });

        if(self.tagName == "IMG") {
            total_img_to_loaded = 1;
            var image = new Image();
            image.src = $self.attr('src');
            $self.bind('load',function(){
                if (--total_img_to_loaded <= 0){self.image_loaded(number_of_images_preloaded,total_img_to_loaded,images_loaded); }
            });

            if (this.complete || this.complete === undefined){
                var src = this.src;
                this.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
                this.src = src;
            }
        }
        else if($self.find('img').exists()) {
            total_img_to_loaded = $self.find('img').size();
            $self.find('img').bind('load',function(){
                if (--total_img_to_loaded <= 0){self.image_loaded(number_of_images_preloaded,total_img_to_loaded,images_loaded); }
            }).each(function(){
                if (this.complete || this.complete === undefined){
                    var src = this.src;
                    this.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
                    this.src = src;
                }
            });
        }
        else {
            callback.call(this,$self);
        }
        return this;
    };

    $.fn.imagesLoaded = function(callback){
        var elems = this.filter('img'),
                len   = elems.length;

        elems.bind('load',function(){
            if (--len <= 0){ $.debug("loaded"); callback.call(elems,this); }
        }).each(function(){

            // cached images don't fire load sometimes, so we reset src.
            if (this.complete || this.complete === undefined){
                $.debug("in cache");
                var src = this.src;
                // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
                // data uri bypasses webkit log warning (thx doug jones)
                this.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
                this.src = src;
            }
        });
        return this;
    };
})(jQuery);
