/* Javascripts for scenario lists  */

var g_scenario_id = 0;
var g_preview_id = "";
var g_board_type = "normal";
var g_timer = null;
var g_panel_on = false;
var k_open_delay = 500;  // In miliseconds


function sc_settext(target_id, str)
{
	el = document.getElementById(target_id);
	if (el)
	{
		el.innerHTML = str;
		
		// get  the widgets initialized
		var scriptElems = el.getElementsByTagName("script"); 
		for( var ii=0; ii < scriptElems.length; ii++) {
			eval(scriptElems[ii].text);
		}
		registerAllWidgets();
	}
}

function msg(str)
{
	//sc_settext("toto", str);
}

function sc_ajax(req, target_id)
{ // Replace the inner content of the target by whatever the AJAX call returns
	var xmlHttp = null;
	if (window.XMLHttpRequest) 
	{
		xmlHttp = new XMLHttpRequest();
		if (xmlHttp.overrideMimeType)
			xmlHttp.overrideMimeType("text/html");
	}
	else if (window.ActiveXObject) 
	{
		 try 
		 {
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		 } 
		 catch (e) 
		 {
				try 
				{
					 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				} 
				catch (e) 
				{
					return false;
				}
		 }
	}
	
	cs_loader_icon(target_id);
	
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			if (xmlHttp.status == 200) 
			{
				sc_settext(target_id, xmlHttp.responseText);
			}
		}
	};
	xmlHttp.open("GET", req, true);
	xmlHttp.send(null);
	return true;
}

function cs_get_element_height(target_node)
{ // IE6 compliant :-(
	var myHeight = 0;
	if (typeof(target_node.innerHeight)=="number")
		myHeight = target_node.innerHeight;
	else if (target_node.clientHeight)
		myHeight = target_node.clientHeight
	else
		myHeight = target_node.offsetHeight;
	return myHeight;
}

function cs_loader_icon(target_id)
{
	var target_node = document.getElementById(target_id);
	var	new_node = document.createElement("div");
	var	sub_node = document.createElement("div");
	if (target_node && new_node && sub_node)
	{
    new_node.style.height = cs_get_element_height(target_node).toString() + "px";	// Needed for IE6
		sub_node.className = "sc_ajax_spinner";
		new_node.appendChild(sub_node);
		new_node.className = "sc_ajax_loader";
		target_node.appendChild(new_node);
	}
}

function sc_timerstart(scenario_id, board_type)
{
	if (scenario_id != g_scenario_id)
	{
		//msg("START TIMER " + scenario_id.toString() + " at " + Date.now() + " g_scenario_id=" + g_scenario_id.toString() + " scenario_id=" + scenario_id.toString());
		sc_timerabort();
		g_scenario_id = scenario_id;
		g_board_type = board_type;
		g_timer = setTimeout(sc_openpreview, k_open_delay);
	}
}

function sc_timerabort()
{
	//msg("ABORT TIMER " + g_scenario_id.toString());
	g_scenario_id = 0;
	if (g_timer) clearTimeout(g_timer);
	g_timer = null;
}

function sc_get_window_size() 
{ // Reliable way to get the window *content* size with all browsers. See http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == "number" )
	{
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in "standards compliant mode"
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth, myHeight];
}

function sc_get_scrollXY() 
{ // Reliable way to get the scoll value with all browsers. See http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == "number" ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function sc_get_lefttop(el, stopClass, wantFixed)
{ // Get the top left coordinates of an element. If wantFixed, returns in global ("fixed") coordinates
	var curleft = 0;
	var curtop = 0;
	var obj = el;
	var class_regex = new RegExp("\\b"+stopClass+"\\b");
	
	while(obj && (stopClass=="" || !obj.className || !obj.className.match(class_regex)))
	{
		curleft += obj.offsetLeft;
		curtop += obj.offsetTop;
		obj = obj.offsetParent;
	}
	
	
	if (wantFixed)
	{
		var scrollXY = window.sc_get_scrollXY();
		curleft -= scrollXY[0];	// Convert to "fixed" coordinates
		curtop -= scrollXY[1];
	}
	return [curleft, curtop];
}

function sc_find_container(el)
{ // Find our container div
	while (el && (!el.className || !el.className.match(/\bsc_container\b/)))
	{
		el = el.offsetParent;
	}
	return el;
}

function sc_find_container_id(el)
{
	var container = sc_find_container(el);
	if (container && container.id)
	{
		return container.id;
	}
	else
	{
		return "";
	}
}


function sc_openpreview()
{
	if (!g_panel_on)
	{ // Open Panel
		//msg("OPEN PANEL " + g_scenario_id.toString());
		
		
		var el_line = document.getElementById("line_"+g_scenario_id.toString());
		if (!el_line)	return;
		
		var container_id = sc_find_container_id(el_line); 
		if (container_id=="") return;

		g_preview_id = "preview_"+container_id;
		var el = document.getElementById(g_preview_id); 
		if (!el) return;
		
		//-- Set the right size to the panel, depending on the type of the board
		var width_div = "566";
		var height_div = 227;
		var left_adjustment = 60;
		switch (g_board_type)
		{
			case "overlord":
				width_div = "819";
				left_adjustment = 4;
				break;
			case "brkthru":
				height_div = 330;
				break;
		}
		
		//-- Get the top left coordinates of the current line and move the panel before displaying it
		var lefttop = sc_get_lefttop(el_line, "sc_container", false);		
		var lefttop_global = sc_get_lefttop(el_line, "", true);		
		
		var new_left = lefttop[0] + left_adjustment;
		var new_top;
				
		if (lefttop_global[1] + el_line.offsetHeight + height_div > sc_get_window_size()[1])
		{ // Bottom is going to be cut off -> display above
			new_top = lefttop[1] - height_div - 2;
		}
		else
		{
			new_top = lefttop[1] + el_line.offsetHeight
		}
				
		el.style.left = new_left.toString() + "px";
		el.style.top = new_top.toString() + "px";
		el.style.width = width_div + "px";
		
		el.style.display = "";
		

		var iframeElem = null;
		var allIFrames = gDOMHelper.getAllSubElements(el , "IFRAME");
		for (var ii in allIFrames) {
			var curIFrameElem = allIFrames[ii];
			curIFrameElem.style.display="none";
			if (curIFrameElem.id == "preview_"+g_scenario_id) {
				iframeElem = curIFrameElem;
				curIFrameElem.style.display="";
			} 
		}
		
		if (!iframeElem) {
			if (!popup_lang) {
				popup_lang = 'en';
			}
			iframeElem = document.createElement("iframe");
			iframeElem.id = "preview_"+g_scenario_id;
			iframeElem.style.border= "none";
			iframeElem.scrolling="no";
			iframeElem.style.width = (+width_div+2)+"px";
			iframeElem.style.height = (height_div+2).toString()+"px";
			iframeElem.src = "/memoir44/"+popup_lang+"/dowpage/scenario/"+g_scenario_id+"/preview";
			el.appendChild(iframeElem);
		}
		
		g_panel_on = true;
	}
	else
	{ // Already open
		//msg("OPEN PANEL (already open) " + g_scenario_id.toString());
	}
}

function sc_closepreview()
{
	//msg("CLOSE PANEL ");
	if (g_preview_id != "")
	{
		el = document.getElementById(g_preview_id);
		if (el) {
			el.style.display = "none";
		}
		g_panel_on = false;
		g_preview_id = "";
	}
}



function SC_PopupPreview() {
}
SC_PopupPreview.prototype = new DowWidget;

SC_PopupPreview.prototype.postInit = function() {
	this.popupElem = this.getWidgetElement();
	this.bindEvent(this.popupElem,"mouseout","mouseoutAction");
	this.bindEvent(this.popupElem,"mouseover","mouseoverAction");
}

SC_PopupPreview.prototype.mouseoutAction = function (event) {
	if (!gDOMHelper.isAncestor(event.relatedTarget, this.popupElem)) //IE6 toElement
	{
		if (!event.ctrlKey) { //to debug, we can leave there, not really a problem and always useful
			sc_timerabort();
			sc_closepreview();
		}
	}
}

SC_PopupPreview.prototype.mouseoverAction = function (event) {
	sc_timerstart(this.params.scenario_id, this.params.board_type);
}


//-- Search engine
function cs_search_addfilter(scenario_list_id, filter_name)
{
	return filter_name + "=" + escape(document.forms["sc_search_" + scenario_list_id].elements[filter_name].value);
}

function cs_search_nopagereset(scenario_list_id)
{
	var filters = "";
	if (document.forms["sc_search_" + scenario_list_id]) // It is possible to have no search engine
	{
		filters += cs_search_addfilter(scenario_list_id, "is_sed");
		filters += "&" + cs_search_addfilter(scenario_list_id, "selshow");
		filters += "&" + cs_search_addfilter(scenario_list_id, "sellang");
		filters += "&" + cs_search_addfilter(scenario_list_id, "selfront");
		filters += "&" + cs_search_addfilter(scenario_list_id, "seltext");
		if (!cs_is_search_easy(scenario_list_id))
		{
			filters += "&" + cs_search_addfilter(scenario_list_id, "seltype");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selyear");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selmonth");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selday");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selauthor");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_tp");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_ef");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_pt");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_ap");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_mt");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_bm");
			filters += "&" + cs_search_addfilter(scenario_list_id, "selpack_cb");
		}
	}
	
	//-- Retrieve the current sort and other parameters that were stored in the list
	var list_el = document.getElementById(scenario_list_id);
	var input_elems = list_el.getElementsByTagName("input");
	for (i=0; i<input_elems.length; ++i)
	{
		el = input_elems[i];
		if (el.name == "sort" || el.name == "sort_order" || el.name == "scenario_list_id" || el.name == "type" || el.name == "status" ||
				el.name == "only_user" || el.name == "show_btn" || el.name == "paginate" || el.name == "start" || el.name == "page_limit")
			filters += "&" + el.name + "=" + el.value;
	}	
		
	sc_ajax("/memoir44/scenario_list/?" + filters, scenario_list_id);
}

function cs_search(scenario_list_id)
{
	cs_reset_pager(scenario_list_id);
	cs_search_nopagereset(scenario_list_id);
}

function sc_sortby(scenario_list_id, sort, sort_order)
{
	//-- Retrieve current filters
	var filters = "";
	var list_el = document.getElementById(scenario_list_id);
	if (!list_el) return;
	var input_elems = list_el.getElementsByTagName("input");
	for (i=0; i<input_elems.length; ++i)
	{
		el = input_elems[i];
		if (el.name == "start")	// Changing sort means restarting at first page
			el.value = "0";
		if (el.name == "filters")
			filters += "&" + el.value;
		if (el.name == "sort" || el.name == "sort_order" || el.name == "scenario_list_id" || el.name == "type" || el.name == "status" ||
				el.name == "only_user" || el.name == "show_btn" || el.name == "paginate" || el.name == "start" || el.name == "page_limit")
			filters += "&" + el.name + "=" + el.value;
	}	
	//-- Add sort
	filters += "&sort=" + sort + "&sort_order=" + sort_order;
		
	sc_ajax("/memoir44/scenario_list/?" + filters, scenario_list_id);
}

function cs_pack_getdata(el_sel, pack_id)
{
	var parent = el_sel.parentNode;
	var input_elems = parent.getElementsByTagName("input");
	for (i=0; i<input_elems.length; ++i)
	{
		el = input_elems[i];
		if (el.name == "selpack_"+pack_id)
			return el;
	}
	return null;
}

function cs_pack_set(el_sel, el_data, new_value)
{
	el_data.value = new_value.toString();
	el_sel.style.backgroundPosition = "0 -" + (new_value*16).toString() + "px";
}

function cs_pack_copyvalue(id)
{
	el_data = cs_pack_getdata(el_sel, pack_id);
	cs_pack_set(el, el_data, Number(el_data.value));
}

function cs_pack_toggle(el_sel, pack_id)
{
	el_data = cs_pack_getdata(el_sel, pack_id);
	if (!el_data) return;
	new_value = (Number(el_data.value)+1) % 3;
	cs_pack_set(el_sel, el_data, new_value);
}


function cd_find_advanced(el_collapser)
{
	el = el_collapser.parentNode;	// td
	el = el.parentNode; // tr
	while (el)
	{
		if (el.className && el.className.match(/\bcs_search_advanced\b/))
			return el;
		el = el.nextSibling; // next tr
	}
	return null;
}

function cs_collapse(el_collapser)
{
	el_advanced = cd_find_advanced(el_collapser);
	if (!el_advanced) return;
	if (el_collapser.className == "sc_search_title_collapser")
	{ // Hide
		el_collapser.className = "sc_search_title_collapser sc_search_title_collapser_plus";
		el_advanced.style.display = "none";
	}
	else
	{ // Show
		el_collapser.className = "sc_search_title_collapser";
		el_advanced.style.display = "";
	}
}

function cs_is_search_easy(scenario_list_id)
{
	var div_elements = document.forms["sc_search_" + scenario_list_id].getElementsByTagName("div")
	for (i=0; i<div_elements.length; ++i)
	{
		el = div_elements[i];
		if (el.className && el.className.match(/\bsc_search_title_collapser\b/))
		{
			return (el.className.match(/\bsc_search_title_collapser_plus\b/));
		}
	}
	return null;
}

function cs_reset_pager(scenario_list_id)
{
	var list_el = document.getElementById(scenario_list_id);
	if (!list_el) return;
	var input_elems = list_el.getElementsByTagName("input");
	for (i=0; i<input_elems.length; ++i)
	{
		el = input_elems[i];
		switch(el.name)
		{
			case "start":
				el.value = "0";
				return;
				break;
		}
	}
}

function cs_pager(scenario_list_id, start, count)
{
	var list_el = document.getElementById(scenario_list_id);
	if (!list_el) return;
	var input_elems = list_el.getElementsByTagName("input");
	for (i=0; i<input_elems.length; ++i)
	{
		el = input_elems[i];
		switch(el.name)
		{
			case "start":
				el.value = start;
				break;
			case "page_limit":
				el.value = count;
				break;
		}
	}
	cs_search_nopagereset(scenario_list_id);
}

function cs_change_limit(scenario_list_id, new_limit)
{
	var list_el = document.getElementById(scenario_list_id);
	var input_elems = list_el.getElementsByTagName("input");
	for (i=0; i<input_elems.length; ++i)
	{
		el = input_elems[i];
		switch(el.name)
		{
			case "paginate": el.value = (new_limit == "") ? "0" : "1"; break;
			case "page_limit": el.value = new_limit; break;
		}
	}
	cs_search(scenario_list_id);
}

function cs_show_variants(el, scenario_id)
{
	//-- Toggle image
	var show = el.src.match(/arrow_right3/);
	if (show)
		el.src = el.src.replace("arrow_right3", "arrow_down3");
	else
		el.src = el.src.replace("arrow_down3", "arrow_right3");
	
	//-- Move up until we find the <tr>
	while (el && el.tagName != "TR")
		el = el.parentNode;
	
	if (!el) return;
	
	//-- Then walk the next siblings as long as they are variants
	el = el.nextSibling;
	while (el && el.className && el.className.match(/sc_line_color_variant/))
	{
		el.style.display = (show) ? "" : "none";
		el = el.nextSibling;
	}
}

//******  (JFS) nice place/file to put 100% paging and sorting, since I already include this file, when I where I need it. Not used by Yann im tmpl (yet)

var gJFSPager = {};  //to avoid namespace conflicts (might be upgraged to full prototype or widget later)


gJFSPager.prevPage = function(pagerJSObj) {
	if (pagerJSObj.pageNumber > 1) {
		pagerJSObj.pageNumber--;
	}
	gJFSPager.updatePage(pagerJSObj);
}

gJFSPager.nextPage = function(pagerJSObj) {
	if (pagerJSObj.pageNumber < pagerJSObj.nbrPage) {
		pagerJSObj.pageNumber++;
	}
	gJFSPager.updatePage(pagerJSObj);
}



gJFSPager.sc_sortby = function(pagerJSObj, sort, sort_order) {
	function sort_asc_text(obj1,obj2) {
		return obj1.value.localeCompare(obj2.value);
	}

	function sort_asc_num(obj1,obj2) {
		var num1 = +obj1.value;
		var num2 = +obj2.value;
		return num2 - num1;
	}

	if (!pagerJSObj.sort_info) {
		pagerJSObj.sort_info={};
	}
	if (!pagerJSObj.sort_info[sort]) {
		pagerJSObj.sort_info[sort]=sort_order; //why not initialize with this? 
	}
	

	var fieldClass;
	var header;
	var sortfn=sort_asc_text;
	switch(sort) {
		case 'operation_name': fieldClass= "sc_operation"; header="operation";break;
		case 'front': fieldClass=  "sc_front";header="front"; break;
		case 'login': fieldClass=  "sc_author"; header="author"; break;
		case 'mod_date': fieldClass=  "sc_lastedit"; header="lastedit"; break;
		case 'nbStars': fieldClass=  "sc_rating"; sortfn=sort_asc_num; header="rating"; break;
		case 'nbRatings': fieldClass=  "sc_aar"; sortfn=sort_asc_num; header="aar"; break;
	}

	
	var listElem = document.getElementById(pagerJSObj.scenario_list_id);
	var allLines = gDOMHelper.getAllSubElements(listElem , "TR" , "sc_line");
	var toSort = [];
	for (var ii in allLines) {
		var trElem = allLines[ii];
		var id_str = trElem.getAttribute("id");
		var tdElems = gDOMHelper.getAllSubElements(trElem , "TD" , fieldClass);
		var stringValue = gDOMHelper.getTextValue(tdElems[0]);
		toSort.push({'value':stringValue,'id':id_str});
	}
	
	toSort.sort(sortfn);
	if (pagerJSObj.sort_info[sort]=='desc') {
		toSort.reverse();
	}
/*	
	var result="";
	for (var ii in toSort) {
		result += toSort[ii].id + " ";
	}
	alert("sorted: "+result);
*/

	var evenodd=1;
	for (var ii in toSort) {
		trElem =  document.getElementById(toSort[ii].id);
		gDOMHelper.setElementClass(trElem, "sc_line_color"+evenodd);
		gDOMHelper.unsetElementClass(trElem, "sc_line_color"+(1-evenodd));
		
		trElem.parentNode.appendChild(trElem);
		evenodd = 1-evenodd;
	}

	if (pagerJSObj) {
		pagerJSObj.pageNumber=1;
		gJFSPager.updatePage(pagerJSObj);
	}
	
	var sort_icon_id = pagerJSObj.scenario_list_id+"_sort_icon_"+header;
	var sort_icon_span = document.getElementById(sort_icon_id);
	var template_span = document.getElementById(pagerJSObj.sort_info[sort]=='desc' ? "up_icon_template" : "down_icon_template");
	
	var cloned_span = template_span.cloneNode(true);
	cloned_span.setAttribute("id",sort_icon_id);
	
	sort_icon_span.parentNode.replaceChild(cloned_span,sort_icon_span);
	
	pagerJSObj.sort_info[sort]=pagerJSObj.sort_info[sort]=='desc' ? "asc" : "desc"
}



gJFSPager.updatePage = function(pagerJSObj) {
	var pageElem = document.getElementById("pageNbr");
	if (pageElem) {
		gDOMHelper.setTextValue(pageElem,pagerJSObj.pageNumber);
	}
	
	var listElem = document.getElementById(pagerJSObj.scenario_list_id);
	var allLines = gDOMHelper.getAllSubElements(listElem , "TR" , "sc_line");
	var curIndex = 1;
	var curPage = 1;
	for (var ii in allLines) {
		var trElem = allLines[ii];
		
		if (curPage==pagerJSObj.pageNumber) {
			trElem.style.display="";
		} else {
			trElem.style.display="none";
		}
		curIndex++;
		if (curIndex>pagerJSObj.pageSize) {
			curIndex=1;
			curPage++;
		}
	}
}

//   ********* End JFS
