// TRACE
function trace(){if(window.console&&console.log){if(navigator.userAgent.toLowerCase().indexOf("webkit")>=0)console.log(arguments.length<2?arguments[0]:Array.prototype.slice.call(arguments));else console.log.apply(this,arguments)}}

// COOKIE
jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options.expires=-1}var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;options.ratio=parseInt(options.ratio||0,10)||24*60*60*1000;
if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*options.ratio))}else{date=options.expires}expires='; expires='+date.toUTCString()}var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('')}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break}}}return cookieValue}};


// GET URL PARTS
function gup(name,def,href){if(name)var h=href||window.location.href||"",n=(name+"").replace(/[\[]/gm,"\\\[").replace(/[\s]+/g,"\\\]"),rx=new RegExp("[\\?#&]"+n+"=([^&#]*)"),m=rx.exec(h);return m?m[1]:(def||"")}

/**
 * Constructor
 *
 * @param options  <JsonArray of JsonObject> - An array of
 */
function Equalize(options,start){	

	// Si un objet est passé
	if(typeof(options) === 'object'){ 
		
		this.options = options;
		this.start	 = start;
		this.init();
	}
}

/**
 * Intializer
 *
 *
 */
Equalize.prototype.init = function()
{
	
	for (var i = 0, options = this.options, nb = options.length ; i < nb ; ++i)
	{
		
		var me = $(options[i].selector),
			size=me.length;
			
		if(size)
		{
			var reorder		= options[i].reorder||false,
				c			= options[i].columns||0,			//!< Total number of columns
				r			= Math.ceil(size/c),			//!< Total number of rows
				id			= 0,							//!< Current iterating cell
				list 		= [];
		
			if(reorder)
			{
				for(;id < size;++id)
					// The reorder position being:
					//  (total number of columns)*(position in the current row = x) + (position in the current column = y)
					list[(c*Math.floor(id%r))+Math.floor(id/r)] = me[id];
			}
			else
				for(;id < size;++id)
					list[id] = me[id];	
			
			// Remove unneeded parameters
			delete options[i].reorder;
			delete options[i].selector;
			options[i].selector = $(list);
			
		}else{
			delete options[i];
		}
	}
	
	if(this.start)this.format();
	
};

Equalize.prototype.format = function(){
	
	for (var i = 0,  options = this.options, nb = options.length ; i < nb ; ++i )
	{
		if(options[i])
		{
			var list 		= options[i].selector,
				size 		= list.length-1,
				columns 	= options[i].columns||0,
				callback	= options[i].callback||false,
				//active		= $([]),
				array       = [],
				c = columns-1, 
				id = 0, 
				heightest = 0;
				
			for(; id <= size ; ++id ){
				
				var me = list[id],$me=$(me),h;
				
				// O(n^3)
				$me.css({height:'auto'});
				h = $me.height()||0;
				
				
				
				if(h > heightest)
					heightest = h;
				
				//active = active.add(me);
				
				array[array.length]=me;
			
				if(id%columns === c || id === size){
					// O(n^3)
					//active.css('height',heightest+'px');
					$(array).css('height',heightest+'px');
					//active = $([]);
					//trace('array',array,$(array));
					array=[];
					heightest = 0;
				}
			}
			
			if(typeof(callback)==='function')callback();
		}
	}
};


