//@todo fuer chrome, Safari, etc erweitern!
function BrowserCheck () {
	var stringIE = 'MSIE ';
    var stringFF = 'Firefox/';
	var _isFF = null;
	var _isIE = null;
	var _mainVersion  = 0;
	
	var __construct = function () {
		_isFF = (navigator.userAgent.indexOf(stringFF) >= 0);
		_isIE = ( (typeof document.all !='undefined') && navigator.userAgent.indexOf(stringIE) >=0);
		readMainVersion();
	};
	var readMainVersion = function() {
		var agent = navigator.userAgent;
		if (_isIE && agent.indexOf(stringIE)>=0) {
			_mainVersion = agent.substr(agent.indexOf(stringIE)+stringIE.length);
			_mainVersion = _mainVersion.substr(0, _mainVersion.indexOf('.'));
		} else if (_isFF) {
			_mainVersion = agent.substr(agent.indexOf(stringFF)+stringFF.length);
			_mainVersion = _mainVersion.substr(0, _mainVersion.indexOf('.'));
		}
		_mainVersion = parseInt(_mainVersion);
	}
	
    // prüft ob Browser Microsoft Internet Explorer ist
    this.isIE = function () {
		return _isIE;
    };
    // prüft ob Browser Firefox ist
    this.isFF = function () {
		return _isFF;
    };
	// prüfen ob der Browser contentEditable unterstützt
	this.supportsContentEditable = function () {
		if (_isFF && _mainVersion < 3) return false;
		return true;
	}
	// prüft ob Mozile unterstützt wird
	this.supportsMozile = function () {
		return(_isFF && (typeof mozileEditor !='undefined'));
	}
    // prüft auf nicht unterstützte Browser und Versionen
    this.notSupported = function () {
        if (!this.isMinVersionIE(7) && !this.isMinVersionFF(2)) return true;
		return false;
    };
    // liefert Hauptversion des Browsers (bei IE 5,6,7 oder 8; bei FF 2 oder 3)
	this.getMainVersion = function() {
		return _mainVersion;
	}
	// prüft ob Browser IE und mindestens von Version version ist
	this.isMinVersionIE = function(version) {
		if (!version || isNaN(version)) return false;
		if (_isIE && _mainVersion >= Number(version)) return true;
		return false;
	}
	// prüft ob Browser FF und mindestens von Version version ist
	this.isMinVersionFF = function(version) {
		if (!version || isNaN(version)) return false;
		if (_isFF && _mainVersion >= Number(version)) return true;
		return false;
	}
	__construct();
}
var tyBrowser = new BrowserCheck();

function tyCheck(form,tmatch) {
	for(i=0;i<form.length;i++)
		if(form.elements[i].name.match(tmatch) && !form.elements[i].disabled)
			form.elements[i].checked=true;
}
function tyUnCheck(form,tmatch) {
	for(i=0;i<form.length;i++)
		if(form.elements[i].name.match(tmatch))
			form.elements[i].checked=false;
}

function tyFormOptions() {
	elements=arguments[0]?arguments[0]:this.options;
	for(var i=0;i<elements.length;i++) {
		if(elements[i].value && document.getElementById(elements[i].value)!=null) {
			if(elements[i].checked || elements[i].selected)
				document.getElementById(elements[i].value).style.display='block';
			else
				document.getElementById(elements[i].value).style.display='none';
		} else if(elements[i].value && document.getElementsByName(elements[i].value).length>0) {
			for(section in document.getElementsByName(elements[i].value)) {
				if(elements[i].checked || elements[i].selected) {
					section.style.display='block';
				}
				else
					section.style.display='none';
			}
		}
	}
}

// calendar functions

// This function gets called when the end-user clicks on some date.
function selected(cal, date) {
  cal.sel.value = date; // just update the date in the input field.
  cal.callCloseHandler();
}

// And this gets called when the end-user clicks on the _selected_ date,
// or clicks on the "Close" button.  It just hides the calendar without
// destroying it.
function closeHandler(cal) {
  cal.hide();                        // hide the calendar
}

// This function shows the calendar under the element having the given id.
// It takes care of catching "mousedown" signals on document and hiding the
// calendar if the click was outside.
function showCalendar(id, format) {
  var el = document.getElementById(id);
  if (calendar != null) {
    // we already have some calendar created
    calendar.hide();                 // so we hide it first.
  } else {
    // first-time call, create the calendar.
    var cal = new Calendar(false, null, selected, closeHandler);
    // uncomment the following line to hide the week numbers
    // cal.weekNumbers = false;
    calendar = cal;                  // remember it in the global var
    cal.setRange(1900, 2070);        // min/max year allowed.
    cal.create();
  }
  calendar.setDateFormat(format);    // set the specified date format
  calendar.parseDate(el.value);      // try to parse the text in field
  calendar.sel = el;                 // inform it what input field we use
  calendar.showAtElement(el);        // show the calendar below it

  return false;
}

function getLeft(l) {
	if (l.offsetParent) return (l.offsetLeft + getLeft(l.offsetParent));
	else return (l.offsetLeft);
}

function getTop(l) {
	if (l.offsetParent) return (l.offsetTop + getTop(l.offsetParent));
	else return (l.offsetTop);
}

var i;
function windowOpen(url,para) {
	i++;
	if(!para) {
		para='width=500,height=400,dependent=yes,status=no,resizable=yes,scrollbars=yes,screenX=' + ((screen.width/2)-500) + ',screenY=' + ((screen.height/2)-400) + ' ';
	}
	window.open(url,'tyo'+i,para);
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr;for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document;if(d.images){if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments;for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){d.MM_p[j]=new Image;d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;if(!d) d=document;if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document;n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n];for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n);return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments;document.MM_sr=new Array;for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x;if(!x.oSrc) x.oSrc=x.src;x.src=a[i+2];}
}

function MM_dragLayer(objName,x,hL,hT,hW,hH,toFront,dropBack,cU,cD,cL,cR,targL,targT,tol,dropJS,et,dragJS) { //v4.32
  //Copyright 1998 Macromedia, Inc. All rights reserved.
  var i,j,s,aLayer,retVal,curDrag=null,curLeft,curTop,OP=window.opera;
  var d=document,IE=(tyBrowser.isIE()),NS4=d.layers;NS6=(!IE&&d.getElementById&&!OP),NS=(NS4||NS6);
  if (!NS) {OP = false;IE = true; /* Alle Browser wie einen IE behandeln */}
  if (IE)
  	var body = getBody(window);
  if (!IE&&!NS) return false;
  retVal = true;if(!OP&&IE&&event)event.returnValue=true;
  if (MM_dragLayer.arguments.length > 1) {
    curDrag = MM_findObj(objName);if (!curDrag) return false;
    if (!d.allLayers) {d.allLayers = new Array();
      with (d) if (NS4) {for (i=0; i<layers.length; i++) allLayers[i]=layers[i];
        for (i=0; i<allLayers.length; i++) if (allLayers[i].document && allLayers[i].document.layers)
          with (allLayers[i].document) for (j=0; j<layers.length; j++) allLayers[allLayers.length]=layers[j];
      } else {
       if (NS6) {var all = getElementsByTagName("span");
          for (i=0;i<all.length;i++) {s=all[i].style;if(s&&(s.position||s.pixelTop))allLayers[allLayers.length]=all[i]}
          all = getElementsByTagName("div");}
        for (i=0;i<all.length;i++) {s=all[i].style;if(s&&(s.position||s.pixelTop))allLayers[allLayers.length]=all[i]}
    }}
    curDrag.MM_dragOk=true;curDrag.MM_targL=targL;curDrag.MM_targT=targT;
    curDrag.MM_tol=Math.pow(tol,2);curDrag.MM_hLeft=hL;curDrag.MM_hTop=hT;
    curDrag.MM_hWidth=hW;curDrag.MM_hHeight=hH;curDrag.MM_toFront=toFront;
    curDrag.MM_dropBack=dropBack;curDrag.MM_dropJS=dropJS;
    curDrag.MM_everyTime=et;curDrag.MM_dragJS=dragJS;
		curDrag.MM_oldZ = (NS4)?curDrag.zIndex:curDrag.style.zIndex;
    curLeft= (NS4)?curDrag.left:(NS6)?parseInt(curDrag.style.left):curDrag.style.pixelLeft;
    if (String(curLeft)=="NaN") curLeft=0;curDrag.MM_startL = curLeft;
    curTop = (NS4)?curDrag.top:(NS6)?parseInt(curDrag.style.top):curDrag.style.pixelTop;
    if (String(curTop)=="NaN") curTop=0;curDrag.MM_startT = curTop;
    curDrag.MM_bL=(cL<0)?null:curLeft-cL;curDrag.MM_bT=(cU<0)?null:curTop-cU;
    curDrag.MM_bR=(cR<0)?null:curLeft+cR;curDrag.MM_bB=(cD<0)?null:curTop+cD;
    curDrag.MM_LEFTRIGHT=0;curDrag.MM_UPDOWN=0;curDrag.MM_SNAPPED=false; //use in your JS!
    d.onmousedown = MM_dragLayer;d.onmouseup = MM_dragLayer;
    if(NS)d.captureEvents(Event.MOUSEDOWN|Event.MOUSEUP);
  } else {
    var theEvent=((NS)?objName.type:event.type);
    if (theEvent=='mousedown') {
      var mouseX=(NS)?objName.pageX:((OP)?event.x+pageXOffset:event.clientX+(IE?body.scrollLeft:d.body.scrollLeft));
      var mouseY=(NS)?objName.pageY:((OP)?event.y+pageYOffset:event.clientY+(IE?body.scrollTop:d.body.scrollTop));
      var maxDragZ=null;d.MM_maxZ = 0;
      for (i=0; i<d.allLayers.length; i++) {aLayer = d.allLayers[i];
        var aLayerZ = (NS4)?aLayer.zIndex:parseInt(aLayer.style.zIndex);
        if (aLayerZ > d.MM_maxZ) d.MM_maxZ = aLayerZ;
        var isVisible = (((NS4)?aLayer.visibility:aLayer.style.visibility).indexOf('hid') == -1);
        if (aLayer.MM_dragOk != null && isVisible) with (aLayer) {
          var parentL=0;var parentT=0;
          if (!NS4) {parentLayer = (NS6)?aLayer.parentNode:aLayer.parentElement;
            while (parentLayer != null && (parentLayer.style.position || OP)) {
              parentL += parseInt(parentLayer.offsetLeft);parentT += parseInt(parentLayer.offsetTop);
              parentLayer = (NS6)?parentLayer.parentNode:parentLayer.parentElement;
          }}
          var tmpX=mouseX-(((NS4)?pageX:((NS6)?parseInt(style.left):style.pixelLeft)+parentL)+MM_hLeft);
          var tmpY=mouseY-(((NS4)?pageY:((NS6)?parseInt(style.top):style.pixelTop) +parentT)+MM_hTop);
          if (String(tmpX)=="NaN") tmpX=0;if (String(tmpY)=="NaN") tmpY=0;
          var tmpW = MM_hWidth;if (tmpW <= 0) tmpW += ((NS4)?clip.width :((OP)?style.pixelWidth:offsetWidth));
          var tmpH = MM_hHeight;if (tmpH <= 0) tmpH += ((NS4)?clip.height:((OP)?style.pixelHeight:offsetHeight));
          if ((0 <= tmpX && tmpX < tmpW && 0 <= tmpY && tmpY < tmpH) && (maxDragZ == null
              || maxDragZ <= aLayerZ)) {curDrag = aLayer;maxDragZ = aLayerZ;}}}
      if (curDrag) {
        d.onmousemove = MM_dragLayer;if (NS4) d.captureEvents(Event.MOUSEMOVE);
        curLeft = (NS4)?curDrag.left:(NS6)?parseInt(curDrag.style.left):curDrag.style.pixelLeft;
        curTop = (NS4)?curDrag.top:(NS6)?parseInt(curDrag.style.top):curDrag.style.pixelTop;
        if (String(curLeft)=="NaN") curLeft=0;if (String(curTop)=="NaN") curTop=0;
        MM_oldX = mouseX - curLeft;MM_oldY = mouseY - curTop;
        d.MM_curDrag = curDrag;curDrag.MM_SNAPPED=false;
        if(curDrag.MM_toFront) {
          eval('curDrag.'+((NS4)?'':'style.')+'zIndex=d.MM_maxZ+1');
          if (!curDrag.MM_dropBack) d.MM_maxZ++;}

		var eventTarget = ((NS)?objName.target:event.target);
		if(typeof eventTarget != "undefined" && typeof eventTarget.nodeName != "undefined"){
			if(eventTarget.nodeName.toUpperCase() != "TEXTAREA" && eventTarget.nodeName.toUpperCase() != "INPUT" && eventTarget.nodeName.toUpperCase() != "SELECT"){
				retVal = false;if(!NS4&&!NS6) event.returnValue = false;
			}
		}
    }} else if (theEvent == 'mousemove') {
		if (d.MM_curDrag) with (d.MM_curDrag) {
			var scroll_top = 1, scroll_left = 1;

			if (IE==true) {
			  if( d.documentElement && ( d.documentElement.scrollTop || d.documentElement.scrollLeft ) ) {
			    //IE 6+ in 'standards compliant mode'
			    scroll_top = d.documentElement.scrollTop;
			    scroll_left = d.documentElement.scrollLeft;
			  } else if( d.body && ( d.body.scrollLeft || d.body.scrollTop ) ) {
			    //IE 4 compatible
			    scroll_top = d.body.scrollTop;
			    scroll_left = d.body.scrollLeft;
			  }
			} else {
				scroll_top = d.body.scrollTop;
				scroll_left = d.body.scrollLeft;
			}
			var mouseX = (NS)?objName.pageX :((OP)?event.x+pageXOffset: event.clientX + scroll_left);
	        var mouseY = (NS)?objName.pageY :((OP)?event.y+pageYOffset: event.clientY + scroll_top);
			newLeft = mouseX-MM_oldX;
	        newTop  = mouseY-MM_oldY;
	        with (Math){
				if (MM_bL!=null)newLeft=max(newLeft,MM_bL);
				if (MM_bR!=null)newLeft=min(newLeft,MM_bR);
	            if (MM_bT!=null)newTop=max(newTop ,MM_bT);
	            if (MM_bB!=null)newTop=min(newTop ,MM_bB);
			}
	        MM_LEFTRIGHT = newLeft-MM_startL;MM_UPDOWN = newTop-MM_startT;
	        if (NS4){
				left = Math.max(newLeft,0);
				top = Math.min(Math.max(newTop,window.scrollY),((window.innerHeight+window.scrollY)-50));
			}else if (NS6){
				style.left = Math.max(newLeft,0)+'px';
				style.top = Math.min(Math.max(newTop,window.scrollY),((window.innerHeight+window.scrollY)-50))+'px';
			}else{
				style.pixelLeft = Math.max(newLeft,0);
				if((document.body.offsetHeight+scrollTop)>50){
					style.pixelTop=Math.min(Math.max(newTop,scrollTop),((document.body.offsetHeight+scroll_top)-50));
				}else{
					style.pixelTop=Math.max(newTop,scroll_top);
				}
			}

        	if (MM_dragJS) eval(MM_dragJS);
        	retVal = false;if(!NS) event.returnValue = false;
		}
    } else if (theEvent == 'mouseup') {
      d.onmousemove = null;
      if (NS){d.releaseEvents(Event.MOUSEMOVE);d.captureEvents(Event.MOUSEDOWN);}
			document.onmousemove = getMousePos;
      if (d.MM_curDrag) with (d.MM_curDrag) {
				if (typeof MM_targL =='number' && typeof MM_targT == 'number' &&
            (Math.pow(MM_targL-((NS4)?left:(NS6)?parseInt(style.left):style.pixelLeft),2)+
             Math.pow(MM_targT-((NS4)?top:(NS6)?parseInt(style.top):style.pixelTop),2))<=MM_tol) {
          if (NS4) {left = MM_targL;top = MM_targT;}
          else if (NS6) {style.left = MM_targL;style.top = MM_targT;}
          else {style.pixelLeft = MM_targL;style.pixelTop = MM_targT;}
          MM_SNAPPED = true;MM_LEFTRIGHT = MM_startL-MM_targL;MM_UPDOWN = MM_startT-MM_targT;}
        if (MM_everyTime || MM_SNAPPED) eval(MM_dropJS);
        if(MM_dropBack) {if (NS4) zIndex = MM_oldZ; else style.zIndex = MM_oldZ;}
        retVal = false;if(!NS) event.returnValue = false;}
      d.MM_curDrag = null;
    }
    if (NS&&!OP) d.routeEvent(objName);
  }

	if(document.getElementById('editMenue')!=null)
		setTBcookie();

	return retVal;
}

function getBody(w) {
    return (w.document.compatMode && w.document.compatMode == "CSS1Compat") ? w.document.documentElement : w.document.body || null;
}

function getMousePos(e){
	if (typeof event == "undefined") var event = window.event;
	if (IE) var body = getBody(window);
    if (typeof e != "undefined") {
		tyMouseLeft = (NS) ? e.pageX : ((OP) ? event.x + pageXOffset : event.clientX + d.body.scrollLeft);
		tyMouseTop  = (NS) ? e.pageY : ((OP) ? event.y + pageYOffset : event.clientY + d.body.scrollTop);
    } else if (typeof event != "undefined") {
    	var scrollLeft = 0, scrollTop = 0;
    	if (IE) {
    		scroll_left = body.scrollLeft;
    		scroll_top = body.scrollTop;
    	} else if (!IE) {
    		scroll_left = d.body.scrollLeft;
    		scroll_top = d.body.scrollTop;
    	}
    	tyMouseLeft = (NS) ? e.pageX : (OP ? event.x + pageXOffset : event.clientX + scroll_left);
		tyMouseTop  = (NS) ? e.pageY : (OP ? event.y + pageYOffset : event.clientY + scroll_top);
    }
}

function tyHelp(obj,dx,dy,relative,count){
	var dx=isNaN(dx)?0:dx;
	var dy=isNaN(dy)?0:dy;
	var relative = (relative==true?true:false);
	var elem = document.getElementById(obj);

	tyMouseLeft=isNaN(tyMouseLeft)?0:tyMouseLeft;
	tyMouseTop=isNaN(tyMouseTop)?0:tyMouseTop;

	//Versuch an der mitte des documents auszurichten
	if(relative){
		if (window.innerHeight) {
			dx=dx+Math.floor(window.innerWidth/2);
			dy=dy+Math.floor(window.innerHeight/2);
		} else if(document.body.offsetHeight) {
			dx=dx+Math.floor(document.body.offsetWidth/2);
			dy=dy+Math.floor(document.body.offsetHeight/2);
		}
	}

	if (elem) {
		//fr die Toolbar
		if(mytyToolbar){
			if(obj.substring(0,6)=='tyList' || obj.substring(0,6)=='tyChar' || obj.substring(0,6)=='tyChar' || obj.substring(0,6)=='tyPara' || obj.substring(0,6)=='tyStyl' || obj.substring(0,6)=='tyFont' || obj.substring(0,6)=='tyTabl'){
				if (typeof count != 'undefined') {
					var tbleft = parseInt(mytyToolbar.style.left);
					var tbtop = parseInt(mytyToolbar.style.top);
				} else {
					var tbleft = parseInt(mytyToolbar.offsetLeft);
					var tbtop = parseInt(mytyToolbar.offsetTop);
				}
				dx=dx-(tbleft>0?tbleft:0);
				dy=dy-(tbtop>0?tbtop:0);
			}
		}

		elem.style.left = (relative?dx:Math.max(tyMouseLeft+dx,0))+'px';
		elem.style.top  = (relative?dy:Math.max(tyMouseTop+dy,0))+'px';

		if(elem.style.display=='none' || elem.style.display=='') elem.style.display='block';
		else elem.style.display='none';
	}
}

function tyShowHelp(id,dx,dy,relative,boxwidth) {
	var helpBox='tyHelpBox'+id;
	var mouseTop = (typeof tyMouseTop == "undefined"?0:tyMouseTop);

	if(document.getElementById(helpBox)==null)
		return false;

	new Draggable(helpBox,{handle:'handle'});

	if (typeof dx != "undefined") dx = 50;
	if (typeof dy != "undefined") dy = 50;

	if (!tyBrowser.isIE()) {
		dy += window.scrollY;
		dx += window.scrollX;
	} else {
		dy += window.scrollHeight;
		dx += window.scrollWidth;
	}

	if(document.getElementById(helpBox).style.display == "none" || document.getElementById(helpBox).style.display == "") {
		document.getElementById(helpBox).style.display = "block";

		if(window.innerHeight){
			var breite = Math.floor(window.innerWidth);
			var hoehe = Math.floor(window.innerHeight);
		}else if(document.body.offsetHeight){
			var breite = Math.floor(document.body.offsetWidth);
			var hoehe = Math.floor(document.body.offsetHeight);
		}
		if (boxwidth == undefined) boxwidth = Math.floor(breite*0.75);
		document.getElementById(helpBox).style.width = boxwidth + "px";
		document.getElementById(helpBox).style.left = Math.floor(breite*0.125) + "px";
		document.getElementById(helpBox).style.top = Math.floor(mouseTop+15) + "px";
	} else {
		document.getElementById(helpBox).style.display = "none";
	}
}

function tyShowColorPickerPopup(inputId,extraStyle,forceColorSelect) {
	var colorPopup = window.open(tybase+'/modules/content/selcolor.php?inputId='+inputId+'&colorstyle='+extraStyle+'&showColorSelect='+forceColorSelect,'selcolor','width=390,height=320,status=no,resizable=no');
	colorPopup.focus();
}

// Cookie zur Speicherung der Position der schwebenden Menueleiste
//Position als Array im Cookie speichern
function setTBcookie(){
	position = new Array();
	var setTBcookie = false;
	if(tyBrowser.isIE()){
		var body = getBody(self);
		if(mytyToolbar){
			position[0] = Math.max(parseInt(mytyToolbar.style.left)-body.scrollLeft,0);                //IE
			position[1] = Math.max(parseInt(mytyToolbar.style.top)-body.scrollTop,0);
			setTBcookie = true;
		}
	}else{
		if(mytyToolbar){
			position[0] = Math.max(parseInt(mytyToolbar.style.left)-window.pageXOffset,0);
			position[1] = Math.max(parseInt(mytyToolbar.style.top)-window.pageYOffset,0);
			setTBcookie = true;
		}
	}
	if(setTBcookie == true)
		document.cookie = "showBar=showTbBarMenu," + showTbBarMenu + "|tyCONpos,"+ position + "; path=/";
}

function readCookie(name){
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++){
		var c = ca[i];
		while (c.charAt(0)==' '){
			c = c.substring(1,c.length);
		}
		if (c.indexOf(nameEQ) == 0){
			return c.substring(nameEQ.length,c.length);
		}
	}
	return null;
}

//Den im Cookie gespeicherten Wert auslesen
function getposition(){
	var wert = [];
	var cookieString = '';

	if(document.cookie){
		cookieString = readCookie('showBar');
		if(cookieString) {
			trenn = cookieString.split("|");
			for(i=0;i<trenn.length;i++){
				if(trenn[i].match(/tyCONpos,/)){
					wert=trenn[i].split(",");
				}
			}
		}
	}
	if(wert.length>0 && mytyToolbar){
		wert[1] = parseInt(wert[1]);
		wert[2] = parseInt(wert[2]);
		if (tyBrowser.isIE()) {
			var body = getBody(self);
			if ((wert[2]+mytyToolbar.offsetHeight) < body.offsetHeight)
				var posy = (wert[2]+body.scrollTop)
			else
				var posy = (body.offsetHeight+body.scrollTop)-mytyToolbar.offsetHeight;

			if ((wert[1]+mytyToolbar.offsetWidth) < body.offsetWidth)
				var posx = (wert[1]+body.scrollLeft)
			else
				var posx = (body.offsetWidth+body.scrollLeft)-mytyToolbar.offsetWidth;
		} else {
			if ((wert[2]+mytyToolbar.offsetHeight) < self.innerHeight)
				var posy = (wert[2]+window.pageYOffset)
			else
				var posy = (self.innerHeight+self.pageYOffset)-mytyToolbar.offsetHeight;

			if ((wert[1]+mytyToolbar.offsetWidth)< self.innerWidth)
				var posx = (wert[1]+self.pageXOffset)
			else
				var posx = (self.innerWidth+self.pageXOffset)-(mytyToolbar.offsetWidth+24);
		}

		mytyToolbar.style.left = posx + "px";
		mytyToolbar.style.top = posy + "px";
	}
}

//wechselt display
function toggleDisplay(did,display){
	var elem = document.getElementById(did);
	if(elem){
		if(display){
			elem.style.display=display;
		}else{
			if(elem.style.display=='none' || elem.style.display==''){
				elem.style.display='block';
			}else{
				elem.style.display='none';
			}
		}
	}
}

// festpinnen der menueleiste
function ixed_timer() {
 	if(mytyToolbar) {
 		if(tyBrowser.isIE()){
	 		var body = getBody(self);
			if(body && body.scrollTop>=0){
	            if(ixed_pretop==-1)
					ixed_pretop=body.scrollTop;

				if (body.scrollTop > (parseInt(mytyToolbar.style.top)+body.scrollTop))
					ixed_pretop = parseInt(mytyToolbar.style.top);
				var ixed_top=body.scrollTop;
	        } else {
	        	var ixed_top=ixed_pretop=0;
	        }
		}else{
			if(ixed_pretop==-1)
				ixed_pretop=self.pageYOffset;
	        if (self.pageYOffset > (parseInt(mytyToolbar.style.top)+self.pageYOffset))
				ixed_pretop = parseInt(mytyToolbar.style.top);
			var ixed_top=self.pageYOffset;
		}

		if (ixed_top!=ixed_pretop) {
			ixed_dif=0.2*(ixed_top-ixed_pretop);
			if (ixed_dif>0) ixed_dif=Math.ceil(ixed_dif);
			else ixed_dif=Math.floor(ixed_dif);

			mytyToolbar.style.top = parseInt(mytyToolbar.style.top)+ixed_dif+'px';
			ixed_pretop+=ixed_dif;
			if (parseInt(mytyToolbar.style.top)<0) {
				mytyToolbar.style.top = '0px';
				ixed_pretop = 0;
			}
		}
 	}
	setTimeout('ixed_timer()',30);
}
//ende toolbar

function tyShow(id) {
	if (document.getElementById(id))
		document.getElementById(id).style.display = "";
}
function tyHide(id) {
	if (document.getElementById(id))
		document.getElementById(id).style.display = 'none';
}


/**
 * Change the class-Attribute of an html object
 * @param HTMLObject | String  obj
 * @param string from
 * @param string to
 */
function mytyChangeClass(obj,from,to){
	if(typeof obj == "string") obj = $(obj);
	if(from && obj.hasClassName(from)){
		obj.removeClassName(from);
	}
	obj.toggleClassName(to);
}

/**
 * Shows js debug infos to the console (if available)
 */
function mytyDebug(msg){
	if(typeof window.console != "undefined" ){
		window.console.log(msg);
	}else if(typeof opera  != "undefined" && opera.postError){
		opera.postError(msg);
	}
}

/**
 * Gibt von einem Select-Feld die selektierten Werte zurck
 */
function getSelectedValues(id) {
	var target = document.getElementById(id);
	var a = new Array();
	if (typeof target != 'undefined' && typeof target.options != 'undefined') {
		for( i=0;i < target.options.length;i++ ) {
			if(target.options[i].selected == true){
				a.push(target.options[i].value);
			}
		}
	}
	return a;
}

function switch_display(prefix, elem_types) {
	var elements = new Array();
	if (typeof prefix == "string" && prefix!="") {
		if (typeof elem_types == "string" && elem_types != "") {
			var elem_types_split = elem_types.split(",");
			if (typeof elem_types_split == "array") {
				for (var elem_type in elem_types_split) {
					elements.concat(document.getElementsByTagName(elem_type));
				}
			} else {
				elements = document.getElementsByTagName(elem_types);
			}
			for (var i=0; i<elements.length;i++) {
				if (typeof elements[i].id == "string" && elements[i].id != "") {
					if (elements[i].id.indexOf(prefix)==0) {
						if (elements[i].style.display != 'none') {
							elements[i].style.display = 'none';
						} else {
							elements[i].style.display = '';
						}
					}
				}
			}
			return true;
		}
	}

	return false;
}

/**
 * lscht alle Werte in einem Select-Feld
 */
function clearList(selectId) {
    var obj = document.getElementById(selectId);
	if (obj) {
		obj.length = 0;
		if (obj.hasChildNodes()) {
			var i=0;
			while (obj.childNodes.length>0) {
				for (i=0; i<obj.childNodes.length; i++) {
					obj.removeChild(obj.childNodes[i]);
				}
			}
		}
	}
}

/**
 * fgt Options hinzu
 */
function addOption(selectId, txt, val, selected, disabled) {
    var obj = document.getElementById(selectId);
	if (obj) {
	    if (typeof val == 'undefined') var val = '';
		if (typeof selected == 'undefined') var selected = false;
		if (typeof disabled == 'undefined') var disabled = false;

		if (!tyBrowser.isIE()) {
			var objOption = new Option(txt, val);
			var idx = document.getElementById(selectId).length;
			obj.options[idx] = objOption;
			if (selected) obj.options[idx].selected = true;
			if (disabled) obj.options[idx].disabled = true;
	    } else {
			var objOption = document.createElement("option");
			obj.options.add(objOption);
			objOption.innerText = txt;
			objOption.value = val;
			if (selected) objOption.selected = true;
			if (disabled) objOption.disabled = true;
	    }
	}
}

/**
 * fgt Optiongroups hinzu
 */
function addOptionGroup(selectId, label) {
    var obj = document.getElementById(selectId);
	if (obj) {
		if (!tyBrowser.isIE()) {
			var obj = document.getElementById(selectId);
		    var optgroup = document.createElement('optgroup');
		    optgroup.setAttribute('label',label);
		    obj.appendChild(optgroup);
		} else {
			var objOption = document.createElement("optgroup");
			obj.options.add(objOption);
			objOption.label = label;
		}
	}
}

/**
 * prft ob der Suchstring im Array vorhanden ist (s. php)
 */
function in_array(key, arr) {
	if (arr.length>0) {
		for (var k in arr) {
			if (arr[k]==key) return true;
		}
	}
	return false;
}

/**
 * prft ob der Suchstring im Array vorhanden ist und gibt den Schlssel zurck(s. php)
 */
function array_search(key, arr) {
	if (arr.length>0) {
		for (var k in arr) {
			if (arr[k]==key) return k;
		}
	}
	return false;
}

// Funktion trim() - s. PHP
if (typeof trim == 'undefined') {
	function trim(text) {
		if (typeof text!='undefined') {
			text = text.replace(/^\s+/ ,'');
			text = text.replace(/\s+$/ ,'');
		}
		return text;
	}
}

/**
 * checked oder uncheckt Checkboxen, eines Formulars mit der id->formID und dem Prefix->prefix
 */
function checkboxMarkHandler(formID, prefix, mark) {
	if (formID=='') var oForm = document.forms[0];
	else {
		var oForm = document.getElementById(formID);
		if (typeof oForm == 'undefined' || oForm==null) oForm = document.forms[0];
	}
	var sPrefix = (prefix!=""?prefix:"checkbox");
	var bMark = (mark==true?true:false);

	for (var i=0; i < oForm.elements.length; i++) {
		if (oForm.elements[i].type=="checkbox") {
			if (
				(oForm.elements[i].id && oForm.elements[i].id.indexOf(sPrefix)==0) ||
				(oForm.elements[i].name && oForm.elements[i].name.indexOf(sPrefix)==0)
			) {
				if (bMark) oForm.elements[i].checked=true;
				else oForm.elements[i].checked=false;
			}
		}
	}
}

/**
 * fuegt einen Eventhandler hinzu
 *
 * @param object obj Objekt, auf das sich das Event bezieht
 * @param string type Typ des Events (mousedown, click, etc.)
 * @param function fn Funktion, an die das Event bermittelt wird
 */
function addEvent( obj, type, fn ) {
   if (obj.addEventListener) {
      obj.addEventListener( type, fn, false );
   } else if (obj.attachEvent) {
      obj["e"+type+fn] = fn;
      obj[type+fn] = function() {obj["e"+type+fn]( window.event );}
      obj.attachEvent( "on"+type, obj[type+fn] );
   }
}

/**
 * entfernt einen Eventhandler
 *
 * @param object obj Objekt, auf das sich das Event bezieht
 * @param string type Typ des Events (mousedown, click, etc.)
 * @param function fn Funktion, an die das Event bermittelt wird
 */
function removeEvent( obj, type, fn ) {
   if (obj.removeEventListener) {
      obj.removeEventListener( type, fn, false );
   } else if (obj.detachEvent) {
	  obj.detachEvent( "on"+type, obj[type+fn] );
      obj[type+fn] = null;
      obj["e"+type+fn] = null;
   }
}

/**
* Dekodiert die HTML Entities im übergebenen String, damit dieser als value gesetzt werden kann
* (innerHTML dekodiert HTML Entities, value nicht)
*/
function entityDecode(strHTML) {
	var tmpTextArea = document.createElement("textarea");
	tmpTextArea.innerHTML = strHTML;
	var decodedStr = tmpTextArea.value;
	return decodedStr;
}

/**
 * erzeugt aus einem Eingabefeld ein spezielles neues, mit deaktivieren Funktion
 *
 * @param id id des Eingabefeldes
 * @param defaultValue => standardwert, der vererbt wurde (nur anzeige)
 * @param editable bestimmt, ob das Eingabefeld sofort bearbeitbar ist
 */
function widgetInput( id, defaultValue, editable ){
	var elem = document.getElementById(id);

	if(!editable){
		elem.onfocus = function (evt){
			if( this.read_only == true ){
				this.read_only = false;
				if( this.name.charAt(0) == "_" &&
					this.name.charAt(1) == "_" ){
					this.name = this.name.substr(2);
				}
				this.className = this.className.replace(/tyFormInputReadOnly/g,"");
			}

			if( this.read_only ){
				this.className+= " tyFormInputReadOnly";
			}
		}

		elem.onblur = function (evt){
			if( ( this.inputDefault!==false ) && ( this.value.replace(/\r/g,"") == (this.inputDefault).replace(/\r/g,"") ) ){
				this.read_only = true;

				this.className = this.className.replace(/tyFormInputReadOnly/g,"");
				if( this.read_only ){
					this.className+= " tyFormInputReadOnly";
				}

				if( this.name.charAt(0) != "_" && this.name.charAt(1) != "_"){
					this.name = "__" + this.name;
				}
			}
		}

		elem.onchange = elem.onkeyup = function (evt){
			if( this.value != this.inputDefault ){
				this.inputDefault = false;
				this.onkeyup = function(evt){};
				this.onchange = function(evt){};
			}
		}

		if(elem.value == '' || typeof elem.options !="undefined"){
			elem.value = entityDecode(defaultValue);
			if((typeof elem.options) != "undefined"){
				elem.value = "";
				elem.selectedIndex = 0;
				for(var i=0;i<elem.options.length;i++){
					if( elem.selectedIndex == -1 &&
						( elem.options[i].value == defaultValue || elem.options[i].value=="" ) ){
						elem.selectedIndex = i;
						elem.options[i].selected = true;
					}
				}
				defaultValue = false;
			}
		}
	}
	elem.inputDefault = defaultValue;
	elem.read_only = !editable;

	elem.className = elem.className.replace(/tyFormInputReadOnly/g,"");
	if( elem.read_only ){
		elem.className+= " tyFormInputReadOnly";
	}

	if( elem.read_only &&
		elem.name.charAt(0) != "_" &&
		elem.name.charAt(1) != "_"){
		elem.name = "__" + elem.name;
	}
}

if(typeof document.getElementsByClassName == 'undefined'){
	if (tyBrowser.isIE()) {
		document.getElementsByClassName = function(element, className) {
			className = className.toString().replace(/^\s+/, '').replace(/\s+$/, '');
			var elements = [];
			if (!className) return elements;

			var nodes = element.getElementsByTagName('*');
			className = ' ' + className + ' ';

			for (var i = 0, child, cn; child = nodes[i]; i++) {
			  if (child.className && (cn = ' ' + child.className + ' ') && (cn.indexOf(className) > -1))
				elements.push(child);
			}
			return elements;
		}
	} else if( Element.prototype ) {
		Element.prototype.getElementsByClassName = function(className){
			className = className.toString().replace(/^\s+/, '').replace(/\s+$/, '');
			var elements = [];
			if (!className) return elements;

			var nodes = this.getElementsByTagName('*');
			className = ' ' + className + ' ';

			for (var i = 0, child, cn; child = nodes[i]; i++) {
			  if (child.className && (cn = ' ' + child.className + ' ') && (cn.indexOf(className) > -1))
				elements.push(child);
			}
			return elements;
		}
		Document.prototype.getElementsByClassName = Element.prototype.getElementsByClassName;
	}
}

/*
 * Checks if a node is contained in a selection
 * Similar to the containsNode method, but this function also works in Opera
 * @param Object nodeToFind The node the function should look for. You can get a node with top.opener.document.getElementById('elemName')
 * @param Object sel The selection which should be searched. You can get a selection with top.opener.getSelection()
 * @param Object srcDocument The source which should be searched. For example top.opener.document
 */
function findInSelection (nodeToFind,sel,srcDocument) {
	var el, el2, rng, comprng, selparent;
	rng = sel.getRangeAt(0);
	el = nodeToFind;
	if (rng) {
		// Look for an element *within* the selected range
		if (!rng.collapsed && (rng.text === undefined || rng.text)) {
			comprng = srcDocument.createRange ?
			srcDocument.createRange() : srcDocument.body.createTextRange();

			// determine if element el is within the range
			if (srcDocument.createRange) { // w3c
				comprng.selectNodeContents(el);
				if (rng.compareBoundaryPoints(Range.END_TO_START, comprng) < 0 &&
					rng.compareBoundaryPoints(Range.START_TO_END, comprng) > 0) {
					return el;
				}
			}
			else { // microsoft
				comprng.moveToElementText(el);
				if (rng.compareEndPoints("StartToEnd", comprng) < 0 &&
					rng.compareEndPoints("EndToStart", comprng) > 0) {
					return el;
				}
			}
		}
		// Look for an element *around* the selected range
		selparent = rng.commonAncestorContainer || rng.parentElement();
		for (el2 = selparent; el2 !== srcDocument.body; el2 = el2.parentNode) {
			if (el2 == el) {
				return el;
			}
		}
	}
	return null;
};
