// Login
function loginUser()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/loginUser");
    
    // Daten aufbauen und ins Fenster laden
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    // document.forms[0].removeChild($("ek_ajax_url"));
	$("ek_ajax_url").remove();
}

// Funktion des Dialogs "IDD_MAIN" zur Ermittlung
// des Zustands des Popupblockers. Veranlasst die
// Prüfung der Aktivität des Blockers und sperrt
// das System, sofern er aktiviert ist
function testPopupBlocker(status)
{
    var formData = Form.serialize(document.forms[0]);
    var browserType = (is.ie) ? "InternetExplorer" : ((is.nav) ? "Firefox" : "unknown");
    
    new Ajax.Request("ajax/testPopupBlocker", {
        parameters:
        {
            '__eksubmit_values__' : formData + "&status=" + status + "&browserType=" + browserType
        },
        
        onSuccess: function(transport)
        {
            try
            {
				var responseObject = transport.responseJSON;
				responseObject.popupCheck.evalScripts();
            }
            catch(e)
            {
                alert("Fehler beim Testen des Popup-Blockers.\nException: " + e.message);
            }
        }
    });
}


// Funktion der Dialoge "IDD_MAIN" und "IDD_PRODUCT" zum
// Laden der drei HTML-Bereiche des Dialogs "IDD_MAIN"
function loadHtmlPage(htmlPagePosition)
{
    var formData = Form.serialize(document.forms[0]);
    
    new Ajax.Request("ajax/loadHtmlPage", {
        parameters:
        {
            '__eksubmit_values__' : formData + "&position=" + htmlPagePosition
        },
        
        onSuccess: function(transport)
        {
            try
            {
				var responseObject = transport.responseJSON;
				
				// Fetch the DOM element of the main dialog
				// where the HTML content should get displayed
				var pageElement;
				if(htmlPagePosition == "UPPER_HEADER")
					pageElement = topEasykatFrame.$("IDC_UPPER_HEADER_HTMLPAGE");
				else if(htmlPagePosition == "LOWER_HEADER")
					pageElement = topEasykatFrame.$("IDC_LOWER_HEADER_HTMLPAGE");
				else if(htmlPagePosition == "FOOTER")
					pageElement = topEasykatFrame.$("IDC_FOOTER_HTMLPAGE");
				
				// Load the contents into the page element
				if(pageElement)
				{
					// If it's not the upper header being loaded
					// and a logo image is present, too
					if(!(htmlPagePosition == "UPPER_HEADER" && responseObject.htmlData == "<div></div>"))
					{
						pageElement.show();
						pageElement.innerHTML = responseObject.htmlData;
					}
				}
            }
            catch(e)
            {
                alert("Fehler beim Laden der HTML-Seite '" + htmlPagePosition + "'\nException: " + e.message);
            }
        }
    });
}


// Funktion der Dialoge IDD_PRODUCT und IDD_CFGSUMMARY zum
// Hinzufügen eines Produktes zur Projektliste
function	addToShoppingCart(artNr, typecode, treeIdent, unitPrice, cfgProduct, lastDialog)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/addToShoppingCart?artNr="+artNr+"&treeIdent="+treeIdent+"&typecode="+typecode+"&unitPrice="+unitPrice+"&cfgProduct="+cfgProduct+"&lastDialog="+lastDialog);
    
    ekSubmit("", 'isyiframe' );
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
    
    // Event-Vererbung aufhalten, um die Selektion von mehreren
    // Tabellenzeilen in der Produkttabelle zu vermeiden
    if ( is.ie5up )
        Event.stop( window.event );
}


// Funktion der Dialoge IDD_PRODUCT zum
// Hinzufügen eines Produktes zur Favoritenliste
function	addToFavoriteList(artNr, typecode, treeIdent, unitPrice, cfgProduct, lastDialog)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/addToFavoriteList?artNr="+artNr+"&treeIdent="+treeIdent+"&typecode="+typecode+"&unitPrice="+unitPrice+"&cfgProduct="+cfgProduct+"&lastDialog="+lastDialog);
    
    ekSubmit("", 'isyiframe' );
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
    
    // Event-Vererbung aufhalten, um die Selektion von mehreren
    // Tabellenzeilen in der Produkttabelle zu vermeiden
    if ( is.ie5up )
        Event.stop( window.event );
}


// Funktion der Dialoge IDD_PRODUCT und IDD_PRODUCT_GROUPS zum
// Anzeigen eines vergrößerten Produktbildes in einem separaten
// Fenster. Die Funktion wird ebenfalls vom Dialog IDD_CONFIG
// zur Anzeige eines vergrößerten Vorschaubildes verwendet.
// @param imagePath - Relativer Pfad der Bilddatei, die von der
//                    Runtime Engine als Quelle genutzt wird
// @param pictureType - Gibt an, welcher Typ von Bild angezeigt
//                      werden soll. Zulässig ist eines der
//						folgenden Schlüsselwörter:
//						PRODUCT = Anzeige eines Produktbildes
//						EXTCONFIG = Anzeige eines Vorschaubil-
//								    des der aktuellen externen
//								    Konfiguration
function	displayZoomedImage(imagePath, pictureType)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    var imageData = encodeURIComponent("{'imagePath' : '" + imagePath + "'}");
    createNewHiddenFormField("ek_ajax_url", "ajax/displayZoomedImage?imageData=" + imageData + "&pictureType=" + pictureType);
    
	// Alle Eingabekontrollen des Dialogs deaktivieren
	disableInput();
	
    // Popup-Fenster für die Bilddarstellung öffnen
    window.open("","ZoomedImageWindow","width=1000,height=800,left=0,top=0,resizable=yes, scrollbars=no");
    
    // Daten aufbauen und ins Fenster laden
    ekSubmit("", 'ZoomedImageWindow');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs "IDD_PRODUCT" zur Anzeige von erweiterten
// Produktinformationen in einem den aktuellen Dialog überlagern-
// den <div>-Element
// @param infoIdent - Der Identifier für die anzuzeigenden Infor-
//        mationen (wird zur Datenbank-Abfrage benutzt)
function getProductInfos(infoIdent)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/getProductInfos?infoIdent=" + infoIdent);
    
	// Alle Eingabekontrollen des Dialogs deaktivieren
	disableInput();
	
    // Daten aufbauen und ins Fenster laden
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_CONFIG zum ermitteln
// des initialien Preises der Konfiguration un-
// mittelbar nach deren Start
function getCfgInitPrice()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/getCfgInitPrice");
    
	// Alle Eingabekontrollen des Dialogs deaktivieren
	disableInput();
	
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_PRODUCT zum Zurück-
// setzen der Filtereinstellungen der Comboboxen
function resetProductFilter()
{   
	// Aktuell selektierten Tab abfragen und aus
	// der ID die Nummer des gewählten Produkt-
	// Tabs ermitteln
	var currentProductTab = dialog.IDC_PRODUCT_TABS.getSelected().substring(11);
	
	// Produktfilter-Tabelle aus DOM laden
	var productFilterTable = document.getElementById("PRODUCT_COMBOBOX_TABLE" + currentProductTab);
	
	for(var i = 0; i < productFilterTable.rows.length; i++)
	{
		// Zeile der Tabelle ausblenden, um Flackern zu verhindern
		productFilterTable.rows[i].style.display = "none";
		
		for(var j = 0; j < productFilterTable.rows[i].cells.length; j++)
		{
			// Inhalt der Tabellenzelle zwischenspeichern
			var filterCellContent = productFilterTable.rows[i].cells[j].firstChild;
			
			// Sofern die Zelle einen Filter beinhaltet
			if(filterCellContent && filterCellContent.tagName == "TABLE")
			{
				// Eingabefelder ermitteln
				var inputFields = filterCellContent.rows[1].cells[0].childNodes;
				
				// Setze den Vergleichsoperator der Relationen-Combobox
				// auf "=" zurück (dritte Option), sofern es nicht be-
				// reits nur noch eine Relation gibt
				if(inputFields[0].options.length >= 2)
					inputFields[0].selectedIndex = 2;
				
				// Setze die Selektion der Werte-Combobox auf leer
				inputFields[1].selectedIndex = 0;
				
				// Edit-Felder leeren (Werte löschen)
				inputFields[2].value = "";
				inputFields[4].value = "";
			}
			else
				return;
		}
	}
}


 // Funktion des Dialogs IDD_PRODUCT zum Ein- und
// Ausblenden des Buttons "Drucken" sowie
// "Filter zurücksetzen"
function setPrintProductTableButtons(selectedTab)
{
    // Wenn nichts übergeben wurde, wurde die
    // Funktion über onload aufgerufen, und
    // die Widget-Abfrage liefert ein korrektes
    // Ergebnis
    if(selectedTab == '')
    {
        // TabCtrl-Widget und selektierten Tab
        // abfragen
        var tabCtrl = dialog["IDC_PRODUCT_TABS"];
        selectedTab = tabCtrl.getSelected();
    }
    
    // Wenn ein Produkt-Tab selektiert ist
    if(selectedTab && selectedTab.indexOf("PRODUCT_TAB") >= 0)
    {
        // Flag zur Anzeige der ControlButtonsTable
        var showControlButtonsTable = false;
        
        // Nummer des angeklickten Produkt-Tabs
        var productTabNumber = selectedTab.substring(11);
        
        // Tabelle nur anzeigen, wenn entweder der
        // Drucken-Button sichtbar ist und / oder
        // die Combobox-Filtertabelle existiert
        var printDocumentButton = $("IDC_PRODUCTTABLE_PRINT_PDF");
        
        if(printDocumentButton.style.visibility != "hidden")
            showControlButtonsTable = true;
        
        // Falls der Inhalt des Produkt-Tabs bereits
        // generiert wurde
        if($("PRODUCT_TABLE" + productTabNumber).tagName == "DIV")
        {
            if($("PRODUCT_COMBOBOX_TABLE" + productTabNumber).tagName.toUpperCase() != "DIV")
                showControlButtonsTable = true;
        }
        else
        {
            if($("PRODUCT_COMBOBOX_TABLE" + productTabNumber).rows[0].cells[0].innerHTML != "&nbsp;")
                showControlButtonsTable = true;
        }
        
        // Tabelle anzeigen, falls zulässig
        if(showControlButtonsTable)
        {
            $("IDC_CONRTOLBUTTONS_TABLE").show()
            return;
        }
        
        // Tabelle verstecken, da kein Link
        // angezeigt wird
        $("IDC_CONRTOLBUTTONS_TABLE").hide();
    }
    // Buttons verstecken, wenn kein Produkt-Tab
    // selektiert ist
    else
        $("IDC_CONRTOLBUTTONS_TABLE").hide();
}


function setupProductFilter(selectedTab)
{
	var formData = Form.serialize(document.forms[0]);
    
    new Ajax.Request("ajax/getProductFilter", {
        parameters:
        {
            '__eksubmit_values__' : formData
        },
        
        onSuccess: function(transport)
        {
            try
            {
				var responseObject = transport.responseJSON;
				var filterTable;
				
				
				if(responseObject.filters || responseObject.noFiltersSpecified)
				{
					// Get the currently selected tab and extract the
					// number of the product tab out of it
					var currentProductTab = dialog.IDC_PRODUCT_TABS.getSelected().substring(11);
					
					// Fetch the product filter table from the DOM
					var filterTable = document.getElementById("PRODUCT_COMBOBOX_TABLE" + currentProductTab);
					var filterTableRows = filterTable.rows.length;
					
					for(var i = 0; i < filterTableRows; i++)
						filterTable.deleteRow(0);
				}
				
				if(responseObject.filters)
				{
					var currentTableRow;
					
					for(var i = 0; i < responseObject.filters.length; i++)
					{
						// Setup the table for the current filter which will be
						// displayed within one cell of the product filter table
						// and insert the filter's title
						var filterTableCell = document.createElement("table");
						filterTableCell.className = "easykatLight-comboboxInnerTable";
						filterTableCell.cellSpacing = "0";
						filterTableCell.style.whiteSpace = "nowrap";
						filterTableCell.insertRow(0).insertCell(0).innerHTML = responseObject.filters[i].title;
						
						// Setup the combobox containing the filter's relations
						var relationCombobox = document.createElement("select");
						relationCombobox.id = "*." + responseObject.filterStorePath + "." + responseObject.filters[i].attributeIdent + "_RELATION";
						relationCombobox.style.width = responseObject.relationComboboxWidth + "px";
						relationCombobox.onchange = relationComboboxChange;
						
						// Add the filter's relations to the relation combobox
						for(var j = 0; j < responseObject.filters[i].relations.length; j++)
						{
							relationCombobox.options[j] = new Option(responseObject.filters[i].relations[j].value, responseObject.filters[i].relations[j].id, false, false);
							
							if(responseObject.filters[i].relations[j].selected)
								relationCombobox.selectedIndex = j;
						}
						
						// Setup the combobox containing the filter's values (items)
						var itemCombobox = document.createElement("select");
						itemCombobox.id = "*." + responseObject.filterStorePath + "." + responseObject.filters[i].attributeIdent;
						itemCombobox.style.width = responseObject.itemComboboxWidth + "px";
						itemCombobox.style.marginLeft = "4px";
						itemCombobox.onchange = checkFilterSubmit;
						
						// Add the filter's values (items) to the value combobox
						for(var j = 0; j < responseObject.filters[i].items.length; j++)
						{
							itemCombobox.options[j] = new Option('', responseObject.filters[i].items[j].id, false, false); 
							itemCombobox.options[j].innerHTML = responseObject.filters[i].items[j].value;
							
							if(responseObject.filters[i].items[j].selected)
								itemCombobox.selectedIndex = j;
						}
						
						// Add the comboboxes to the filter's table
						var filterComboboxContainer = filterTableCell.insertRow(1).insertCell(0);
						filterComboboxContainer.style.height = "24px";
						filterComboboxContainer.style.verticalAlign = "middle";
						filterComboboxContainer.appendChild(relationCombobox);
						filterComboboxContainer.appendChild(itemCombobox);
						
						// Add the HTML elements needed for range selection
						// abilities(either range between two values or neigh-
						// borhood (percentage value) of a certain value
						// Input field vor lower boundary
						var inputFieldLower = document.createElement("input");
						inputFieldLower.id = "*." + responseObject.filterStorePath + "." + responseObject.filters[i].attributeIdent + "_FIRST_VALUE";
						inputFieldLower.type = "text";
						inputFieldLower.value = responseObject.filters[i].firstUserValue;
						inputFieldLower.className = "textNormal";
						inputFieldLower.style.width = parseInt((responseObject.itemComboboxWidth - 21) / 2) + "px";
						inputFieldLower.style.marginLeft = "4px";
						inputFieldLower.onchange = checkFilterSubmit;
						inputFieldLower.style.display = "none";
						if(!is.ie)
							inputFieldLower.style.padding = "0px";
						filterComboboxContainer.appendChild(inputFieldLower);
						
						// Label containing the neighborhood sign (+/-)
						var plusMinusLabel = document.createElement("span");
						plusMinusLabel.appendChild(document.createTextNode(" \u00B1"));
						plusMinusLabel.style.display = "none";
						filterComboboxContainer.appendChild(plusMinusLabel);
						
						// Input field vor upper boundary
						var inputFieldUpper = inputFieldLower.cloneNode(false);
						inputFieldUpper.id = inputFieldUpper.id.replace("_FIRST_VALUE", "_SECOND_VALUE");
						inputFieldUpper.value = responseObject.filters[i].secondUserValue;
						inputFieldUpper.style.marginLeft = "5px";
						inputFieldUpper.onchange = checkFilterSubmit;
						filterComboboxContainer.appendChild(inputFieldUpper);
						
						// Label containing the percent sign (%)
						var percentLabel = document.createElement("span");
						percentLabel.appendChild(document.createTextNode(" %"));
						percentLabel.style.display = "none";
						filterComboboxContainer.appendChild(percentLabel);
						
						// Append a row to the main product filter table, if necessary,
						// and insert the generated filter to a cell
						if(i % responseObject.filtersPerRow == 0)
						{
							currentTableRow = filterTable.insertRow(i / responseObject.filtersPerRow);
							currentTableRow.style.display = "none";
						}
						
						if(relationCombobox.selectedIndex > 3)
							relationComboboxChange.call(relationCombobox, true);
						
						currentTableRow.insertCell(i % responseObject.filtersPerRow).appendChild(filterTableCell);
					}
					
					// If there's no space left for the 'reset filter' icon column,
					// insert another row to the table
					if(currentTableRow.cells.length == responseObject.filtersPerRow - 1)
						filterTable.insertRow(filterTable.rows.length);
					
					// Fill up missing cells of the table row and insert the 'reset
					// filter' icon to the last cell
					for(var i = currentTableRow.cells.length; i < responseObject.filtersPerRow; i++)
					{
						var currentTableCell = currentTableRow.insertCell(i);
						
						if(i == responseObject.filtersPerRow - 1)
						{
							var resetIconImage = document.createElement("img");
							resetIconImage.id = "IDC_RESET_FILTER_ICON";
							resetIconImage.src = "EKImage/Button/Menu_Reset_Filter.gif";
							resetIconImage.className = "easykatLight-linkImage";
							resetIconImage.style.paddingRight = "10px";
							resetIconImage.style.paddingBottom = "7px";
							resetIconImage.title = responseObject.resetFilterTooltip;
							resetIconImage.onclick = function() { resetProductFilter(); getProductTabContent({event: 'filterReset'});};
							
							// Set the correct style information and append the
							// 'reset filter' icon cell
							currentTableCell.style.textAlign = "right";
							currentTableCell.style.verticalAlign = "bottom";
							currentTableCell.appendChild(resetIconImage);
						}
					}
					
					for(var i = 0; i < filterTable.rows.length; i++)
						filterTable.rows[i].style.display = "";
				}
				else if(responseObject.noFiltersSpecified)
				{
					var filterBorder = document.createElement('div');
					filterBorder.id = "PRODUCT_COMBOBOX_TABLE1";
					filterBorder.style.top = "0px";
					filterBorder.style.left = "0px";
					filterBorder.style.width = "758px";
					filterBorder.style.height = "1px";
					filterBorder.style.position = "absolute";
					filterBorder.className = "easykatLight-border";
					filterBorder.innerHTML = "&nbsp;"
					filterTable.parentNode.replaceChild(filterBorder, filterTable);
				}
			}
			catch(e)
			{
				alert("Fehler beim Aufbau des Produktfilters\nException: " + e.message);
			}
		}
	});
}


// Funktion des Dialogs IDD_PRODUCT zum Laden bzw.
// Aktualisieren des Inhalts (Tabellen) eines
// PRODUCTS- oder CHILD-PRODUCTS-Tabs. Alle Para-
// meter müssen in einem anonymen Objekt überge-
// ben werden
//
// @param event - Spezifizierung, warum diese
//        Funktion aufgerufen wurde anhand eines
//        der folgenden Schlüsselwörter:
//          clickedOnTab - Der Tab wurde in der
//          Dialog-Ansicht angeklickt
//          pagingAction - Ein Paging-Button
//          wurde angeklickt
//          filterChanged - Eine Filter-Einstel-
//          lung wurde verändert
//          filterReset - Der Filter wurde zu-
//          rückgesetzt
//          treeSelectionChanged - Ein neuer
//          Knoten im Menübaum wurde gewählt
//          und der zuletzt selektierte Tab
//          war ein Produkt-Tab
// @param tabNr - Nummer des ausgewählten Tabs,
//        nur belegt bei den Events 'clickedOnTab'
//        und 'treeSelectionChanged'
// @param pagingEvent - Legt die durchzufuehrende
//        Aktion bei der Nutzung von Paging fest:
//          INIT - Initaler Aufbau der Tabelle
//                 Wird nur gesendet, wenn Paging
//                 aktiviert ist
//          FIRST - Erste Seite laden
//          PREVIOUS - Eine Seite zurückblättern
//          NEXT - Eine seite vorblättern
//          LAST - Letzte Seite laden
function getProductTabContent(params)
{
    // Neuladen des Tabs je nach Tab-Zustand,
    // sofern die Funktion anhand eines Klicks
    // auf einen Produkt-Tab in der Dialog-
    // Ansicht aufgerufen wurde
    if(params.event == 'clickedOnTab')
    {
        // Nummer des Produkt-Tabs abfragen
        var productTabNumber = params.tabNr;
        
        // Sofern der Inhalt bereits geladen wurde,
        // lediglich den Status der ControlButtons
        // Table prüfen und ggf. aktualisieren
        if($("PRODUCT_TABLE" + productTabNumber).tagName == "DIV")
        {
            setPrintProductTableButtons("PRODUCT_TAB" + productTabNumber);
            return;
        }
    }
    
    if(params.event == 'clickedOnTab' || params.event == "treeSelectionChanged")
    {
        // Tab-Höhe anpassen, da die Paging-Buttons
        // sonst nicht dargestellt werden können
        if(is.ie && params.pagingEvent == "INIT")
            $("PRODUCT_TAB" + params.tabNr).style.height = "536px";
        
        // Paging-Event löschen, da es nicht an
        // den Server zurückgesendet werden soll
        params.pagingEvent = "";
    }
    
    // Alle Eingabekontrollen des Dialogs deaktivieren
    disableInput();
    
    // Wartemeldung einblenden (wird beim Laden
    // des Frames mittels onload ausgeblendet)
    dialog.LOADPRODUCTS_NOTICE.setText($F("WAITMESSAGE"));
    dialog.LOADPRODUCTS_NOTICE.show();
    
    if(params.pagingEvent)
    {
		var formData = Form.serialize(document.forms[0]);
		
		// Daten der Produkttabelle aktualisieren
		var currentProductTab = dialog.IDC_PRODUCT_TABS.getSelected();
		currentProductTab = currentProductTab.replace("PRODUCT_TAB" , "");
		dialog["PRODUCT_TABLE" + currentProductTab].update({"url": "ajax/getProductTablePagingData", "params": {'__eksubmit_values__' : formData + "&pagingEvent=" + params.pagingEvent}});
        
		// Paging-Infos anpassen
		new Ajax.Request("ajax/getProductTablePagingInfo", {
			parameters:
			{
				'__eksubmit_values__' : formData + "&pagingEvent=" + params.pagingEvent
			},
			
			onSuccess: function(transport)
			{
				try
				{
					var responseObject = transport.responseJSON;
					
					var firstPageButton = document.getElementById("IDC_PRODUCT_TABLE_PAGING_FIRST");
					var previousPageButton = document.getElementById("IDC_PRODUCT_TABLE_PAGING_PREVIOUS");
					var pagingInfoText = document.getElementById("IDC_PRODUCT_TABLE_PAGING_INFO");
					var nextPagingButton = document.getElementById("IDC_PRODUCT_TABLE_PAGING_NEXT");
					var lastPagingButton = document.getElementById("IDC_PRODUCT_TABLE_PAGING_LAST");
					
					if(!responseObject.firstButtonDisabled)
					{
						firstPageButton.src = "EKImage/Button/Paging_first.gif";
						firstPageButton.className = "easykatLight-linkImage";
						firstPageButton.onclick = function() { getProductTabContent({event: 'pagingAction', pagingEvent: 'FIRST'}); }
					}
					else
					{
						firstPageButton.src = "EKImage/Button/Paging_first_disabled.gif";
						firstPageButton.className = "";
						firstPageButton.onclick = null;
					}
					
					if(!responseObject.previousButtonDisabled)
					{
						previousPageButton.src = "EKImage/Button/Paging_previous.gif";
						previousPageButton.className = "easykatLight-linkImage";
						previousPageButton.onclick = function() { getProductTabContent({event: 'pagingAction', pagingEvent: 'PREV'}); }
					}
					else
					{
						previousPageButton.src = "EKImage/Button/Paging_previous_disabled.gif";
						previousPageButton.className = "";
						previousPageButton.onclick = null;
					}
					
					pagingInfoText.innerHTML = responseObject.infoText;
					
					if(!responseObject.nextButtonDisabled)
					{
						nextPagingButton.src = "EKImage/Button/Paging_next.gif";
						nextPagingButton.className = "easykatLight-linkImage";
						nextPagingButton.onclick = function () { getProductTabContent({event: 'pagingAction', pagingEvent: 'NEXT'}); }
					}
					else
					{
						nextPagingButton.src = "EKImage/Button/Paging_next_disabled.gif";
						nextPagingButton.className = "";
						nextPagingButton.onclick = null;
					}
					
					if(!responseObject.lastButtonDisabled)
					{
						lastPagingButton.src = "EKImage/Button/Paging_last.gif";
						lastPagingButton.className = "easykatLight-linkImage";
						lastPagingButton.onclick = function() { getProductTabContent({event: 'pagingAction', pagingEvent: 'LAST'}); }
					}
					else
					{
						lastPagingButton.src = "EKImage/Button/Paging_last_disabled.gif";
						lastPagingButton.className = "";
						lastPagingButton.onclick = null;
					}
					
					dialog.LOADPRODUCTS_NOTICE.hide();
					enableInput();
					checkSystemError();
				}
				catch(e)
				{
					alert("Fehler beim Paging der Produkttabelle. \nException: " + e.message);
				}
			}
		});
    }
	else
    {
		// Generierung des Inhalts minimal zeitver-
		// setzt starten, um die Wartemeldung anzei-
		// gen zu können
		setTimeout("updateDialogElement('IDD_PRODUCT', 'LOAD_PRODUCT_TAB_CONTENT', false, 'PRODUCT_TAB_CONTAINER|SYSTEM_ERROR_OCCURRED', 'getProductTabContent');setupProductFilter(1);", 5);
    }
}


// Funktion des Dialogs IDD_PRODUCT zum Aktualisieren
// des Inhalts (Tabellen) des PRODUCT-Tabs, sofern
// der Produkt-Tab bereits beim Aufbau selektiert ist.
// Sorgt auch dafür, dass bei einer TabCtrl ohne Tabs
// die Notice-Meldungen keinen Platz mehr benötigen.
function checkProductTabTimeliness()
{
    var selectedTab = dialog.IDC_PRODUCT_TABS.getSelected();
    
    if(selectedTab && selectedTab.indexOf("PRODUCT_TAB") >= 0)
    {
        var pagingEvent = ($F("productTablePagingEnabled") == "true") ? "INIT" : "";
        getProductTabContent({event: 'treeSelectionChanged', tabNr: selectedTab.substring(11), pagingEvent: pagingEvent});
    }
    
    // Wenn die TabCtrl keine Tabs hat, den Platz
    // der Notice-Meldungen freigeben
    if(!selectedTab)
    {
        $("LOADPRODUCTS_NOTICE").hide();
    }
}


// Funktion des Dialogs IDD_PROJECTLIST_TABS zum Aktuali-
// sieren des Inhalts (Tabelle) des PROJECTLIST-Tabs
function refreshProjectlistTab()
{
    // Alle Eingabekontrollen des Dialogs deaktivieren
	disableInput();
    
	// Produkttabelle in eigenen IFrame (Dialog
    // IDD_PROJECTLIST) laden
    ekSubmit('IDC_REFRESH_PROJECTLISTTABLE', 'ProjectlistTableFrame');
}


// Funktion des Dialogs IDD_PROJECTLIST_TABS zum Aktuali-
// sieren des Inhalts (Tabelle) des PROJEKTLISTEN-
// Tabs, sofern der Projektlisten-Tab bereits beim
// Aufbau selektiert ist
function checkProjectlistTabTimeliness()
{
    var selectedTab = dialog.IDC_PROJECTTABCTRL.getSelected();
    
    if(selectedTab == "IDC_PROJECTPOSITIONS_TAB")
        refreshProjectlistTab();
}


// Funktion der Dialoge IDD_Document und IDD_Product zum
// Öffnen einer CAD-Zeichnung
function	openCADDrawing(filename)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/openCADDrawing?cadName="+filename);
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion der Dialoge IDD_Document und IDD_Product zum
// Öffnen eines Dokuments mit nicht näher spetifiziertem
// Dateityp (z.B. Bild, Word-Dokument, ...)
function	openMiscDocument(filename)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/openMiscDocument?fileName="+filename);
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion der Dialoge IDD_PRODUCT und IDD_PROJECTLIST zum
// Ein- und Ausblenden der Details-Tabelle
function	toggleDetails(tableRowIndex, detailsIdent, productType, mode, artNr, treeIdent)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/toggleDetails?tableRowIndex="+tableRowIndex+"&detailsId="+detailsIdent+"&productType="+productType+"&mode="+mode+"&artNr="+artNr+"&treeIdent="+treeIdent);
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion der Dialoge IDD_CFGSUMMARY, IDD_PROJECTLIST_TABS, IDD_DETAILS
// und IDD_OFFER zum Drucken eines RTF- oder PDF-Dokuments.
// Je nachdem, ob das System im Internet-Modus läuft und AJAX unterstützt
// wird, ändert sich der Funktionsablauf.
function	printDocument(event, format)
{
	// Alle Eingabekontrollen des Dialogs deaktivieren
	disableInput();
	
	// Wartemeldung anzeigen
	if (format == "PDF")
		displayPopupNotice("PDF_GENERATION");
	else if (format == "DOC")
		displayPopupNotice("DOC_GENERATION");
	
    // Das System läuft im Internet-Modus und AJAX
    // ist verfügbar
    if(operateInInternetMode() && Ajax.getTransport())
    {
        // Ergebnis-Objekt zeitverzögert empfangen,
		// um die Anzeige der Wartemeldung zu ermög-
		// lichen
		setTimeout(function() {
			var resultData = sendSyncRequest('printDocument', 'event='+event+'&format='+format+'&ajax=true').evalJSON();
			
			// Die "Bitte warten"-Meldung ausblenden und
            // alle Eingabekontrollen des Dialogs wieder
            // freigeben
			hidePopupNotice();
            enableInput();
			
			// Sofern ein Fehler während der Generierung
			// aufgetreten ist, das Systemfehler-Flag
			// setzen und die Funktion zur Ausgabe des
			// Fehlers aufrufen
			if(resultData.generationErrorOccurred)
			{
				$("SYSTEM_ERROR_OCCURRED").value = 1;
				checkSystemError();
			}
			else
			{
				// Dokument öffnen
				window.open(resultData.documentFileUrl);
			}
		}, 5);
    }
    else
    {
		// Hidden-Feld zum Aufruf des Handlers zum
		// Starten des Dokument-Generierungsprozesses
		//anlegen
		createNewHiddenFormField("ek_ajax_url", "ajax/printDocument?format="+format+"&event="+event+"&ajax=false");
        ekSubmit("PRINT_DOCUMENT", 'isyiframe');
		
        // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
        // wie z.B. "dynrequest.js" in Konflikt zu geraten
        document.forms[0].removeChild($("ek_ajax_url"));
    }
}


// Funktion des Dialogs IDD_PROJECTLIST_TABS zum Speichern
// der Projektliste
function	saveProject()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveProject?sendEmail=false");
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_PROJECTLIST zum Überprüfen, der
// Verfügbarkeit des Buttons "Position ändern"
function	checkPositionModify()
{
    // Tabellen-Widget und selektierte Tabellenzeile laden
    var tableWidget = dialog["IDC_PROJLIST_TABLE"];
    var selectedRow = tableWidget.getSelected();
    
    // Wenn eine selektierte Zeile existiert
    if(selectedRow != "")
    {
        // Buttons aktivieren, denn sie könnten zuvor
        // deaktiviert worden sein
        parent.dialog["IDC_POSITION_COPY_BUT"].enable();
        parent.dialog["IDC_POSITION_DELETE_BUT"].enable();
        parent.dialog["IDC_PROJECT_REFRESH_BUT"].enable();
        
        // Typ des selektierten Produkts aus dem Hidden-
        // Field "projectlistProductTypes" laden
        var productTypes = eval("(" + $F("projectlistProductTypes") + ")");
        var curProductType = productTypes[selectedRow.substring(19)];
        
        // Sofern es ein konfigurierter Artikel ist,
        // aktiviere den Button "Position ändern"
        if(curProductType == "CONFIGURED")
            parent.dialog["IDC_POSITION_MODIFY_BUT"].enable();
        else
            parent.dialog["IDC_POSITION_MODIFY_BUT"].disable();
    }
    // Wenn keine selektierte Zeile existiert
    // deaktiviere alle Buttons
    else
    {
        parent.dialog["IDC_POSITION_MODIFY_BUT"].disable();
        parent.dialog["IDC_POSITION_COPY_BUT"].disable();
        parent.dialog["IDC_POSITION_DELETE_BUT"].disable();
        parent.dialog["IDC_PROJECT_REFRESH_BUT"].disable();
    }
}


// Funktion des Dialogs IDD_SETTINGS zum Speichern der
// persistenten Systemeinstellungen
function	saveSettings()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveSettings");
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_OFFER zum Speichern der
// Angebotsdaten
function	saveOffer()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveOffer?sendEmail=false");
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_OFFER zum Versenden einer
// eMail an den Vertrieb, wenn der Konfigurator im
// kundenseitigen Modus läuft
function	sendRequestEmail()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveProject?sendEmail=true");
    
    // Dialog sperren und Anrede-Combobox auf disabled setzen
    disableInput();
    $("*.PROJECT.SETTINGS.CLIENT.IDC_ANREDE_CUSTOMER").disabled = "true";
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_CONFIG zum Speichern der
// aktuellen Konfiguration
function	saveConfiguration()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveConfiguration");
	
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_FAVORITELIST zum Speichern der
// Favoritenliste
function	saveFavList()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveFavList");
	
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_OFFER zum Generieren eines
// CSV-Dokuments mit den Angebotsdaten
function	createCSV()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/createCSV");
	
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_OFFER zum Versenden der
// Angebots-Daten an den Vertrieb unter Benutzung
// von MAPI-Mail
function	sendOfferEmail()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/saveOffer?sendEmail=true");
    
    // Dialog sperren
    disableInput();
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_OFFER zum Generieren eines
// XML-Dokuments mit den Angebotsdaten
function generateOfferInterfaceXML()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/exportOfferInterfaceXml");
	
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_Offer zur Durchführung
// einer Kalkulationsberechnung
function	calculate(mode)
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/doCalculation?mode="+mode);
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_Offer zum Setzen der Angebotswährung
// in den entsprechenden Comboboxen
// Führt bei Währungsänderung oder bei Veränderung der Projekt-
// liste seit dem letzten Aufruf eine Neukalkulation durch
function	setOfferCurrency(combo)
{
    // Aktuell ausgewählte Währung speichern
    var currencyComboboxWidget    = dialog[combo];
    var curSelectedCurrencyId     = currencyComboboxWidget.getValue();
    var curSelectedCurrencyIdText = currencyComboboxWidget.getSelectedText();
    var lastCurrency              = document.getElementById("LAST_OFFER_CURRENCY");
    var recalculate = false;
    
    //alert("CurCurrency: " + curSelectedCurrencyId + " - LastCurrency: " + lastCurrency.value);
    
    // Bei Änderung der Währung eine Neukalkulation vornehmen
    if(lastCurrency.value != curSelectedCurrencyId)
        recalculate = true;
    
    // Zu änderne Comboboxen in einem Array angeben
    var targetComboboxes = new Array();
    targetComboboxes.push($('*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.DISPLAY.OVERALL.adjustmentUnit'));
    targetComboboxes.push($('*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.DISPLAY.POSITION.hiddenPriceAdjustmentUnit'));
    targetComboboxes.push($('*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.DISPLAY.POSITION.visiblePriceAdjustmentUnit'));
    
    for(i = 0; i < targetComboboxes.length; i++)
    {
        // Die ID darf wegen der Kalkulation nicht verändert werden
       // targetComboboxes[i].options[1].value = curSelectedCurrencyId;
        targetComboboxes[i].options[1].text  = curSelectedCurrencyIdText;
    }
    
    // Alle Header-Zellen der Produkttabelle, die Währungs-
    // Kürzel beinhalten, aktualisieren (Währung ändern)
    var tableCellIndices = [5, 6, 8];
    var headerTable = dialog["*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.OFFER_TABLE"].columnHeader.headerTable.rows[0];
    
    for(var i = 0; i < tableCellIndices.length; i++)
    {
        var resultData = headerTable.cells[tableCellIndices[i]].innerHTML.replace("[" + lastCurrency.value + "]", "[" + curSelectedCurrencyId + "]");
        headerTable.cells[tableCellIndices[i]].innerHTML = headerTable.cells[tableCellIndices[i]].innerHTML.replace("[" + lastCurrency.value + "]", "[" + curSelectedCurrencyId + "]");
    }
    
    // Währungshistorie aktualisieren
    lastCurrency.value = curSelectedCurrencyId;
    
    if(recalculate)
        calculate("full");
}


// Funktion des Dialogs IDD_Offer zur Selektierung
// oder Deselektierung aller Tabellenzeilen der
// Angebots-Tabelle
function	changeSelection()
{
    var offerTable = dialog["*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.OFFER_TABLE"];
    var numRows    = offerTable.getRowCount();
	var selectAllRowsChecked = dialog["*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.allTableRowsSelected"].element.checked;
	
    for(var i = 0; i < numRows; i++)
    {
        tableCell = offerTable.element.rows[i+1].cells[0];
        checkBox  = Element.getFirstChildByTagName(tableCell, 'input');
        checkBox.checked = selectAllRowsChecked;
    }
    
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/changeSelection");
	
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion des Dialogs IDD_Offer zur Anpassung des
// Selektierungsstatus der "Alle markieren"-Checkbox
// anhand der selektierten Tabellenzeilen
function	verifyCheckboxStatus()
{
    var offerTable = dialog["*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.OFFER_TABLE"];
    var numRows    = offerTable.getRowCount();
    for(var i = 0; i < numRows; i++)
    {
        tableCell = offerTable.element.rows[i+1].cells[0];
        checkBox  = Element.getFirstChildByTagName(tableCell, 'input');
        if(!checkBox.checked)
        {
            dialog["*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.allTableRowsSelected"].element.checked = false;
            return;
        }
    }
    dialog["*.DLGDATA.DLGVARS.EASYKATLIGHT.IDD_OFFER.CALC.allTableRowsSelected"].element.checked = true;
}


// Funktion des Dialogs IDD_Offer zum Laden der
// Kalkulationsdaten der aktuell selektierten
// Tabellenposition in die Dialogelemente
function	setCalcValues()
{
    // Hidden-Feld zum Aufruf des Handlers anlegen
    createNewHiddenFormField("ek_ajax_url", "ajax/setCalcValues");
    
    ekSubmit("", 'isyiframe');
    
    // Ajax-URL-Feld löschen, um nicht mit anderen Ajax-Skripten
    // wie z.B. "dynrequest.js" in Konflikt zu geraten
    document.forms[0].removeChild($("ek_ajax_url"));
}


// Funktion, die von allen Dialogen zur Ausgabe
// von Systemfehlern sowie allgemeinen Hinweisen
// verwendet wird. Die anzuzeigenden Daten werden
// in ein DIV-Element geladen, unter dem ein IFrame
// zur Überblendung von Comboboxen liegt. Beide
// Elemente werden erzeugt, sofern sie noch nicht
// existieren
function displayPopupNotice(noticeType)
{
    // Existenz des Popups abfragen
    var popupElement = topEasykatFrame.$("SYSTEMNOTICE_CONTAINER");
	
    // DIV-Element und IFrame für die Ausgabe 
    // der Daten anlegen
    if(!popupElement)
    {
        var topDocument = topEasykatFrame.document;
        
        // DIV-Element aufbauen und in den Haupt-
        // dialog integrieren
        popupElement = topDocument.createElement("DIV");
        popupElement.id = "SYSTEMNOTICE_CONTAINER";
        topDocument.body.appendChild(popupElement);
        
        // Unterlagernden IFrame aufbauen
        popupElement.iframeElement = topDocument.body.insertBefore(topDocument.createElement("IFRAME"), popupElement);
        popupElement.iframeElement.frameBorder = 0;
        popupElement.iframeElement.backgroundColor = "white";
        popupElement.iframeElement.src = "javascript: false";
        
        popupElement.iframeElement.style.zIndex = 10000;
        popupElement = $(popupElement);
    }
    
    // Anzuzeigende Daten und Meta-Informationen laden
	var content = sendSyncRequest("displayPopupNotice", "noticeType="+noticeType).evalJSON();
    
	// Style des Anzeige-Containers setzen
	popupElement.iframeElement.className = content.noticeStyle + "Container";
	popupElement.className = content.noticeStyle + "Container";
	
	// Meldung anzeigen und Ausblende-Timer setzen
	popupElement.innerHTML = "<table class=\"" + content.noticeStyle + "\"><tr><td><span>" + content.noticeText + "</span></td></tr></table>";
    popupElement.iframeElement.style.display = "block";
	popupElement.style.visibility = "visible";
	
    // Höhe des IFrame-Elements an die tatsächliche
    // Höhe der Meldungs-Tabelle anpassen
    popupElement.iframeElement.style.height = popupElement.childNodes[0].offsetHeight + "px";
    
	// Timeout für die Anzeige setzen (sofern nicht
    // auf 0 = nicht ausblenden gesetzt)
    if(content.displayTimeout > 0)
    {
        setTimeout("hidePopupNotice();", content.displayTimeout);
        popupElement.isPermanent = false;
    }
    else
        popupElement.isPermanent = true;
}

// Funktion zum Ausblenden des Bereichs zur Anzeige
// von Systemfehler-Meldungen sowie allgemeinen
// Hinweisen
function hidePopupNotice()
{
	var popupElement = topEasykatFrame.$("SYSTEMNOTICE_CONTAINER");
    
    // Wenn das Popup-DIV-Element existiert und
    // nicht als permanent gekennzeichnet ist
	if(popupElement && !popupElement.isPermanent)
	{
		popupElement.iframeElement.style.display = 'none';
		popupElement.style.visibility = 'hidden';
	}
}

// Funktion, die von allen Dialogen zur Anzeige eines
// Popups zum Download einer Datei genutzt wird. Dazu
// wird ein DIV-Element mit einem unterliegenden
// IFrame erzeugt, welches die Popup-Daten enthält.
// Alle Argumente sind innerhalb eines anonymen Ob-
// jekts zu übergeben
//
// @param texts = Anonymes Objekt mit den anzuzeigen-
//                den Texten
//          buttonText: Text des Download-Buttons
//          linkText: Text des Schließen-Links
// @param fileUrl = relative URL der herunterzuladen-
//                  den Datei. Dabei sollten Alias-
//                  Namen verwendet werden
// @param downloadType = Art und Weise, auf die der
//                       Download erfolgen soll.
//          POPUP: Zeigt das Popup mit dem Button
//                 zum Download der Datei an
//          WINOPEN: Versucht, die Datei mittels
//                   window.open zum Herunterladen
//                   bzw. direkten Öffnen bereit-
//                   zustellen. Kritisch bei Pop-
//                   up-Blockern
function displayDownloadPopup(params)
{
    // Sofern der Download per window.open er-
    // folgen soll
    if(params.downloadType.toUpperCase() == "WINOPEN")
        window.open(params.fileUrl);
    // Sofern der Download per Popup durchge-
    // führt werden soll
    else
    {
        // Existenz des Popups abfragen
        var popupElement = topEasykatFrame.$("DOWNLOADPOPUP_CONTAINER");
        
        // DIV-Element und IFrame für die Ausgabe 
        // der Daten anlegen
        if(!popupElement)
        {
            var topDocument = topEasykatFrame.document;
            
            // DIV-Element aufbauen und in den Haupt-
            // dialog integrieren
            popupElement = topDocument.createElement("DIV");
            popupElement.id = "DOWNLOADPOPUP_CONTAINER";
            topDocument.body.appendChild(popupElement);
            
            // Unterlagernden IFrame aufbauen
            popupElement.iframeElement = topDocument.body.insertBefore(topDocument.createElement("IFRAME"), popupElement);
            popupElement.iframeElement.frameBorder = 0;
            popupElement.iframeElement.src = "javascript: false";
            popupElement.iframeElement.style.zIndex = 10000;
        }
        
        // Onclick-Handler zum Schließen des Popups beim
        // Anklicken des Buttons oder einer beliebigen
        // Stelle des Popup-DIV-Elements setzen. Dies
        // muss auf konventionelle Art geschehen, da der
        // IE den Handler sonst nach einem Neuaufbau des
        // RFrames (Dialogwechsel) nicht mehr startet
        popupElement.onclick = hideDownloadPopup;
        
        // Style des Anzeige-Containers und des DIV-Ele-
        // ments setzen
        popupElement.iframeElement.className = "easykatStandard-downloadPopupContainer";
        popupElement.iframeElement.style.border = "none";
        popupElement.iframeElement.style.padding = "5px";
        popupElement.iframeElement.style.paddingBottom = "6px";
        popupElement.className = "easykatStandard-downloadPopupContainer";
        
        // Meldung anzeigen und Ausblende-Timer setzen
        popupElement.innerHTML = "<div class='easykatStandard-downloadPopupButton'><input type='Button' value='" + params.texts.buttonText + "' onclick=\"parent.frames['isyiframe'].location.href = '" + params.fileUrl + "';\"/></div><div class='easykatStandard-downloadPopupCloseLink'>" + params.texts.linkText + "</div>";
        popupElement.iframeElement.style.display = "block";
        popupElement.style.visibility = "visible";
        
        setTimeout("hideDownloadPopup();", 60000);
    }
}

// Funktion zum Ausblenden eines Download-Popups
function hideDownloadPopup()
{
	var popupElement = topEasykatFrame.$("DOWNLOADPOPUP_CONTAINER");
	
	if(popupElement)
	{
		popupElement.iframeElement.style.display = 'none';
		popupElement.style.visibility = 'hidden';
	}
}

// Aufruf des zweiten UserExits, um die Vorschaudaten
// zum gerade durchgeführten Konfigurationsschritt zu
// laden. Die Funktion übernimmt auch die Verarbeitung
// und Visualisierung der zurückgelieferten Daten.
function userExit_002Request(params)
{
    // Benötigte Daten für den Request bereitstellen
	var sessionId = $F("sessionid");
	var stateId = $F("stateid");
	
    new Ajax.Request("ajax/userExit_002Request", {
        parameters:
        {
            '__eksubmit_values__' : "sessionid=" + sessionId + "&stateid=" + stateId + "&waitingForPreviewData=" + parseInt(params.waitingForPreviewData)
        },
        
        onSuccess: function(transport)
        {
            try
            {
                var previewData = transport.responseJSON;
                
                // If the preview data to display changed
                if(previewData.dataChanged)
                {
                    // If an image should be displayed
                    if(previewData.previewType == "image")
                    {
                        // Build up the image element
                        var previewImage = topEasykatFrame.document.createElement("img");
                        previewImage.id = "CFG_PREVIEW_IMAGE";
                        previewImage.src = previewData.content;
                        $(previewImage).observe("click", function() {
                            eval(previewData.clickHandler);
                        });
                        
                        // Replace the content of the table cell
                        // with the image
                        var previewTableCell = topEasykatFrame.$("CFG_PREVIEW_DATA_CELL");
                        previewTableCell.innerHTML = "";
                        Element.insert(previewTableCell, previewImage);
                    }
                    // If HTML code should be displayed
                    else if(previewData.previewType == "html")
                    {
                        // Replace the content of the table cell
                        // with the data returned
                        var previewTableCell = topEasykatFrame.$("CFG_PREVIEW_DATA_CELL");
                        
                        // If new content is present, replace the
                        // old data
                        if(previewData.content != "")
                        {
                            previewTableCell.innerHTML = "";
                            Element.insert(previewTableCell, previewData.content);
                        }
                        
                        // If a JavaScript function has to gene-
                        // rate of modify the content, call it
                        if(previewData.onload)
                            window[previewData.onload.func](previewData.onload.args);
                    }
                    
                    // Check, if the response provided the preview
                    // data or just the information to display
                    // during their generation
                    if(previewData.waitingInformation)
                    {
                        // Lock the dialog controls
                        disableInput();
                        
                        // If the real preview data didn't get
                        // provided, trigger this function again
                        // with the waiting flag set
                        userExit_002Request({waitingForPreviewData: 1});
                    }
                    else
                    {
                        // Enable the dialog controls again
                        enableInput();
                    }
                }
                else
                {
                    // Enable the dialog controls again
                    enableInput();
                }
                
                // If an error occurred, set the client side
                // error flag and trigger the handling rou-
                // tine to retrieve the error message
                if(previewData.errorOccurred)
                {
                    var configFrame = this.frames['RFrame'];
                    
                    configFrame.$("SYSTEM_ERROR_OCCURRED").value = 1;
                    configFrame.checkSystemError();
                    
                    // Enable the dialog controls again
                    enableInput();
                }
            }
            catch(e)
            {
                alert("Fehler beim Laden der Vorschau-Daten.\nFehlermeldung: " + e.message);
				
				// Enable the dialog controls again
				enableInput();
            }
        }
    });
}