
//-----Data Arays
//To dorting by name
var CL_GamesByName = new Array(CL_GamesCount);

//To force row access
var CL_GamesRow =new Array(CL_GamesCount);

//-------Global variables
var current_page = -1;
var displayin_as_pages = true;
var is_gamename_array_sorted = false;

//0 - popular, 1 - name
var current_sort_mode = 0;

//Root 
var root_rows = null;

//One group contain 10 pages
var pages_count = 0;
var PAGE_COUNT_IN_GROUP = 10;

var CL_page_range_first = 0;
var CL_page_range_last = 0;


var inited=false;

var CL_smod = 0;
var CL_vmod = 0;
var CL_apage = 0;
//---------------------------------------------------------


//------- Initialization-----------------------------------
function CL_TryInit()
{
	try
	{
		if ( inited )
			return true;
			
		var temp = document.getElementById("PageResultBottomID");
		
		if(temp)
		{
			//Parse url
			CL_SortingViewModesInit(window.location.search);

			//Init array		
			CL_InitSorting();

			//Sort and rearange
			CL_ChangeSortingModeAndRearangeRows(CL_smod);

			//Sort by popular
			if(CL_vmod == 0)
			{
				//Show first page
				CL_ShowPage(CL_apage,true);
				displayin_as_pages = true;
			}
			//Sort by name
			else
			{
				//Show all games
				CL_ShowAllRow();
				displayin_as_pages = false;
				
				//If view all | page result NOT refresh page - remove it
				current_page = CL_apage;
			}
		
		
			//Update navArea
			CL_UpdateNavigatioArea();

			//Show NavArea
			CL_ShowHideTag("TopNavigationAreaID",true);
			CL_ShowHideTag("BottomNavigationAreaID",true);
		}
		else
		{
			inited = false;
			return false;
		}
		
		inited = true;
	}
	catch(e)
	{
		inited = false;
		return false;
	}
	
	return true;
}

function CL_InitSorting()
{
	var res="";
	
	//Map rows to array	
	CL_CreateRowsArray();
	
	//Init Root object
	var row_obj = CL_GamesRow[0];	
	if(row_obj)
	{
		if(row_obj.row)
		{
			root_rows = row_obj.row.parentNode;
		}
	}

	//Calculate pages count
	pages_count = Math.ceil(CL_GamesCount/CL_GamesPerPage);
	
	CL_page_range_first = 0;
	CL_page_range_last = CL_page_range_first+PAGE_COUNT_IN_GROUP-1;
	
	if(CL_page_range_last >= pages_count)
	{
		CL_page_range_last = pages_count-1;
	}
	
	inited = true;
	
}

//Create structure for one game row , includeing separator tag
function CL_CreateGameObject(_obj,_name)
{
	this.RowObj = _obj;
	this.Name = _name;
}

//Create list of games, for sorting
function CL_InitGamesListWithNames()
{
	var name_tag;
	
	for(var i = 0 ; i < CL_GamesCount; ++i )
	{
		name_tag = document.getElementById("GLN_"+i);
		if(name_tag)
		{
			CL_GamesByName[i]=new CL_CreateGameObject(CL_GamesRow[i],name_tag.innerHTML );
		}
		else
		{
			CL_GamesByName[i]=new CL_CreateGameObject(CL_GamesRow[i],"");
		}
	}
	
}

//Create structure for one game row , includeing separator tag
function CL_CreateRowObject(_row,_separator)
{
	this.row = _row;
	this.separator = _separator;
}

//Map rows to array
function CL_CreateRowsArray()
{
	var row;
	var separator;
		
	for (var i = 0; i < CL_GamesCount; ++i)
	{
		row = document.getElementById("GL_"+i);
		separator = document.getElementById("GLS_"+i);

		CL_GamesRow[i] = new CL_CreateRowObject(row,separator);
	}
}
//---------------------------------------------------------



//------- Events--------------------------------------------
function CL_CillEvent(event)
{

	event=event||window.event;

	if (event.preventDefault)
		event.preventDefault()
	else
		event.returnValue= false
}

function CL_OnPageChange(event, num)
{
	try
	{
		CL_CillEvent(event);

		//Init
		if(!CL_TryInit())return false;

		num = CL_page_range_first + num;
		
		//Show page
		CL_ShowPage(num,false);

		//Update nav Area		
		CL_UpdateNavigatioArea();
		
	}
	catch(e)
	{
		inited = false;
	}
	
	return false;	
}

function CL_OnPagesScroll(event, direction)
{
	try
	{
		CL_CillEvent(event);

		//Init
		if(!CL_TryInit())return false;

	
		//Scroll pages group
		var tmp_page = current_page;
		
		//scroll	
		tmp_page+=direction;
		if(tmp_page < 0)
			return false;

		if(tmp_page >= pages_count)
			return false;
		
		//Out to left - shift
		if(tmp_page < CL_page_range_first)
		{
			CL_page_range_first = tmp_page;
			CL_page_range_last = CL_page_range_first+PAGE_COUNT_IN_GROUP-1;
		}
		
		//Out right
		if(tmp_page > CL_page_range_last)
		{
			CL_page_range_last = tmp_page;
			CL_page_range_first = CL_page_range_last - PAGE_COUNT_IN_GROUP + 1;
			
		}
		
		//Trunk ranges
		if(CL_page_range_last >= pages_count)
		{
			CL_page_range_last = pages_count-1;
		}
		
		if(CL_page_range_first < 0 )
		{
			CL_page_range_last = 0;
		}

		CL_ShowPage(tmp_page,false);
		

		//Update nav Area		
		CL_UpdateNavigatioArea();
	}		
	catch(e)
	{
		inited = false;
	}
	
	
	return false;	
}

function CL_OnSortingModeChange(event, mode)
{
	//Now is ViewAll, we need refresh page
	if(!displayin_as_pages)
	{
		return true;
	}
	
	try
	{
		CL_CillEvent(event);

		//Init
		if(!CL_TryInit())return false;
		
		CL_ChangeSortingMode(mode);
		
		CL_UpdateNavigatioArea();
	}		
	catch(e)
	{
		inited = false;
	}
	
	return false;	

}
//--------------------------------------------------




//------- Pages Managament--------------------------
//Show one page
function CL_ShowPage(page_num,force)
{
	//The same page, do nothing
	if(page_num == current_page && !force)
		return false;

	//Currenly displayed  page, hide it
	if(current_page > -1)
	{
		HidePage(current_page);
	}
	
	//Show by pages
	CL_ShowOnePage(page_num);
		
	current_page = page_num;
	
	return false;
}
//---------------------------------------------------------



//------- Hide Pages---------------------------------------
//Hide One Page
function HidePage(page_num)
{
	if(page_num < 0)
		return false;
		
	var first_game_idx = CL_GamesPerPage*page_num;
	var after_last_game_idx = first_game_idx + CL_GamesPerPage;
	
	for(var i = first_game_idx ; i < after_last_game_idx; ++i)
	{
		CL_HideOneRow(i);
	}
}

//Hide one game
function CL_HideOneRow(row_num)
{
	var row_obj = CL_GetRow(row_num);
	if(row_obj)
	{
		CL_ShowHideObject(row_obj.row,false);
		CL_ShowHideObject(row_obj.separator,false);
	}
}

//Hide all games
function CL_HideAllRow()
{
	for (var i = 0 ; i < CL_GamesCount ; ++i )
	{
		CL_HideOneRow(i);
	}
}
//---------------------------------------------------------



//------- Show Pages --------------------------------------
//Show One page
function CL_ShowOnePage(page_num)
{
	var first_game_idx = CL_GamesPerPage* page_num ;
	var after_last_game_idx = first_game_idx + CL_GamesPerPage;
	var las_showed_idx = -1;
	
	for(var i = first_game_idx ; i < after_last_game_idx; ++i)
	{
		if( CL_Show_OneRow(i,true) )
		{
			las_showed_idx = i;
		}
	}
		
	CL_Show_OneRow(las_showed_idx,false);
	
}

//Show one game
function CL_Show_OneRow(row_num, sep)
{
	var row_obj = CL_GetRow(row_num);
	var showed=false;
	
	if(row_obj)
	{
		CL_ShowHideObject(row_obj.row,true);
		CL_ShowHideObject(row_obj.separator,sep);
		showed = true;
	}
	
	return showed;
}


//Show all games
function CL_ShowAllRow()
{
	var las_showed_idx = -1;
	for (var i = 0 ; i < CL_GamesCount; ++i )
	{
		if( CL_Show_OneRow(i,true) )
		{
			las_showed_idx = i;
		}
	}

	CL_Show_OneRow(las_showed_idx,false);
}


//---------------------------------------------------------



//------- Sorting -----------------------------------------
function CL_ChangeSortingMode(mode)
{
	//Sort and rearange
	CL_ChangeSortingModeAndRearangeRows(mode);
	
	//Set first page
	CL_page_range_first = 0;
	CL_page_range_last = CL_page_range_first+PAGE_COUNT_IN_GROUP-1;
	
	if(CL_page_range_last >= pages_count)
	{
		CL_page_range_last = pages_count-1;
	}
		
	//Show firs page
	CL_ShowPage(0,true);
	
	displayin_as_pages = true;
	
	CL_UpdateNavigatioArea();
	
	//Update reference
	CL_SetReferences();
}

//Comparation method
function CL_GamesComparer(g1,g2)
{
	var g1n = g1.Name.toLowerCase();
	var g2n = g2.Name.toLowerCase();
	
	return ( (g1n < g2n) ? -1 : ( (g1n > g2n) ? 1:0 ) ) ;
}

//Sorting array by MostPopular 
function CL_ChangeSortingModeAndRearangeRows(sorting_mode)
{
		
	//The same sorting
	if(current_sort_mode == sorting_mode)
		return false;

	current_sort_mode = sorting_mode;	


	//Sort by name 
	if(!is_gamename_array_sorted)
	{
		//Map rows to array to sorting by name
		CL_InitGamesListWithNames();
		
		//Sorting
		CL_GamesByName.sort(CL_GamesComparer);
		
		is_gamename_array_sorted = true;
	}
	
	var row_obj;
	
	//Hide All
	CL_HideAllRow();
	
	//Reattach
	for (var i = 0 ; i < CL_GamesCount; ++i )
	{
		row_obj = CL_GetRow(i);
		if(row_obj)
		{
			if(row_obj.row)
			{
				root_rows.appendChild(row_obj.row);	
			}
			if(row_obj.separator)
			{
				root_rows.appendChild(row_obj.separator);	
			}
		}
	}

	return false;
}
//---------------------------------------------------------



//----- Page Scrolling ------------------------------------
//Redraw numbers
function CL_RefreshPagesNums()
{
	CL_RefreshPageNumPart("top");
	CL_RefreshPageNumPart("bottom");
	
}

function CL_RefreshPageNumPart(position)
{
	var page_num_tag;
	var temp_page_num = CL_page_range_first;
	for(var i = 0; i < PAGE_COUNT_IN_GROUP; ++i)
	{
		//Show
		if(temp_page_num < pages_count)
		{
			if(temp_page_num!=current_page)
			{
				//Cell
				page_num_tag = CL_ShowHideTag("PNE"+position+"_ID_"+i,true);
				page_num_tag = CL_ShowHideTag("PND"+position+"_ID_"+i,false);
				//Text
				page_num_tag = document.getElementById("PNAE"+position+"_ID_"+i);
				if(page_num_tag)
					page_num_tag.innerHTML = temp_page_num+1;
				
			}
			else
			{
				//Cell
				page_num_tag = CL_ShowHideTag("PNE"+position+"_ID_"+i,false);
				page_num_tag = CL_ShowHideTag("PND"+position+"_ID_"+i,true);
				//Text
				page_num_tag = document.getElementById("PNAD"+position+"_ID_"+i);
				if(page_num_tag)
					page_num_tag.innerHTML = temp_page_num+1;
			}
		}
		//Hide
		else
		{
			CL_ShowHideTag("PNE"+position+"_ID_"+i,false);
			CL_ShowHideTag("PND"+position+"_ID_"+i,false);
		}
		
		temp_page_num++;
	}
}

function CL_RefreshAllArrows()
{
	//Refresh Arrows
	CL_RefreshArrows("top");
	CL_RefreshArrows("bottom");
}

function CL_RefreshArrows(position)
{
	//Left
	if(current_page <= 0)
	{
		CL_RefreshOneArrows("L","D",position,true);
		CL_RefreshOneArrows("L","E",position,false);
	}
	else
	{
		CL_RefreshOneArrows("L","D",position,false);
		CL_RefreshOneArrows("L","E",position,true);
	}	
	
	//Right
	if(current_page >= pages_count-1)
	{
		CL_RefreshOneArrows("R","D",position,true);
		CL_RefreshOneArrows("R","E",position,false);
	}
	else
	{
		CL_RefreshOneArrows("R","D",position,false);
		CL_RefreshOneArrows("R","E",position,true);
	}	
}

//Draw one arrow 
function CL_RefreshOneArrows(direction,enabling,position,show)
{
	CL_ShowHideTag(direction+"A"+enabling+position,show);
}
//-------------------------------------------------------




//--------- Utils --------------------------------------
//Get Row in table
function CL_GetRow(num)
{
	if(num >= CL_GamesCount)
		return null;
	
	if(current_sort_mode == 0)
	{
		return CL_GamesRow[num];
	}
	else
	{
		var temp = CL_GamesByName[num];
		if(temp)
		{
			return temp.RowObj;
		}
		return null;
	}
}

function CL_ShowHideTag(id,show)
{
	tag = document.getElementById(id);
	CL_ShowHideObject(tag,show);
}

function CL_ShowHideObject(obj, show)
{
	if(obj)
	{
		if(show)
		{
			obj.style.display="";
		}
		else
		{
			obj.style.display="none";
		}
	}
}
//-------------------------------------------------------
	


// ---------------- Navigation Area Update ---------------
function CL_UpdateNavigatioArea()
{
	//Sorting Mode
	CL_ShowSortModeMethod("MostPopular",	!(current_sort_mode == 0)	);
	CL_ShowSortModeMethod("GameName",		(current_sort_mode == 0)	);
	
	//Numbers
	CL_ShowHideNumbersCaptions(displayin_as_pages);
	
	//All-Paged
	CL_ShowHidePagedResultCaptions(!displayin_as_pages);
	
	//Update reference
	CL_SetReferences();
}


function CL_ShowSortModeMethod(mode,enabling)
{
	CL_ShowHideTag(mode+"TopEnabledID",enabling);
	CL_ShowHideTag(mode+"TopDisabledID",!enabling);
	CL_ShowHideTag(mode+"BottomEnabledID",enabling);
	CL_ShowHideTag(mode+"BottomDisabledID",!enabling);
}

function CL_ShowHideNumbersCaptions(show)
{
	//Show/Hide numbers block 
	CL_ShowHideTag("NumbersPagesTopID", show);
	CL_ShowHideTag("NumbersPagesBottomID", show);

	//Refresh data	
	if(show)
	{
		//Refresh Numbers
		CL_RefreshPagesNums();
	
		//Refresh Arrows
		CL_RefreshAllArrows();
	}
}

function CL_ShowHidePagedResultCaptions(show)
{
	CL_ShowHideTag("PageResultTopID", show);
	CL_ShowHideTag("PageResultBottomID", show);
}

//---------------------------------------------------------



//-------- References -------------------------------------
function CL_SetReferences()
{
	var tag;
	//ViewAll
	CL_SetReferenceOnTag("RefNumbersPagesTopID",current_sort_mode,1,current_page);
	CL_SetReferenceOnTag("RefNumbersPagesBottomID",current_sort_mode,1,current_page);
	
	//View Paged
	CL_SetReferenceOnTag("RefPageResultTopID",current_sort_mode,0,current_page);
	CL_SetReferenceOnTag("RefPageResultBottomID",current_sort_mode,0,current_page);
	
	//Sorting links
	CL_SetReferenceOnTag("RefMostPopularTopEnabledID",0,0,0);
	CL_SetReferenceOnTag("RefGameNameTopEnabledID",1,0,0);
	CL_SetReferenceOnTag("RefMostPopularBottomEnabledID",0,0,0);
	CL_SetReferenceOnTag("RefGameNameBottomEnabledID",1,0,0);
	
	//PageNums
	for(var i = 0; i < 10 ; ++i)
	{
		CL_SetReferenceOnTag("PNAEtop_ID_"+i,current_sort_mode,0,CL_page_range_first+i);
		CL_SetReferenceOnTag("PNAEbottom_ID_"+i,current_sort_mode,0,CL_page_range_first+i);
	}
	
	
}

function CL_SetReferenceOnTag(tagid,sortmode, viewmode,activepage)
{
	var tag = document.getElementById(tagid);
	if(tag)
	{
		tag.href=CL_UrlSetHeightParameter(CL_me_url+"&svmod=" + CL_GetSortMode(sortmode) + CL_GetViewMode(viewmode), viewmode);
	}
		
}

//---------------------------------------------------------



//----------------- URL processing-------------------------
function CL_GetSortMode(code)
{
	switch (code)
	{
		case 0:
			return "p";
		break;

		case 1:
			return "n";
		break;
	}
	
	return "p";
}

function CL_GetViewMode(code)
{
	switch (code)
	{
		case 0:
			return "p";
		break;

		case 1:
			return "a";
		break;
	}
	
	return "p";
}

function CL_GetCodeBySortMode(mode)
{
	switch(mode)
	{
		case "p":
			return  0;
		break;
		
		case "n":
			return  1;
		break;
	}
	
	return 0;
}

function CL_GetCodeByViewMode(mode)
{
	switch(mode)
	{
		case "p":
			return  0;
		break;
		
		case "a":
			return  1;
		break;
	}
	
	return 0;
}


function CL_SortingViewModesInit(_url)
{
	var urlstr = new String(_url);
	var tmp;
	
	params = urlstr.split("&");
	for(var i = 0; i < params.length; ++i)
	{
		tmp = CL_GetValue(params[i],"svmod=");
		if(tmp)
		{
			//Sortmode
			CL_smod = CL_GetCodeBySortMode(tmp.charAt(0));
			//PagedViewAll mode
			CL_vmod = CL_GetCodeByViewMode(tmp.charAt(1));
			
			//Page Num
			CL_apage = 0;
		}
			
	}
	
}

function CL_GetValue(src,field)
{
	if(!src)
		return -1;

	var pos = src.indexOf(field);
	if(pos < 0)
		return null;
		
	var data = src.substr(pos + field.length);
	
	return data;
}

function CL_UrlSetHeightParameter(_url,viewmode)
{
	var urlstr = new String(_url);
	var resurl=_url;

	var pos = urlstr.indexOf("innerHeight=");
	

	//Not found height
	if(pos==-1)
	{
	}
	//Found, replace
	else
	{
		var pos2 = pos + "innerHeight=".length;
	
		var pos3 = urlstr.indexOf("&",pos2);

		var url_begin = urlstr.substr(0,pos2);
		
		var url_end ="";
	
		if(pos3 != -1)
		{
			url_end = urlstr.substr(pos3);
		}
		
		var frame_games_count = CL_GamesCount;
		
		//Paged 
		if(viewmode==0)
		{
			if (frame_games_count > CL_GamesPerPage )
				frame_games_count = CL_GamesPerPage
		}
		
		framheight = CL_outer_height + frame_games_count * CL_one_row_height;
		
		var resurl=url_begin+framheight+url_end;
		
	}
	
	return resurl;
	
}
//---------------------------------------------------------
