/**
 * Liefert Objekt
 */
function $(id)
{
	return jsGeneral.getElement(id);
}

/**
 * Fehlerbehandlung
 */
function Errormessage (msg, filename, line) {
//	prompt(msg, filename);
	alert("concept-computer GmbH meldet JavaScript-Fehler:\n" + msg + "\n\nDatei: " + filename + "\nZeile: " + line);
	return true;
}
//window.onerror = Errormessage;

/**
 * gemeinsame Funktionen
 */
function jsGeneralClass() 
{
	// XML
	this.responseXML = null;
	this.responseArray = new Array();
	// Popup
	this.createdSPP = [];
	this.lastZInd = 4879;
	this.nr = -1;
	this.pPrefix = "general_popup_";
	this.MoveCoord = [];
	this.PopupDestroy = 0;
	this.PopupFunction = "";
	this.VarsToSet = new Array();

	// Bildvorschau
	this.displayF = "";
	this.lastDI = "";
	this.pos = {"left":0,"top":0};
	this.loadTime = 0;

	// Kommentar
	this.commCSS = "display:none;position:absolute;overflow:hidden;background-color:#FFFFE1;border:1px solid #000;padding:3px;font-size:11px;left:-100px;top:-100px;-moz-user-select: none;color:#333;";

	// Alert / Confirm
	this.alertReturn = false;
	this.ConfirmFunction = "";
	this.alertWidth = 0; // Intern
	this.alertHeight = 0; // Intern

	this.ScriptURL = "-";

	// Balken-Anzahl
	this.barZIndex = 2100;
	this.barCounter = 0;
	this.barContInfo = [];

	// Tastenkombinationen
	this.ShortcutKsON = true; // Ausfuehren (ein/aus) public
	this.ShortcutEventSet = false; // event gesetzt (privat)
	this.ShortcutKeys = []; // Array mit alle Kombinationen (privat)
};

jsGeneralClass.prototype =
{
	/**
	 * Prueft, ob ein Wert in einem Array existiert
	 */
	in_array:function(needle, arr)
	{
		var CurStr = new String("," + arr + ",");
		if (CurStr.indexOf("," + needle + ",") == -1) return false;
		else return true;
	},
	
	/**
	 * Ersetzt alle Vorkommen eines Strings in einem anderen String
	 */
	str_replace:function(in_str,reg_exp,replace_str,opts)
	{
		if(in_str==null) return in_str;
		if(typeof(opts)=="undefined") opts='g';
		var re=new RegExp(reg_exp,opts);
		return in_str.replace(re,replace_str);
	},
	
	/**
	 * Liefert Objekt
	 */
	getElement:function(id,create)
	{
		if (typeof(create) == "undefined") create = false;
		if (!document.getElementById) return;
		if (document.getElementById(id)) return document.getElementById(id);
		else if (create)
		{
			var g = document.createElement("div");
			var ind = jsGeneral.lastZInd;
			jsGeneral.lastZInd++;
			g.style.cssText='display:none;position:absolute;z-index:' + ind.toString() + ';';
			g.id = id;
			if (document.getElementsByTagName)
				document.getElementsByTagName("body")[0].appendChild(g);
			else if (document.all)
				document.all("body").parentNode.appendChild(g);
			return g;
		}
		else return false;
	},
	/**
	 * Datei laden
	 */
	loadFile:function(settings)
	{
		if (typeof(settings) == "undefined") return false;
		if (typeof(settings.url) == "undefined") return false;
		else var url = settings.url;
		var modus = (typeof(settings.modus) == "undefined") ? 'GET' : settings.modus;
		var request = false;
		//var parameter = jsGeneral.setLoadFileParameter(modus.toUpperCase());
		var today = new Date();
		url += (url.indexOf("?") == -1 ? "?" : "&") + "tmLsmas="+today.getTime().toString();
		var contentType = (typeof(settings.contentType) == "undefined") ? 'text/xml' : settings.contentType;
		parameter = null;
		if (jsGeneral.loadFileParams.length > 0)
		{
			if (modus.toUpperCase() == "GET")
			{
				url += (url.indexOf("?") == -1 ? "?" : "&") + jsGeneral.setLoadFileParameter(modus.toUpperCase());
			}
			else
			{
				var boundary = Math.round(Math.random()*10000000000000);
				boundary = boundary.toString(16);
				boundary = "--------" + boundary.toUpperCase();
				var br = "\r\n";
				contentType = "multipart/form-data; boundary="+boundary;
				parameter = jsGeneral.setLoadFileParameter(modus.toUpperCase(),boundary);
			}
		}

		if (typeof(settings.parameter) != "undefined")  url += (url.indexOf("?") == -1 ? "?" : "&")+settings.parameter;
		jsGeneral.responseXML = null;

		if (window.XMLHttpRequest)
		{
		   request = new XMLHttpRequest();
		   if (request.overrideMimeType) request.overrideMimeType('text/xml');
		}
		else if (window.ActiveXObject)
		{
		   try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} }
		}
		if (!request) { alert('Fehler: keine Instanz'); return false;}

		request.onreadystatechange = function()
		{
			if (request.readyState == 4 && request.status == 200)
			{
				if (request.responseXML != null)
				{
					jsGeneral.responseXML = request.responseXML;
					if (typeof(settings.rf) != "undefined")
					{
						eval(settings.rf);
					}
				}
				else alert('Fehler: Document-Syntax');
			}
		};
		jsGeneral.loadFileParams = new Array();
		request.open(modus, url, true);
		request.setRequestHeader("content-type", contentType);
		if(parameter != null)request.setRequestHeader("Content-length", parameter.length);
		request.setRequestHeader("Connection", "close");
		request.send(parameter);

		return true;
	},

	/**
	 * XML Parser
	 *
	 *
	 * Beispiel:
	 * XML:
	 * <ConfigsData>
	 *  <Node DefaultName="Tables">
	 *   <Config ID="1" Name="Konfiguration_1" DefaultKey="1">
	 *     <Field ExportName="border">2</Flied>
	 *     <Field ExportName="cellpadding">3</Field>
	 *     <Field ExportName="cellspacing">1</Field>
	 *     <Field ExportName="background-color">#444444</Field>
	 *   </Config>
	 *   <Config ID="2" Name="Konfiguration_2" DefaultKey="0">
	 *     <Field ExportName="border">1</Flied>
	 *     <Field ExportName="cellpadding">1</Field>
	 *     <Field ExportName="cellspacing">2</Field>
	 *     <Field ExportName="background-color">#888888</Field>
	 *   </Config>
	 *  </Node>
	 * <ConfigsData>
	 *
	 * var arr = jsGeneral.XML_Parse();
	 * // arr.ConfigsData.Node.Config[0].attributes["Name"] ist "Konfiguration_1"
	 *	for (var i = 0; i < arr.ConfigsData.Node.Config[0].Field.length; i++)
	 * {
	 * 	alert(arr.ConfigsData.Node.Config[0].Field[i].name); // Field
	 * 	alert(arr.ConfigsData.Node.Config[0].Field[i].value); // 2
	 * 	alert(arr.ConfigsData.Node.Config[0].Field[i].attributes["ExportName"]); // border
	 *    ....
	 * }
	 */
	XML_Parse:function(obj)
	{
		if (typeof(obj) == "undefined") obj = jsGeneral.responseXML;
		if (obj == null) obj = jsGeneral.responseXML;
			
		var sObj = new Array(), names = new Array(), tmp_arr = new Array(), counter;
		if (obj == null) return sObj;
		for (var n = 0; n < obj.childNodes.length; n++)
		{
			if(obj.childNodes[n].nodeType != 3 && typeof(obj.childNodes[n].tagName) != "undefined")
			{
				if (!jsGeneral.in_array(obj.childNodes[n].tagName,names)) names.push(obj.childNodes[n].tagName);
				var val = "";
				if (obj.childNodes[n].firstChild)
				{
					val = obj.childNodes[n].firstChild.nodeValue;
					val = jsGeneral.str_replace(val, String.fromCharCode(153), "&#153;","gi");
					val = jsGeneral.str_replace(val, String.fromCharCode(8482), "&#153;","gi");
					val = jsGeneral.str_replace(val, String.fromCharCode(128), "&#128;","gi");
					val = jsGeneral.str_replace(val, String.fromCharCode(8364), "&#128;","gi");
				}
				
				var Elm = new Object({"name" : obj.childNodes[n].tagName, "value":val,"attributes" : [] });
				if (obj.childNodes[n].attributes.length > 0)
				{
					for (var a = 0; a < obj.childNodes[n].attributes.length; a++)
					{
						var arrt = new Object({"name":obj.childNodes[n].attributes[a].nodeName,"value":obj.childNodes[n].attributes[a].nodeValue});
						Elm.attributes[obj.childNodes[n].attributes[a].nodeName] = obj.childNodes[n].attributes[a].nodeValue;
					}
				}
				counter = 0;
				if (obj.childNodes[n].childNodes.length > 0)
				{
					var childObj = jsGeneral.XML_Parse(obj.childNodes[n]);
					for (var kw in childObj)
					{
						counter++; break;
					}
					if (counter > 0)
					{
						for (var kw in childObj) Elm[kw] = childObj[kw];
					}
				}
				if (typeof(tmp_arr[obj.childNodes[n].tagName]) == "undefined") tmp_arr[obj.childNodes[n].tagName] = new Array();
				tmp_arr[obj.childNodes[n].tagName].push(Elm);
			}
		}
		for (var keys in names)
		{
			if  (tmp_arr[names[keys]].length == 1) sObj[names[keys]] = tmp_arr[names[keys]][0];
			else sObj[names[keys]] = tmp_arr[names[keys]];
		}

		return sObj;
	},

		// Array mit Parameter
	loadFileParams : [],
	/**
	 * Parameter hinzufuegen
	 */
	addLoadFileParameter:function(name,value)
	{
		if(typeof(value) == "boolean") value = value ? "1" : "0";
		if(typeof(value) == "number") value = value.toString();
		if(typeof(value) == "string") jsGeneral.loadFileParams[jsGeneral.loadFileParams.length] = new Object({name:name,value:value});
		else if(typeof(value) == "object")
		{
			for (var i in value)
			{
				jsGeneral.addLoadFileParameter(name+"["+i+"]",value[i]);
			}
		}
	},

	postValue:function(key, val, boundary)
	{
		var br = "\r\n";
		var POSTDATA = "--" + boundary + br;
		POSTDATA += "Content-Disposition: form-data; name=\""+key+"\""+br;
		POSTDATA += br + encodeURIComponent(val) + br;
		POSTDATA += "--" + boundary + br;
		return POSTDATA;
	},

	/**
	 * Parameter uebernehmen
	 */
	setLoadFileParameter:function(method, boundary)
	{
		// Parameter listen
		var parameter = "";
		for (var i = 0; i < jsGeneral.loadFileParams.length; i++)
		{
			if (jsGeneral.loadFileParams[i].name != "")
			{
				if (method == "POST")
				{
					parameter += jsGeneral.postValue(jsGeneral.loadFileParams[i].name, jsGeneral.loadFileParams[i].value, boundary);
				}
				else
				{
					if (parameter != "") parameter += "&";
					parameter += jsGeneral.loadFileParams[i].name + "=" + encodeURIComponent(jsGeneral.loadFileParams[i].value);
				}
			}

		}

		return parameter;
	}
}

var jsGeneral = new jsGeneralClass();
