jQuery.noConflict();
var grid$ = jQuery;

var COLUMN_MIN = 3;
var COLUMN_WIDTH = 190;
var COLUMN_MARGIN = 10; 

var _offset_x=_offset_y=0;

grid$.grid = {
	init: function() {
		for (module in grid$.grid) {
			if (grid$.grid[module].init)
				grid$.grid[module].init();
		}
	}
};


grid$(document).ready(grid$.grid.init);

var cookie="";

grid$.grid.window = {
	init: function() {
		grid$(window)
			.bind('resize', this.resize)
			.bind('scroll', this.scroll)
			.each(this.preload);

		bindLinkEvent();

	},

	preload: function() {
		//cookie = grid$.cookie('ready');
		
		//if(!cookie){
			grid$('body').append('<div id="loading" style="position:absolute;top: 0 ;left:0; margin:0; padding:0; background: #fff; width:'+grid$(window).width()+'px;height:'+grid$(window).height()+'px;z-index:9999;"></div>');
			//grid$.cookie('ready','true',{expires:30,path:'/'});
			grid$.timer(2000,function(timer){
				grid$('#loading').animate({'opacity':0},3000,'easeOutCubic',function(){grid$(this).remove();});
			});
			
			grid$.timer(3000,function(timer){
				setupLoadingAsynchronousImagesDelay();
			});
		//}
		grid$('#container, #top-nav, #footer').css({'visibility':'visible'});
		
		_offset_y = grid$('#grid').offset().top;
		_offset_x = grid$('#grid').offset().left;
		
		//topics();
		adjust(false);
	},
	resize: function() {

		adjust(true);
		
	},
	scroll: function() {
		var st=grid$(document.body).scrollTop();
		st = (!st)?document.documentElement.scrollTop:st;
		grid$('#header').css({top: st+COLUMN_MARGIN});
	}
};

function bindLinkEvent() {

	grid$('#grid > div.item.link').bind('mouseup', function() {

		var selectedBox = grid$(this);
		var preloader = grid$('#preloader');

//		selectedBox.css("z-index", "99999999999999999");
//
//		preloader.css(
//			{
//				'opacity': 0.1,
//				'display': 'block'
//			}
//		);

//		preloader.animate(
//
//			{
//
//				'opacity': 0.8
//
//			},
//
//			"fast",
//
//			function() {
//
//				selectedBox.fadeOut(
//					"fast",
//					function() {
//
//						document.location.href = selectedBox.attr("rel");
//
//					}
//
//				);
//
//			}
//
//
//		);

		preloader.fadeIn(
			"fast",
			function() {

				document.location.href = selectedBox.attr("rel");

			}
		);

	});

	grid$('#grid > div.item.link').bind('mouseenter', function() {

		grid$(this).stop().animate(
			{
				'background-color':'#bbb'
			},
			{
				'duration': 300
			}
		);

	});
	
	grid$('#grid > div.item.link').bind('mouseleave', function() {

		grid$(this).stop().animate(
			{
				'background-color':'#fff'
			},
			{
				'duration': 200
			}
		);

	});

}

function unbindLinkEvent() {

	grid$('#grid > div.item.link').unbind();
	
}

function adjust(mode){

        if(grid$("body").hasClass('skipResize'))return;
	grid$('#breadcrumb').stop();
	unbindLinkEvent();
	
	var _max_y = new Array();
	var _max_h = 0;
	var _max_col = 0;

	var _window_h = grid$(window).height();
	var _window_w = grid$(window).width();
	/*
var limit=grid$('#header div.inner').height();
	if(limit+32<_window_h){
		grid$('#header').height(_window_h-8);
	}
	var _header_w=grid$('#header').outerWidth();
	var _target_w = _window_w-grid$('#header').outerWidth();
*/
	//var _target_w = _window_w;
	var _target_w = _window_w - (20 * _window_w / 100);

	
	
	grid$('#pagebody').width(_target_w-16);

	grid$('#grid div.item.filler').remove();

	//grid$('#grid div.item.filler').remove();
	
	var total_columns = 0;

	grid$('#grid div.item').each(function(i) {
		total_columns += 1;
	});

	grid$('#grid div.item.item_double').each(function(i) {
		total_columns += 1;
	});

	grid$('#grid div.item.item_tripple').each(function(i) {
		total_columns += 2;
	});

	var missing_columns = 0;
	
	var _footer_y=0;
	var columns = Math.max(COLUMN_MIN, parseInt(_target_w / (COLUMN_WIDTH+COLUMN_MARGIN)));
	
	if (total_columns <= 5) columns = 4;

	var rows = Math.ceil(total_columns / columns);

	grid$('#grid div.item').css('width',COLUMN_WIDTH+'px');
	grid$('#grid div.item_double').css('width',(COLUMN_WIDTH*2+COLUMN_MARGIN));
	grid$('#grid div.item_tripple').css('width',(COLUMN_WIDTH*3+COLUMN_MARGIN*2));
	for (x=0;x<columns;x++) _max_y[x] = 0;

	var max_cursor = 0;
	var max_pos = 0;
	var max_bottom = 0;

	var max_width = 0;
	
	var items = grid$('#grid > div.item');

	var itemIndex = 0;
	var lastItem;

	var target_x=target_y=cursor=0;

	var columnsHeight = new Array(columns);

	for (var i = 0; i < columns; ++i) columnsHeight[i] = 0;
	
	items.each(function(i) {
		
		++itemIndex;
		
		var pos, width, height= 0;

		var callback = null;

		width=(Math.floor(grid$(this).outerWidth()/COLUMN_WIDTH));
		
		cursor=0;

		if (width>1) {
			for (x=0;x<columns-(width-1);x++) cursor=(_max_y[x]<_max_y[cursor])?x:cursor;

			//max_cursor = Math.max(max_cursor, cursor);
			
			pos=cursor;
			for(var x=0; x<width; x++) height = Math.max(height, _max_y[pos+x]);
			for(var x=0; x<width; x++) _max_y[pos+x] = parseInt(grid$(this).outerHeight())+COLUMN_MARGIN+height;

			target_x=pos*(COLUMN_WIDTH+COLUMN_MARGIN)+_offset_x;
			
			target_y=height+_offset_y;
			
			_max_h=(height > _max_h)?_max_y[pos+width-1]:_max_h;
			
		} else {

			for (x=0;x<columns;x++) cursor=(_max_y[x]<_max_y[cursor])?x:cursor;

			//max_cursor = Math.max(max_cursor, cursor);
			
			target_x=cursor*(COLUMN_WIDTH+COLUMN_MARGIN)+_offset_x;
			target_y=_max_y[cursor]+_offset_y;
			_max_y[cursor] += grid$(this).outerHeight()+COLUMN_MARGIN;
			_max_h=(_max_y[cursor]>_max_h)?_max_y[cursor]:_max_h;
			
		}

		for (var i = cursor;i < width; ++i) columnsHeight[i] = grid$(this).outerHeight() + COLUMN_MARGIN;

		max_bottom = Math.max(target_y + grid$(this).outerHeight(), max_bottom);
		
		if (cursor >= max_cursor) {
			
			max_pos = Math.max(max_pos, cursor + width);

			max_cursor = cursor;

			max_width = Math.max(max_width, max_cursor + width);
			
		}

		if (items.length == itemIndex) {

			missing_columns = max_pos - (cursor + width);

			lastItem = grid$(this);

			//callback = bindLinkEvent();
			
		}

//		_footer_y=(_footer_y<_max_h)?_max_h:_footer_y;
		_footer_y= max_bottom;

		if(!mode){
			
			grid$(this).css('left', target_x).css('top',target_y+COLUMN_MARGIN);

			if (callback) callback;

		}else{
			
			grid$(this).stop();
			
			grid$(this).animate(
				{
					left: target_x + 'px',
					top: target_y+COLUMN_MARGIN + 'px',
					borderWidth: "10px"
				},
				500,
				'easeInOutCubic',
				function() {

					if (items.length == itemIndex) bindLinkEvent();
					
				}
				
			);
			
		}
		_max_col=(_max_col<cursor)?cursor:_max_col;
	});


	fillGrid(lastItem, missing_columns, target_x, target_y);

	
	var target_x=parseInt((grid$('body').innerWidth()-(COLUMN_WIDTH+COLUMN_MARGIN)*(_max_col+1))/2)-0;

	grid$('#grid').stop();
	grid$('#header').stop();
	grid$('#home-details').stop();
	grid$('#footer').stop();

	target_x = parseInt((_window_w - (max_pos * (COLUMN_WIDTH+COLUMN_MARGIN))) / 2);

	grid$('#breadcrumb').animate({
		"width": ((COLUMN_WIDTH+COLUMN_MARGIN) * max_width) - COLUMN_MARGIN,
		"left": target_x
	}, "medium");

	var sectionExternalLink = grid$('#sectionExternalLink');

	if (sectionExternalLink) {

		sectionExternalLink.animate({

			'width': ((COLUMN_WIDTH+COLUMN_MARGIN) * max_width) - COLUMN_MARGIN - 8,
			'left': target_x,
			'top': _footer_y
		})


	}

	_footer_y += sectionExternalLink.outerHeight();
	
	if(!mode){
		grid$('#header').css('right',target_x);
		grid$('#grid').css('left',target_x);
		grid$('#home-details').css({'left':target_x,'top':_footer_y, 'width':columns*COLUMN_WIDTH});
		//grid$('#footer').css({'left':0,'top':_footer_y, 'width':columns*COLUMN_WIDTH});
		grid$('#footer').css({'left':0,'top':_footer_y, 'width':_window_w});
	}else{
		grid$('#grid').animate({left:target_x},500,'easeInOutCubic');
		grid$('#header').animate({right:target_x},500,'easeInOutCubic');
		grid$('#home-details').animate({left:target_x,top:_footer_y, width:columns*COLUMN_WIDTH},500,'easeInOutCubic');
//		grid$('#footer').animate({left:target_x,top:_footer_y, width:columns*COLUMN_WIDTH},500,'easeInOutCubic');
		grid$('#footer').animate({left:0,top:_footer_y, width:_window_w},500,'easeInOutCubic');
	}



};

function fillGrid(lastItem, missing_columns, target_x, target_y) {
	
	var minIndex = 1;
	var maxIndex = 47;
	var picIndexes = new Array(missing_columns);
	var picIndex;

	for (var i = 0; i < missing_columns; ++i) {

		do {

			picIndex = Math.floor(Math.random() * (maxIndex - minIndex + 1)) + minIndex;

		} while (picIndexes.indexOf(picIndex) > -1)

		picIndexes[i] = picIndex;
		
		lastItem.after('<div class="item filler"><div class="body" style="overflow: hidden;"><div class="asyncImgLoad" style="height: 172px;" title="images/filler/' + picIndexes[i] + '.jpg"></div></div></div>');
		//<img src="images/filler/' + picIndexes[i] + '.jpg" style="width: 175px; height: 174px;" />
				
	}

	var itemIndex = 0;
	
	grid$('#grid div.item.filler').each(function() {

		++itemIndex;

		var filler_x = target_x + ((COLUMN_WIDTH+COLUMN_MARGIN) * (itemIndex));
		var filler_y = target_y + COLUMN_MARGIN;
				
		grid$(this).css({
			"top": filler_y,
			"left": filler_x,
			"height": 190,
			"display": "none"
		}).fadeIn(1000);
		
	});
	
}

function getMin(array) {

	var min = 0;

	for (var i = 0; i < array.length; ++i) {

		min = Math.min(min, array[i]);

	}

	return min;

}
