/*
 * ================================================================
 * Copyright (c) Meta-Level Software AG
 * Alle Rechte vorbehalten.
 * 
 * META-LEVEL Software AG,
 * Saarbruecker Strasse 51,
 * 66130 Saarbruecken
 * Tel. : 0681/99687-0
 * Fax. : 0681/99687-99
 * Internet: www.meta-level.de
 * Mail: info@meta-level.de
 * ================================================================
 * SVN-Information:
 * $LastChangedBy: tbrauer $
 * $LastChangedRevision: 12109 $
 * $LastChangedDate: 2010-03-01 10:29:32 +0100 (Mo, 01 Mrz 2010) $
 * $HeadURL: http://svn/svn/metadok/trunk/META-DOK_4_5_0_J6_UTF_8/Tomcat5.0/webapps/meta-dok/app/javascript/shared.js $
 * ================================================================
 */
 
/*
 * Allgemeine JS-Funktionen, 
 * die in allen META-DOK Dialogen zur Verfuegung stehen.
 */

/**
 * Prueft ob es sich beim aktuellen Browser um den Microsoft-InternetExplorer
 * handelt.
 */
function isMSIE(){
	return ( navigator.appName=="Microsoft Internet Explorer" );
}

function isMSIE6() {
	return (isMSIE() && typeof window.XMLHttpRequest == "undefined"); 
}

/**
 * Diese Funktion gibt einen Frame zurueck. Der erste Paramenter
 * ist der StartFrame (z.B. 'top'), der zweite Parameter ist der
 * Name des gesuchten Frame.
 * Wird kein Frame gefunden, so wird NULL zurueck gegben
 */
function getFrameByName(startFrame, tgtName) {
  // Rekursives Suchen nach dem passenden Frame:
  // Von einem Startpunkt aus betrachtet, werden alle direkt
  // enthaltenen Frames untersucht
  for (var i = 0; i < startFrame.length; i++) {
    var tgt = startFrame.frames[i];
    // Wenn hierbei schon der passende Frame gefunden werden konnte, ...
    if (tgt.name == tgtName) {
      // ... dann ist die Arbeit getan!
      return tgt;
    }
    else {
      // Ansonsten muessen wir von dem aktuellen Knoten an abwaerts gehen,
      // indem wir seine Kind-Frames durchwandern 
      var subTgt = getFrameByName(tgt, tgtName);
      // Wenn sich jetzt was ergibt, ...
      if (subTgt != null) {
        // ... dann zurueck damit!
        return subTgt;
      }
    }
  }
  return null;
}

/**
 * Iframe zum Abdecken von Comboboxen beim IE
 */
function loadSpecialFrame(elementId){
	loadSpecialFramePos(elementId, elementId);
}

function loadSpecialFramePos(elementId, positionElementId){
	if(isMSIE()){
		var dialogControl = document.getElementById(elementId);
		var dialogPosition = getAbsolutPosition(positionElementId);
		var posControl = document.getElementById(positionElementId);
		var iFrame = document.createElement("IFRAME");
		iFrame.setAttribute("src", "../white.blank");
		iFrame.frameBorder="0";
		iFrame.id="special_"+elementId;
		iFrame.style.position="absolute";
		iFrame.style.zIndex=900;
		iFrame.style.left = posControl.offsetLeft + 'px';
		iFrame.style.top = posControl.offsetTop + 'px';
		iFrame.style.width = posControl.offsetWidth + 'px';
		iFrame.style.height = posControl.offsetHeight + 'px';
		iFrame.style.visibility="visible";
		iFrame.style.display="block";
		dialogControl.offsetParent.appendChild(iFrame);
		window.onresize = function(){
			refreshSpecialFrame(elementId, positionElementId);
		}
	}
}

function unloadSpecialFrame(elementId){
	if(isMSIE()){
		var dialogControl = document.getElementById(elementId);
		var iFrame = document.getElementById("special_"+elementId);
		if (iFrame!=null){
			dialogControl.offsetParent.removeChild(iFrame);
			window.onresize = null;
		}
	}
}

/**
 * bestimmt die absolute Position des Elements mit der
 * ID elementId in einem HTML-Dokument.
 * 
 * @return Array(x-Position, y-Position)
 */
function getAbsolutPosition(elementId){
	var element = document.getElementById(elementId);
	if (element == null){
		return null;
	}
	var posX = element.offsetLeft;
	var posY = element.offsetTop;
	while (element.offsetParent!=null){
		element = element.offsetParent;
		posX += element.offsetLeft;
		posY += element.offsetTop;
	}
	return new Array(posX, posY);
}

function getAbsoluteSize(elementId){
	var element = document.getElementById(elementId);
	if (element == null){
		return null;
	}
	var width = element.offsetWidth;
	var height = element.offsetHeight;
	return new Array(width, height);
}

function getAbsoluteSizeForHiddenElement(elementId) {
	var element = document.getElementById(elementId);
	if(element == null) {
		return null;
	}
	var temp_top = element.style.top;
	var temp_left = element.style.left;
	element.style.top = -5000 + 'px';
	element.style.left = -5000 + 'px';
	element.style.visibility = 'visible';
	element.style.display = 'block';
	
	var result = getAbsoluteSize(elementId);
	
	element.style.top = temp_top;
	element.style.left = temp_left;
	element.style.visibility = 'hidden';
	element.style.display = 'none';
	
	return result;
	
}

function getDialogButton(buttonText, buttonAction){
	var btnControl = "";
	btnControl += "<table border='0' cellpadding='0' cellspacing='0' class='dialog-button' onclick='" + buttonAction + "'>";
	btnControl += "<tr><td align='center' valign='center' class='buttontext_small'>";
	btnControl += buttonText;
	btnControl += "</td></tr></table>";
	return btnControl;
}

/**
 * Gibt zurueck, ob irgendeine Checkbox unter dem Namen elementSelector
 * aktiviert ist.
 */
function areElementsChecked(elementSelector) {
  var boxes = document.getElementsByName(elementSelector);
  if (boxes != null) {
    for (i = 0; i < boxes.length; i++) {
      if (boxes[i].checked) {
        return true;
      }
    }
  }
  return false;
}

/**
 * Diese Methode selektiert bzw. deselektiert alle Checkboxen unter
 * einem bestimmten Namen.
 * Der boolean Parameter 'checkBoolean' gibt an, ob die Checkboxen selektiert
 * oder deselektiert sind.
 */
function changeAllCheckboxes(elementName, checkBoolean) {
	var boxes = document.getElementsByName(elementName);
  if (boxes != null) {
    for (i = 0; i < boxes.length; i++) {
			boxes[i].checked = checkBoolean;
		}
  }
}

/**
 * Gibt von dem uebergebenen 'rootElement' alle Kindelemente zurueck, deren
 * ID mit dem uebergebenen String 'idStartsWith' beginnt.
 */
function getSubElements(rootElement, idStartsWith){
	try{
		var tArray = new Array();
		if(rootElement == null || idStartsWith == null || idStartsWith.length <=0){
			return null;
		}
		
		var childElements = rootElement.childNodes;
		if(childElements!= null){
			for(var i=0; i <childElements.length; i++){
				var child = childElements[i];
				if(child.id != null && child.id.indexOf(idStartsWith) == 0){
					tArray.push(child);
				}
			}
		}
		return tArray;
	} catch(ex){alert('getSubElements:' + ex);}
}

function replaceAll(stringObject, findString, newString){
	while (stringObject.indexOf(findString)!=-1){
		stringObject = stringObject.replace(findString, newString);
	}
	return stringObject;
}

function showTableRow(element2Show){
	if (element2Show != null ){
		element2Show.style.visibility = "visible";
		if(isMSIE()){
			element2Show.style.display="block";
		}
		else{
			element2Show.style.display="table-row";			
		}
	}
}

/**
 * Aktualisiert die Position des IFrames.
 * 
 * (Der Iframe wird beim MS-IE benoetigt um Combobox- und 
 *  List-Steuerelemente abzudecken)
 */
function refreshSpecialFrame(elementId, positionElementId){
	var iFrame = document.getElementById("special_"+elementId);
	var posControl = document.getElementById(positionElementId);
	if (iFrame != null){
		iFrame.style.left = posControl.offsetLeft + 'px';
		iFrame.style.top = posControl.offsetTop + 'px';
	}
}

/*
*	Bestimmung der Abmessungen des Browser-Fensters
*/
function getWindowSize() {
	var browserWidth = 0, browserHeight = 0;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		browserWidth = window.innerWidth;
		browserHeight = window.innerHeight;
	} 
	else {
		if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
			//IE 6+ in 'standards compliant mode'
			browserWidth = document.documentElement.clientWidth;
			browserHeight = document.documentElement.clientHeight;
		}
		else {
			if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
				//IE 4 compatible
				browserWidth = document.body.clientWidth;
				browserHeight = document.body.clientHeight;
			}
		}
	}
	
	return {'width': browserWidth, 'height': browserHeight};
}

function trim(str) {
	if (str == null) {
		return null;
	}
	var out;
	for (i=0; i<str.length; i++) {
		out+=str.charCodeAt(i);
		out+=",";
	}
	while (str.charCodeAt(0) == 32 || str.charCodeAt(0) == 13 || str.charCodeAt(0) == 10) {
		str = str.substring(1, str.length);
	}
	return str;
}

/**
* Fehlerbehandlung bei der Verwendung von Generatoren
* @param xmlDoc
* @return boolean
*/
function isErrorMessage(xmlDoc) {
	
	// nur wenn wirklich ein xml-Dokument uebergeben wurde, kann nach dem <error> tag gesucht werden
	// ansonsten handelt es sich ggf. um ein html oder text Dokumente
	// bei nicht xml-Dokumente ist der Aufrufer selbst verantwortlich zu pruefen, ob es sich um eine
	// Fehlerantwort vom Server handelt oder nicht
	
	if(!xmlDoc) {
		return false;
	}
	if(xmlDoc == null) {
		return false;
	}
	try {
		var error = xmlDoc.getElementsByTagName('error');
		if(error.length > 0) {
			return true;				
		}
	} catch (e) {
		return false;
	}
}

/**
 * Extrahiert die Fehlermeldung aus einem gegebenen Fehler-XML-Dokument
 * (Ueberpruefung, ob es sich um ein Fehlerdokument handelt ueber die function isErrorMessage(xmlDoc))
 * @param xmlDoc
 * @return Array(Fehlertyp, Titel, Nachricht)
 */
function getErrorData(xmlDoc) {
	var errorType = "";
	if(xmlDoc.getElementsByTagName('type')[0] != null) {
		errorType = xmlDoc.getElementsByTagName('type')[0].childNodes[0].nodeValue;
	}
	var errorTypeName = "";
	if(xmlDoc.getElementsByTagName('title')[0] != null) {
		errorTypeName = xmlDoc.getElementsByTagName('title')[0].childNodes[0].nodeValue;
	}
	var errorMessage = "";
	if(xmlDoc.getElementsByTagName('message')[0] != null) {
		errorMessage = xmlDoc.getElementsByTagName('message')[0].childNodes[0].nodeValue;
	}
	
	return new Array(errorType, errorTypeName, errorMessage);	
}

/**
 * Liefert fuer eine Fehlermeldung die Uebersetzung
 * @param type
 * @param title
 * @param message
 * @return
 */
function translateError(url, type, titleKey, messageKey) {
	var translationRequest = new Request({
		url: url,
		data: 'type='+type+'&title='+titleKey+'&message='+messageKey,
		onSuccess: function(responseText, responseXML) {
			var translatedErrorData = getErrorData(responseXML);
			errorBox(translatedErrorData[1], translatedErrorData[2]);
		},
		onFailure: function ( xhr ) {
			errorBox(titleKey, messageKey);
		}
	}).send();
}