/**
 * Tab hide/unhide functions
 */
var currentGridPages = new Object();
function showTab(tabGroup,tabIndex)
{
	hideAllTabs(tabGroup);
	addClass(document.getElementById("tabHeader_"+tabGroup+"_"+tabIndex), "selected");
	document.getElementById("tab_" + tabGroup + "_" + tabIndex).className = '';
}

function hideAllTabs(tabGroup)
{
	var tabChild = document.getElementById("tabGroup_" + tabGroup).firstChild;
	while(tabChild)
	{
		if(tabChild.id)
		{
			// set div of Tab hidden
			tabChild.className = "hidden";
			// remove selected marker of TabHeader
			stripClass(document.getElementById("tabHeader_" +tabChild.id.substring(4)), "selected");
		}
		tabChild = tabChild.nextSibling;
	}
}

function gridFilter(event, grid, instance) 
{
	onEnter(event, "showGridPage(1, "+grid+", null, "+instance+")");
}

function sortFromTableAjax(grid, orderBy, sortOrder, instance) 
{
	showGridPage(1, grid, null, "&orderby="+orderBy + "&sortorder=" + sortOrder + "&instance=" + instance);
}

function gridPageURL(visible, grid, additionalGet) {
	// Add request parameters.
	var i = 1;
	var fieldName = "hdr" + grid + "_" + i + "value";
	var param = document.getElementById(fieldName);
	var extraGet = "";
	while (param != null) {
		extraGet += "&"+ fieldName + "=" + param.value;
		
		i++;
		fieldName = "hdr" + grid + "_" + i + "value";
		param = document.getElementById(fieldName);
	}
	if (!additionalGet) additionalGet = "";
	
	var append = "";
	var href = location.href;
	while (/(lnkins_.*?=.*?)($|&)/.test(href)) {
		append += "&" + RegExp.$1;
		href = href.replace(/(lnkins_.*?=.*?)($|&)/, "");
	}
	
	if (isdefined('gridTabParents') && gridTabParents[grid])
	{
		for (var i = 0; i < gridTabParents[grid].length; i++)
		{
			var path = gridTabParents[grid][i];
			var field = getFieldFromPath(path);
			if (!field) continue;
			/formfield_(\d+)/.test(field.id);
			extraGet += "&path_" + RegExp.$1 + "=" + field.value;
		}
	}

	return "AjaxGrid.action?gridTabId="+grid+"&pageIndex="+visible+"&pageSize=20" + extraGet + additionalGet + append;
}

function ajaxChangePage(page, grid, extraPost)
{
	showGridPage(page, grid, null, "&instance=" + document.getElementById("id").value + extraPost, false, false);
}

function showGridPage(visible,grid,pageCount, additionalGet, show, edit)
{
	if (trim(document.getElementById("tab_"+grid).innerHTML) != "" && show === true)
		return;
	
	if (visible)
		currentGridPages[grid] = visible;
	else if (!currentGridPages[grid])
		visible = 1;
	else
		visible = currentGridPages[grid];
	
	var httpObject = getAjaxRequestObject();
	httpObject.onreadystatechange=function()
	{
		if(httpObject.readyState==4)
		{
			var response = httpObject.responseText;
			showGridData(response, grid);
		}
	}
	if (!additionalGet)
		additionalGet = "";
	
	if (/^-?\d+$/.test(additionalGet))
		additionalGet = "&instance=" + additionalGet;
	if (edit)
		additionalGet += "&edit=true";
	
	httpObject.open("GET",gridPageURL(visible, grid, additionalGet),true);
	httpObject.setRequestHeader("If-Modified-Since", "Sat, 1 Aug 1971 00:00:00 GMT"); 
	httpObject.send(null);
	
	var tabObject = document.getElementById("tab_"+grid);
	tabObject.innerHTML = '<div class="loading"><img src="img/loader.gif" alt="loader"/></div>';
	if (show !== true)
		return false;
}

function setGridTotalCount(grid, count, alert)
{
	var parent = $(grid).parent()[0];
	var header = document.getElementById(parent.id.replace("tab", "tabHeader"));
	if (alert && count >= alert)
		addClass(header, "alert");
	else
		stripClass(header, "alert");
	$(header).find("a,span").each(function(i,o){
	  if (/\([\d?]+\)$/.test(o.innerHTML))
	    o.innerHTML = o.innerHTML.replace(/\([\d?]+\)$/, "("+count+")");
	  else
	    o.innerHTML = o.innerHTML + " ("+count+")";
	});
}

function showGridData(response, grid) {
	var regex = /function updateForm\(\) {([\s\S]*)}[\s\S]*updateForm\(\);/;
	RegExp.$1 = ""
	
	response.replace(regex, "");

	if (RegExp.$1)
		try
		{
			eval(RegExp.$1);
		} catch (e) {}
		
	// Voer de <exec></exec> inhoud uit.
	var regex = /<exec>(.*?)<\/exec>/;
	while (regex.test(response))
	{
		eval(RegExp.$1);
		response = response.replace(regex, "");
	}
	
	RegExp.$1 = "";
	// Get the <var ...>...</var> contents.
	var start = response.indexOf("<var");
	var end = response.indexOf("</var>");
	var needed = response.substring(start+5, end);
	response = response.substring(0, start);
	start = needed.indexOf('>');
	var varName = needed.substring(0, start);
	var content = needed.substring(start + 1)
	
	if (varName)
		try
		{
			eval("window." + varName + " = " + content);
		} catch (e) {}
		
	document.getElementById("tab_"+grid).innerHTML = response;
	initTooltips();
}

var newNr = -1;
/**
 * Add a row to a grid.
 * @param id
 * @return
 */
var tabAppendedParents = new Object();
function addNewGridRow(id) {
	var oldRow = document.getElementById("cloneRow_" + id);
	var newRow = oldRow.cloneNode(true);
	
	oldRow.parentNode.insertBefore(newRow, oldRow);
	newRow.style.display = tableRow();
	newRow.id = "";
	
	function setNewId(elem) {
		if (elem.name.substring(0, 8) == "editIds_") {
			elem.value = newNr;
			elem.id = elem.id.replace(/_\d+$/, "_" + newNr);
		}
		else
			elem.id = elem.id.replace("_X", "_" + newNr);
		elem.name = elem.name.replace("_X_", "_" + newNr + "_");
		if (/parents$/.test(elem.name)) {
			if (!tabAppendedParents[newNr])
				tabAppendedParents[newNr] = new Array();
			tabAppendedParents[newNr].push(elem);
		}
	}

	function setNewSearchId(elem) {
		if (elem.title=="Zoeken")
			elem.onclick = function() { doSearch(this); return false; };
		if (elem.title=="Herstellen")
			elem.onclick = function() { 
				var elems = getEnclosingElem(this, "table").getElementsByTagName("input")
				for (var i = 0; i < elems.length; i++)
					if (elems[i].type == "hidden") {
						elems[i].value = '';
						doUpdateLinkRelations(elems[i]);
					}
				return false;
			};
	}
	
	map(newRow.getElementsByTagName("input"), setNewId);
	map(newRow.getElementsByTagName("select"), setNewId);
	map(newRow.getElementsByTagName("textarea"), setNewId);
	map(newRow.getElementsByTagName("button"), setNewSearchId);
	
	showEditGridInputs(newNr, newRow);
	newNr--;
}

/**
 * Removes a row from a table.
 * @param elem An element in the row which will be deleted.
 */
function deleteGridRow(elem) {
	var row = getEnclosingElem(elem, "tr");
	
	var elements = new Array();
	elements = arr_concat(elements, row.getElementsByTagName("input"));
	elements = arr_concat(elements, row.getElementsByTagName("select"));
	elements = arr_concat(elements, row.getElementsByTagName("textarea"));

	for (var i = 0; i < elements.length; i++)
	{
		elements[i].value = "";
		if (elements[i].onblur)
			elements[i].onblur(elements[i]);
	}
	
	row.parentNode.removeChild(row);
}

function getSelectedValues(tabId, all) {
	var tab;
	if (tabId)
		tab = document.getElementById("tab_" + tabId);
	else
		tab = document;
	
	var values = "";
	map(tab.getElementsByTagName("input"), function (o) {
		if (o.name == "copy" && (o.checked || all === true)) {
			if (values != "") values += ","
			values += o.value;
		}
	});
	return values;
}

/**
 * Returns a string where the {1} occurences in val are replaced by ids seperated by &:
 * gridSelectedEntities(X, test={1})
 * Selected: 1, 3, 5
 * Result: test=1&test=3&test=5
 * 
 * @param tabId
 * @param val
 * @return
 */
function gridSelectedEntities(tabId, val, allIfNone) {
	var values = getSelectedValues(tabId);
	// FIXME: Wil je dit altijd? Als geen geselecteerd, dan alle.
	if (values == "") 
		values = getSelectedValues(tabId, allIfNone);
	if (values == "") 
		return "";
	
	var allCheck = document.getElementById("select_all_" + tabId);
	var all = false;
	if (allCheck) all = allCheck.checked;
	
	values = values.split(",")
	
	var result = "";
	for (var i = 0; i < values.length; i++)
	    result += (i != 0 ? "&" : "") + val.replace(/\{1\}/g, values[i])
	if (all) result += "&all=" + tabId;
	return result;
}

/**
 * Creates copy_ids and copy_entity inputs, fills them and submits the form without checking the form restrictions.
 * @param tabId The id of the tab that cointains the copyable items.
 * @param entityId The id of the entity for the tab.
 */
function gridCopy(tabId, entityId, targetEntityId, entityPath) {
	if (getSelectedValues(tabId) == "") return;
	
	var copyTarget = document.getElementById("copy_target");
	if (copyTarget == null)
		copyTarget = createElement("input", "hidden", "copy_target", "copy_target");

	var form = document.getElementById("bodyform");
	form.appendChild(copyTarget);
	copyTarget.onchange = function() {
		gridCopyDone(tabId, entityId, entityPath);
	};
	// Get the target.
	selectEntity(targetEntityId, "copy_target");
}

function gridCopyDone(tabId, entityId, entityPath) {
	
	var copyIds = createElement("input", "hidden", "copy_ids", "copy_ids");
	var copyEntity = createElement("input", "hidden", "copy_entity", "copy_entity");
	var copyTarget = document.getElementById("copy_target");
	var copyEntityPath = createElement("input", "hidden", "copy_path", "copy_path");
	
	var form = document.getElementById("bodyform");
	form.appendChild(copyIds);
	form.appendChild(copyEntity);
	form.appendChild(copyEntityPath);
	copyIds.value = getSelectedValues(tabId);
	copyEntity.value = entityId;
	copyEntityPath.value = entityPath;

	submitWithFncPrv(false, false, false);
	
	form.removeChild(copyIds);
	form.removeChild(copyEntity);
	form.removeChild(copyTarget);
	form.removeChild(copyEntityPath);
}

/**
 * Checks all checkboxes in the current table.
 * @param check The source checkbox.
 */
function gridCheckAll(check) {
	var table = getEnclosingElem(check, "table");
	var values = "";
	map(table.getElementsByTagName("input"), function (o) {
		if (o.name == "copy") {
			o.checked = check.checked;
		}
	});
}

/**
 * Opens a popup for reports.
 * @param tabId The id of the tab that cointains the copyable items.
 * @param entityId The id of the entity for the tab.
 */
function gridBulkReport(tabId, entityId, reportId, formId, params) {
	var tab = document.getElementById("tab_" + tabId);
	var values = "";
	map(tab.getElementsByTagName("input"), function (o) {
		if (o.name == "copy" && o.checked) {
			values += "&identifiers=" + o.value;
		}
	});
	if (values == "") return;
	if (!params) params = "";
	else		 params = "&" + params;
	if (!formId) formId = "";
	else		 formId = "&formId=" + formId;
	
	openPopup('./DoLetter.action?entityId='+entityId +
			"&report=" + reportId + formId +
		    values + params
		    , 'doLetter', 350, 200);
}


function saveTab(tabgroup, tab, id) {
	var input = $("#tab_" + tabgroup + "_" + tab + " input,#tab_" + tabgroup + "_" + tab + " select,#tab_" + tabgroup + "_" + tab + " textarea");

	// Reset de refreshed vlaggetjes.
	for (rownr in editGridRowRefreshed)
		if (new RegExp("^" + id + "_").test(rownr))
			editGridRowRefreshed[rownr] = undefined;

	var map = objectsToMap(input);
	map['gridTabId'] = id;
	map['save'] = true;
	map['edit'] = false;
	map['instance'] = document.getElementById("id").value;
	map['fnc'] = document.getElementById("fnc").value;
	map['prv'] = document.getElementById("prv").value;
	map['form'] = document.getElementById("form").value;
	map['id'] = document.getElementById("id").value;
	
	document.getElementById("tab_"+id).innerHTML = '<div class="loading"><img src="img/loader.gif" alt="loader"/></div>';
	$.post("AjaxGrid.action", map, function(data) {
		showGridData(data, id);
	} );
}

/**
 * Creates copy_ids and copy_entity inputs, fills them and submits the form without checking the form restrictions.
 * @param tabId The id of the tab that cointains the copyable items.
 * @param entityId The id of the entity for the tab.
 */
function gridAttach(tabId, entityId, destEntityId, destPathVal, dummy, destTab) {
	
	var input = $("#smiletable_" + tabId + " input,#smiletable_" + tabId + " select,#smiletable_" + tabId + " textarea");

	var tab = document.getElementById("tab_" + tabId);
	var values = "";
	map(tab.getElementsByTagName("input"), function (o) {
		if (o.name == "copy" && o.checked) {
			if (values != "") values += ","
			values += o.value;
		}
	});
	if (values == "") return;
	
	var paramMap = objectsToMap(input);
	paramMap['fnc'] = $("#fnc")[0].value;//document.getElementById("fnc").value;
	paramMap['prv'] = $("#prv")[0].value;//document.getElementById("prv").value;
	paramMap['form'] = $("#form")[0].value;//document.getElementById("form").value;
	paramMap['id'] = document.getElementById("id").value;
	paramMap['instance'] = paramMap['id'];
	paramMap['copy_ids'] = values;
	paramMap['copy_entity'] = entityId;
	paramMap['dest_entity'] = destEntityId;
	paramMap['dest_path'] = destPathVal;
	paramMap['attach'] = true;
	paramMap['gridTabId'] = tabId;
	
	document.getElementById("tab_"+tabId).innerHTML = '<div class="loading"><img src="img/loader.gif" alt="loader"/></div>';
	
	$.post("AjaxGrid.action", paramMap, function(data) {
		showGridData(data, tabId);
	} );
	
	document.getElementById("tab_" + destTab).innerHTML = "";
}


var gridTabHandlers = new Object();
/**
 * Voeg event handler toe aan paden van grid.
 * @param path
 * @param gridtab
 * @return
 */
function addGridTabHandler(path, gridtab)
{
	var field = getFieldFromPath(path);
	if (!field) return;

	// Haal de tabgroup en het index uit de bron.
	/(\d+)_(\d+)$/.test($("#tab_" + gridtab).parent()[0].id);
	var tabgroup = RegExp.$1;
	var index = RegExp.$2;
	
	// Geen dubbele event handlers.
	if (!gridTabHandlers[field])
		gridTabHandlers[field] = new Array();
	if (in_array(gridTabHandlers[field], gridtab)) return;

	gridTabHandlers[field].push(gridtab);
	gridTabParents[gridtab].push(path);
	
	// Voeg een onchange event toe.
	$(field).change(function()
	{
		var tabObject = document.getElementById("tab_" + gridtab);
		setGridTotalCount(tabObject, "?");

		tabObject.innerHTML = "";
		showGridPage(1,gridtab,1,document.bodyform.id.value, true);
	});
}

function getFieldFromPath(path)
{
	// Kijk of het veld voor het pad op het scherm staat.
	var field = null;
	var pathStripped = path;
	while (field == null && pathStripped.lastIndexOf('.') != -1)
	{
		field = getFieldObject(path)
		if (!field) field = getFieldObject(path + ".id");
		pathStripped = pathStripped.substring(0, pathStripped.lastIndexOf('.'));
	}
	return field;
}