// some helping routines for our ajax requests

function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
	var element = arguments[i];
	if (typeof element == 'string')
	  element = document.getElementById(element);

	if (arguments.length == 1)
	  return element;

	elements.push(element);
  }

  return elements;
}

// define a reloadhandler 
function ReloadHandler(URL, HTMLElement, UpdateHTML)	{
	this.URL = URL;	// URL to call
	this.RefreshFunction = function(){UpdateContent(this);}; // function which is called when we get back from the handler
	this.http_request = null;
	this.HTMLElement = HTMLElement;	// HTML Element to Update
	this.UpdateHTML = UpdateHTML;	// true if we have to update an HTML element
	this.UpdateValue = false;
	this.NotificationOK = false;
	this.Notification = false;
	this.Indicator = false;
	this.Method = "GET";	// method to use to transmit the request
	this.Parameter = "";	// additional parameters that should be posted
	this.Form = "";			// form variables that should be posted
	this.SetTimer = false;	// if not false contains seconds after which content will be reloaded
	this.TimerFunc = '';	// if settimer is set, hold name of refreshing function
	this.UpdateFunctions = false;
}

function handleAJAXResponse(reqobj, ReloadObj) {
	if (reqobj.readyState == 4)	{
		if (reqobj.readyState == 4) {
			if (reqobj.status == 200) {
				if (ReloadObj.Indicator)	{
					if ($(ReloadObj.Indicator))	{
						$(ReloadObj.Indicator).style.display="none";
					}
				}							
				if (ReloadObj.UpdateValue)	{
					if ($(ReloadObj.HTMLElement))	{
						$(ReloadObj.HTMLElement).value = reqobj.responseText;
					}
				}
				if (ReloadObj.UpdateHTML)	{
					if ($(ReloadObj.HTMLElement))	{
						if (ReloadObj.UpdateFunctions)	{
							var NewText = reqobj.responseText.replace(/rl_func/g,"$('"+ReloadObj.HTMLElement+"').RL");
							$(ReloadObj.HTMLElement).innerHTML = NewText;
						} else {
							$(ReloadObj.HTMLElement).innerHTML = reqobj.responseText;
						}
					}
				}
				if (ReloadObj.Notification)	{
					ReloadObj.Notification();
				}
				if ((ReloadObj.SetTimer) && (ReloadObj.SetTimer > 0) && (ReloadObj.TimerFunc != ''))	{
					var zw = ReloadObj.TimerFunc+"()";
					var Timeout = ReloadObj.SetTimer*1000;
					window.setTimeout(zw, Timeout);
				}
			} else {
				if (ReloadObj.Indicator)	{
					if ($(ReloadObj.Indicator))	{
						$(ReloadObj.Indicator).style.display="none";
					}
				}							
				if (ReloadObj.Notification)	{
					ReloadObj.Notification();
				}
			}
		}
	}
}

function UpdateContent(ReloadData)	{
	ReloadData.http_request = false;

	if (ReloadData.Indicator)	{
		if ($(ReloadData.Indicator))	{
			$(ReloadData.Indicator).style.display="block";
		}
	}

	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		ReloadData.http_request = new XMLHttpRequest();
		if (ReloadData.http_request.overrideMimeType) {
			ReloadData.http_request.overrideMimeType('text/xml');
			// zu dieser Zeile siehe weiter unten
		}
	} else if (window.ActiveXObject) { // IE
		try {
			ReloadData.http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				ReloadData.http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!ReloadData.http_request) {
		alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
		return false;
	}
	ReloadData.http_request.onreadystatechange = function(){handleAJAXResponse(ReloadData.http_request,ReloadData);};
	if (ReloadData.Method == "POST")	{
		ReloadData.http_request.open(ReloadData.Method, ReloadData.URL, true);
		// we post the request, so we construct any parameters
		var PostVars = "";
		if (ReloadData.Parameter != "")	{
			PostVars = ReloadData.Parameter;
		}
		if (ReloadData.Form != "")	{
			var formObj = $(ReloadData.Form);
			if (formObj)	{
				for (f=0; f<formObj.length; f++)	{
					var IsHint = formObj[f].id.search(/_hint/);
					var IsRC = formObj[f].id.search(/_rc/);
					var IsValue = formObj[f].id.search(/_value/);					
					if ((IsHint == -1) && (IsRC == -1) && (IsValue == -1) && (formObj[f].type != 'submit'))	{
						if (PostVars != "") PostVars += "&";
						if (formObj[f].name != "")	{
							PostVars += formObj[f].name;
						} else {
							PostVars += formObj[f].id;
						}
						if (formObj[f].type == "checkbox")	{
							if (formObj[f].checked == "1") {
								PostVars += "=1";
							} else {
								PostVars += "=0";
							}
						} else {
							if ($(formObj[f].id+"_value"))	{
								PostVars += "=" + encodeURIComponent($(formObj[f].id+"_value").value);								
							} else {
								PostVars += "=" + encodeURIComponent(formObj[f].value);
							}
						}
					}
				}
			}
		}
		// if we post anything, we give the parameters
		ReloadData.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		ReloadData.http_request.setRequestHeader("Content-length", PostVars.length);
		ReloadData.http_request.setRequestHeader("Connection", "close");		
		ReloadData.http_request.send(PostVars);		
	} else {
		var URL = ReloadData.URL;
		if (ReloadData.Parameter != "")	{
			URL += "&"+ReloadData.Parameter;
		}
		ReloadData.http_request.open(ReloadData.Method, URL, true);
		ReloadData.http_request.send(null);
	}
}

function clientSideInclude(id, url, PostObj, Method, IsForm) {
	var req = false;
	// For Safari, Firefox, and other non-MS browsers
	if (window.XMLHttpRequest) {
		try {
			req = new XMLHttpRequest();
		} catch (e) {
			req = false;
		}
	} else if (window.ActiveXObject) {
		// For Internet Explorer on Windows
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				req = false;
			}
		}
	}
	if (req) {
		// we construct our parameters
		var PostVars = "";
		if (IsForm)	{
			for (f=0; f<PostObj.length; f++)	{
				// we see if we have a special variable which should not be posted
				var IsHint = PostObj[f].id.search(/_hint/);
				var IsRC = PostObj[f].id.search(/_rc/);
				var IsValue = PostObj[f].id.search(/_value/);
				// if we are in direct mode just ignore it
				if (Method == 'POSTDIRECT') {
					IsHint = IsRc = IsValue = -1;
				}
				if ((IsHint == -1) && (IsRC == -1) && (IsValue == -1) && (PostObj[f].type != 'submit'))	{
					if (PostVars != "") PostVars += "&";
					PostVars += PostObj[f].id;
					if (PostObj[f].type == "checkbox")	{
						if (PostObj[f].checked == "1") {
							PostVars += "=1";
						} else {
							PostVars += "=0";
						}
					} else {
						if ($(PostObj[f].id+"_value"))	{
							PostVars += "=" + encodeURIComponent($(PostObj[f].id+"_value").value);								
						} else {
							PostVars += "=" + encodeURIComponent(PostObj[f].value);
						}
					}
				}
			}
		} else if (PostObj) {
			if (PostObj.type != "submit")	{			
				PostVars += PostObj.id;
				if (PostObj.type == "checkbox")	{
					if (PostObj.checked == "1") {
						PostVars += "=1";
					} else {
						PostVars += "=0";
					}
				} else {
					PostVars += "=" + encodeURIComponent(PostObj.value);
				}
			}
		}
		// Synchronous request, wait till we have it all
		if (Method == "GET")	{
			req.open('GET', url, false);
			req.send(null);
		} else {
			req.open('POST', url, false);
			// if we post anything, we give the parameters
			req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			req.setRequestHeader("Content-length", PostVars.length);
			req.setRequestHeader("Connection", "close");
			req.send(PostVars);
		}
		if (id)	{
			var element = $(id);
			if (element)	{
				element.innerHTML = req.responseText;
			}
			return true;
		} else {
			return req.responseText;
		}
		return rc;
	}
	return false;
}

function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}

function addPageShowEvent(func) {
	var oldpageshow = window.onpageshow;
	if (typeof window.onpageshow != 'function') {
		window.onpageshow = func;
	} else {
		window.onpageshow = function() {
			if (oldpageshow) {
				oldpageshow();
			}
			func();
		}
	}
}

var bgsleight	= function() {		
	function fnLoadPngs() {
		var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
		var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5);
		for (var i = document.all.length - 1, obj = null; (obj = document.all[i]); i--) {
			if (itsAllGood && obj.currentStyle.backgroundImage.match(/\.png/i) != null) {
				fnFixPng(obj);
				obj.attachEvent("onpropertychange", fnPropertyChanged);
			}
		}
	}

	function fnPropertyChanged() {
		if (window.event.propertyName == "style.backgroundImage") {
			var el = window.event.srcElement;
			if (!el.currentStyle.backgroundImage.match(/x\.gif/i)) {
				var bg	= el.currentStyle.backgroundImage;
				var src = bg.substring(5,bg.length-2);
				el.filters.item(0).src = src;
				el.style.backgroundImage = "url(/images/x.gif)";
			}
		}
	}

	function fnFixPng(obj) {
		var bg	= obj.currentStyle.backgroundImage;
		var src = bg.substring(5,bg.length-2);
		obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')";
		obj.style.backgroundImage = "url(/images/x.gif)";
	}
	
	return {
		init: function() {
			if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
				fnLoadPngs();
			}
		}
	}
	
}();

addLoadEvent(bgsleight.init);

document.getElementsByClassName = function(className, parentElement) {
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

// add a new element to a parent
function addElement(Parent, Tag, ID, Type) {
	var newElement = document.createElement(Tag);
	newElement.setAttribute('id',ID);
	if (Type != "")	{
		newElement.setAttribute('type',Type);
	}
	Parent.appendChild(newElement);
	return newElement;
}

// parse a XML Text (browser dependant)
function ParseXML(XMLText)	{
	var xmlDoc = false;

	try { //Internet Explorer
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		try {
			xmlDoc.loadXML(XMLText);
		} catch(e) { alert ("we have an error"); }
	} catch(e) {
		try { //Firefox, Mozilla, Opera, etc.
			parser=new DOMParser();
			xmlDoc=parser.parseFromString(XMLText,"text/xml");
		}	catch(e) { return false; }
	}

	return xmlDoc;
}

function GetValueFromXML(XMLDoc, TagName)	{
	var RCTag = XMLDoc.getElementsByTagName(TagName);
	if (RCTag.length > 0)	{
		return RCTag[0].attributes[0].nodeValue;
	}
	return false;
}

// get a textvalue of an xml element
function GetSubValue(Obj, NodeName)	{
	var Ret = new Array();	
	for (var i=0; i<Obj.childNodes.length; i++)	{
		if (Obj.childNodes[i].nodeName == NodeName)	{
			Ret.push(Obj.childNodes[i].nodeValue);
		}
	}
	return Ret;
}

// get the position of an element taking all its parents into account	
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj)	{
		if (obj.offsetParent) {
			do {
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
			} while (obj = obj.offsetParent);
		}
		return [curleft,curtop];
	} else {
		return [0,0];
	}
}

// get the size of the browser window
function findWindowSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth,myHeight];
}

// fix for IE png24
function fnLoadPngs() {
	if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
		var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
		var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5);
	
		for (var i = document.images.length - 1, img = null; (img = document.images[i]); i--) {
			if (itsAllGood && img.src.match(/\.png$/i) != null) {
				fnFixPng(img);
				img.attachEvent("onpropertychange", fnPropertyChanged);
			}
			img.style.visibility = "visible";
		}
	
		var nl = document.getElementsByTagName("INPUT");
		for (var i = nl.length - 1, e = null; (e = nl[i]); i--) {
			if (e.className && e.className.match(/\bimage\b/i) != null) {
				if (e.src.match(/\.png$/i) != null) {
					fnFixPng(e);
					e.attachEvent("onpropertychange", fnPropertyChanged);
				}
				e.style.visibility = "visible";
			}
		}
	}
}

function fnPropertyChanged() {
	if (window.event.propertyName == "src") {
		var el = window.event.srcElement;
		if (!el.src.match(/x\.gif$/i)) {
			el.filters.item(0).src = el.src;
			el.src = "/images/x.gif";
		}
	}
}

function fnFixPng(img) {
	var src = img.src;
	img.style.width = img.width + "px";
	img.style.height = img.height + "px";
	img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')"
	img.src = "/images/x.gif";
}

// get a style property of a element
function getCurrentStyle(elem, prop)	{
   if (elem.currentStyle)	{  
      var ar = prop.match(/\w[^-]*/g);
      var s = ar[0];      
      for (var i=1; i<ar.length; ++i)	{
         s += ar[i].replace(/\w/, ar[i].charAt(0).toUpperCase());
      }           
      return elem.currentStyle[s]
   } else if (document.defaultView.getComputedStyle) {
      return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);
   }
}

// hide the ugly borders around links
function BlurLinks(){
	// Text- u. Grafik-Links
	lnks=document.getElementsByTagName('a');
	for(i=0;i<lnks.length;i++){
		lnks[i].onfocus=new Function("this.blur()");
	}
	// ImageMaps
	lnks=document.getElementsByTagName('area');
	for(i=0;i<lnks.length;i++){
		lnks[i].onfocus=new Function("this.blur()");
	}
}

// clear the autocomplete flags of all elements
function ClearAutoComplete()	{
	var hints = document.getElementsByTagName('input');
	for (var f=0; f<hints.length; f++)	{
		hints[f].setAttribute('autocomplete','off',0);
		
	}
}

// add an entry to a combobox with various options
function AddCB(CBObj,Text,Value,ToClear,PreSel)	{
	var TextParts;
	var Selected = CBObj.value;
	if (ToClear)	{
		// we clear our list first
		while (CBObj.length > 0)	{
			CBObj.options[CBObj.length - 1] = null;
		}
	}
	if (Text)	{
		newOption = new Option(Text, Value,false, false);
		if (Value == PreSel)	{
			// if we have a presel we selected it
			newOption.selected = true;
		}
		CBObj.options[CBObj.length] = newOption;
	}
	return Selected;
}

addLoadEvent(fnLoadPngs);
addLoadEvent(BlurLinks);
addLoadEvent(ClearAutoComplete);

