var DEBUG_MODE = true;

/* ----------------------------------------- HTML5 BOILER FUNCTION -------------------------------------------------- */
// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function(){
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  arguments.callee = arguments.callee.caller;  
  if(this.console) console.log(Array.prototype.slice.call(arguments));
};
// make it safe to use console.log always
(function(b){function c(){}for(var d="assert,count,debug,dir,dirml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();)b[a]=b[a]||c})(window.console=window.console||{});





// place any jQuery/helper plugins in here, instead of separate, slower script files.
/* ------------------------------------------- UTILS FUNCTION ------------------------------------------------------- */
(function($) {

    // DEBUG FUNCTION
	$.debug = function(message) {if(window.console && DEBUG_MODE == true) {console.log(message);}};
    $.debug_list = function(message) {if(window.console && DEBUG_MODE == true) {console.dir(message);}};

    // INSTANCE FUNCTION
	$.fn.exists = function(){if(jQuery(this).length == 0){return false;}else{return true;}};

    // BROWSER INFO
	$.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;
    };
    
})(jQuery);




/* -------------------------------------------  OTHERS -------------------------------------------------------------- */


/* -------------------------------------------  JCSS_ALIGN ---------------------------------------------------------- */
/**
 * Align Everything everywhere
 * Work on all browser platform including IE6
 * Version Alpha 0.1
 * This plugins align every element to any position
 * Check sources to know what you need to be able to use this.
 * This required : Jquery 1.4
 * Please leave me some comment on anything!
 *
 * Example :
 * $('{element}').JCSS_align({
 *     {setting}:'{value}'
 * });
 * Copyright (c) 2010 Samuel Cléroux-Bouthillier
 * Demo : http://plugins.scbfolio.com/jquery_jcss_align/
 *
 * Dual licensed under MIT and GNU General Public License version 3 (GPLv3)
 * http://www.opensource.org/licenses
 * Launch  : October 2010
 */
(function($) {
	$.fn.exists = function(){if(jQuery(this).length == 0){return false;}else{return true;}};
	$.fn.JCSS_align = function(settings){
        var config = $.fn.JCSS_align.defaults;
        if (settings) config = $.extend($.fn.JCSS_align.defaults, settings);
		return this.each(function() {
			var self = this;
            var $self = $(this);
            var parent = $(this).parent();
            var parentNodeName = parent[0].nodeName;
            var error = false;
            var horizontal_align_error = false;
            var vertical_align_error = false;
            var axis_error = false;
            var total_img_to_loaded;
			var images_loaded = false;
			var number_of_images_preloaded = 0;


            if(typeof(config.vertical_offset) != "number") {
                config.vertical_offset = 0;
            }
            if(typeof(config.horizontal_offset) != "number") {
                config.horizontal_offset = 0;
            }
            $.extend(self, {
                init: function() {
                    if($self.css("position") != "absolute")
                    $self.css({position:"absolute"});

                    if($self.css("z-index") == 'auto')
                    $self.css({"z-index":config.index});

                    if(parentNodeName == "BODY") {
                        var sizeBrowser = viewport();
                        var parentWidth = sizeBrowser[0];
                        var parentHeight = sizeBrowser[1];
                        var leftValue,topValue;
                        if(config.horizontal_align == "left") {
                            leftValue = 0;
                            leftValue += config.horizontal_offset;
                        }
                        else if(config.horizontal_align == "middle") {
                            leftValue = parentWidth/2;
                            leftValue -= $self.outerWidth()/2;
                        }
                        else if(config.horizontal_align == "right") {
                            leftValue = parentWidth;
                            leftValue -= $self.outerWidth();
                            leftValue -= config.horizontal_offset;
                        }
                        else {
                            horizontal_align_error = true;
                            horizontal_align_error_message = "horizontal_align : choose a valid options.\n";
                            error = true;
                            leftValue =0;
                        }

                        if(config.vertical_align == "top") {
                            topValue = 0;
                            topValue += config.vertical_offset;
                        }
                        else if(config.vertical_align == "middle") {
                            topValue = parentHeight/2;
                            topValue -= $self.outerHeight()/2;
                        }
                        else if(config.vertical_align == "bottom") {
                            topValue = parentHeight;
                            topValue -= $self.outerHeight();
                            topValue -= config.vertical_offset;
                        }
                        else {
                            vertical_align_error = true;
                            vertical_align_error_message = "vertical_align : choose a valid options.\n";
                            error = true;
                            topValue =0;
                        }

                    }
                    else {
                        if(parent.css("position") != "relative" && parent.css("position") != "absolute")
                        parent.css({position:"relative"});

                        parentWidth = parent.outerWidth();
                        parentHeight = parent.outerHeight();

                        if(config.horizontal_align == "left") {
                            leftValue = 0;
                            leftValue += config.horizontal_offset;
                        }
                        else if(config.horizontal_align == "middle") {
                            leftValue = parentWidth/2;
                            leftValue -= $self.outerWidth()/2;
                        }
                        else if(config.horizontal_align == "right") {
                            leftValue = parentWidth;
                            leftValue -= $self.outerWidth();
                            leftValue -= config.horizontal_offset;
                        }
                        else {
                            horizontal_align_error = true;
                            horizontal_align_error_message = "horizontal_align : choose a valid options.\n";
                            error = true;
                            leftValue =0;
                        }

                        if(config.vertical_align == "top") {
                            topValue = 0;
                            topValue += config.vertical_offset;
                        }
                        else if(config.vertical_align == "middle") {
                            topValue = parentHeight/2;
                            topValue -= $self.outerHeight()/2;
                        }
                        else if(config.vertical_align == "bottom") {
                            topValue = parentHeight;
                            topValue -= $self.outerHeight();
                            topValue -= config.vertical_offset;
                        }
                        else {
                            vertical_align_error = true;
                            vertical_align_error_message = "vertical_align : choose a valid options.\n";
                            error = true;
                            topValue =0;
                        }
                    }
                    if(leftValue <= 0){leftValue = 0;}
                    if(topValue <= 0){topValue = 0;}

                    if(config.axis == "xy") {
                        $self.css({top: topValue, left: leftValue});
                    }
                    else if(config.axis == "y") {
                        $self.css({top: topValue});
                    }
                    else if (config.axis == "x") {
                        $self.css({left: leftValue});
                    }
                    else {
                        axis_error = true;
                        axis_error_message = "axis : choose a valid axis.\n";
                        error = true;
                    }
                    if(error) {
                        var textAlert = "JCSS_ALIGN Plugins : \n";
                        if(horizontal_align_error) {
                            textAlert += horizontal_align_error_message;
                        }

                        if(vertical_align_error) {
                            textAlert += vertical_align_error_message;
                        }

                        if(axis_error) {
                            textAlert += axis_error_message;
                        }
                        alert(textAlert);
                    }
                    return 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;
                        self.init();
                        return true;
                    }
                    return self;
                }
            });
            if(self.tagName == "IMG") {
                total_img_to_loaded = 1;
                var image = new Image();
                image.src = $self.attr('src');
                if(image.complete){
                    self.image_loaded(number_of_images_preloaded,total_img_to_loaded,images_loaded);
                }
                else {
                    $self.load(function(){
                        self.image_loaded(number_of_images_preloaded,total_img_to_loaded,images_loaded);
                    });
                }
            }
            else if($self.find('img').exists()) {
                total_img_to_loaded = $self.find('img').size();
				$self.find('img').each(function() {
					var image = new Image();
					image.src = $(this).attr('src');
                    if(image.complete){
                        self.image_loaded(number_of_images_preloaded,total_img_to_loaded,images_loaded);
                    }
                    else {
                        $(this).load(function() {
                            self.image_loaded(number_of_images_preloaded,total_img_to_loaded,images_loaded);
                        });
                    }
				});
			}
            else {
                self.init();
            }

            $(window).resize(function(){self.init();});
		});
	};

    // DEFAULT SETTINGS
    $.fn.JCSS_align.defaults = {
        axis:"xy",
		vertical_align:"middle",// top,middle,bottom
		vertical_offset:0,
		horizontal_align:"middle",// left,middle,right
		horizontal_offset:0,
		index:1
    };

	function viewport() {
		// the horror case
		if ($.browser.msie) {
			// if there are no scrollbars then use window.height
			var d = $(document).height(), w = $(window).height();
			return [
				window.innerWidth || 						// ie7+
				document.documentElement.clientWidth || 	// ie6
				document.body.clientWidth, 					// ie6 quirks mode
				d - w < 20 ? w : d
			];
		}
		// other well behaving browsers
		return [$(window).width(), $(window).height()];
	}
})(jQuery);
