var zinGdbConn_autoCompleters = new Array();
var zinGdbConn_dateSelectors = new Array();
var tmpObject, tmpModuleIdentifier, tmpChildFlag, tmpTarget;

function collapseFilter(src, moduleIdentifier) {
	document.getElementById("filterScroll_" + moduleIdentifier).style.height = "45px";
	src.style.display = 'none';
	document.getElementById("expandButton_" + moduleIdentifier).style.display = 'inline';
}

function expandFilter(src, moduleIdentifier) {
	document.getElementById("filterScroll_" + moduleIdentifier).style.height = "350px";
	src.style.display = 'none';
	document.getElementById("collapseButton_" + moduleIdentifier).style.display = 'inline';
}

//Setzt die vorherigen Werte in die Input-Felder ein
function previousSettings(object, targetIdentifier) {

	targetId = "tx_zingdbconn_pi1[" + targetIdentifier + "][filter]";
	sourceId = "tx_zingdbconn_pi1[" + targetIdentifier + "][backFilter]";
	var i, tmpStr='';

	// backFilter is not present if filter has been submitted for the first time. In this case,
	// we'll just clear the filter.
	
	for (i = 1; i <= object.lastLineCount; i++) {

		var prefix = "tx_zingdbconn_pi1[" + targetIdentifier + "][filter][" + i + "]";
		var backPrefix = "tx_zingdbconn_pi1[" + targetIdentifier + "][backFilter][" + i + "]";

		tmpStr += '<input type="hidden" name="' + prefix + '[attribute]" value="'
		+	document.getElementById(backPrefix + '[attribute]').value + '" />';

		tmpStr +=
			'<input type="hidden" name="' + prefix + '[operator]" value="'
			+	document.getElementById(backPrefix + '[operator]').value + '" />';

		tmpStr +=
			'<input type="hidden" name="' + prefix + '[value]" value="'
			+	document.getElementById(backPrefix + '[value]').value + '" />';

		if(document.getElementById(backPrefix + "[child][attribute]")) {

			tmpStr +=
				'<input type="hidden" name="' + prefix + '[child][attribute]" value="'
				+	document.getElementById(backPrefix + "[child][attribute]").value+'" />';

			tmpStr +=
				'<input type="hidden" name="' + prefix + '[child][operator]" value="'
				+	document.getElementById(backPrefix + "[child][operator]").value+'" />';

			tmpStr +=
				'<input type="hidden" name="' + prefix + '[child][value]" value="'
				+	document.getElementById(backPrefix + "[child][value]").value+'" />';
		}
	}

	// delete all former lines in order to not let them be submitted as well:
	for(i = 1; i < object.nextLine; i++) {
		document.getElementById("tx_zingdbconn_pi1["+targetIdentifier
		+	"][filter]["+i+"]").innerHTML = '';
	}
	
	// set former filter options
	var optionKeys = [ "allCriteria", "hitEmptyValues" ];
	var optionKey;
	
	var optionPrefix = "tx_zingdbconn_pi1[" + targetIdentifier + "][options]";
	var oldOptionPrefix = "tx_zingdbconn_pi1[" + targetIdentifier
	+	"][backOptions]";
	
	for(var i = 0; i < optionKeys.length; i++) {
		optionKey = optionKeys[i];
		var old = document.getElementById(oldOptionPrefix+"["+optionKey+"]");
		if(!old) continue;
		
		var cur = document.getElementById(optionPrefix+"["+optionKey+"]");
		$(cur).remove();
		tmpStr += '<input type="hidden" name="' + optionPrefix + "["
		+	optionKey + ']" value="' + old.value + '" />';
	}

	// add the state of the and/or buttons:
	var state, exit=false;
	for(var i = 1; i < object.lastLineCount - 1 && !exit; i++) {
		id = "tx_zingdbconn_pi1[" + targetIdentifier + "][backOptions][andOr]["
		+	i + "][value]";
		
		state = document.getElementById(id).value;
		tmpStr += "<input type='hidden' name='tx_zingdbconn_pi1[std]"
		+	"[options][andOr][" + i + "][value]' value='" + state + "' />";
		
	}
	
	// overwrite former filter rows:
	document.getElementById("tx_zingdbconn_pi1["+targetIdentifier
	+	"][filterRows]").innerHTML = tmpStr;
	
	submitSearch();
}


function searchFilter(postfix) {
	zgdbResetStart(postfix);
	zgdbSubmitForm();
}


/**
 * @deprecated
 * @param count
 * @param moduleIdentifier
 */
function addFilterLinkSymbols(count, moduleIdentifier) {
	
	console.trace();
	return;
	
	moduleIdentifier = moduleIdentifier.replace(/\./g, "_");
	
	if(!document.getElementById('tx_zingdbconn_pi1[' + moduleIdentifier +'][filter_relation]')) {
		console.log("error:");
		console.log("tx_zingdbconn_pi1[" + moduleIdentifier +"][filter_relation] not found!");
	}
	document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier +"][filter_relation]").innerHTML = '';

	if (!count) count = 1;
	for (var i = 0; i < Math.floor(count/2); i++) {
		document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier +"][filter_relation]").innerHTML +=
			'<img class="topImageRelation" src="typo3conf/ext/zin_gdb_conn/img/pi5_top.png"><br />'
		+	'<img src="typo3conf/ext/zin_gdb_conn/img/pi5_and.png"><br />'
		+	'<img id="img_bottom'+i+'" "style="margin-top: 1px; *margin-top: 0px;" src="typo3conf/ext/zin_gdb_conn/img/pi5_bottom.png"><br />';
	}
}

/**
 * @deprecated
 * @param count
 * @param object
 * @param moduleIdentifier
 */
function addFilterLinkSymbol(count, object, moduleIdentifier) {
	console.trace();
	return;
	document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][filter_relation]").innerHTML = '';
	if (!count) count = 2;
	for (var i = 0; i < Math.floor(count/2); i++) {
		var temp = 	document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][filter_relation]").innerHTML;
		document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][filter_relation]").innerHTML = temp+''
		+	'<img class="topImageRelation_' + moduleIdentifier + '"  src="typo3conf/ext/zin_gdb_conn/img/pi5_top.png" alt=""><br />'
		+	'<img src="typo3conf/ext/zin_gdb_conn/img/pi5_and.png" alt=""><br />'
		+	'<img id="img_bottom_'+moduleIdentifier+'_'+object.nextLine
		+	'" style="margin-top: 1px; *margin-top: 0px;" src="typo3conf/ext/zin_gdb_conn/img/pi5_bottom.png" alt=""><br />';
	}
}



function newFilter(source, context, object, moduleIdentifier)
{
	tmpObject = object;
	tmpModuleIdentifier = moduleIdentifier;
	
	var allCriteria;
	var acId = "tx_zingdbconn_pi1["
		+ moduleIdentifier + "][options][allCriteria]";
	
	allCriteria = (
		document.getElementById(acId)
			&&
		document.getElementById(acId).checked
	)
	?	1
	:	0;
	
	new Ajax.Request("index.php?eID=zgdbAjax&filterRow=1&objectTypeId="
			+	object.objectTypeId
			+	"&nextLine=" + object.nextLine
			+	"&sourceElement=line&langId=" + object.zinGdbConn_langId
			+	"&context=" + context
			+	"&module=" + moduleIdentifier
			+	"&ug=" + object.group
			+	"&allCriteria=" + allCriteria,  
			{
				method: 'get', 
				onComplete:showNewRow
			}
	);
	object.nextLine++;
}

function showNewRow(originalRequest) {
	
	var result = originalRequest.responseText;
	var o = tmpObject;
	var m = tmpModuleIdentifier;
	
	var elUpper = document.getElementById('tx_zingdbconn_pi1_filter_' + m);
	var elListHead = document.getElementById('listHead_' + m);
	var elListBody = document.getElementById('listWrap_' + m);
	var elProperties = document.getElementById('ldoProperties_' + m);
	var elUpperHeightBefore = rzLib.height(elUpper);
	
	// picker:
	var pickerFlag = false;
	if(!elListBody) {
		if(!elListBody) {
			elListBody = document.getElementById('picker_' + m);
		}
		pickerFlag = true;
	}
	
	// Safari fix: will show scrollbars otherwise, because the area is too
	// small for a short moment
	elListBody.style.height = (rzLib.height(elListBody) - 40) + "px";
	
	if (document.getElementById("tx_zingdbconn_pi1[" + m + "][filter]["+ (o.nextLine)+"]")) {
		document.getElementById("tx_zingdbconn_pi1[" + m + "][filter]["+ (o.nextLine)+"]").innerHTML += originalRequest.responseText;
	} else {
		var row = document.createElement('div');
		row.setAttribute("id", "tx_zingdbconn_pi1[" + m + "][filter]["+ (o.nextLine-1)+"]");
		row.setAttribute("class", "filterRow");
		row.setAttribute("className", "filterRow");
		row.innerHTML = originalRequest.responseText;
		document.getElementById('tx_zingdbconn_pi1[' + m + '][filterRows]').appendChild(row);
	}
	// calculate difference
	var elUpperDifference = rzLib.height(elUpper) - elUpperHeightBefore;
	
	// resize list body
	var oldBodySize = rzLib.height(elListBody);
	
	// add +40 pixels, safari fix (see above)
	var newBodySize = (oldBodySize - elUpperDifference) + 40;
	
	// if the picker flag is raised, the border width has to be subtracted
	if(pickerFlag) {
		if(zgdbFlags_isFF) {
			newBodySize -= 4;
		} else if(zgdbFlags_isIE) {
			newBodySize -= 4;
		}
	}
	
	elListBody.style.height = newBodySize + "px";
	
	var scroller = $$('#picker_' + m + ' .SCROLLER');
	for (var i = 0; i < scroller.length; i++) {
		scroller[i].style.height = newBodySize + "px";
	}
	
}
/////////////////////////////////////////////////////////////////////////

// delete filter settings
function clearFilter(object, moduleIdentifier) {
	
	zgdbResetStart(moduleIdentifier);
	
	if (document.getElementById('zgdbFilterStart_' + moduleIdentifier)) {
		document.getElementById('zgdbFilterStart' + moduleIdentifier).value = '0';
	}
	
	for (var i = (object.nextLine-1); i >= 1; i--) {
		
		if (zinGdbConn_autoCompleters[i]) {
			delete zinGdbConn_autoCompleters[i];
		}
		//var filterRow = document.getElementById("tx_zingdbconn_pi1[filterRows]").innerHTML;
		
		var filter = document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][filterRows]");
		filterRow = filter.firstChild;
		
		while(filterRow != undefined){
			
			if (filterRow.nodeName.toLowerCase() != 'div'){
				filterRow = filterRow.nextSibling;
				continue;
			}
			
			document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][filterRows]").removeChild(filterRow);
			filterRow = filterRow.nextSibling;
		}		
	}
	if(document.getElementById("tx_zingdbconn_pi1["+moduleIdentifier+"][clearFilter]")) {
		document.getElementById("tx_zingdbconn_pi1["+moduleIdentifier+"][clearFilter]").value='1';
	}
	$$('#tx_zingdbconn_pi1_filter_' + moduleIdentifier + ' .filterOption').each(function(s) {
		s.innerHTML = '';
	});
	object.nextLine = 1;
	// newFilter(document.getElementById('newFilterImgButton[' + moduleIdentifier + ']'), object.context, object, moduleIdentifier);
	zgdbSubmitForm();
}


// Submit search form 
function submitSearch() {
	zgdbSubmitForm();
}


// Get a new value input field
function callFilter(
	objectTypeId,
	nextLine,
	originator,
	sourceElement,
	langId,
	context,
	moduleIdentifier,
	object,
	childFlag,
	onComplete,
	isChild
)	{
	
	var optActive = originator.options[originator.selectedIndex];
	var optClass = optActive.getAttribute('class');

	// IE fix: uses "className" instead of class
	if(!optClass) optClass = optActive.getAttribute('className');
	
	if(	optActive.getAttribute('link')
	&&	originator.getAttribute('id')
	&&	originator.getAttribute('id').indexOf('[child]') != -1) {
		
		var dummy = '<select id="tx_zingdbconn_pi1[' + moduleIdentifier
			+	"][filter][" + (nextLine-1) + "][child][value]\">"
			+	"<option></option></select>";
		document.getElementById('tx_zingdbconn_pi1[' + moduleIdentifier
			+	"][filter][" + (nextLine-1) + "][child][valueCell]").innerHTML = dummy;
		
		zgdb_updateChild(
			document.getElementById('tx_zingdbconn_pi1['
				+	moduleIdentifier + "][filter][" + (nextLine-1)
				+	"][value]"
			),
			object,
			nextLine-1
		);
		return;
	}
	
	// LDO flag
	var ldo = optActive.getAttribute("ldo") ? "&ldo=1" : "";
	
	var parentStr = '';
	
	var parentFlag = optClass && optClass.indexOf('zgdbParent') !== -1;
	if(parentFlag) {
		parentStr = "&p="+optClass.replace('zgdbParent_', '');
	}
	
	var attribute_id = originator.value;
	
	tmpObject = object;
	tmpModuleIdentifier = moduleIdentifier;
	
	tmpChildFlag = childFlag;
	
	if(!onComplete) {
		onComplete = attributeSelectorChanged;
	}
	if(!isChild) {
		isChild = 0;
	}
	
	new Ajax.Request(
		"index.php?eID=zgdbAjax&filterRow=0&objectTypeId="
		+	objectTypeId+"&nextLine="+nextLine+"&attribute_id="+attribute_id
		+	"&sourceElement="+sourceElement+"&langId="+langId+"&context="+context
		+	"&module="+moduleIdentifier+"&ug="+object.group+parentStr+"&cf="
		+	tmpChildFlag+"&ic="+isChild
		+	ldo,
		{
			method:		'get',
			onComplete:	onComplete
		}
	);
}


// attribute change
function attributeSelectorChanged(request) {
	
	var o = tmpObject;
	var m = tmpModuleIdentifier;
	var line = request.responseText;
	
	var results = line.split("||");
	
	var prefix = "tx_zingdbconn_pi1[" + m + "][filter]["+results[2]+"]";
	
	var attributeSelect = document.getElementById(prefix + "[attribute]");
	var attribute = attributeSelect ? attributeSelect.value : -1;
	var lang_id = results[4];
	
	var targetPrefix = prefix + (tmpChildFlag ? "[child]" : "");
	
	// set when having parent & child
	var childFlag = results.length == 8;
	// set when having child
	var isChild = (results[3] & 4) == 4;
	
	document.getElementById(targetPrefix+"[operatorCell]").innerHTML = results[0];
	document.getElementById(targetPrefix+"[valueCell]").innerHTML = results[1];
	
	// if an autocompleter needs to be created for child elements, put +64 to
	// the array index
	var arrayOffset = childFlag ? 64 : 0;
	
	// check if a child filter has been created in addition to a normal filter
	if(childFlag) {
		document.getElementById(prefix+"[child][attributeCell]").innerHTML = results[5];
		document.getElementById(prefix+"[child][operatorCell]").innerHTML = results[6];
		document.getElementById(prefix+"[child][valueCell]").innerHTML = results[7];
	} else {
		// if the tmpChildFlag variable is set, populate the fields
		if(!tmpChildFlag) {
			document.getElementById(prefix+"[child][attributeCell]").innerHTML = '';
			document.getElementById(prefix+"[child][operatorCell]").innerHTML = '';
			document.getElementById(prefix+"[child][valueCell]").innerHTML = '';
		}
	}
	
	var child = isChild ? "[child]" : "";
	
	switch(results[3]) {
	
		case 1:
		case '1':
		case 5:
		case '5':
			if (zinGdbConn_autoCompleters[results[2] + arrayOffset]) {
				delete (zinGdbConn_autoCompleters[results[2] + arrayOffset]);
			}
			log("AC: tx_zingdbconn_pi1[" + m + "][filter]["+results[2]+"]"+child+"[value]");
			log(zgdbAutoCompleteTarget + "&l=" + lang_id // + "&row=" + line
				+	"&c=" + o.context + "&ug=" + o.group + "&a=" + attribute 
				+	"&ot=" + o.objectTypeId);
			
			var tmp = new Ajax.Autocompleter(
				"tx_zingdbconn_pi1[" + m + "][filter]["+results[2]+"]"+child+"[value]", 
				"tx_zingdbconn_pi1[" + m + "][filter]["+results[2]+"]"+child+"[value][autocompleter]",
				zgdbAutoCompleteTarget + "&l=" + lang_id // + "&row=" + line
				+	"&c=" + o.context + "&ug=" + o.group + "&a=" + attribute 
				+	"&ot=" + o.objectTypeId,
				{
					'paramName'	:	'value'
				}
			);
			zinGdbConn_autoCompleters[results[2]] = tmp;
			
			break;
			
		case 2:
		case '2':
			
			A_TCALDEF.imgpath = 'typo3conf/ext/zin_gdb_conn/img/calendar/';
			
			var controlname = 'tx_zingdbconn_pi1[' + m + '][filter]['
			+	results[2] + ']'+child+'[value]';
			
			var tmp = new tcal (
					{
						'formname': 'tx_zingdbconn_pi1[form]',
						'controlname': controlname
					}, 
					false, 
					'tx_zingdbconn_pi1[' + m + '][filter][' + results[2] + ']'+child+'[valueCell]'
			);
			
			zinGdbConn_dateSelectors[results[2]] = tmp;
			break;
	}
	
}



function updateOperator(request) {
	var activeLine = nextLine - 1; 
	document.getElementById("tx_zingdbconn_pi1[filter][" + activeLine + "][operator]").innerHTML = request.responseText; 
}



function zgdb_filterLink(
		attributeId, value, moduleIdentifier, target, parentAttr, parentVal
)	{
	// try to get the filter
	var filter = document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][filterRows]");
	
	// use hidden fields otherwise
	if (!filter) {
		filter = document.getElementById("tx_zingdbconn_pi1[filterAlternate]");
	}
	var firstValue = parentVal ? parentVal : value;
	var targetStr = '<input type="hidden" name="tx_zingdbconn_pi1[' + moduleIdentifier
	+	'][filter][1][attribute]" value="' + attributeId + '" />'
	+	'<input type="hidden" name="tx_zingdbconn_pi1[' + moduleIdentifier
	+	'][filter][1][operator]" value="=" />'
	+	'<input type="hidden" name="tx_zingdbconn_pi1[' + moduleIdentifier
	+	'][filter][1][value]" value="'
	+	firstValue.replace("\"", "\\\"") + '" />';
	// pass parent values
	if(parentAttr) {
		targetStr += '<input type="hidden" name="tx_zingdbconn_pi1[' + moduleIdentifier
		+	'][filter][1][child][attribute]" value="' + parentAttr + '"]" />'
		+	'<input type="hidden" name="tx_zingdbconn_pi1[' + moduleIdentifier
		+	'][filter][1][child][operator]" value="=" />'
		+	'<input type="hidden" name="tx_zingdbconn_pi1[' + moduleIdentifier
		+	'][filter][1][child][value]" value="'
		+	value.replace("\"", "\\\"") + '" />';
	}
	filter.innerHTML = targetStr;
	zgdbSubmitForm(null, target);
}



function zgdb_realignFilter(object) {
	
	var identifier = object.identifier;
	
	var mainWrap = document.getElementById("mainWrap_" + identifier);
	if(!mainWrap) {
		mainWrap = rzLib.byId('pickerMainInner_' + identifier);
	}
	
	var filterWrap = document.getElementById(
		"tx_zingdbconn_pi1_filter_" + identifier
	);
	var listHead = document.getElementById("listHead_" + identifier);
	var listBody = document.getElementById("listWrap_" + identifier);
	if(!listBody) listBody = document.getElementById("picker_" + identifier);
	
	// set new margin-top for list head
	var filterHeight = rzLib.height(filterWrap) + 8;
	// listHead.style.marginTop = filterHeight + "px";
	
	/*
	var r = rzLib.height;
	rzLib.log("mainWrap: " + r(mainWrap) + ", filterWrap: " + r(filterWrap)
		+	", listHead: " + r(listHead)
	);
	//*/
	
	// set new height for list
	listBody.style.height = (rzLib.height(mainWrap)
	-	rzLib.height(filterWrap)
	-	rzLib.height(listHead)
	-	9) + "px";
	
	/*
	rzLib.log("height: " + (rzLib.height(mainWrap)
	-	rzLib.height(filterWrap)
	-	rzLib.height(listHead)
	-	9) + "px");
	*/
}



function zgdbEditChildUpdate(
	parentHtmlId,
	childHtmlId,
	parentAttrId,
	childAttrId,
	contextStr,
	langId,
	cssClass
) {
	var parentSelector = document.getElementById(parentHtmlId);
	var parentSelectorValue = parentSelector.value;
	
	var params = { 
		sourceElement	:	'parentEdit',
		parentId		:	parentAttrId,
		childId			:	childAttrId,
		childHtmlId		:	childHtmlId,
		context			:	contextStr,
		parentValue		:	parentSelectorValue,
		L				:	langId,
		css				:	cssClass
	};
	
	new Ajax.Request(
		"index.php?eID=zgdbAjax",
		{
			parameters:	params,
			method:		'get',
			onComplete:	zgdbEditChildUpdate_exec
		}
	);
}

var tmpDebug;
function zgdbEditChildUpdate_exec(request) {
	var response = request.responseText;
	var boundaryEnd = response.indexOf(";");
	var boundary = response.substring(0, boundaryEnd);
	response = response.substring(boundary.length + 1);
	var parts = response.split(boundary);
	var currentChild = document.getElementById(parts[1]);
	var childDOMParent = currentChild.parentNode;
	tmpDebug = currentChild;
	childDOMParent.innerHTML = parts[0];
}



var tmpDebug;
function zgdbSortSelectorUpdate(request) {
	var responseText = request.responseText;
	var semicolonPos = responseText.indexOf(';');

	var boundary = responseText.substring(0, semicolonPos + 1);

	var parts = responseText.split(boundary);
	var moduleIdentifier = parts[1];

	document.getElementById('zgdb_sortOrderCell_' + moduleIdentifier).innerHTML =
		parts[2] + " " + parts[3] + " " + parts[4];
}


function zgdb_updateChild(originator, obj, line, onComplete) {
	
	var prefix = "tx_zingdbconn_pi1[" + obj.identifier + "][filter][" + line + "]";
	
	var parentId = originator.getAttribute("id");
	var childId = prefix + "[child][value]";
	
	var childSelector = document.getElementById(childId);
	
	if(!childSelector) {
		log('childselector (id: "' + childId + ') not found');
		return;
	}
	
	if(childSelector.nodeName.toLowerCase() == 'select') {
		var parentAttrSelector = document.getElementById(prefix+"[attribute]");
		var parentAttrId = parentAttrSelector.value;
		var parentVal = document.getElementById(parentId).value;
		var childAttrSelector = document.getElementById(prefix+"[child][attribute]");
		var childAttrId = childAttrSelector.value;
		
		var targetURL = "index.php?eID=zgdbAjax&sourceElement=parent&parentAttr="
		+	parentAttrId + "&parentVal=" + parentVal + "&L=" + obj.zinGdbConn_langId
		+	"&childAttrId=" + childAttrId + "&module=" + obj.identifier
		+	"&context=" + obj.context + "&nextLine=" + line;
		
		new Ajax.Request(
			targetURL,
			{
				method:		'get',
				onComplete:	onComplete
				?	onComplete
				:	zgdb_updateChild_exec
			}
		);
	} else log('value selector: no select field ('+childSelector.nodeName.toLowerCase()+')');
}

function zgdb_updateChild_edit(request) {
	alert(request.responseText);
}

function zgdb_updateChild_exec(request) {
	
	var response = request.responseText;
	
	var parts = response.split(";");
	
	var lineNo = parts[0];
	var identifier = parts[1];
	var selector = parts[2];
	
	document.getElementById("tx_zingdbconn_pi1[" + identifier + "][filter]["
		+	lineNo + "][child][valueCell]").innerHTML = selector;
}
//*/
