var rzLib_class = function() {
	
	// VARIABLES - DEBUG
	var debug			= true;
	var logMessages		= "";
	var consoleReady	= typeof console != 'undefined';
	
	/****************************/
	/*      DEBUG FUNCTIONS     */
	/****************************/
	
	handleError = function() {
		if(debug && consoleReady) {
			console.trace();
		}
		;
	};
	
	this.debug = function(object) {
		if(debug && consoleReady) {
			console.debug(object);
		}
		logMessages += object.toString();
	};
	
	this.log = function(text) {
		if(debug && consoleReady) {
			console.log(text);
		}
		logMessages += text + "\n";
	};
	
	this.outputLog = function() {
		if(consoleReady) {
			console.log(logMessages);
		} else {
			alert(logMessages);
		}
	};
	
	/****************************/
	/*         FUNCTIONS        */
	/****************************/
	
	this.byId = function(id) {
		return document.getElementById(id);
	}
	
	this.closeWindow = function() {
		window.close();
	};
	
	this.height = function(element) {
		if(!element) { handleError(); return undefined; }
		return $(element).getHeight();
	};
	
	this.width = function(element) {
		if (!element) { handleError(); return undefined; }
		return $(element).getWidth();
	}
	
	this.addClass = function(element, className) {
		if(!element) { handleError(); return undefined; }
		return $(element).addClassName(className);
	};
	
	this.hasClass = function(element, className) {
		if(!element) { handleError(); return undefined; }
		return $(element).hasClassName(className);
	};
	
	this.removeClass = function(element, className) {
		if(!element) { handleError(); return undefined; }
		return $(element).removeClassName(className);
	};
	
	this.setUnloadEvent = function(element, handler)
	{
		Event.observe(element, 'unload', handler);
	}
};

var rzLib = new rzLib_class();

////////////////////////////////////////////////
var zgdbParentSelectors = new Object();
var zgdbTmpTarget;

function zgdbBlurLink(source) {
	source.blur();
}

function zgdbBlurLinkById(sourceId) {
	document.getElementById(sourceId).blur();
}

function zgdbConfirmDelete() {
	if (confirm(zgdbMsg_confirmDeleteObject)) {
		zgdbSetAction("delete");
		zgdbSubmitForm();
	}
}

function zgdbConfirmJump(query, jumpAddr) {
	if (confirm(query)) {
		location.href = jumpAddr;
	}
}

// function zgdbQuickAssign(attributeName, mode, selected) {
function zgdbQuickAssign(paramObj, objectId) {
	// 1. collect all marked checkboxes
	var sel, prefix = "tx_zingdbconn_pi1";
	
	var marks = new Array();
	if(!objectId) {
		if(paramObj.mode == 'list') {
			sel = $$('.listWrap input.quickAssign');
		} else {
			sel = $$('.resultLines input.quickAssign');
		}
		var id, tmp, titles = "";
		for(var i = 0; i < sel.length; i++) {
			if(sel[i].checked) { 
				id = sel[i].getAttribute('id').substring(16);
				id = id.substring(0, id.length - 1);
				marks.push(id);
				tmp = $("zgdbTitle_" + id);
				if(tmp) titles += tmp.innerHTML + "<br />";
			}
		}
	} else {
		marks.push(objectId);
	}
	// 2. assemble URI
	var URI = "index.php?eID=zgdbQuickVal&" + prefix + "[objectId]="
	+	paramObj.objectId + "&" + prefix + "[attributeId]="
	+	paramObj.attributeId + "&" + prefix + "[context]="
	+	paramObj.context + "&" + prefix + "[langId]="
	+	paramObj.langId + "&" + prefix + "[dcId]="
	+	paramObj.dcId + "&" + prefix + "[LO]="
	+	marks.join(",") + "&" + prefix + "[oldContext]="
	+	paramObj.oldContext;
	
	// 3. set target & launch AJAX request
	zgdbTmpTarget = window.opener.$('zgdbAttr_' + paramObj.attributeId);
	
	new Ajax.Request(
		URI,
		{
			'method' : 'GET',
			'onComplete' : zgdbQuickAssignUpdate
		}
	);
}

function zgdbQuickAssignSingle(attributeName, selected) {
	var title = $("zgdbTitle_" + selected).innerHTML;
	var identifier = 'tx_zingdbconn_pi1[' + attributeName + '][picker]';
	$(opener).$(identifier+"[markedRow]").value = selected;
	$(opener).$(identifier+"[action]").value = 'assign';
	$(opener).$("tx_zingdbconn_pi1_" + attributeName + "_objectTitle").innerHTML = title;
	rzLib.closeWindow();
}

function zgdbQuickAssignUpdate(requestObject) {
	zgdbTmpTarget.innerHTML = requestObject.responseText;
	rzLib.closeWindow();
}

function zgdbQuickUnlink(attributeName) {
	var identifier = 'tx_zingdbconn_pi1[' + attributeName + '][picker]';
	$(identifier + "[markedRow]").value = '';
	$(identifier + "[action]").value = 'assign';
	$("tx_zingdbconn_pi1_" + attributeName + "_objectTitle").innerHTML = '';
}

function zgdbRegisterParentSelector(childSel, parentSel, parentAttrId, childAttrId) {
	
	var childSelector, parentSelector;
	var childSelId, parentSelId;
	
	if(parentSel instanceof Object) {
	    parentSelector = parentSel;
	    parentSelId = parentSel.getAttribute("id");
	} else {
	    parentSelector = document.getElementById(parentSel);
	    parentSelId = parentSel;
	}
	if(childSel instanceof Object) {
		childSelector = childSel;
		childSelId = childSel.getAttribute("id");
	} else {
		childSelector = document.getElementById(childSel);
		childSelId = childSel;
	}
	zgdbParentSelectors[childSelId] = parentSelector;
	
	var onchange = parentSelector.getAttribute('onchange');
	var updateCommand = 'zgdbParentChanged(this, \'' + childSelId + '\');';
	
	if(onchange) {
		parentSelector.setAttribute('onchange', onchange + '; ' + updateCommand);
	} else {
		parentSelector.setAttribute('onchange', updateCommand);
	}
}

function zgdbSetCalVisibility(targetFormElementId, visibility) {
	var targetFormElement = document.getElementById(targetFormElementId);
	var children = targetFormElement.parentNode.childNodes;
	var iterator;
	for (var i = 0; i < children.length; i++) {
		iterator = children[i];
		if(	typeof iterator.getAttribute == 'function'
		&&	iterator.getAttribute('class') == 'tcalIcon') {
			iterator.style.visibility = visibility;
		}
	}
}

function zgdbSetStartParam(prefix, start) {
	document.getElementById('zgdbPageStart_' + prefix).value = start;
	zgdbSubmitForm();
}

function zgdbSetAction(action, mode) {
	if (document.getElementById("zgdbAction")) {
		document.getElementById("zgdbAction").value = action;
		if (mode && document.getElementById("zgdbMode")) {
			document.getElementById("zgdbMode").value = mode;
		}
	}
}

function zgdb_triggerExport(tid, identifier, objectType) {
	// Set export parameters
	document.getElementById('zgdb_exportTid').value = tid;
	document.getElementById('zgdb_exportFlag').value = 1;
	document.getElementById('zgdb_exportIdentifier').value = identifier;
	document.getElementById('zgdb_exportObjectType').value = objectType;
	
	// Submit the form
	zgdbSubmitForm(false, false, true);
	
	// Unset the export parameters
	document.getElementById('zgdb_exportFlag').value = 0;
	document.getElementById('tx_zingdbconn_pi1[form]').setAttribute('target', '');
}

function zgdbSetActionIdentifier(identifier) {
	document.getElementById("zgdbActionIdentifier").value = identifier;
}

function zgdb_setListMode(moduleIdentifier, listMode) {
	document.getElementById("tx_zingdbconn_pi1[" + moduleIdentifier + "][listMode]").value = listMode;
	zgdbSubmitForm();
}

function zgdbSortSelectorChanged(reference, object, langId) {
	
	var optActive = reference.options[reference.selectedIndex];
	var ldo = optActive.getAttribute("ldo");

	var el = reference.options[reference.selectedIndex];
	var cl = el.getAttribute('class');

	if(cl && cl.indexOf('zgdbParent') == 0) {
		// parent attribute
		var parentId = cl.replace('zgdbParent_', '');
		callFilter(
				object.objectTypeId,
				-1,
				reference,
				'sortSelector',
				langId,
				object.context,
				object.identifier,
				object,
				true,
				zgdbSortSelectorUpdate,
				ldo
		);
	} else {
		var tmpId = "tx_zingdbconn_pi1[" + object.identifier + "][ldoSort]";
		if(document.getElementById(tmpId)) {
			document.getElementById(tmpId).value = ldo ? 1 : 0;
		}
		
		zgdbSetAction('');
		zgdbSubmitForm();
	}
}

function zgdbSubmitForm(id, target, blank) {
	
	if (!id) id = 'tx_zingdbconn_pi1[form]';
	
	if (blank) {
		document.getElementById(id).setAttribute('target', '_blank');
	}
	
	if (target) {
		document.getElementById(id).setAttribute('action', target);
	}
	
	if (typeof l10nSwitch != 'undefined') {
		l10nSwitch.submitForm(target);
	} else {
		document.getElementById(id).submit();
	}
}

function zgdbGroupSelectorChanged(source, object, langId) {
	zgdbSetAction("");
	zgdbSubmitForm();
}

function zgdbMarkOnly(id, identifier) {
	zgdb_setSelect(identifier, 'off');
	var c = document.getElementById(
		'zgdb_checked' + identifier + '[' + id + ']'
	);
	c.checked = 'on';
}

function zgdbPrintContent() {
	window.print();
}

function zgdbResetStart(postfix) {
	if (document.getElementById('zgdbPageStart_' + postfix)) {
		document.getElementById('zgdbPageStart_' + postfix).value = 0;
	}
}

function zgdbSAS(element,value,formId, target) {
	if(!formId) formId = 'form';
	if(!target) target = window;
	target.document.getElementById("tx_zingdbconn_pi1[" + element + "]").value = value;
	zgdbSubmitForm(formId);
}



function zgdbTranslate(key) {
	if(zgdbTexts[key]) return zgdbTexts[key];
	else return false;
}


function zgdbUpdateAllCriteria(obj) {
	var id = "tx_zingdbconn_pi1[" + obj.identifier
	+	"][options][allCriteria]";
	var cb = document.getElementById(id);
	if(!cb) {
		alert("element '" + id + "' not found!");
		return;
	}
	
	var prefix = '#tx_zingdbconn_pi1_filter_' + obj.identifier;
	var state = cb.checked ? 1 : 0;
	var inputFields = $$(prefix + ' .input_filter_andOr');
	var buttons = $$(prefix + ' .filterRelation .inner');
	var markers = $$(prefix + ' .filterRelationMarker');
	
	var statusMsg = zgdbTranslate('filter_button_' + (state ? 'and' : 'or'));
	var searchMarkerClass = 'filterRelationMarker' + (state ? 'Off' : 'On');
	var replaceMarkerClass = 'filterRelationMarker' + (state ? 'On' : 'Off');
	var newClass;
	
	var tmpIndex = 0;
	for(var i = 0; i < inputFields.length; i++) {
		inputFields[i].value = state;
		buttons[i].innerHTML = statusMsg;
		
		/*
		newClass = markers[i].getAttribute('class').replace(searchMarkerClass, replaceMarkerClass);
		markers[i].setAttribute('class', newClass);
		markers[i].setAttribute('className', newClass);
		*/
		
		rzLib.removeClass(markers[i], searchMarkerClass);
		rzLib.addClass(markers[i], replaceMarkerClass);
		tmpIndex++;
	}
}


/******* TAB FUNCTIONS *******/
var zgdb_activeTab;

function switchTab(activeTab, bla) {
	
	zgdb_activeTab = activeTab;
	
	var container = document.getElementById("zgdb_tabWrap");
	
	var children = container.childNodes;
	var iterator, newClass, zIndex;
	
	for (var i = 0; i < children.length; i++) {
		iterator = children[i];
		if (iterator.nodeName == 'undefined' || iterator.nodeName.toLowerCase() != 'div') {
			continue;
		}
		
		newClass = iterator.getAttribute('id') == ("zgdb_tab_" + activeTab)
		?	'active' : 'inactive';
		zIndex = iterator.getAttribute('id') == ("zgdb_tab_" + activeTab) ? 1 : 0;
		
		iterator.setAttribute('className', 'tab ' + newClass);
		iterator.setAttribute('class', 'tab ' + newClass);
		iterator.style.zIndex = zIndex;
	}
	
	container = document.getElementById("zgdb_tabTitleSubWrapRow");
	children = container.childNodes;
	
	for (var i = 0; i < children.length; i++) {
		iterator = children[i];
		if (iterator.nodeName == 'undefined' 
		|| 	iterator.nodeName.toLowerCase() != 'td'
		||	iterator.getAttribute('id') == null
		||	iterator.getAttribute('id').indexOf("zgdb_tabTitle") == -1	
		) {
			continue;
		}
		
		newClass = iterator.getAttribute('id') == ("zgdb_tabTitle_" + activeTab)
		?	'active' : 'inactive';
		iterator.setAttribute('className', 'tabTitle ' + newClass);
		iterator.setAttribute('class', 'tabTitle ' + newClass);
		
	}
	
	if (document.getElementById("zgdbTab")) {
		document.getElementById("zgdbTab").value = activeTab;
	}
	zgdb_ensureVisibility('zgdb_tabTitles', 'zgdb_tabTitle_' + activeTab, 'zgdb_tabTitleSubWrap');
	
	// resize pickers, if there are any
	if (typeof zgdb_resizePickers == 'function') {
		zgdb_resizePickers();
	}
}


function zgdb_previousTab() {
	var tmpIndex = -1;
	for (var i = 1; i < tabs.length && tmpIndex == -1; i++) {
		if (tabs[i] == zgdb_activeTab) tmpIndex = i;
	}
	if (tmpIndex == -1) return;
	
	switchTab(tabs[tmpIndex - 1]);
}


function zgdb_nextTab() {
	var tmpIndex = -1;
	for (var i = 0; i < tabs.length - 1 && tmpIndex == -1; i++) {
		if (tabs[i] == zgdb_activeTab) tmpIndex = i;
	}
	if (tmpIndex == -1) return;
	
	switchTab(tabs[tmpIndex + 1]);
}

var zgdb_tabOffset = 0;

function zgdb_ensureVisibility(parentTable, childCell, container) {
	var childCell = $(childCell);
	if(!childCell) return;
	var parent = $(childCell).getOffsetParent();
	var container = $(container); 
	
	var offsetLeft = childCell.offsetLeft;
	var offsetWidth = childCell.offsetWidth;
	
	var offsetParentWidth = container.offsetWidth;
	
	if ($('tabDebug')) {
		$('tabDebug').innerHTML = "offsetLeft: " + offsetLeft + "<br />"
		+	"offsetWidth: " + offsetWidth + "<br />"
		+	"zgdb_tabOffset: " + zgdb_tabOffset + "<br />"
		+	"offsetParentWidth: " + offsetParentWidth;
	}
	
	if (offsetLeft + offsetWidth > offsetParentWidth - zgdb_tabOffset) {
		zgdb_tabOffset = offsetParentWidth - (offsetWidth + offsetLeft);
		parent.style.left = zgdb_tabOffset + "px";
	} else if (offsetLeft < 0 - zgdb_tabOffset) {
		zgdb_tabOffset = - offsetLeft;
		parent.style.left = zgdb_tabOffset + "px";
	}
}


function zgdb_export(key, target) {
	
	zgdbSetActionIdentifier(key);
	zgdbSetAction('export', key);
	document.getElementById('tx_zingdbconn_pi1[form]').action = target;
	zgdbSubmitForm();
}

function zgdb_setPickerCSS(identifier, target) {
	document.getElementById("zgdb_PickerCSS_" + identifier).setAttribute('href', target);
	zgdb_resizePickerResultCells(identifier);
}

