var NPage_NoValidation = false;

function openIMG(path, pk, hi, wi) {
	x = window.open("\VController.aspx?ThumbNail=false&Layout=False&class=open&Path=" + path + "&pk_Dokument=" + pk + "&tabelle=Dokument&pk_tabelle=PK_Dokument", "_blank", "width=" + wi + ",height=" + hi + ",resizable=yes");
}

var BASE = {
    isIE: (document.all && !window.opera),
    isFF: (!document.all && !window.opera && document.getElementById),
    sp: " --- ",
    EscInitUrl: "&initEsc=true",
    Elements: Array(),
    TmpObj: function(name, value) {
        this.name = name;
        this.value = value;
    },

    GetTmpObj: function(name) {
        for (var i = 0; i < BASE.Elements.length; i++) {
            if (BASE.Elements[i].name == name) {
                return BASE.Elements[i].value;
            }
        }
        return null;
    },

    InsTmpObj: function(name, value) {
        for (var i = 0; i < BASE.Elements.length; i++) {
            if (BASE.Elements[i].name == name) {
                BASE.Elements[i].value = value;
                return;
            }
        }
        BASE.Elements[BASE.Elements.length] = new BASE.TmpObj(name, value);
    },

    InitNoReturn: function() {
        var allCombos = document.getElementsByTagName("select");
        for (var i = 0; i < allCombos.length; i++) {
            Event.observe(allCombos[i], 'keydown', BASE.NoReturn, true);
        }
    },

    InitIEDisabledFields: function() {
       	var f = $$('input[disabled]');
       	for (var i = 0; i < f.length; i++) {
       		var className = f[i].className;
       		if (className != undefined && className != "" && className.indexOf("disabled") >= -1)
       			break;
       		if (className != undefined)
       			className += " disabled";
       		else
       			className = "disabled";
       		f[i].className = className;
       	}
    },

    InitF7TextBoxes: function(parent) {
        var allInputs = parent.getElementsByTagName('input');
        for (var i = 0; i < allInputs.length; i++) {
            var tb = allInputs[i];
            if (tb.type == 'text') {
                Event.observe(tb, 'keydown', AL.openF7Win);
            }
        }
        var alltextar = parent.getElementsByTagName('textarea');
        for (var j = 0; j < alltextar.length; j++) {
            Event.observe(alltextar[j], 'keydown', AL.openF7Win);
        }
    },

    Init: function() {
        BASE.InitNoReturn();
        if (BASE.isIE) {
        	BASE.InitIEDisabledFields();
        	return;
        }
        var helps = $$("img.helps");
        for (var i = 0; i < helps.length; i++) {
            if (helps[i].parentNode.tagName == "TD")
                helps[i].parentNode.className = "nr";
        }
    },

    NoReturn: function(event) {
        if (event.keyCode == 8)
            Event.stop(event);
    },

    evalFunction: function(fkt) {
        eval(fkt);
    },

    setTextSelected: function(input, start, end) {
        if (!start)
            start = 0;
        if (!end)
            end = $F(input).length;

        if (input.setSelectionRange) {
            input.focus();
            input.setSelectionRange(start, end);
        }
        else if (input.createTextRange) {
            var range = input.createTextRange();
            range.collapse(true);
            range.moveEnd('character', start);
            range.moveStart('character', end);
            range.select();
        }
    }
}

var SB = {
	sb: function(val, obj) {
		$('txtSubmitParam').value = val;
		return CausesValidation(obj);
	},
	del: function(frage, val) {
		if (confirm(frage)) {
			$('txtSubmitParam').value = val;
			document.forms[0].submit();
		}
	}
}

function CausesValidation(sender) {
	if (!sender)
		return true;
	validate = sender.getAttribute("causesvalidation");
	if (validate && validate == 'false')
		NPage_NoValidation = true;
	else
		NPage_NoValidation = false;
	return !NPage_NoValidation;
}

function NValidatorOnSubmit() {
	if (typeof (NValidator_CustomValidate) != 'undefined') {
		var ret = NValidator_CustomValidate();
		if (!ret)
			return false;
	}
	var submitParam = '0';
	if ($('txtSubmitParam'))
		submitParam = $('txtSubmitParam').value;

	if (submitParam == '2' || submitParam == '7' || NPage_NoValidation)
		return true;
	try {
		if (NPage_ValidationActive) {
			NPage_ClientValidate();
			return (NPage_IsValid);
		}
		else
			return true;
	}
	catch (e) { }
}

function stopEvent(e) {
	try {
		if (!e || e == null)
			e = window.event;
	}
	catch (ex) { }
	if (!e)
		return false;
	else
		return Event.stop(e);
}

//erweitereung des Prototype, weil es native Events (onchange...) nicht aufruft
//auch Funktionen mit Event.Observe werden aufgerufen
function fireEvent(element, event) {
	if (document.createEvent) { //firefox + others
		var evt = document.createEvent('HTMLEvents');
		evt.initEvent(event, true, true); // event type,bubbling,cancelable
		return !element.dispatchEvent(evt);
	}
	else {// IE
		var evt = document.createEventObject();
		return element.fireEvent('on' + event, evt)
	}
}

function return_key() {
	if (event.keyCode == 13) {
		event.keyCode = 9
	}
}
function stunde(feld1, feld2) {
	var wert = feld1.value;
	if (isNaN(feld1.value) || feld1.value > 24 || feld1.value.indexOf('.') != -1) feld1.value = wert.substr(0, (feld1.value = wert.length - 1));
	if (feld1.value == 24) feld1.value = '00';

	hh = feld1.value.toString();

	if (document.all) {
		if (hh.length == 2 && (event.keyCode != 9 && event.keyCode != 16)) { feld2.focus; feld2.select(); }
		if (hh.length == 1 && (event.keyCode == 188 || event.keyCode == 110 || event.keyCode == 39 || event.keyCode == 190 || event.keyCode == 111 || (event.shiftKey && event.keyCode == 55))) {
			feld1.value = 0 + hh;
			feld2.focus();
			feld2.select();
		}
	}
	else {
		if (hh.length == 2) { feld2.focus; feld2.select(); }
	}
}
function stundeb(feld1) {
	if (feld1.value.toString().length == 1) feld1.value = 0 + feld1.value;
}
function min(feld2) {
	var wert = feld2.value;
	if (isNaN(feld2.value) || feld2.value > 59 || feld2.value.indexOf('.') != -1) feld2.value = wert.substr(0, (feld2.value = wert.length - 1));
}

var nMenuMyTimer;
var nMenuMenue;

function MenuDOM() {
	return (document.implementation && document.implementation.hasFeature('HTML', ''));
}
function MenuHideCallback() {
	if (window.nMenuMyTimer)
		window.clearTimeout(window.nMenuMyTimer);
	if (nMenuMenue) {
		MenuHide(nMenuMenue);
		nMenuMenue = null;
	}
}
function MenuHide(obj) {
	//obj.style.visibility = 'hidden';
	obj.style.display = 'none';
	$("ifrMenubg").style.visibility = 'hidden';
}
function MenuisShowElement(obj) {
	//return (obj.style.visibility == 'visible');
	return (obj.style.display == 'block');
}
function nMenuShow(obj) {
	obj.style.zIndex = 999;
	//obj.style.visibility = 'visible';
	obj.style.display = 'block';
}
function MenueOver() {
	var sender = this;
	if (sender.childNodes.length == 1)
		return false;
	var objPopup = sender.childNodes.item(1);
	var objParent = sender.parentNode;

	if (window.nMenuMenue && window.nMenuMenue != objPopup) {
		MenuHide(window.nMenuMenue);
	}
	window.clearTimeout(nMenuMyTimer);
	window.nMenuMenue = objPopup;
	if (!MenuisShowElement(objPopup)) {
		nMenuShow(objPopup);
		if (document.all) {
			objPopup.style.left = nGetAbsoluteLeft(objParent);
			objPopup.style.top = nGetAbsoluteTop(objParent) + 27;
			tmpWidth = objPopup.offsetWidth;
			with ($("ifrMenubg").style) {
				left = objPopup.style.posLeft;
				top = objPopup.offsetTop;
				width = tmpWidth;
				height = objPopup.offsetHeight;
				visibility = 'visible';
				display = 'block';
			}
		} else if (MenuDOM()) {
			objPopup.style.left = nGetAbsoluteLeft(objParent);
			objPopup.style.top = nGetAbsoluteTop(objParent) + 27;
		}
	}
	return true;
}
function MenueOut() {
	var sender = this;
	if (sender.childNodes.length == 1)
		return false;
	var objPopup = sender.childNodes.item(1);
	var objParent = sender.parentNode;
	nMenuMenue = objPopup;
	window.nMenuMyTimer = window.setTimeout("MenuHideCallback()", 300);
	return true;
}
function MenueSubout() {
	var objPopup = null;
	if (this.nodeName != "DIV") {
		this.className = "";
		return true;
	} else
		objPopup = this;
	nMenuMenue = objPopup;
	window.nMenuMyTimer = window.setTimeout("MenuHideCallback()", 300);
	return true;
}
function MenueSubover(sender, isDiv) {
	window.clearTimeout(nMenuMyTimer);
	if (this.nodeName != "DIV") { this.className = "hv"; }
}

var MN = {
	isInit: false,
	Init: function() {
		var td = $("mn").rows[0].childNodes[0];
		if (td.nodeName.toUpperCase() != "TD")
			td = $("mn").rows[0].childNodes[1];
		while (td.firstChild && td.firstChild.nodeName == "SPAN") {
			if (td.className == "d") {
				var span = td.firstChild;
				span.onmouseover = MenueOver;
				span.onmouseout = MenueOut;
				if (span.getAttribute("w")) { span.onclick = MN.PopUp; }
				else if (span.getAttribute("p")) { span.onclick = MN.MenueClick; }
				if (span.childNodes[1]) {
					if (span.childNodes[1].nodeName == "DIV") {
						MN.InitSub(span.childNodes[1]);
					}
				}
			}
			if (td.nextSibling)
				td = td.nextSibling;
			else
				break;
		}
		MN.InitToolbar();
	},

	InitSub: function(div) {
		var tds = $A(div.getElementsByTagName("td"));
		tds.each(function(td) {
			if (td.getAttribute("p")) {
				td.onclick = MN.MenueClick;
				//td.onclick = function(){MN.MenueClick(this);};
				td.onmouseover = MenueSubover;
				td.onmouseout = MenueSubout;
			}
			if (td.getAttribute("w")) {
				td.onclick = MN.PopUp;
			}
		});
	},

	InitToolbar: function() {
		tb = $("T");
		if (!tb)
			return;
		spans = tb.getElementsByTagName("span");
		for (var i = 1; i < spans.length; i++) {
			if (spans[i].parentNode.nodeName.toUpperCase() == "DIV") {
				spans[i].onmouseover = function() { MN.TbHover.call(this, 1) };
				spans[i].onmouseout = function() { MN.TbHover.call(this, 0) };
				spans[i].onmousedown = function() { MN.TbMousedown.call(this, 1) };
				spans[i].onmouseup = function() { MN.TbMousedown.call(this, 0) };
			}
		}
	},

	MenueClick: function(event) {
		var sender = this;
		var key = sender.getAttribute("p");
		var win = sender.getAttribute("w");
		stopEvent(event);
		if (win == null && key)
			document.location.href = "VController.aspx?Path=" + key;
	},

	PopUp: function() {
		var loc = this.getAttribute("w");
		var newPopUpNutri = window.open(loc, "newPopUpNutri");
		return false;
	},

	TbHover: function(ov) {
		if (!this.firstChild.getAttribute("disabled"))
			this.className = (ov) ? "hv" : "";
	},

	TbMousedown: function(down) {
		if (!this.firstChild.getAttribute("disabled"))
			this.className = (down) ? "cl" : "hv";
	},

	Xls: function() {
		location.href = location.href + '&XlsExport=true';
	},

	FB: function(path, rel) { //Feedback
		var fbWin = window.open('VController.aspx?PopUp=True&Path=' + path + '&RelatedPagezuContext=' + rel, 'Feedback', 'width=700, height=500, scrollbars=0, resizable=0,location=no', '_blank');
	}
}

//Begin Buttons_Events
function __NAutoPostBackCtl(eventObj, eventTargetID, eventArgument, NPageButtons, senderID) {
	$("txtSubmitParam").value = NPageButtons;
	var theform = document.forms[0];
	theform.btnPage__EVENTTARGET.value = eventTargetID;
	theform.btnPage__EVENTARGUMENT.value = eventArgument;
	var validate = null;
	var sender = null;
	if (eventObj)
		sender = Event.element(eventObj);
	else if (eventTargetID)
	    sender = $(eventTargetID);
	if (sender == null && senderID != null)
	    sender = $(senderID);		
	if (sender)
		validate = sender.getAttribute("causesvalidation");
	if ((validate && validate == 'false') || NPage_NoValidation) {
		NPage_NoValidation = true;
		return theform.submit();
	}
	if (typeof (NValidator_CustomValidate) != "undefined") {
		var ret = NValidator_CustomValidate();
		if (!ret) {
			if (eventObj != null)
				eventObj.returnValue = false;
			return false;
		}
	}
	if (typeof (NPage_IsValid) != "undefined") {
		NPage_ClientValidate();
		if (!NPage_IsValid)
			return false;
	}
	theform.submit();
}
function __NAutoPostBack(eventObj, eventTarget, eventArgument, NPageButtons) {
	$("txtSubmitParam").value = NPageButtons
	var theform = document.forms[0];

	if (eventTarget)
		theform.btnPage__EVENTTARGET.value = (eventTarget.name != undefined && eventTarget.name.indexOf("$") > -1) ? eventTarget.name.split("$").join(":") : eventTarget.id;
	else
		theform.btnPage__EVENTTARGET.value = "";
	theform.btnPage__EVENTTARGET.value = (eventTarget) ? eventTarget.name.split("$").join(":") : "";
	theform.btnPage__EVENTARGUMENT.value = eventArgument;
	if (typeof (NValidator_CustomValidate) != "undefined") {
		var ret = NValidator_CustomValidate();
		if (!ret) {
			if (eventObj != null)
				eventObj.returnValue = false;
			return false;
		}
	}
	if (typeof (NPage_IsValid) != "undefined") {
		NPage_ClientValidate();
		if (!NPage_IsValid)
			return false;
	}
	if (eventTarget && eventTarget.type.toLowerCase() != "submit")
		theform.submit();
	if (!eventTarget)
		theform.submit();
}
function __NAutoPostBackValue(eventObj, eventTarget, eventArgument, NPageButtons, Value) {
	$("txtSubmitParam").value = NPageButtons;
	var theform = document.forms[0];

	if (eventTarget)
		theform.btnPage__EVENTTARGET.value = (eventTarget.name != undefined && eventTarget.name.indexOf("$") > -1) ? eventTarget.name.split("$").join(":") : eventTarget.id;
	else
		theform.btnPage__EVENTTARGET.value = "";
	theform.btnPage__EVENTARGUMENT.value = eventArgument;
	theform.btnPage__EVENTVALUE.value = Value;
	var sender = null;
	var validate = null;
	if (eventObj) {
		sender = Event.element(eventObj);
		if (sender)
			validate = sender.getAttribute("causesvalidation");
	}
	if (!validate || validate != 'false') {
		if (typeof (NValidator_CustomValidate) != "undefined") {
			var ret = NValidator_CustomValidate();
			if (!ret) {
				if (eventObj != null)
					eventObj.returnValue = false;
				return false;
			}
		}
		if (typeof (NPage_IsValid) != "undefined") {
			NPage_IsValid = true;
			NPage_ClientValidate();
			if (!NPage_IsValid) {
				return false;
			}
		}
	}
	else
		NPage_NoValidation = true;
	if (sender)
		var toolbar = false;
	if (sender.parentNode && sender.parentNode.parentNode && sender.parentNode.parentNode.id == "T")
		toolbar = true;
	if (sender.nodeName.toUpperCase() == "BUTTON" || sender.nodeName.toUpperCase() == "INPUT" || toolbar) {
		if (toolbar || sender.type.toLowerCase() != "submit")
			theform.submit();
	}
}

function __NPostBack(NPageButtons) {
	$("txtSubmitParam").value = NPageButtons
	var theform = document.forms[0];
	if (typeof (NValidator_CustomValidate) != "undefined") {
		var ret = NValidator_CustomValidate();
		if (!ret) {
			return false;
		}
	}
	if (!NPage_NoValidation && typeof (NPage_IsValid) != "undefined") {
		NPage_ClientValidate();
		if (!NPage_IsValid)
			return false;
	}
	theform.submit();
}

//mausEVents
var EV = {
    ShowBubble: function(obj, header, text, img, cssClass, maxPanelWidth) {
        var panel = $("nPanel");
        if (!panel) {
            panel = document.createElement("div");
            panel.id = "nPanel";
        }
        else
            panel.style.width = "";
        var ifrPanel = $("ifrPanel");
        if (document.all) {
            if (!ifrPanel) {
                ifrPanel = document.createElement("iframe");
                ifrPanel.id = "ifrPanel";
                ifrPanel.style.position = "absolute";
                ifrPanel.src = "images/null.gif";
                ifrPanel.frameBorder = 0;
            }
            document.body.appendChild(ifrPanel);
        }

        document.body.appendChild(panel);

        panel.className = "panel" + ((cssClass) ? " " + cssClass : "");

        var strHeader = "";
        if (header != null && header != "")
            strHeader = "<h1>" + header + "</h1>";

        var strImg = "";
        if (img != null && img != "")
            strImg = '<img class="nPanelImg" src="images/' + img + '"/>'

        panel.innerHTML = strHeader + strImg + text;
        if (maxPanelWidth && panel.offsetWidth > maxPanelWidth)
            panel.style.width = maxPanelWidth;

        var alignRight = false;
        if (window.innerWidth)
            alignRight = (nGetAbsoluteLeft(obj) / window.innerWidth > 0.5);
        else if (document.body && document.body.offsetWidth)
            alignRight = (nGetAbsoluteLeft(obj) / document.body.offsetWidth > 0.5);

        var l = ((alignRight) ? nGetAbsoluteLeft(obj) - panel.offsetWidth + obj.offsetWidth : nGetAbsoluteLeft(obj)).toString();
        l = ((l.indexOf("-") == 0) ? 0 : l).toString() + "px";
        with (panel.style) {
            left = l;
            top = (nGetAbsoluteBottom(obj) + 2).toString() + "px";
            visibility = "visible";
            zIndex = 5000;
        }

        if (ifrPanel) {
            with (ifrPanel.style) {
                left = panel.style.left;
                top = panel.style.top;
                width = panel.offsetWidth;
                height = panel.offsetHeight;
                visibility = 'visible';
                zIndex = 4999;
                display = 'block';
            }
        }
    },

    HideBubble: function() {
        if ($("nPanel")) {
            $("nPanel").style.visibility = "hidden";
        }
        if ($("ifrPanel")) {
            $("ifrPanel").style.visibility = "hidden";
        }
    }
}

//Alerts
var AL = {
    isInit: false,
    myDialog: null,
    myWin: null,
    idx: 0,
    init: function() {
        if (!AL.isInit) {
            var css = document.createElement("link");
            css.type = "text/css";
            css.href = "css/themes/alphacube.css";
            css.rel = "stylesheet";
            css.id = "cssAlphacube";
            document.getElementsByTagName('head')[0].appendChild(css);

            if (typeof (Window) == "undefined") {
                var url = "js/window.js";
                var xmlHttp = new Ajax.Request(
						url, {
						    method: 'get',
						    asynchronous: false
						}
				   );
                try {
                    if (xmlHttp.transport.status == 200)
                        eval(xmlHttp.transport.responseText);
                }
                catch (e) { }

            }

            try { AL.myDialog = Dialog; }
            catch (e) { }

        }
    },

    showProgress: function() {
        AL.init();
        AL.myDialog.info("Processing", { windowParameters: { className: 'alphacube', width: 250, height: 100 }, showProgress: true });
    },

    hideProgress: function() {
        AL.myDialog.closeInfo();
    },

    hideWin: function() {
        if (AL.myWin) {
            Windows.close(AL.myWin.getId());
            AL.myWin = null;
        }
    },

    openWin: function(url, wi, hi, title) {
        AL.hideWin();
        (AL.myWin = new Window('AL' + AL.idx++, { className: 'alphacube', width: wi, height: hi, zIndex: 100, resizable: true, title: title, showEffect: Element.show,
            destroyOnClose: true, hideEffect: Element.hide, draggable: true, url: url
        }))
            .showCenter(true);
    },

    closeF7Win: function(event) {
        var keycode;
        var sender = event.srcElement;
        if (event.keyCode)
            keycode = event.keyCode;
        else
            keycode = event.which;
        if (keycode == 118 && (event.charCode ? event.charCode : 0) == 0 && sender) {
            AL.hideWin();
            var inp = $('AL_openF7WinDiv');
            if (inp && inp.firstChild) {
                var txt = $(inp.getAttribute('last'))
                if (txt) {
                    txt.value = inp.firstChild.value;
                    fireEvent(txt, 'change');
                    BASE.setTextSelected(txt);
                }
            }
        }
    },

    openF7Win: function(event) {
        var keycode;
        var sender = event.srcElement;
        if (event.keyCode)
            keycode = event.keyCode;
        else
            keycode = event.which;
        if (keycode == 118 && (event.charCode ? event.charCode : 0) == 0 && sender) {
            AL.init();
            AL.hideWin();
            var win = new Window('AL' + AL.idx++, { className: 'alphacube', width: 400, height: 400, zIndex: 100, resizable: true,
                showEffect: Element.show, destroyOnClose: true, hideEffect: Element.hide, draggable: true
            });
            AL.myWin = win;
            var inp = $('AL_openF7WinDiv');
            if (!inp) {
                inp = document.createElement('div');
                var st = inp.style;
                st.width = '100%';
                st.height = '100%';
                inp.setAttribute('hidden', 'hidden');
                inp.setAttribute('id', 'AL_openF7WinDiv');
                var t = document.createElement('textarea');
                Event.observe(t, 'keydown', AL.closeF7Win);
                st = t.style;
                st.width = '100%';
                st.height = '95%';
                inp.appendChild(t);
                document.appendChild(inp);
            }
            var ta = inp.firstChild;
            ta.value = sender.value;
            if (inp.getAttribute('readonly'))
                ta.setAttribute('readonly', 'readonly');
            inp.setAttribute('last', sender.id);
            inp.removeAttribute('hidden');
            win.setContent('AL_openF7WinDiv');
            win.showCenter(true);
            BASE.setTextSelected(ta);
        }
    }
}

function nCalClick(parentvalue, parent, dateFormat, culture, obj, event) {
	if (obj && obj.disabled)
		return false;
	try {
		var ifrCal = $("ncalender");
		if (ifrCal.style.visibility == "visible")
			ifrCal.style.visibility = "hidden";
		else {
			objParent = $(parent);
			objParentvalue = $(parentvalue);
			var pos = Position.page(objParentvalue);
			with ($("ncalender")) {
				style.left = pos[0] + (document.documentElement.scrollLeft || document.body.scrollLeft); /*nGetAbsoluteLeft(objParentvalue);*/
				style.top = pos[1] + objParentvalue.offsetHeight + (document.documentElement.scrollTop || document.body.scrollTop); /*nGetAbsoluteBottom(objParentvalue) + 2*/;
				style.visibility = 'visible';
				src = 'frmCalender.aspx?date=' + document.getElementById(parentvalue).value + '&item=' + parentvalue + '&dateFormat=' + dateFormat + '&culture=' + culture;
			}
			Event.stop(event);
			return true;
		}
	}
	catch (e) { }
}

function nGetAbsoluteBottom(oNode) {
    return nGetAbsoluteTop(oNode) + oNode.offsetHeight - 1;
}

function nGetAbsoluteTop(oNode) {
    return Position.cumulativeOffset(oNode).top - Position.realOffset(oNode).top + document.viewport.getScrollOffsets().top;
}
function nGetAbsoluteLeft(oNode) {
    return Position.cumulativeOffset(oNode).left - Position.realOffset(oNode).left + document.viewport.getScrollOffsets().left;
}

function nParentStop(oNode) {
	var position = getStyle(oNode, "position");
	if (position == "absolute" || position == "relative" || position == "fixed")
		return true;
	else
		return false;
}

function getStyle(oElm, strCssRule) {
	var strValue = "";
	if (document.defaultView && document.defaultView.getComputedStyle) {
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if (oElm.currentStyle) {
		strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) {
			return p1.toUpperCase();
		});
		strValue = oElm.currentStyle[strCssRule];
	}
	return strValue;
}

function nSetFocus(objID) {
	try {
		$(objID).focus();
	}
	catch (e) { }
}

var DC = { //Dyncombo, Combo
    zielId: null,
    callID: 0,
    proceedAfter: null,
    dl: function(ev, sender, hint) {/*neue dynload Function*/
        if (sender.getAttribute("loaded") == "false") {
            var pars = 'DynLoad=true&hint=' + hint + '&senderId=' + sender.id;
            var req = new Ajax.Request(
		    document.location.href, {
		        asynchronous: false,
		        method: 'get',
		        parameters: pars
		    });
            var response = req.transport;
            var xml = response.responseXML;
            DC.Fill(sender, xml, false);
        }
        else
            return;
    },

    Oc: function(eventObj, sender, hint) {
        var recall = false;
        var recallObject = sender;

        if (!sender.onblur)
            sender.onblur = function() { DC.Ob(this); };

        if (sender.getAttribute("loaded") == "false") {
            if (sender.getAttribute("dropDownRef") != null || sender.getAttribute("DataReference") != null) {
                var link = $(sender.getAttribute("dropDownRef"));
                if (link == null)
                    link = $(sender.getAttribute("DataReference"));
                if (link.getAttribute("loaded") == "false") {
                    recallObject = sender;
                    recall = true;
                    sender = link;
                }
                else {
                    DC.Fill(sender, link, true);
                    return;
                }
            }
            var xmlDoc = null;
            var url = document.location.toString() + DC.BuildParam(sender, hint, recallObject);

            if (window.ActiveXObject) {
                xmlDoc = new ActiveXObject("MSXML.DOMDocument");
            }
            else if (document.implementation && document.implementation.createDocument) {
                xmlDoc = document.implementation.createDocument("", "", null);
            }
            xmlDoc.async = false;
            xmlDoc.load(url);
            DC.Fill(sender, xmlDoc, false);
        }
        if (recall && recallObject != null) {
            DC.Oc(eventObj, recallObject, hint);
        }
    },

    Ob: function(sender) {
        if (sender) {
            if ($F(sender) == "")
                sender.selectedIndex = 0;
        }
    },

    Fill: function(sender, refObject, isCmb) {
        var selectedValue = null;
        if (sender.getAttribute("selectedValue") != null) {
            selectedValue = sender.getAttribute("selectedValue");
            sender.removeAttribute("selectedValue");
        }
        else if (sender.selectedIndex >= 0)
            selectedValue = sender.options[sender.selectedIndex].value;
        var nullable = false;
        var nullItem = null;
        while (sender.options.length > 0) {
            if (sender.options[0].value == "null")
                nullItem = sender.options[0];
            sender.options[0] = null;
        }

        if (nullItem != null) {
            var optNull = document.createElement("OPTION");
            optNull.value = nullItem.value;
            optNull.text = nullItem.text;
            optNull.setAttribute('match', '');
            sender.options.add(optNull);
        }
        var rowsObj = null;
        if (isCmb)
            rowsObj = refObject.options;
        else
            rowsObj = refObject.documentElement.getElementsByTagName("ROW");
        var iIdxSel = -1;
        for (var iIdx = 0; iIdx < rowsObj.length; iIdx++) {
            var name = null;
            var value = null;
            var match = null;
            if (isCmb) {
                name = refObject.options[iIdx].text;
                value = refObject.options[iIdx].value;
                match = refObject.options[iIdx].getAttribute(("match"));
            } else {
                match = DC.GetProp(rowsObj[iIdx], "match");
                name = DC.GetProp(rowsObj[iIdx], "Name");
                value = DC.GetRowKey(rowsObj[iIdx]);
            }
            if (name == null) {
                continue;
            }
            var option = document.createElement("Option");
            option.text = name;
            option.value = value.toLowerCase();
            if (match != null)
                option.setAttribute('match', match)
            if (selectedValue != null && selectedValue.toLowerCase() == value.toLowerCase()) {
                iIdxSel = iIdx;
                if (nullItem != null) iIdxSel++;
            }
            sender.options.add(option);
        }
        if (iIdxSel < 0)
            iIdxSel = 0;
        sender.selectedIndex = iIdxSel;
        sender.setAttribute("loaded", "true");
    },

    BuildParam: function(sender, hint, originalSender) {
        var param = "&DynLoad=true&hint=" + hint + "&CallId=" + DC.callID.toString();
        var paramFn = originalSender.getAttribute("DynCombo_ParamFn");
        if (paramFn != null && paramFn != "") {
            var paramFnReturn = eval(paramFn + "('" + sender.id + "')");
            param = param + paramFnReturn;
        }
        return param;
    },

    GetRowKey: function(row) {
        if (window.ActiveXObject)
            return row.getAttribute("KEY");
        else
            return row.attributes.item("KEY").nodeValue;
    },

    GetProp: function(row, name) {
        for (var iIdx = 0; iIdx < row.childNodes.length; iIdx++) {
            if (row.childNodes.item(iIdx).nodeName.toLowerCase() == name.toLowerCase()) {
                if (row.childNodes.item(iIdx).childNodes.item(0) != null)
                    return row.childNodes.item(iIdx).childNodes.item(0).nodeValue;
                else
                    return null;
            }
        }
        return null;
    },

    Match: function(txtMatch) {
        var matchCode = txtMatch.value;
        if (matchCode == "")
            return;

        var drp = $(txtMatch.id.replace("__Match", "_Select"));
        if (drp == null)
            drp = $(txtMatch.id.replace("__Match", ""));
        for (var i = 0; i < drp.options.length; i++) {
            var optMatchCode = drp.options[i].getAttribute("match");
            if (optMatchCode == null)
                continue;
            if (matchCode.toUpperCase() == optMatchCode.toUpperCase()) {
                drp.options[i].selected = true;
                var oc = drp.onchange;
                if (oc)
                    oc();
                break;
            }
        }
    },

    getV2Value: function(drp) {
        if (drp == null)
            return null;
        var value = $F(drp);
        for (var i = 0; i < drp.options.length; i++) {
            if (drp.options[i].value != value)
                continue;
            var optV2Value = drp.options[i].getAttribute("V2");
            return optV2Value;
        }
        return null;
    },

    // DynLoad dropDown
    LoadLinked: function(senderID, id, filter, ctlIDPrefix, parentColumn, showAllIfNull) {
        DC.callID++;
        var sender = $(senderID + "_Select");
        if (!sender || !sender.options)
            return;
        var idx = sender.selectedIndex;

        if (idx >= 0) {
            var opt = sender.options[idx];
            var value = opt.value;
            if (parentColumn)
                value = opt.getAttribute("pCol");
            if (showAllIfNull == true && DC.isNull(value))
                showAllIfNull = true;
            else
                showAllIfNull = false;
            if (sender.getAttribute("ProceedAfter") != null)
                DC.proceedAfter = sender.getAttribute("ProceedAfter");
            else
                DC.proceedAfter = null;
            DC.ReqLinkedCmb(ctlIDPrefix + id, filter, value, showAllIfNull, senderID);
        }
    },

    ReqLinkedCmb: function(id, name, value, showAllIfNull, senderID) {
        if (!id)
            return;
        BASE.InsTmpObj("dynload_" + DC.callID, id);
        var url = document.location.toString() + DC.BuildParams(id, name, value) + "&ShowAllIfNull=" + ((showAllIfNull) ? "1" : "0");
        if (senderID != null && senderID != "")
            url += "&senderID=" + senderID;
        var xmlHttp = new Ajax.Request(
                url, {
                    method: 'get',
                    asynchronous: true,
                    contentType: 'application/xml',
                    onSuccess: function(xhr) {
                        DC.ProceedRequest(xhr.responseXML);
                    },
                    onComplete: function(xhr) {
                    },
                    onFailure: function(xhr) {
                        alert("Failed loading " + id);
                    }
                }
           );
    },

    ProceedRequest: function(response) {
        if (!response || !response.documentElement)
            return;


        var callID = Number(response.documentElement.getElementsByTagName("CallID")[0].firstChild.nodeValue);
        var id = BASE.GetTmpObj("dynload_" + callID.toString()) + "_Select";
        var zielObj = $(id);
        
        //beide leer bzw NaN
        if (!response || !zielObj)
            return;
        DC.Fill(zielObj, response, false);
        var oc = zielObj.onchange;
        if (DC.proceedAfter != null)
            eval(DC.proceedAfter + "($('" + id + "'))");
        if (oc)
            zielObj.onchange();
    },

    BuildParams: function(id, name, value) {
        var param = "&DynLoad=true&hint=" + id + "&CallId=" + DC.callID.toString();
        if (name == "XX") //Erzeugt leeren Filter
            param = param + "&filterName=&value=" + value;
        else if (name != null && name != "")
            param = param + "&filterName=" + name + "&value=" + value;
        return param;
    },

    isNull: function(objOrValue) {
        var value;
        if (typeof (objOrValue) == "object")
            value = objOrValue.value;
        else if (N$(objOrValue + "_Select"))
            value = N$(objOrValue + "_Select").value;
        else if (N$(objOrValue))
            value = N$(objOrValue).value;
        else
            value = objOrValue;
        if (value == -1 || value == "null" || value == "0" || value == "" || value == "00000000-0000-0000-0000-000000000000")
            return true;
        return false;
    }
}

function SetValue(val, kommastellen, decimalChar) {
	decimalChar = (decimalChar) ? decimalChar : ",";
	val = Number(val);
	if (val == Number.NaN || val.toString() == "NaN" || val.toString() == "Infinity")
		return 0;
	else {
		if (decimalChar == ",")
			return val.toFixed(kommastellen).toString().replace(".", ",");
		else return val.toFixed(kommastellen);
	}
}

var ND = {
	win: null,
	aktGrid: null,
	aktRow: null,
	dataPopUpButtons: null,
	rowFocusEvent: null,
	rowIdxChangeEvent: null,
	rowClickEvent: false,
	rowRightClickEvent: null,
	isSesam: null,
	rowIdxChangeSel: false,
	widthPanelMin: 0, widthPanelMax: 0,
	widthPanelReferenceObject: null,

	Init: function(grids) {
		for (var i = 0; i < grids.length; i++) {
			var grd = $(grids[i]);

			if (grd) {
				if (grd.getAttribute("rfe"))
					ND.rowFocusEvent = grd.getAttribute("rfe");
				if (grd.getAttribute("rice")) {
					ND.rowIdxChangeEvent = grd.getAttribute("rice");
					if (grd.getAttribute("riceSel") == "1")
						ND.rowIdxChangeSel = true;
				}
				if (grd.getAttribute("WidthPanelMin"))
					ND.widthPanelMin = grd.getAttribute("WidthPanelMin");
				if (grd.getAttribute("WidthPanelMax"))
					ND.widthPanelMax = grd.getAttribute("WidthPanelMax");
				if (grd.getAttribute("WidthPanelReferenceObject"))
					ND.widthPanelReferenceObject = grd.getAttribute("WidthPanelReferenceObject");

				ND.rowRightClickEvent = grd.getAttribute('rrce') || false;
				ND.rowClickEvent = grd.getAttribute('rce') || false;

				if (grd.getAttribute("sesam"))
					ND.isSesam = 1;

				if (grd.getAttribute("sesamToggleAll"))
					ND.sesamToggleAll = true;

				ND.GetPKColumn(grd);
				ND.InitSort(grd);
				ND.InitHover(grd);
				ND.InitSetTxtEdit(grd);
				ND.InitMouseHoverCell(grd);
				if (ND.widthPanelMin > 0 || ND.widthPanelReferenceObject) {
					var width = RS.getWidth(ND.widthPanelMin, ND.widthPanelMax, ND.widthPanelReferenceObject);
					var div = $(grd.id.replace("NDataGridTA", "") + "NDataGridTASpan");
					if (div) {
						div.style.width = width;
						if (ND.widthPanelReferenceObject != null && $(ND.widthPanelReferenceObject))
							div.style.width = $(ND.widthPanelReferenceObject).offsetWidth
						var divs = new Array(1);
						divs[0] = div;
						RS.allCrToResize[RS.allCrToResize.length] = { regID: grd.id, widthPanelMin: ND.widthPanelMin, widthPanelMax: ND.widthPanelMax, widthPanelReferenceObject: ND.widthPanelReferenceObject, divs: divs };
						RS.resizeable = true;
					}
				}

				ND.rowFocusEvent = null;
				ND.rowIdxChangeEvent = null;
				ND.rowRightClickEvent = null;
				ND.widthPanelMin = 0; ND.widthPanelMax = 0;
				ND.widthPanelReferenceObject = null;
				BASE.InitF7TextBoxes(grd);
			}
		}
	},

	InitSort: function(grid) {
		thCells = $A(grid.getElementsByTagName("TH"));
		for (var ci = 0; ci < thCells.length; ci++) {
			var cell = thCells[ci];
			if (ND.FindClassName(cell, 's')) {
				cell.oc = cell.onclick;
				cell.onclick = ND.OnColumnSort;
			}
		}
	},

	InitHover: function(grid) {
		rows = $A(grid.getElementsByTagName("TR"));
		var rowIdx = 0;
		var tab = grid.id.replace("NDataGridTA", "");
		var fieldID = grid.id.replace("NDataGridTA", "Search");
		for (var rI = 0; rI < rows.length; rI++) {
			var row = rows[rI];
			if (ND.FindClassName(row, 'nav')) { continue; }
			var aktRowIdx = rowIdx;
			if (ND.FindClassName(row, "rh")) {
				Event.observe(row, 'mouseover', ND.RowOver);
				Event.observe(row, 'mouseout', ND.RowOut);
				if (/*!row.getAttribute("clicked") && */!ND.rowClickEvent)
					ND.InitPostBackCond(fieldID, row);
			}
			else if ((ND.rowFocusEvent || ND.rowIdxChangeEvent) && (ND.FindClassName(row, "v") || ND.FindClassName(row, "d"))) {
				ND.InitEditEventsOnIdxChange(row, tab, rowIdx, ND.rowFocusEvent, ND.rowIdxChangeEvent, ND.rowIdxChangeSel);
			} else {
				rowIdx--; /*th nicht erhoehen*/
			}

			if (ND.rowClickEvent) {
				ND.InitClickEvent(row, tab, rowIdx, ND.rowClickEvent);
			}

			if (ND.rowRightClickEvent) {
				ND.InitRightClickEvent(row, tab, rowIdx, ND.rowRightClickEvent);
			}

			rowIdx++;

			if (ND.isSesam) {
				for (var i = 0; i < row.childNodes.length; i++) {
					if (row.childNodes[i].getAttribute("eb")) {
						ND.InitSesam(row.childNodes[i]);
						break;
					}
				}
				/*M.W. 18.9. fuehrt zu Problemen
				if (aktRowIdx == rowIdx && row.tagName.toLowerCase != 'tr')
				rowIdx++;*/
			}
		}
	},

	InitSetTxtEdit: function(grid) {
		var tab = grid.id.replace("NDataGridTA", "");
		var idx = 0;
		var gridRows = new Array();
		rows = $A(grid.getElementsByTagName("TR"));
		for (var rI = 0; rI < rows.length; rI++) {
			var row = rows[rI];
			var classes = ND.CssClasses(row);
			if (classes.indexOf('nav') != -1) { continue; }
			var pk = row.getAttribute('pk');
			var rowID = tab + idx + '_';
			row.setAttribute('rowID', rowID);
			if (classes.indexOf("d") != -1 && classes.indexOf("ll") == -1) {//NDataGrid oder NDataGridUpdate
				gridRows[gridRows.length] = row;
				var newRow = (row.getAttribute("new") == "1") ? "1" : "0";
				var inputs = $A(row.getElementsByTagName("input"));
				for (var ipI = 0; ipI < inputs.length; ipI++) {
					var ip = inputs[ipI];
					switch (ip.type) {
						case "text":
						case "file":
						case "password":
							if (ip.getAttribute("nsg") == "1")//Suggestbox
								ND.InitEditEventsNsg(ip, rowID, newRow, idx);
							else if (ip.getAttribute("nsgM") == "1")//Suggestbox-Matchcode
								ND.InitEditEventsNsgM(ip, rowID, newRow, idx);
							else
								ND.InitEditEventsOk(ip, rowID, newRow);
							ND.InitEditEventsCh(ip, rowID, newRow);
							break;
						case "checkbox":
							ND.InitEventsCbClick(ip, tab, pk, idx, rowID, newRow);
							break;
						case "button":
						case "image":
						case "submit":
							if (MS.Init(ip, newRow, rowID)) {
								if (ip.id.search(/LkpButton$/) != -1)
									ND.InitLkpButton(ip);
								ND.InitEditEventsCl(ip, rowID, newRow, idx);
							}
							break;
					}
					ND.InitEditEventsOnfocus(ip, tab, idx, ND.rowFocusEvent, ND.rowIdxChangeEvent, ND.rowIdxChangeSel);
				}
				var selects = $A(row.getElementsByTagName("select"));
				for (var sI = 0; sI < selects.length; sI++) {
					var select = selects[sI];
					ND.InitEditEventsCh(select, rowID, newRow);
					ND.ComboFill(select, tab);
					ND.InitEditEventsOnfocus(select, tab, idx, ND.rowFocusEvent, ND.rowIdxChangeEvent, ND.rowIdxChangeSel);
					ND.EnsureItemsFiltered(select);
					if (select.getAttribute("match") == "1") //Combo mit Matchcode
						ND.AddMatch(select);
				}
				var buttons = $A(row.getElementsByTagName("button"));
				for (var btI = 0; btI < buttons.length; btI++) {
					var button = buttons[btI];
					if (button.parentNode.className == 'dl') {//delete Button
						var fkt = function() { ND.SetDel.call(this, this, this.getAttribute('delClientEvent')); };
						Event.observe(button, 'click', fkt);
					} else
						ND.InitEditEventsCl(button, rowID, newRow, idx);

					ND.InitEditEventsOnfocus(button, tab, idx, ND.rowFocusEvent, ND.rowIdxChangeEvent, ND.rowIdxChangeSel);
				}
				var textareas = $A(row.getElementsByTagName("textarea"));
				for (var taI = 0; taI < textareas.length; taI++) {
					var textarea = textareas[taI];
					//if (i > 0)
					ND.InitEditEventsCh(textarea, rowID, newRow);
					textarea.onfocus = function() { this.style.height = "5em"; };
					textarea.onblur = function() { this.style.height = "1.7em"; };
					ND.InitEditEventsOk(textarea, rowID, newRow);
				}
				var links = $A(row.getElementsByTagName("a"));
				for (var lnI = 0; lnI < links.length; lnI++) {
					var link = links[lnI];
					if (link.getAttribute("cmd") != null)
						ND.InitEditEventsCl(link, rowID, newRow, idx);
				}
				var imgs = $A(row.getElementsByTagName("img"));
				for (var imIndex = 0; imIndex < imgs.length; imIndex++) {
					var img = imgs[imIndex];
					if (img.getAttribute("cmd") != null)
						ND.InitEditEventsCl(img, rowID, newRow, idx);
				}
				idx++;
			}
			else if (classes.indexOf("v") != -1 || classes.indexOf("rh") != -1) {//NDataView oder NDataSearch
				gridRows[gridRows.length] = row;
				var inputs = $A(row.getElementsByTagName("input"));
				for (var ipIndex = 0; ipIndex < inputs.length; ipIndex++) {
					var ip = inputs[ipIndex];
					if ((ip.type == "button" || ip.type == "image") && ip.id.search(/LkpButton$/) != -1)
						ND.InitLkpButton(ip);
					ND.InitEditEventsCl(ip, rowID, false, idx);
				}
				var links = $A(row.getElementsByTagName("a"));
				for (var lnIndex = 0; lnIndex < links.length; lnIndex++) {
					var link = links[lnIndex];
					if (link.getAttribute("cmd") != null)
						ND.InitEditEventsCl(link, rowID, null, idx);
				}
				var imgs = $A(row.getElementsByTagName("img"));
				for (var imIndex = 0; imIndex < imgs.length; imIndex++) {
					var img = imgs[imIndex];
					if (img.getAttribute("cmd") != null)
						ND.InitEditEventsCl(img, rowID, false, idx);
				}
				idx++;
			}
		}
		grid.setAttribute("gridRows", gridRows);
		/*das Array beim Unload entleeren um Leaks zu entfernen*/
		if (window.addEventListener) { window.addEventListener('unload', gridRows.clear.bind(gridRows), false); }
		else { window.attachEvent('onunload', gridRows.clear.bind(gridRows)); }
	},

	InitEventsCbClick: function(ip, tab, pk, index, rowID, newRow) {
		if (ip.getAttribute('isCC') == '1') {//Check-Column
			var dd = { tab: String(tab), pk: String(pk), idx: Number(index), rowID: rowID, newRow: newRow };
			var fkt = function(event) {
				var d = dd;
				ND.setCheck.call(this, d.tab, d.pk);
				/*ND.SetTxtEdit(this, d.rowID, d.newRow);*/
				if (this.getAttribute('isDCC') == '1') { ND.dynLoadCB.call(this, d.pk); }
				/*stopEvent(event);*/
			};
			Event.observe(ip, 'click', fkt);
		} else if (ip.getAttribute('cbf')) {/*eigene CheckBoxFunction*/
			var dd = { tab: String(tab), pk: String(pk), idx: Number(index), ft: ip.getAttribute('cbf'), rowID: rowID, newRow: newRow };
			var fkt = function(event) {
				if (this.getAttribute('isSS') == '1')
					SingleSelectCheck.call(this, event || window.event, this);
				ND.SetTxtEdit(this, dd.rowID, dd.newRow);
				eval(dd.ft).call(this, this, dd.pk, dd.idx);
			};
			Event.observe(ip, 'click', fkt);
		} else {
			var dd = { rowID: rowID, newRow: newRow };
			var fkt = function() {
				ND.SetTxtEdit(this, dd.rowID, dd.newRow);
				if (this.getAttribute('isSS') == '1')
					SingleSelectCheck.call(this, event || window.event, this);
			};
			Event.observe(ip, 'click', fkt);
		}
	},

	InitEditEventsCh: function(obj, ctlID, newRow) {
		var dd = { ctlID: ctlID, newRow: newRow, oc: false };
		/*Problem mit AutoPostback-Compos im Grid kapselt die onchange-Funktion und ruft sie nachher auf (leaks?)*/
		if (obj.onchange) { dd.oc = obj.onchange; obj.onchange = ''; }
		var fkt = (function() { var d = dd; ND.SetTxtEdit(this, d.ctlID, d.newRow); if (dd.oc) dd.oc.call(this); });
		Event.observe(obj, 'change', fkt);
	},

	InitEditEventsCl: function(obj, ctlID, newRow, idx) {
		var dd = { ctlID: ctlID, newRow: newRow, idx: idx };
		var fkt = obj.getAttribute("cmd") ? ND.doCommand : function() { var d = dd; ND.SetTxtEdit(this, d.ctlID, d.newRow); };
		obj.details = dd;
		Event.observe(obj, "click", fkt);
	},

	InitEditEventsOk: function(obj, ctlID, newRow) {
		var dd = { ctlID: ctlID, newRow: newRow };
		var fkt = function() { var d = dd; ND.SetTxtEdit(this, d.ctlID, d.newRow); };
		Event.observe(obj, 'keyup', fkt);
	},

	InitEditEventsOnfocus: function(obj, gridID, rowIdx, callFunctionOnFocus, callFunctionOnIdxChange, selRow) {
		var dd = { gid: gridID, idx: rowIdx, ofo: callFunctionOnFocus, oc: callFunctionOnIdxChange, sr: selRow };
		var fkt = function(event) { var d = dd; ND.SetAktRow(Event.element(event), d.gid, d.idx, d.ofo, d.oc, d.sr); };
		Event.observe(obj, 'focus', fkt);
	},
	InitEditEventsOnIdxChange: function(obj, gridID, rowIdx, callFunctionOnFocus, callFunctionOnIdxChange, selRow) {
		var dd = { gid: gridID, idx: rowIdx, ofo: callFunctionOnFocus, oc: callFunctionOnIdxChange, sr: selRow };
		var fkt = function() { var d = dd; ND.SetAktRow(this, d.gid, d.idx, d.ofo, d.oc, d.sr); };
		Event.observe(obj, 'click', fkt);
	},

	InitClickEvent: function(obj, gridID, rowIdx, callFunctionOnClick) {
		var dd = { gid: gridID, idx: rowIdx, ocl: callFunctionOnClick };
		var fkt = (function() { var d = dd; eval(d.ocl).call(this, this, ND.GetPKValue(d.gid, d.idx), d.gid.substr(0, d.gid.length - 1), d.idx); });
		Event.observe(obj, 'click', fkt);
	},

	InitPostBackCond: function(fieldID, row) {
		var dd = { fieldID: fieldID, pbc: row.getAttribute("pbc") };
		var fkt = function() { ND.Postback.call(this, this, dd.fieldID, null, dd.pbc); };
		Event.observe(row, 'click', fkt);
	},

	InitRightClickEvent: function(obj, gridID, rowIdx, callFunctionOnRightClick) {
		/*var onfkt = (!!window.opera ? obj.onclick : obj.onmousedown) || false;
		obj.rcd = {fkt : onfkt , gid: gridID, idx : rowIdx, ofo : callFunctionOnRightClick };
		
		obj.oncontextmenu = ND.contextMClick;
		if(!!window.opera){
		obj.onclick = ND.contextMClick;
		else 
		obj.mousedown = ND.contextMClick;*/
		var dd = { gridID: gridID, rowIdx: rowIdx, callFunct: callFunctionOnRightClick }
		var fkt = function(ev) {
			var d = dd;
			if (ev.type == 'contextmenu' || Event.isRightClick(ev) || ev.ctrlKey) {
				CTMN.lastEvent = ev; //um die Event-Koordinaten weiter zu geben	   
				stopEvent(ev);
				var elem = this;
				if (elem.nodeName.toUpperCase() != 'TR')
					elem = ND.SearchParentObjByNodeName(elem, 'TR');
				if (elem && elem.getAttribute('pk'))
					ND.SetAktRow(elem, d.gridID, d.rowIdx, d.callFunct, null, null);
				return false;
			}
		};
		/*eventuell einen Umschalter bei verschiedenen Browsern verwenden*/
		Event.observe(obj, (Prototype.Browser.Opera ? 'click' : 'contextmenu'), fkt);
	},

	InitEditEventsNsg: function(obj, ctlID, newRow, rowIdx) {//Suggestbox
		obj.idx = rowIdx;
		obj.onkeydown = nsSgPTGrid;
		obj.onkeyup = nsSgT;
	},
	InitEditEventsNsgM: function(obj, ctlID, newRow, rowIdx) {//SuggestboxMatchcode
		obj.idx = rowIdx;
		obj.onkeyup = nsSgM;
	},
	InitLkpButton: function(obj) {
		Event.observe(obj, 'click', ND.Lookup_Click);
	},
	InitSesam: function(obj) {
		Event.observe(obj, 'click', ND.Sesam);
	},

	InitMouseHoverCell: function(grid) {
		if (grid.getAttribute("MouseHoverCells")) {
			var constructors = grid.getAttribute("MouseHoverCells").split("||");
			for (var i = 0; i < constructors.length; i++) {
				var cellName = constructors[i].split("|")[0];
				var hoverFunction = constructors[i].split("|")[1];
				for (j = 1; j < grid.rows.length; j++) {
					var cellID = grid.id.replace("NDataGridTA", "") + (j - 1) + "_" + cellName;
					var cell = $(cellID);
					if (!cell)
						break;
					ND.InitMouseHoverCellOver(grid.id.replace("NDataGridTA", ""), cell, cellName, j - 1, hoverFunction);
					ND.InitMouseHoverCellOut(grid.id.replace("NDataGridTA", ""), cell, cellName, j - 1, hoverFunction);
				}
			}
		}
	},
	InitMouseHoverCellOver: function(gridID, obj, cellName, idx, hoverFunction) {
		obj.omover = obj.onmouseover;
		obj.onmouseover = function() { ND.EvalMouseHoverCell(gridID, cellName, idx, hoverFunction, 1); if (this.omover) this.omover.call(this); };
	},
	InitMouseHoverCellOut: function(gridID, obj, cellName, idx, hoverFunction) {
		obj.omout = obj.onmouseout;
		obj.onmouseout = function() { ND.EvalMouseHoverCell(gridID, cellName, idx, hoverFunction, 0); if (this.omout) this.omout.call(this); };
	},
	EvalMouseHoverCell: function(gridID, cellName, rowIdx, hoverFunction, over) {
		var pk = ND.GetPKValue(gridID, rowIdx);
		if (pk) {
			if (pk.indexOf("\n") >= 0) {
				while (pk.indexOf("\n") >= 0)
					pk = pk.replace("\n", "");
			}
		}
		eval(hoverFunction + "('" + gridID + "', this, '" + cellName + "', " + rowIdx + ", '" + pk + "', " + over + ")");
	},

	GetPKColumn: function(grid) {
		var row = grid.rows[1];
		if (!row)
			return;
		var pk_Column = "";
		var gridID = grid.id.replace("NDataGridTA", "");
		if (row.getAttribute("pk"))
			pk_Column = "rowPK";
		else {
			var inputs = row.getElementsByTagName("input");
			if (inputs.length > 0) {
				for (var i = 0; i < inputs.length; i++) {
					if (inputs[i].id.replace(gridID + "0_", "").substr(0, 2).toUpperCase() == "PK") {
						pk_Column = inputs[i].id.replace(gridID + "0_", "");
						break;
					}
				}
			}
			else if (grid.rows.length > 1) {
				var tds = grid.rows[1].getElementsByTagName("td");
				for (var i = 0; i < tds.length; i++) {
					if (tds[i].id.replace(gridID + "0_", "").substr(0, 2).toUpperCase() == "PK") {
						pk_Column = tds[i].id.replace(gridID + "0_", "");
						break;
					}
				}
			}
		}
		BASE.InsTmpObj(gridID + "pkColumn", pk_Column);
	},

	doCommand: function(event) {
		var btn = Event.element(event);
		var grdID = ND.GetGridId(btn);
		$(grdID + '_Command').value = btn.getAttribute("cmdArg");
		$(grdID + '_Search').value = btn.getAttribute("cmdVal");

		ND.SetTxtEdit(btn, btn.ctlID, btn.newRow)
		if (btn.getAttribute("del") == "1") {
			if (!confirm(confirmDelMsg)) {
				Event.stop(event);
				return false;
			}
			NPage_NoValidation = true;
		}

		if (btn.getAttribute("cmd") == "1")//AutoPostBack
			__NPostBack(btn.getAttribute("pbV"));
		else {
			var cmd2 = btn.getAttribute("cmdVal2");
			var cmd3 = "";
			var details = btn.details;
			if (details)
				cmd3 = ", " + btn.details.idx;
			if (cmd2 != null)
				cmd2 = ", '" + cmd2 + "'";
			else
				cmd2 = ", null";
			var cmdFkt = btn.getAttribute("cmd");
			if (cmdFkt.indexOf("return ") == 0)
				cmdFkt = cmdFkt.replace("return ", "");
			eval(cmdFkt + "('" + btn.getAttribute("cmdVal") + "'" + cmd2 + cmd3 + ");");
		}
		Event.stop(event);
	},

	GetPKValue: function(gridID, rowIdx) {
		var pk;
		var pkColumn = BASE.GetTmpObj(gridID + "pkColumn");
		if (pkColumn == "rowPK")
			pk = $(gridID + "NDataGridTA").rows[Number(rowIdx) + 1].getAttribute("pk");
		else if (pkColumn != "") {
			var pkObj = $(gridID + rowIdx + "_" + pkColumn);
			if (!pkObj)
				return null;
			else if (pkObj.nodeName.toUpperCase() == "TD")
				pk = $(gridID + rowIdx + "_" + pkColumn).innerHTML;
			else
				pk = $F(pkObj);
		}
		return pk;
	},

	getIdx: function(pk) {

	},

	ComboFill: function(elem, gridID) {
		if (elem.options.length > 0)
			return;
		var dropDownRef = $(gridID + "_" + elem.getAttribute("dropDownRef"));
		var lfdIdx = -1, setIdx = false, selIdx = -1;
		var disallow = elem.getAttribute('DisallowItems');
		for (var iIdx = 0; iIdx < dropDownRef.options.length; iIdx++) {
			lfdIdx++;
			var refOpt = dropDownRef.options.item(iIdx);
			var opt = document.createElement("option");
			opt.value = refOpt.value;
			opt.text = refOpt.text;
			if (refOpt.getAttribute("match") != null)
				opt.setAttribute("match", refOpt.getAttribute("match"));
			if (opt.value == elem.getAttribute("selectedValue")) {
				selIdx = lfdIdx;
				setIdx = true;
			}
			if (refOpt.getAttribute("V2") != null)
				opt.setAttribute("V2", refOpt.getAttribute("V2"));
			elem.options.add(opt);
		}
		if (disallow != null && typeof (disallow) != 'undefined') {
			var arr = disallow.toString().split(';');
			for (var iIdxItem = 0; iIdxItem < arr.length; iIdxItem++) {
				for (var iJdxItem = 0; iJdxItem < elem.options.length; iJdxItem++) {
					if (elem.options.item(iJdxItem).value == arr[iIdxItem]) {
						elem.options.item(iJdxItem).style.color = 'rgb(223, 223, 234)'; //ToDo
						break;
					}
				}
			}
		}
		if (setIdx)
			elem.selectedIndex = selIdx;
		else {
			var iIdxNext = -1;
			while (iIdxNext < elem.options.length) {
				++iIdxNext;
				try { if (elem.options.item(iIdxNext).style.color == '') { elem.selectedIndex = iIdxNext; break; } } catch (e) { }
			}
		}
	},
	EnsureItemsFiltered: function(dropDown) {
		var linkTo = $(dropDown.getAttribute('LinkTo'));
		if (linkTo == null)
			return;
		var dropDownRef = $(linkTo.getAttribute('dropDownRef'));
		//var linkItems = $(dropDown.getAttribute('dropDownRef') + '_Link'); 
		//if( linkItems != null ) { 
		var selItemLink = null;
		if (linkTo.selectedIndex >= 0)
			selItemLink = linkTo.options.item(linkTo.selectedIndex).value;
		else if (linkTo.getAttribute("selectedValue") && linkTo.getAttribute("selectedValue") != "null")
			selItemLink = linkTo.getAttribute("selectedValue");
		ND.ClearDropDown(linkTo);
		if (dropDown.selectedIndex < 0 || key == 'null')
			return;
		var key = $F(dropDown);
		if (linkTo.getAttribute("nullAllowed") == "1" && linkTo.options.length < 1) {
			var opt = document.createElement('option');
			opt.value = "null";
			opt.text = "---";
			linkTo.options.add(opt)
		}
		var master = $(linkTo.getAttribute('dropDownRef'));
		var gridPrefix = "";
		if (!master) {
			var gridId = ND.GetGridId(linkTo);
			master = $(gridId + '__' + linkTo.getAttribute('dropDownRef'));
			gridPrefix = gridId + '__';
		}
		if (!master)
			return;
		var showAllIfNull = ($(gridPrefix + dropDown.getAttribute('dropDownRef')).getAttribute("showAllIfNull") == "1");
		if (showAllIfNull && DC.isNull(key))
			showAllIfNull = true;
		else
			showAllIfNull = false;
		for (var iIdxItem = 0; iIdxItem < master.options.length; iIdxItem++) {
			var optCopy = master.options.item(iIdxItem);
			var fk_parent = optCopy.getAttribute("fk_match"); //linkItems.options.item(iIdxItem).text.toString().split('|'); 
			if (showAllIfNull || fk_parent == key) {
				var opt = document.createElement('option');
				//var optCopy = ND.FindItem(dropDownRef, item[1]); 
				opt.value = optCopy.value;
				opt.text = optCopy.text;
				if (optCopy.getAttribute("match") != null)
					opt.setAttribute("match", optCopy.getAttribute("match"));
				linkTo.options.add(opt);
			}
		}
		if (selItemLink != null && selItemLink != "null") {
			var newSelItem = ND.FindItem(linkTo, selItemLink);
			if (newSelItem != null)
				linkTo.selectedIndex = newSelItem.index;
		}
		//} 
	},
	FindItem: function(dropDown, val) {
		for (var iIdxItem = 0; iIdxItem < dropDown.options.length; iIdxItem++) {
			if (dropDown.options.item(iIdxItem).value == val)
				return dropDown.options.item(iIdxItem);
		}
		return null;
	},
	ClearDropDown: function(dropDown) {
		var nullItem = null;
		if (dropDown.options.length == 0)
			return;
		if (dropDown.options.item(0).value == 'null')
			nullItem = dropDown.options.item(0);
		dropDown.options.length = 0;

		if (nullItem != null)
			dropDown.options.add(nullItem);
	},

	AddMatch: function(select) {
		var inp = document.createElement("input");
		inp.onkeyup = function() { DC.Match.call(this, this); };
		inp.className = "drpMatch";
		inp.id = select.id + "__Match";
		if (select.disabled)
			inp.disabled = true;
		var code = select.options[select.selectedIndex].getAttribute("match");
		if (code != null)
			inp.value = code;
		select.parentNode.insertBefore(inp, select);
	},

	TxtEdit: function(obj, rowIdx) {
		var tab = ND.GetGridId(obj);
		ND.SetTxtEdit(obj, tab + "_" + rowIdx + "_", "0");
	},

	SetTxtEdit: function(obj, rowID, newRow) {
		var txtDel = document.forms[0].elements[rowID + 'Del'];
		var txtState = document.forms[0].elements[rowID + 'State'];
		if (!txtState)
			return;
		var delv = (txtDel && txtDel.value == "1") ? 1 : 0;
		if (txtState.value == "1" && delv == "0")
			return;
		txtState.value = '1';
		$(rowID + 'icSt').className = "edit";
		if ($(rowID + "btnDel")) {
			$(rowID + "btnDel").className = "";
			ND.SetRowClass(obj, "deleted", 0);
		}

		if (txtDel != null)
			txtDel.value = 0;
		if (newRow == '1' && txtState.parentNode.parentNode.nextSibling != null) {
			txtState.parentNode.parentNode.nextSibling.className = 'd';
			//$(rowID + 'btnDaten').onclick = function(){ND.SetBtn(this)};
		}
		//ND.SaveAjax(obj,rowID,newRow);
	},

	/*	SaveAjax    : function(obj,rowID,newRow){
	 
	var url = document.location.href;
	var par = {dynload: "true",
	dynKey : "upGrid",
	rowId: rowID, 
	val:   obj.value,
	id:   obj.id,
	text:   obj.text,
	IsChecked:   obj.checked,
	type:   obj.type,
	x : Math.random()};
    	
	var dynObject = new Ajax.Request(url +"&"+ $H(par).toQueryString() , {method: 'post', parameters: obj});
	},*/

	SetAktRow: function(obj, gridID, rowIdx, rowFocusEvent, rowIdxChangeEvent, selRow) {
		if (ND.aktGrid != gridID || ND.aktRow != rowIdx) {
			/*var pkColumn = BASE.GetTmpObj(gridID + "pkColumn");
			if (pkColumn == "rowPK")
			pk = $(gridID + "NDataGridTA").rows[Number(rowIdx) + 1].getAttribute("pk");
			else
			if(pkColumn !="")
			pk = $F(gridID + rowIdx + "_" + pkColumn)*/
			var pk = ND.GetPKValue(gridID, rowIdx);
			var chE = ($(gridID + "Search").value != pk)
			$(gridID + "Search").value = pk;

			if (rowIdxChangeEvent && chE) {
				if (selRow) {
					ND.ClearAktRows(gridID);
					ND.RowSel(gridID, obj);
				}
				eval(rowIdxChangeEvent + "('" + gridID + "', '" + rowIdx + "')");
			}
		}
		ND.aktGrid = gridID;
		ND.aktRow = rowIdx;

		if (rowFocusEvent)
			eval(rowFocusEvent + "('" + gridID + "', '" + rowIdx + "')");
	},

	RowSel: function(gridID, obj) {
		while (obj.parentNode) {
			if (obj.nodeName.toUpperCase() == "TABLE" && obj.id.replace("NDataGridTA", "") == gridID)
				break;
			if (obj.nodeName.toUpperCase() == "TR") {
				var cl = obj.className.split(" ");
				if (cl.indexOf("v") >= 0 || cl.indexOf("d") >= 0 || cl.indexOf("hv") >= 0
                        || cl.indexOf("v0") >= 0 || cl.indexOf("v1") >= 0 || cl.indexOf("v2") >= 0) {
					ND.RowHandelSel(obj, 1)
					break;
				}
			}
			obj = obj.parentNode;
		}
	},

	setRowsHiddenByPK: function(gridID, pks) {
		var pkArr = pks.split('|');
		var rows = $(gridID + "NDataGridTA").rows;
		for (var i = 0; i < rows.length; i++) {
			if (rows[i].getAttribute('pk')) {
				for (var ii = 0; ii < pkArr.length; ii++) {
					if (rows[i].getAttribute('pk') == pkArr[ii]) {
						rows[i].style.display = "none";
					}
				}
			}
		}
	},

	ClearAktRows: function(gridID) {
		var rows = $(gridID + "NDataGridTA").rows;
		for (var i = 0; i < rows.length; i++) {
			ND.RowHandelSel(rows[i], 0)
		}

	},

	RowHandelSel: function(row, sel) {
		var baseClass = row.className.replace(" sel", "");
		row.className = (sel) ? baseClass + " sel" : row.className = baseClass;
	},

	Sesam: function(event) {
		var cell = this;

		var ebNr = Number(cell.getAttribute("eb"));
		var parTr = cell.parentNode;
		if (!ND.FindClassName(cell, "leaf")) {
			var sesamOpen = ND.FindClassName(cell, "collapse");
			cell.className = (sesamOpen) ? cell.className.replace("collapse", "expand") : cell.className.replace("expand", "collapse");
			var tr = parTr.nextSibling;
			while (tr) {
				var cell = null;
				var cNr = null;
				for (var i = 0; i < tr.childNodes.length; i++) {
					cell = tr.childNodes[i];
					cNr = Number(cell.getAttribute("eb"));
					if (cNr)
						break;
				}

				if (cNr <= ebNr)
					break;
				else if (sesamOpen && (cNr == ebNr + 1 || (ND.sesamToggleAll && cNr > ebNr))) {
					tr.className = tr.className.replace("dn", "");
					if (ND.sesamToggleAll)
						cell.className = cell.className.replace("collapse", "expand");
				}
				else if (!sesamOpen) {
					cell.className = cell.className.replace("expand", "collapse");
					if (!ND.FindClassName(tr, "dn"))
						tr.className += " dn";
				}
				tr = tr.nextSibling;
			}
		}
		stopEvent(event);
	},

	isLeafRow: function(obj) /*fix me! - habe keine effizientere Variante gefunden*/
	{
		var tr = ND.SearchParentObjByClass(obj, 'd');
		tds = tr.getElementsByTagName('td');
		for (var i = 0; i < tds.length; i++)
			if (ND.FindClassName(tds[i], 'leaf'))
			return true;
		return false;
	},

	/*nicht verwendet*/
	SesamSetKnotenDisabled: function(id_template, idx) {
		var previous = false;
		var ebene = 0;
		var wasKnoten = false;
		var start = true;
		while (--idx >= 0 && (previous = $(id_template.replace('#', idx)))) {
			var isLeaf = ND.isLeafRow(previous);
			if (!isLeaf)/*Knoten*/
			{
				if (ebene > 0 || start)
					previous.disabled = true;
				start = false;
				ebene++;
				wasKnoten = true;
			}
			else if (wasKnoten)/*ein Blatt nach einem Knoten*/
			{
				ebene--;
				wasKnoten = false;
			}
		}
	},

	/*Der Aufruf bei Dropdowns ist anders*/
	SesamSetAllDropBeyond: function(sender, idx)
	{ ND.SesamSetAllBeyond(sender, false, idx); },

	/*Alle untergeordneten Element auf den selben Wert setzen*/
	SesamSetAllBeyond: function(sender, pk, idx) {
		if (window.sesamCheckExecuting)
			return; //entweder ein Flag, oder das Onchange-Event bei jeder Checkbox aussetzen
		window.sesamCheckExecuting = true;
		/*wenn das erste Element ein Knoten ist, wird beim Start die Ebene inkrementiert, bis ein Blatt gefunden wird*/
		var start = !ND.isLeafRow(sender);
		/*if(start && sender.checked)
		return; Selektion kann nicht aufgehoben werden?*/
		var id_template = sender.id.replace('_' + idx + '_', '_#_');
		var rowID = id_template.substr(0, id_template.indexOf('#'));
		var next = false;
		var wasKnoten = false;
		/*wenn es ein Blatt ist, wird der uebergeordnete Knoten disabled?
		if(!start)
		return ND.SesamSetKnotenDisabled(id_template, idx);*/
		var ebene = 0;
		if (start)
			while (next = $(id_template.replace('#', ++idx))) {
			var isLeaf = ND.isLeafRow(next);
			if (start) {
				if (isLeaf)
					start = false;
				else
					ebene++;
			}
			else if (!isLeaf) { /*ein Knoten nach einem Blatt*/
				ebene--;
				wasKnoten = true;
			} else if (wasKnoten) /*ein Blatt nach einem Knoten*/
			{
				ebene++;
				wasKnoten = false;
			}
			if (ebene < 0)
				break;
			if (sender.type == 'checkbox')
				next.checked = sender.checked;
			else
				next.value = sender.value
			if (isLeaf)/*Blatt auf editiert setzen - leider wird das Element, auf das geklickt wurde auf editiert gesetzt*/
				ND.SetTxtEdit(next, rowID + idx + '_', false);
		}
		window.sesamCheckExecuting = false;
	},

	Lookup_Click: function(ev) {
		Lookup_Click(Event.element(ev));
		Event.stop(ev);
	},

	SetDel: function(btn, delClientEvent) {
		var rowID = btn.id.replace("btnDel", "");
		var del = document.forms[0].elements[rowID + 'Del'];
		if ($F(del) == "0") {
			del.value = 1;
			btn.className = 'del';
			ND.SetRowClass(btn, "deleted", 1);
		}
		else {
			del.value = 0;
			if ($F(rowID + 'State') == '1')
				btn.className = 'edit';
			else
				btn.className = '';
			ND.SetRowClass(btn, "deleted", 0);
		}
		if (delClientEvent != null && delClientEvent != "") {
			var gridID = ND.GetGridId(btn);
			if (delClientEvent.indexOf("(") > 0)
				eval(delClientEvent);
			else
				eval(delClientEvent + "('" + ND.GetPKValue(gridID, rowIdx) + "');");
		}
		return false;
	},

	SetRowClass: function(obj, className, setOrRemove) {
		if (!obj)
			return;
		var tr = ND.SearchParentObjByClass(obj, "d");
		ND.SetElementsClass(tr.getElementsByTagName("input"), className, setOrRemove);
		ND.SetElementsClass(tr.getElementsByTagName("textarea"), className, setOrRemove);
		ND.SetElementsClass(tr.getElementsByTagName("button"), className, setOrRemove);
		ND.SetElementsClass(tr.getElementsByTagName("select"), className, setOrRemove);
	},

	SetElementsClass: function(elements, className, setOrRemove) {
		for (var i = 0; i < elements.length; i++) {
			if (elements[i].tagName == "button" && elements[i].parentNode.className == "dl")
				continue;
			elements[i].className = (setOrRemove) ? elements[i].className += " " + className : elements[i].className.replace(className, " ");
		}
	},

	OnColumnSort: function() {
		var obj = this;
		if (this.oc)
			this.oc();
		var tab = ND.SearchParentObjByClass(obj, "ND").id;
		var fieldID = tab.replace("NDataGridTA", "Sort");
		var currentVal = $F(fieldID);
		var column = obj.getAttribute("c");
		if (currentVal == null || currentVal == '')
			currentVal = '[' + column + '] ASC';
		else {
			if (currentVal.indexOf(column) >= 0) {
				if (currentVal.indexOf('ASC') > 0)
					currentVal = '[' + column + '] DESC';
				else
					currentVal = '[' + column + '] ASC';
			}
			else
				currentVal = '[' + column + '] ASC';
		}
		$(fieldID).value = currentVal;
		NPage_NoValidation = true;
		__NPostBack(21);
	},

	RowOver: function()
	{ ND.RowHover(this, 1); },

	RowOut: function()
	{ ND.RowHover(this, 0); },

	RowHover: function(row, over) {
		var baseClass = row.className.replace(" hover", "");
		row.className = (over) ? baseClass + " hover" : row.className = baseClass;
	},

	Postback: function(row, postBackFieldId, pk, postBackCondition) {
		postBackFieldId = postBackFieldId || row.getAttribute('fieldID');
		pk = pk || row.getAttribute("pk");
		if (postBackCondition) {
			var arrPbCondition = postBackCondition.split("||");
			var aufrufe = "";
			if (arrPbCondition[1]) {
				arrAufrufe = arrPbCondition[1].split("|");
				for (var i = 0; i < arrAufrufe.length; i++)
					aufrufe += ((aufrufe == "") ? "'" : ", '") + arrAufrufe[i] + "'";
			}
			try {
				if (!eval(arrPbCondition[0] + "(this, " + aufrufe + ")"))
					return;
			}
			catch (e)
			{ return; }

		}

		$(postBackFieldId).value = pk;
		__NPostBack(20);
	},

	markAll: function(objCb, grdId, column) {
		var check = objCb.checked;
		if (column == null)
			column = "__check";

		var cbId = grdId + "_#_" + column;
		var i = 0;
		while (true) {
			var cb = $(cbId.replace("#", i++));
			if (cb) {
				if (check != cb.checked && !cb.disabled)
					cb.click();
			}
			else
				break;
		}
	},

	markAbsolutelyAll: function(objCb, grdId, column) {
		ND.markAll(objCb, grdId, column);
		var pars = "&DynLoadGrid=true&hint=" + grdId + "&checked=" + ((objCb.checked) ? "1" : "0");
		var myAjax = new Ajax.Request(
			location.href, {
				method: 'get',
				parameters: pars,
				asynchronous: false
			});
		$(grdId + "_Check").value = myAjax.transport.responseText;
	},

	rowCheck: function(row, pk, gridId, idx) {
		var chckBx = $(gridId + (gridId.charAt(gridId.length - 1) == '_' ? '' : '_') + idx + '___check');
		if (chckBx) {
			chckBx.checked = !chckBx.checked;
			var obj = chckBx;
			/*kopiert von ND.RowSel, weil es keinen Flag hat*/
			while (obj.parentNode) {
				if (obj.nodeName.toUpperCase() == 'TABLE' && obj.id.replace('NDataGridTA', '') == gridId)
					break;
				if (obj.nodeName.toUpperCase() == 'TR') {
					var cl = obj.className.split(' ');
					if (cl.indexOf('rh') >= 0 || cl.indexOf('v') >= 0 || cl.indexOf('d') >= 0 || cl.indexOf('hv') >= 0) {
						ND.RowHandelSel(obj, chckBx.checked ? 1 : 0);
						break;
					}
				}
				obj = obj.parentNode;
			}
			ND.setCheck.call(chckBx, gridId, pk);
		}
	},

	SearchParentObjByClass: function(obj, className) {
		while (obj.parentNode && !ND.FindClassName(obj.parentNode, className)) {
			obj = obj.parentNode;
		}
		return obj.parentNode;
	},
	SearchParentObjByNodeName: function(obj, nodeName) { //Noch nicht verwendet
		if (obj.nodeName.toUpperCase() == nodeName.toUpperCase())
			return obj;
		while (obj.parentNode.nodeName.toUpperCase() != nodeName.toUpperCase()) {
			obj = obj.parentNode;
		}
		return (obj.parentNode);
	},
	FindClassName: function(obj, findClass) {
		var fullClassName = obj.className;
		classes = $A(fullClassName.split(" "));
		sortClass = classes.find(function(cl) {
			return (cl.toUpperCase() == findClass.toUpperCase())
		});
		if (sortClass && sortClass.toUpperCase() == findClass.toUpperCase())
			return true;
		else
			return false;
	},
	CssClasses: function(obj) {
		if (obj != null)
			return obj.className.split(' ');
		else
			return null;
	},

	OnGroupBy: function(elem) {
		var below = elem.getEltBelow();
		if (below)//wenn das Element schon "Kind" des DropFeldes ist
			if (elem.parent == below)
			return;
		var id = ND.GetGridId(elem.div);
		var groupid = id + "_GroupBy";
		var groupIn = $(groupid);
		var currentVal = $F(groupIn);
		if (currentVal == null || currentVal == "") {
			groupIn.value = elem.div.getAttribute("c");
		} else {
			groupIn.value = currentVal + "|" + elem.div.getAttribute("c");
		}
		__NPostBack(21);
	},

	OnUnGroupBy: function(elem) {
		var below = elem.getEltBelow();
		if (below)//wenn das Element nicht aus dem Feld gezogen wurde
			if (elem.parent == below)
			return elem.moveTo(DaD.startX, DaD.startY);
		var id = ND.GetGridId(elem.div).replace("GroupHeaders", "");
		var groupid = id + "_GroupBy";
		var groupIn = $(groupid);
		var currentVal = $F(groupIn);
		var colName = elem.div.getAttribute("c");
		if (currentVal && currentVal != "") {
			var elems = currentVal.split('|');
			currentVal = null;
			for (var i = 0; i < elems.length; i++)
				if (!currentVal && elems[i] != colName)
				currentVal = elems[i];
			else if (elems[i] != colName)
				currentVal = currentVal + "|" + elems[i];
			groupIn.value = currentVal;
		}
		__NPostBack(21);
	},

	DynloadGrid: function(elem) {
		var id = ND.GetGridId(elem.div);
		var groupid = id + "_GroupBy";
		var groupIn = $(groupid);
		var currentVal = $F(groupIn);
		if (currentVal == null || currentVal == "") {
			groupIn.value = elem.div.getAttribute("c");
		} else {
			groupIn.value = currentVal + "|" + lem.div.getAttribute("c");
		}
		var grid = $(id);
		ND.aktGrid = id;
		var pars = "&DynLoad=true&hint=" + id + "&" + groupid + "=" + $F(groupIn);
		var myAjax = new Ajax.Request(
			location.href,
			{
				method: 'get',
				parameters: pars,
				onSuccess: ND.ReplaceGrid
			});
	},

	// DataGrid reihung
	tmpWertR: 0,
	PosColumn: function(aktuellesFeld, aktFeldObj, gridId, colName) {
		var CheckP = $(idPrefix + gridId + '_NDataGridTA');
		if (CheckP == null)
			return;
		aktuellesFeld = NUM.getNumber(aktuellesFeld);
		if (aktuellesFeld <= CheckP.rows.length) {
			for (var i = 0; i < CheckP.rows.length; i++) {
				var rowFeld = idPrefix + gridId + '_' + i + '_' + colName;
				var rowFeldV = NUM.getNumberO(rowFeld);
				if ($(rowFeld) != null && $(rowFeld).value != '') {
					if (ND.tmpWertR < aktuellesFeld) {
						if (rowFeldV > ND.tmpWertR && rowFeldV <= aktuellesFeld && $(rowFeld) != aktFeldObj) {
							$(rowFeld).value--;
							ND.SetTxtEdit(null, rowFeld.replace(colName, ""), 0);
						}
					}
					else if (ND.tmpWertR > aktuellesFeld) {
						if (rowFeldV < ND.tmpWertR && rowFeldV >= aktuellesFeld && $(rowFeld) != aktFeldObj) {
							$(rowFeld).value++;
							ND.SetTxtEdit(null, rowFeld.replace(colName, ""), 0);
						}
					}
				}
			}
		}
		else {
			aktuellesFeld.value = ND.tmpWertR;
		}
	},

	ReplaceGrid: function(xhr) {
		var grid = $(ND.aktGrid + "_NDataGridTA");
		if (!grid)
			return;

		if (dd != null) { //wenn das DragDrop Script eingebunden wurde{
			var parentDiv = dd.elements[grid.parentNode.id]
			if (parentDiv)
				parentDiv.write(xhr.responseText);
			else
				grid.parentNode.innerHTML = xhr.responseText;
		}
	},

	validate: function(validator, isValid) {
		var grid = $(validator.getAttribute("controlID") + "_NDataGridTA");
		isValid.IsValid = false;
		var rows = grid.rows;
		var rowIdx = 0;
		for (var i = 0; i < rows.length; i++) {
			if (ND.FindClassName(rows[i], "v")) {//DataView -- nicht validieren
				isValid.IsValid = true;
				break;
			}
			if (ND.FindClassName(rows[i], "d") && !ND.FindClassName(rows[i], "ll")) {
				var rowStateId = grid.id.replace('NDataGridTA', rowIdx.toString() + '_State');
				var rowDelId = grid.id.replace('NDataGridTA', rowIdx.toString() + '_Del');
				rowIdx++;
				if (rows[i].getAttribute("new") != "1") {
					isValid.IsValid = true;
					break;
				}
				else {
					var objState = document.forms[0].elements[rowStateId];
					var objDel = document.forms[0].elements[rowDelId];
					if (objState.value == "1" && objDel.value == "0") {
						isValid.IsValid = true;
						break;
					}
				}
			}
		}
		ND.updErrText(validator, isValid);
	},

	updErrText: function(validator, isValid) {
		if (isValid.IsValid == false) {
			if (isValid.ErrorText == "")
				isValid.ErrorText = validator.getAttribute("error_Required");
			if ($(validator.id + "_msg"))
				validator.parentNode.removeChild($(validator.id + "_msg"));
			var errMsg = document.createElement("span");
			errMsg.className = "validator";
			errMsg.innerHTML = isValid.ErrorText;
			errMsg.style.paddingLeft = "5px"
			errMsg.id = validator.id + "_msg";
			validator.parentNode.appendChild(errMsg);
		}
		else if ($(validator.id + "_msg"))
			validator.parentNode.removeChild($(validator.id + "_msg"));
	},
	GetGridId: function(elem) {
		elem = $(elem);
		var i = 0;
		if (elem.parentNode == null)
			return null;
		while (elem.parentNode.tagName != "TABLE" || elem.parentNode.className != "ND") {
			elem = elem.parentNode;
			if (elem.parentNode == null)
				return "";
			i++;
			if (i > 50)
				break;
		}
		return elem.parentNode.id.replace("_NDataGridTA", "");
	},
	getRowIdx: function(elem) {
		var grdID = ND.GetGridId(elem);
		var elemID = elem.id;
		var rest = elemID.replace(grdID + "_", '');
		return rest.substring(0, rest.indexOf("_"));

	},
	getElement: function(gridID, rowIdx, column) {
		return $(idPrefix + gridID + '_' + rowIdx.toString() + '_' + column);
	},

	usrSettings: function(param, wi, hi, event) {
		AL.openWin(document.location.pathname + '?' + param, wi || 400, hi || 800, ' ');
	},

	setCheck: function(gridId, pk) {
		var inpChk = $(gridId + (gridId.charAt(gridId.length - 1) == '_' ? 'Check' : '_Check'));
		var pkval = pk + ';';
		var val = String(inpChk.value).replace(pkval, '');
		if (this.checked) { val = pkval + val; }
		inpChk.value = val;
	},

	dynLoadCB: function(val) {
		var h = $H({ DynLoad: 'true', Param: val });
		var myAjax = new Ajax.Request(location.href, { method: 'get', parameters: h });
	}
}

/////// CheckBox -> HF ev. noch in init einbauen!
function setCheck(o, val) {
	var gridid = ND.GetGridId(o);
	var o1 = $(gridid + "_Check");
	if (o != null && o1 != null) {
		if (o.checked)
			o1.value += val + ";";
		else
			o1.value = o1.value.replace(val + ";", "");
	}
}
///// Dynamisches Laden / CheckBox /
function DynLoad(val) {
	var h = $H({
		DynLoad: 'true',
		Param: val
	});

	var q = h.toQueryString();
	var myAjax = new Ajax.Request(
		location.href,
		{
			method: 'get',
			parameters: q
		}
	);
}


// Ajax Save Multiselect
function SaveMultiselect(DataTable, pk, values) {
	//DataTable = tabelle sql
	//pk = pk , masterdatensatz
	//values = checked item values, zb.:(123;343;343)
	var h = $H({
		DynLoad: 'true',
		Table: DataTable,
		PK: pk,
		val: values,
		art: "MultiSelect"
	});

	var q = h.toQueryString();
	var myAjax = new Ajax.Request(
		location.href,
		{
			method: 'get',
			parameters: q
		}
	);
}

////////////////// onclick='openReport("xxxxx.rpt",true)' 
//quantity :true (alle reports) , false (die markierten) aus dem Suche grid zb.
function openReport(rName, quantity) {
	var h = $H({
		DynLoad: 'true',
		dynKey: "openR",
		Param: "openR",
		rName: rName,
		quantity: quantity
	});

	var q = h.toQueryString();

	var aj = new Ajax.Request(
		location.href,
		{
			method: 'get',
			parameters: q,
			onComplete: handleReportResponse
		}
	);
}

function handleReportResponse(response) {
	if (response.responseText.search(/^ERROR/) == 0) {
		alert(response.responseText.split("|")[1]);
		return;
	}
	exexResponse(response);
}

function exexResponse(response) {
	eval(response.responseText);
}

/*Zwei Felder sollen sich um ein Vielfaches unterscheiden 
Der Faktor steht in einem dritten Feld*/
var FAKT = {
	hiField: new Array(),
	hiFields: new Array(),
	loField: new Array(),
	fktField: new Array(),
	dezimalStellen: new Array(),
	autoStart: new Array(),
	callFunction: new Array(),
	i: -1,
	isHiCalled: false, //um Rekursioen zu verhindern
	isLoCalled: false,
	startEvent: null,

	init: function(hi, lo, fkt, dez, auto, func) {//autostart wird hier ignoriert - todo
		FAKT.i++;
		FAKT.hiField[FAKT.i] = hi;
		FAKT.loField[FAKT.i] = lo;
		FAKT.fktField[FAKT.i] = fkt;
		FAKT.autoStart[FAKT.i] = auto;
		FAKT.dezimalStellen[FAKT.i] = (dez) ? dez : 2;
		if (func)
			FAKT.callFunction[FAKT.i] = func;

		FAKT.InitEventHi($(hi), FAKT.i);
		FAKT.InitEventLo($(lo), FAKT.i);
	},

	initOneWay: function(elements, target, faktor, dez, auto, func) {//Nur in eine Richtung, dafür können mehrere Felder als Multiplikatoren angegeben werden.
		FAKT.i++;
		FAKT.hiFields[FAKT.i] = elements;
		FAKT.loField[FAKT.i] = target;
		FAKT.fktField[FAKT.i] = faktor;
		FAKT.autoStart[FAKT.i] = auto;
		FAKT.dezimalStellen[FAKT.i] = (dez) ? dez : 2;
		if (func)
			FAKT.callFunction[FAKT.i] = func;

		for (var i = 0; i < elements.length; i++)
			FAKT.InitEventOneWay($(elements[i]), FAKT.i);
	},

	initGrid: function(gridID, hi, lo, fkt, dez, auto, func) {
		var grid = $(gridID + "_NDataGridTA");
		if (!grid)
			return;
		var idShort = gridID.replace("NDataGridTA", "");
		rows = grid.getElementsByTagName("TR");
		if (!$(idShort + "_0_" + hi) || !$(idShort + "_0_" + lo))
			return;
		var j = 0;
		var rowIdx = j;
		var row = rows[j]
		while (row) {
			if (ND.FindClassName(row, "d") && !ND.FindClassName(row, "ll")) {
				var idHi = idShort + "_" + rowIdx + "_" + hi;
				var idLo = idShort + "_" + rowIdx + "_" + lo;
				var idFkt = idShort + "_" + rowIdx + "_" + fkt;
				if (typeof (fkt) == "object")
					idFkt = fkt;
				FAKT.init(idHi, idLo, idFkt, dez, auto, func);
				rowIdx++; //der Header soll nicht mitgezaehlt werden
			}
			j++;
			row = rows[j];
		}
	},

	InitEventHi: function(c, i) { //Event fuer das Vielfache
		if (c.onchange)
			c.ocfakt = c.onchange;
		if (c.onkeyup)
			c.okfakt = c.onkeyup;
		c.onchange = function() {
			if (!FAKT.isLoCalled) {
				FAKT.isLoCalled = true;
				FAKT.isHiCalled = true;
				FAKT.calcLo(this);
			}
			FAKT.isLoCalled = false;
		};
		c.onkeyup = function() {
			if (!FAKT.isLoCalled) {
				FAKT.isLoCalled = true;
				FAKT.isHiCalled = true;
				FAKT.calcLo(this);
			}
			FAKT.isLoCalled = false;
		};
		c.faktIndex = i;
	},

	InitEventLo: function(c, i) { //Event fuer den Teil
		if (c.onchange)
			c.ocfakt = c.onchange;
		if (c.onkeyup)
			c.okfakt = c.onkeyup;
		c.onchange = function() {
			if (!FAKT.isHiCalled) {
				FAKT.isHiCalled = true;
				FAKT.isLoCalled = true;
				FAKT.calcHi(this);
			}
			FAKT.isHiCalled = false;
		};
		c.onkeyup = function() {
			if (!FAKT.isHiCalled) {
				FAKT.isHiCalled = true;
				FAKT.isLoCalled = true;
				FAKT.calcHi(this);
			}
			FAKT.isHiCalled = false;
		};
		c.faktIndex = i;
	},

	InitEventOneWay: function(c, i) {
		if (c.onchange)
			c.oconew = c.onchange;
		if (c.onkeyup)
			c.okonew = c.onkeyup;
		c.onchange = function() {
			FAKT.calculateOW(this);
			if (c.oconew/* && !SUM.isCalled*/) {
				//SUM.isCalled = true;
				c.oconew.call(this);
			}
			//SUM.isCalled = false;
		};
		c.onkeyup = function() {
			FAKT.calculateOW(this);
			if (c.oconew/* && !SUM.isCalled*/) {
				//SUM.isCalled = true;
				c.oconew.call(this);
			}
			//SUM.isCalled = false;
		};
		c.faktIndex = i;
	},

	calcHi: function(sender) //Berechne das Vielfache
	{
		if (!FAKT.isHiCalled)
			return;
		var idx = sender.faktIndex;
		var fk = NUM.getNumberO(FAKT.fktField[idx]);
		var lo = NUM.getNumberO(sender);
		FAKT.setVal(FAKT.hiField[idx], lo, fk, FAKT.dezimalStellen[idx]);
		if (FAKT.callFunction[idx])
			FAKT.callFunction[idx]();
	},

	calcLo: function(sender) //Berechne den Teil
	{
		if (!FAKT.isLoCalled)
			return;
		var idx = sender.faktIndex;
		var fk;
		var faktor = NUM.getNumberO(FAKT.fktField[idx]);
		if (faktor != 0) //wg. Division durch 0
			fk = 1 / faktor;
		else
			fk = 0;
		var hi = NUM.getNumberO(sender); // || 1;
		FAKT.setVal(FAKT.loField[idx], hi, fk, FAKT.dezimalStellen[idx]);
		if (FAKT.callFunction[idx])
			eval(FAKT.callFunction[idx] + "()");
	},

	calculateOW: function(obj) {
		if (!obj)
			return;
		var ergebnis = 1;
		var idx = obj.faktIndex;
		for (var i = 0; i < FAKT.hiFields[idx].length; i++)
			ergebnis *= NUM.getNumberO(FAKT.hiFields[idx][i]);

		if (FAKT.fktField[idx] != null)
			ergebnis *= Number(FAKT.fktField[idx]);

		var target = $(FAKT.loField[idx]);
		if (target) {
			NUM.setNumberO(ergebnis, FAKT.dezimalStellen[idx], target);
			if (target.onchange)
				target.onchange();
		}
		if (FAKT.callFunction[idx])
			eval(FAKT.callFunction[idx] + "()");
	},

	setVal: function(targetId, val, fkt, stellen) {
		var target = $(targetId);
		if (target) {
			NUM.setNumberO(val * fkt, stellen, targetId);
			if (target.onchange)
				target.onchange();
		}
	}
}

/***Calculation (Summieren, Subtrahieren) Funktion fuer Textboxen
* Beispiel fuer Konstruktor (RegisterStartupScript):
*
*	 SUM.Init(["Brutto", "Zuschlag"], ["Tara", "Abzug"], "Summe", 1, 2);
*
* Konstrukor fuer Grid:
*   SUM.InitGrid(ctl0_ctl1_grdSuche_NDataGridTA, ["Brutto", "Zuschlag"], ["Tara", "Abzug"], "Summe", 1, 2);
*/

var SUM = {
	dezimalStellen: new Array(),
	felderSummieren: new Array(),
	felderSubtrahieren: new Array(),
	feldZiel: new Array(),
	autoStart: new Array(),
	dezimalStellen: new Array(),
	callFunction: new Array(),
	i: -1,
	isCalled: false, //um Rekursionen zu verhindern

	Init: function(felderSummieren, felderSubtrahieren, feldZiel, autoStart, dezimalStellen, callFunction) {
		SUM.i++;
		SUM.felderSummieren[SUM.i] = felderSummieren;
		SUM.felderSubtrahieren[SUM.i] = felderSubtrahieren;
		SUM.feldZiel[SUM.i] = feldZiel;
		SUM.autoStart[SUM.i] = autoStart;
		SUM.dezimalStellen[SUM.i] = (dezimalStellen) ? dezimalStellen : 0;
		if (callFunction)
			SUM.callFunction[SUM.i] = callFunction;
		for (var i = 0; i < felderSummieren.length; i++) {
			var c = $(felderSummieren[i]);
			if (!c)
				continue;
			SUM.InitEventHandler(c, SUM.i);
		}
		if (felderSubtrahieren && felderSubtrahieren.length > 0) {
			for (var i = 0; i < felderSubtrahieren.length; i++) {
				var c = $(felderSubtrahieren[i]);
				SUM.InitEventHandler(c, SUM.i);
			}
		}
		if (autoStart)
			SUM.Calculate($(felderSummieren[0]));
	},

	InitEventHandler: function(c, i) {
		if (c.onchange)
			c.ocsum = c.onchange;
		if (c.onkeyup)
			c.oksum = c.onkeyup;
		c.onchange = function() {
			SUM.Calculate(this);
			if (this.ocsum && !SUM.isCalled) {
				SUM.isCalled = true;
				this.ocsum.call(this);
			}
			SUM.isCalled = false;
		};
		c.onkeyup = function() {
			SUM.Calculate(this);
			if (this.oksum && !SUM.isCalled) {
				SUM.isCalled = true;
				this.oksum.call(this);
			}
			SUM.isCalled = false;
		};
		c.sumIndex = i;
	},

	InitGrid: function(gridID, felderSummieren, felderSubtrahieren, feldZiel, autoStart, dezimalStellen, callFunction) {
		var grid = $(gridID);
		var idShort = $(gridID.replace("NDataGridTA", ""));
		rows = $A(grid.getElementsByTagName("TR"));
		var rowIdx = 0;
		for (var i = 0; i < rows.length; i++) {
			var row = rows[i];
			if (ND.FindClassName(row, "d")) {
				var txtGridSummieren = new Array();
				var txtGridSubtrahieren = new Array();
				for (iSum = 0; iSum < felderSummieren.length; iSum++) {
					txtGridSummieren[iSum] = idShort + "_" + rowIdx + "_" + felderSummieren[iSum];
				}
				for (iSub = 0; iSub < felderSubtrahieren.length; iSub++) {
					txtGridSubtrahieren[iSub] = idShort + "_" + rowIdx + "_" + felderSubtrahieren[iSub];
				}
				SUM.Init(txtGridSummieren, txtGridSubtrahieren, idShort + "_" + rowIdx + "_" + feldZiel, autoStart, dezimalStellen, callFunction);
				rowIdx++;
			}
		}
	},

	Calculate: function(obj) {
		if (!obj)
			return;
		var ergebnis = 0;
		var sumIndex = obj.sumIndex;
		for (var i = 0; i < SUM.felderSummieren[sumIndex].length; i++) {
			ergebnis += NUM.getNumber($F(SUM.felderSummieren[sumIndex][i]));
		}
		if (SUM.felderSubtrahieren[sumIndex] && SUM.felderSubtrahieren[sumIndex].length) {
			for (var i = 0; i < SUM.felderSubtrahieren[sumIndex].length; i++) {
				ergebnis -= NUM.getNumber($F(SUM.felderSubtrahieren[sumIndex][i]));
			}
		}
		var target = $(SUM.feldZiel[sumIndex]);
		if (target) {
			if (target.tagName.toLowerCase() == 'td')
				target.innerHTML = NUM.setNumber(ergebnis, SUM.dezimalStellen[sumIndex]);
			else
				target.value = NUM.setNumber(ergebnis, SUM.dezimalStellen[sumIndex]);
		}
		if (SUM.callFunction[sumIndex])
			eval(SUM.callFunction[sumIndex] + "()");
	}
}

//Numerische Funktionen
var NUM = {
	decChar: null,
	reValidChars: /\d/,
	reKeyboardChars: /[\x00\x03\x08\x0D\x16\x18\x1A]/,
	Init: function() {
		if (NUM.decChar)
			return;
		if ($("Globalization_DecimalChar"))
			NUM.decChar = $F("Globalization_DecimalChar");
		else
			NUM.decChar = ".";
	},
	getNumber: function(wert) {
		NUM.Init();
		if (wert){
			if (wert.indexOf(" ") >= 0)
				wert = wert.gsub(" ", "");
			wert = wert.toString().replace(",", ".")
		}
		if (isNaN(wert))
			wert = 0;
		return Number(wert);
	},
	getNumberO: function(obj) {
		var wert;
		if ($(obj))
			wert = $F(obj);
		else
			return 0;

		return NUM.getNumber(wert);
	},
	setNumber: function(wert, stellen) {
		NUM.Init();
		if (stellen && stellen < 10)
			wert = wert.toFixed(stellen);

		if (NUM.decChar != ".")
			wert = String(wert).replace(".", NUM.decChar);
		return wert;
	},
	setNumberO: function(wert, stellen, obj) {
		var val = NUM.setNumber(wert, stellen);

		if ($(obj).tagName != 'TD')
			$(obj).value = val;
		else
			$(obj).innerText = val;
	},
	KeyPress: function(objEvent, allowDecimal, allowOnlyPositive) {
		NUM.Init();
		var press = true;
		var iKeyCode, strKey;
		var target;
		var allowNegative = (allowOnlyPositive) ? false : true;
		if (BASE.isIE) {
			iKeyCode = objEvent.keyCode;
			target = objEvent.srcElement;
		}
		else {
			iKeyCode = objEvent.which;
			target = objEvent.target;
		}
		strKey = String.fromCharCode(iKeyCode);
		if (!NUM.reValidChars.test(strKey) && !NUM.reKeyboardChars.test(strKey)) {
			if (strKey == "-" && allowNegative && target.value.toString().indexOf("-") < 0)
				press = true;
			else if (allowDecimal && strKey == NUM.decChar && target.value.toString().indexOf(NUM.decChar) < 0 && target.value.toString().length > 0)
				press = true;
			else
				press = false;
		}
		if (press && $(target.id + "_K"))//Kennzeichnung-Flag (Waage oder manuell)
			$(target.id + "_K").value = "H";
		return press;
	}
}

var NT = {	//NTree
    lastCell: null,
    Init: function(treeID, autoPostBack, callClientFunction, itemSelect, rightClickFunction) {
        var tds = $A($(treeID).getElementsByTagName("td"));
        for (var tdi = 0; tdi < tds.length; tdi++) {
            var td = tds[tdi];
            if (td.className == "x" || td.className == "c") { //AufZuklappen initialisieren
                td.treeID = treeID;
                td.onclick = NT.ItemClick;
            } if (td.className == "l") { //Unterste Elemente sollen nichts machen
                td.onclick = stopEvent;
            }
            if (autoPostBack || callClientFunction || itemSelect || rightClickFunction) { //select (AutoPostBack, Item markieren oder Client-Funktion aufrufen
                if (td.getAttribute("s") == "1") {
                    if (td.className != "EnCond") {
                        var val = td.previousSibling.getAttribute("value");
                        if (val) {
                            val = val.replace("|", "");
                            val = val.replace("|", "");
                        }
                        td.treeID = treeID;
                        td.style.cursor = "pointer";
                        td.val = val;
                        if (autoPostBack)
                            td.onclick = /*function(Ereignis){NT.PostBack(this, val, treeID);stopEvent(Ereignis);};*/
							td.onclick = NT.PostBack;
                        else if (!rightClickFunction) {
                            td.callFunction = callClientFunction;
                            /*td.onclick = function(Ereignis){NT.Select(this, val, treeID, callClientFunction);stopEvent(Ereignis);};*/
                            td.onclick = NT.Select;
                        } if (rightClickFunction) {
                            td.rightClick = rightClickFunction;
                            Event.observe(td, 'contextmenu', NT.contextMenu);
                        }
                    }
                    else {
                        td.onclick = stopEvent;
                    }
                }
                if (td.className == "sel")
                    NT.lastCell = td;
            }
            /*});*/
        }
        var chbxs = $A($(treeID).getElementsByTagName("input"));
        for (var cbi = 0; cbi < chbxs.length; cbi++) {
            var cb = chbxs[cbi];
            if (cb.type.toLowerCase() == "checkbox" && cb.parentNode.previousSibling.getAttribute("enabled") == "true") {
                var val = cb.parentNode.previousSibling.getAttribute("value");
                var oc = cb.onclick;
                cb.onclick = function() {
                    NT.ItemCheck(this, val, 1, treeID);
                    if (oc)		//&& typeof(idPrefixW5) == "string" typeof idPrefixW5 is string == easy erfassung		    
                        oc(this);
                };
            }
            else if (cb.parentNode.previousSibling.getAttribute("enabled") == "false")
                cb.disabled = true;
            /*});*/
        }
    },

    collapseAll: function(event) {
        var cls = this.isCollapsed || false ? 'c' : 'x';
        var tree = this;
        var elems = tree.getElementsByTagName('td');
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].className == cls) {
                NT.ItemClick.call(elems[i], event);
            }
        }
        this.isCollapsed = cls == 'x';
        return stopEvent(event);
    },

    ItemClick: function(/*cell, treeID, */event) {
        var cell = this;
        var treeID = this.treeID;
        var hidd = $(treeID + "_states");
        var tableDisplay = "none";
        var val = cell.getAttribute("value");
        var cellClass = cell.className;
        if (cellClass == "l")
            return false;
        if (cellClass == "c") {
            cell.className = "x";
            tableDisplay = 'block';
            hidd.value = hidd.value + val;
        }
        else {
            cell.className = "c";
            tableDisplay = 'none';
            hidd.value = hidd.value.replace(val, '');
        }
        var tabNext = cell.parentNode.childNodes[1].firstChild;
        var i = 0;
        while (tabNext.tagName != "TABLE" && i < 10) {
            tabNext = tabNext.nextSibling;
            i++;
        }
        tabNext.style.display = tableDisplay;
        stopEvent(event);
    },

    Select: function(/*cell, key, treeID, callFunction*/event) {
        var cell = this;
        var key = cell.val;
        var treeID = cell.treeID;
        var callFunction = cell.callFunction;
        if (cell.parentNode.childNodes.item(0).getAttribute('enabled') != 'true')
            return;
        var hidd = $(treeID + "_selItem");
        hidd.value = key;
        if (NT.lastCell != null && NT.lastCell != cell) {
            NT.lastCell.className = '';
        }
        if (cell.className != 'EnCond' || cell.className == '') {
            if (cell.className == 'sel') {
                cell.className = '';
                hidd.value = '';
            }
            else
                cell.className = 'sel';
        }
        NT.lastCell = cell;
        if (callFunction) {
            callFunction(cell);
            if (callFunction.toString().indexOf("callFunctionPropagate") == -1)
                stopEvent(event);
        }
        else
            stopEvent(event);
    },

    PostBack: function(/*cell, key, treeID*/event) {
        var cell = this;
        var key = cell.val;
        var treeID = cell.treeID;

        if (cell.parentNode.firstChild.getAttribute("enabled") != "true")
            return;
        var hidd = $(treeID + "_selItem");
        if (hidd) {
            hidd.value = key;
            __NAutoPostBackCtl(null, treeID, "", 21);
        }
        stopEvent(event);
    },

    ItemCheck: function(chkBox, key, first, treeID) {
        var hidd = $(treeID + "_checked");
        if (NT.GetCell(chkBox) == "true") {
            if (chkBox.checked) {
                if (hidd.value.indexOf(key) == -1)
                    hidd.value = hidd.value + key;
            }
            else {
                while (hidd.value.indexOf(key) > -1)
                    hidd.value = hidd.value.replace(key, "");
                if (first == 1)
                    NT.UncheckPreviousNodes(chkBox, hidd);
            }
        }
        if (chkBox.parentNode.childNodes.length < 4)
            return;
        var nextTable = chkBox.parentNode.childNodes[3];
        if (nextTable.nodeName.toUpperCase() != "TABLE" && chkBox.parentNode.childNodes[4]) // Wenn Ampel eingeblendet ist
            nextTable = chkBox.parentNode.childNodes[4];
        if (nextTable.childNodes.length == 0)
            return;
        for (var iIdx = 0; iIdx < nextTable.childNodes[0].childNodes.length; iIdx++) {
            var chkBoxNext = nextTable.firstChild.childNodes[iIdx].childNodes[1].firstChild;
            if (NT.GetCell(chkBoxNext) == 'true') {
                chkBoxNext.checked = chkBox.checked;
                var keyNext = chkBoxNext.parentNode.parentNode.childNodes[0].getAttribute("value");
            }
            NT.ItemCheck(chkBoxNext, keyNext, 0, treeID);
        }
    },

    contextMenu: function(ev) {
        var obj = Event.element(ev);
        var value = obj.parentNode.firstChild.getAttribute("value");
        value = value.replace("|", "");
        value = value.replace("|", "");
        var fkt = obj.rightClick;
        CTMN.lastEvent = ev;
        eval(fkt + "('" + value + "')");
        stopEvent(ev);
    },

    GetCell: function(chkbox) {
        return (chkbox.parentNode.parentNode.firstChild.getAttribute("enabled"));
    },

    UncheckPreviousNodes: function(chkBox, hidd) {
        var x = chkBox;
        var i = 0;
        while (x.parentNode && x.tagName != "TABLE" && i < 10) {
            x = x.parentNode;
            i++;
        }
        if (x != null && x.parentNode != null && x.parentNode.previousSibling != null) {
            hidd.value = hidd.value.replace(x.parentNode.previousSibling.value, "");
            x = x.parentNode.firstChild;
            x.checked = false;
            NT.UncheckPreviousNodes(x.parentNode, hidd)
        }
        else
            return;
    },

    toggleAll: function(obj, id) {

        var t = $(id);
        while (t.firstChild != null && t.tagName.toLowerCase() != "tr")
            t = t.firstChild;

        if (t != null && t.tagName.toLowerCase() == "tr") {

            t = t.parentNode;
            var len = t.childNodes.length;

            for (var i = 0; i < len; i++) {

                var x = t.childNodes[i].firstChild;

                while (x != null) {
                    if (x.firstChild != null && x.firstChild.tagName.toLowerCase() == "input") {
                        x = x.firstChild;
                        break;
                    }
                    else
                        x = x.nextSibling;
                }

                if (x != null && x.checked != obj.checked)
                    x.click();
            }
        }
    }
}

var MS = { //Multiselect
    ms: false,
    msButtons: Array(),
    ie: null,
    hidd: "",
    pk_table: "",
    DataTable: "",
    check: "",
    dynsave: "",
    searchAll: null,
    noCleanup: false,

    Init: function(bt, newRow, rowID) {
        MS.ms = true;
        MS.ie = (document.all ? true : false);
        if (ND.FindClassName(bt, "msButton")) {
            MS.msButtons[MS.msButtons.length] = bt;
            bt.firstUsed = 0;
            Event.observe(bt, 'click', MS.ShowItems, true);
            bt.setAttribute("newRow", newRow);
            if (bt.getAttribute("StandAlone") == null && rowID != null)
                bt.setAttribute("inGrid", rowID);
            return false;
        }
        else
            return true;
    },

    ShowItems: function(ev) {
        var bt = Event.element(ev);
        var txtParent = bt.id.replace("_Expand", "_Text");
        var divID = bt.id.replace("_Expand", "_Items");
        if (bt.getAttribute("inGrid") != null)
            ND.SetTxtEdit(bt, bt.getAttribute("inGrid"), null);
        if (bt.open == "open") {
            var div = $("div" + bt.id);
            div.style.display = "none";
            if (bt.value == "<" || bt.value == ">")
                bt.value = ">";
            else
                bt.className = "msButton";
            bt.open = "closed";
        }
        else {
            var div;
            if (bt.firstUsed == 0) {
                div = document.createElement("div");
                div.className = "DivMultiselect";
                div.id = "div" + bt.id;
                Event.observe(div, 'click', MS.cancelBubble, true);
                document.body.appendChild(div);
                bt.firstUsed = 1;
            }
            else
                div = $("div" + bt.id);
            div.innerHTML = "";

            div.style.display = "block";
            MS.MultisToFill(bt.id.replace("_Expand", ""), div);
            var posParentObj = $(txtParent);
            var ttop = nGetAbsoluteTop(posParentObj) + posParentObj.offsetHeight + 2;
            if (Prototype.Browser.Gecko) {
                var tt = posParentObj;
                do {
                    if (tt.className == "regItem") {
                        ttop += 21;
                        tt = null;
                    }
                    else
                        tt = tt.offsetParent;
                } while (tt)
            }
            div.style.top = ttop.toString() + "px";
            div.style.left = (nGetAbsoluteLeft(posParentObj)).toString() + "px";
            if (bt.value == "<" || bt.value == ">")
                bt.value = "<";
            else
                bt.className = "msButton msOpen";
            bt.open = "open";
        }
        MS.refresh(bt);
        Event.stop(ev);
    },

    MultisToFill: function(id, div, txt) {
        if (txt)
            txt.value = "";
        var elem = $(id);

        var tab = document.createElement('TABLE');
        tab.id = id + '_ItemTable';
        div.appendChild(tab);

        var lfdIdx = -1, setIdx = false, selIdx = -1;
        var multiRef = $(elem.getAttribute('multiref'));
        if (multiRef == null)
            return;

        MS.pk_table = elem.getAttribute('pk_table');
        MS.DataTable = elem.getAttribute('DataTable');
        MS.dynsave = elem.getAttribute('DynSave');

        var parentColumn = multiRef.getAttribute('LinkParentColumn');
        var parentObj;
        var parentValue;
        if (parentColumn != null) {
            var parentObjID = id.replace(multiRef.id, parentColumn);
            parentObj = $(parentObjID + "_Select");
            if (parentObj == null)
                parentObj = $(parentObjID);
            if (parentObj != null)
                parentValue = $F(parentObj);
        }

        var delDisabled = 0;
        for (var iIdx = 0; iIdx < multiRef.options.length; iIdx++) {
            if (multiRef.options[iIdx].getAttribute("fk_match") != null && parentValue != null && multiRef.options[iIdx].getAttribute("fk_match") != parentValue)
                continue;

            var tr = tab.insertRow(-1);
            var span = document.createElement('span');
            if (multiRef.options[iIdx].getAttribute("disabled")) {
                tr.setAttribute("disabled", "disabled");
                span.innerHTML = "<i>" + multiRef.options[iIdx].innerHTML + "</i>&nbsp;&nbsp;&nbsp;";
            }
            else
                span.innerHTML = multiRef.options[iIdx].innerHTML;
            if (new Number(multiRef.options[iIdx].value) < 0) {
                tr.setAttribute('group', 'true');
                var tdColSpan = document.createElement('td');
                tdColSpan.colSpan = 2;
                tr.appendChild(tdColSpan);
                tdColSpan.appendChild(span);
            }
            else {
                var tdCheck = document.createElement('td');
                var tdText = document.createElement('td');
                tr.appendChild(tdCheck);
                tr.appendChild(tdText);
                var bChecked = false;
                var keys = elem.value.toString().split(';');
                for (var iIdxKey = 0; iIdxKey < keys.length; iIdxKey++) {
                    if (keys[iIdxKey] == multiRef.options[iIdx].value) {
                        bChecked = true;
                        if (txt)
                            txt.value += (txt.value.length > 0) ? ", " + multiRef.options[iIdx].text : multiRef.options[iIdx].text;
                        break;
                    }
                }

                if ($(id + "_visible")) {
                    var invisible = true;
                    var visKeys = $(id + "_visible").value.toString().split(';');
                    for (var idxVisKey = 0; idxVisKey < visKeys.length; idxVisKey++) {
                        if (visKeys[idxVisKey] == multiRef.options[iIdx].value) {
                            invisible = false;
                            break;
                        }
                    }

                    if (invisible)
                        tr.className = "dn";
                }

                var cb = document.createElement("input");
                cb.type = "checkbox";
                cb.setAttribute("key", multiRef.options[iIdx].value);
                cb.setAttribute("parentElementID", id);
                tdCheck.appendChild(cb);
                Event.observe(cb, 'click', MS.Check, true);
                cb.checked = (bChecked) ? "checked" : "";
                tdText.appendChild(span);


                if (tr.disabled || tr.getAttribute("disabled") == "disabled") {// fuer FF
                    if (bChecked) {
                        cb.disabled = true; // fuer FF
                        var delImg = document.createElement("img")
                        delImg.src = "images/icon/delete2_16.png";
                        Event.observe(delImg, 'click', MS.RemoveDisabled, true);
                        tdText.appendChild(delImg);
                    }
                    else if (tr.disabled)
                        tab.deleteRow();
                    else
                        tr.className = "dn";
                }

            }
            lfdIdx++;
        }
    },

    Check: function(ev, chk) {
        var chkBox = chk;
        if (chkBox == null)
            chkBox = Event.element(ev);
        var hiddKeys = chkBox.getAttribute("parentElementID");
        var txt = $(hiddKeys + "_Text");
        var divID = hiddKeys + "_Items";
        var cKey = chkBox.getAttribute("key");
        MS.check = "chk";
        MS.hidd = $(hiddKeys);
        var itemText = chkBox.parentNode.parentNode.childNodes.item(1).childNodes.item(0).innerHTML;
        if (chkBox.checked) {
            if (!isInList(MS.hidd.value, cKey, ";"))
                MS.hidd.value = MS.hidd.value + cKey + ';';
        }
        else
            MS.hidd.value = MS.hidd.value.replace(cKey + ';', '');

        txt.value = "";
        var multiRef = $(MS.hidd.getAttribute('multiref'));
        for (var iIdx = 0; iIdx < multiRef.options.length; iIdx++) {
            var keys = MS.hidd.value.toString().split(';');
            for (var iIdxKey = 0; iIdxKey < keys.length; iIdxKey++) {
                if (keys[iIdxKey] == multiRef.options[iIdx].value) {
                    txt.value += (txt.value.length > 0) ? ", " + multiRef.options[iIdx].text : multiRef.options[iIdx].text;
                    break;
                }
            }
        }
        txt.style.color = "#000";
        if (txt.value == "" && $(hiddKeys + "_Expand").getAttribute("showSearchAll") == "1") {
            txt.value = MS.searchAll;
            txt.style.color = "rgb(102,102,102)";
        }
        MS.noCleanup = true;
    },

    reset: function(id) {
        var txt = $(id + "_Text");
        txt.value = "";
        $(id).value = "";
        if ($(id + "_Expand").getAttribute("showSearchAll") == "1") {
            txt.value = MS.searchAll;
            txt.style.color = "rgb(102,102,102)";
        }
    },

    refresh: function(bt) {
        for (var i = 0; i < MS.msButtons.length; i++) {
            if (MS.msButtons[i] != bt) {
                if (MS.msButtons[i].value == "<" || MS.msButtons[i].value == ">")
                    MS.msButtons[i].value = ">";
                else
                    MS.msButtons[i].className = "msButton";
                MS.msButtons[i].open = "closed";
                if ($("div" + MS.msButtons[i].id)) {
                    if (MS.dynsave == "true" && ($("div" + MS.msButtons[i].id).style.display = "none") && MS.check != "") { // save mit Ajax
                        SaveMultiselect(MS.DataTable, MS.pk_table, MS.hidd.value);
                        MS.check = "";
                    }
                    $("div" + MS.msButtons[i].id).style.display = "none";
                    var msGrid = null;
                    try {
                        msGrid = ND.GetGridId(MS.msButtons[i]);
                    }
                    catch (e) { }
                    if (msGrid != null && msGrid != "") {
                        var rest = MS.msButtons[i].id.replace(ND.GetGridId(MS.msButtons[i]) + "_", "");
                        var rowID = rest.substr(0, rest.indexOf("_"));
                        var txtStateId = msGrid + "_" + rowID + "_";
                        ND.SetTxtEdit(MS.msButtons[i], txtStateId, MS.msButtons[i].getAttribute("newRow"));
                    }
                }
            }
        }
    },

    cancelBubble: function(ev) {
        if (Event.element(ev).tagName != "INPUT")
            Event.stop(ev);
    },

    RemoveDisabled: function(ev) {
        var obj = Event.element(ev);
        var tr = obj.parentNode.parentNode;

        var chk = tr.childNodes[0].childNodes[0];
        chk.checked = false;
        MS.Check(null, chk);
        tr.className = "dn";

    }
}

document.onclick = cleanup;

function cleanup(e) {
	if (!e)
		e = window.event;
	var srcObj;
	if (e.target)
		srcObj = e.target;
	else if (e.srcElement)
		srcObj = e.srcElement;

	if (MS.ms && !MS.noCleanup) {
		if (MS.msButtons.length > 0) {
			MS.refresh();
		}
	}
	if (MS.noCleanup)
		MS.noCleanup = false;
	if ($("ncalender"))
		$("ncalender").style.visibility = "hidden";

	if (typeof (nsHide) == "function" && srcObj.getAttribute("nsgImg") != "1" && srcObj.getAttribute("nsg") != "1" && srcObj.getAttribute("nsgM") != "1")
		nsHide();
}

function buildPostString(obj) {
	var x = '';
	for (var i = 0; i < obj.childNodes.length; i++) {
		c = obj.childNodes[i];
		if (c.name != null && c.name != "" && c.value != null)
			if (c.type == "checkbox")
			if (c.checked)
			x += c.name + "=on&";
		else
			x += c.name + "=off&";
		else
			x += c.name + "=" + c.value + "&";
		x += buildPostString(c);
	}
	return (x);
}

var CR = { //ClientRegister (NCRegister)
    Init: function(regID, selItemId, clientIDPrefix, widthPanelMin, widthPanelMax) {
        var liTags = $(regID).getElementsByTagName("li");
        var width = RS.getWidth(widthPanelMin, widthPanelMax);
        var divs = new Array();
        for (var i = 0; i < liTags.length; i++) {
            var tr = $(liTags[i].firstChild.getAttribute("key"));
            if (tr == null)
                tr = $(clientIDPrefix + liTags[i].firstChild.getAttribute("key"))
            if (tr) {
                BASE.InsTmpObj(liTags[i].firstChild.getAttribute("key"), tr.id);
                tr.className = "isInVisible";
                tr.style.display = "";
                var td = tr.firstChild;
                if (td.tagName == null)//Firefox behandelt Zeilenumbruch als Textknoten
                    td = td.nextSibling;
                if (widthPanelMin > 0 && td) {
                    var div = null;
                    if (td.firstChild && td.firstChild.tagName == "DIV" && td.firstChild.className == "gridOVx")
                        div = td.firstChild;
                    else {
                        div = document.createElement("DIV");
                        div.className = "gridOVx";
                        var elem = td.firstChild;
                        while (elem) {
                            td.removeChild(elem);
                            div.appendChild(elem);
                            elem = td.firstChild;
                        }
                        //dann gehen die Scripte nicht mehr
                        //div.innerHTML = td.innerHTML;
                        //td.innerHTML = "";
                        td.appendChild(div);
                    }
                    div.style.width = width;
                    divs[divs.length] = div;
                }
            }
        }
        if (widthPanelMin > 0) {
            RS.allCrToResize[RS.allCrToResize.length] = { regID: regID, widthPanelMin: widthPanelMin, widthPanelMax: widthPanelMax, divs: divs };
            RS.resizeable = true;
        }
        if ($(selItemId))
            $(selItemId).className = "isVisible";

    },

    Select: function(clientIDPrefix, regID, obj) {
        var liTags = $(regID).getElementsByTagName("li");
        var selTag;
        for (var i = 0; i < liTags.length; i++) {
            liTags[i].className = "";
            var aktReg = $(liTags[i].firstChild.getAttribute("key"));
            if (aktReg == null)
                aktReg = $(clientIDPrefix + liTags[i].firstChild.getAttribute("key"))
            if (aktReg)
                aktReg.className = "isInVisible";
            if (obj.parentNode == liTags[i]) {
                liTags[i].className = "s";
                if (aktReg) {
                    aktReg.style.display = "";
                    aktReg.className = "isVisible";
                    selTag = aktReg;
                }
            }
        }
        $(clientIDPrefix + regID + "_SelItem").value = obj.getAttribute('key');
        //PK: Workaround FireFox
        if (BASE.isFF) {
            selTag.parentNode.style.display = "none";
            setTimeout(function() { selTag.parentNode.style.display = "inline"; }, 1);
        }
    }
}

//DateTime Funktionen
var DT = {
	setDiff: function(start, diff, datepart, patch, zielID, culture, validator) {
		if (validator == null)
			validator = "0";
		var url = "frmCalender.aspx";
		var par = { dynload: "true",
			start: start,
			diff: diff,
			patch: patch,
			datepart: datepart,
			zielID: zielID,
			Culture: culture,
			Validator: validator
		};

		var dynObject = new Ajax.Request(url, { method: 'get', parameters: $H(par).toQueryString(), onComplete: DT.fillDiff });
	},

	fillDiff: function(response) {
		var erg;
		var respText = response.responseText;
		erg = respText.split("|");
		$(erg[1]).value = erg[0];
		if ($("Validator_" + erg[1]) && erg[2] == "1") {
			var objValidator = $("Validator_" + erg[1]);
			var errorRange = objValidator.getAttribute("error_range");
			errorRange = errorRange.replace(objValidator.getAttribute("maxvalue"), erg[0]);
			objValidator.setAttribute("maxvalue", erg[0]);
			objValidator.setAttribute("error_range", errorRange);
		}
		$(erg[1]).onchange;
	},

	dayDiff: function(strDatumVon, strDatumBis) {
		var datumVon = DT.getDate(strDatumVon);
		var datumBis = DT.getDate(strDatumBis);
		var msVon = Date.parse(datumVon);
		var msBis = Date.parse(datumBis);
		var diff = (msBis - msVon) / (1000 * 60 * 60 * 24);
		return Number(diff.toFixed(0));
	}
}

// returns document.getElementById[id_index_subId] || id_index[subId==null] || id[index==null])
// eg.: $$("grdCategory", 3, "Flaeche1") -> document.getElementById('_ctl0__ctlX_grdCategory_3_Flaeche1')
// !!! REQUIREMENT(CodeFile): base.renderClientIds(new Control[] {grdCategory, ...});
function I$(id, index, subId, key) {
	return $(I$ID(id, index, subId, key));
}

function N$(id) {
	if (idPrefix)
		return $(idPrefix + id);
	else
		return $(id);
}

function N$F(id) {
	return $F(N$(id));
}

function I$ID(id, index, subId, key) {
	if (key == null)
		key = "";
	var e = "ClId" + key + "." + id;
	var ev = eval(e);

	if (index != null) {
		index = index.toString();
		if (index == "" && subId != null)
			ev += "_" + subId;
		else if (subId != null)
			ev += "_" + index + "_" + subId;
		else
			ev += "_" + index;
	}
	return ev;
}

function I$IX(id, subId, key, obj) {
	var o = $(obj);
	if (obj) {
		var objId = obj.id;
		if (subId == null || subId == "") {
			var tmp = objId.substring(I$ID(id).length);
			var tmptmp = tmp.split("_");
			if (tmptmp.length > 1)
				subId = tmptmp[2];
		}

		var t = null;
		var i = 0;
		while (i > -1) {
			t = I$(id, i, subId, key);
			if (t) {
				if (t.id == objId)
					return i;
			}
			else
				return -1;
			i++;
		}
	}
	else
		return -2;
}

function lTrim(value) {
    var re = /\s*((\S+\s*)*)/;
    return value.replace(re, "$1");
}

function rTrim(value) {
    var re = /((\s*\S+)*)\s*/;
    return value.replace(re, "$1");
}

function trim(value) {
    return lTrim(rTrim(value));
}

var LTWin;
var LT = {
    openWindow: function(path, art, fk, obj) {
        this.closeWindow();
        var url = location.href.replace(location.search, "?Path=" + path);
        url += "&art=" + art;

        if (!isGuid(fk) && $(fk) && isGuid(trim($(fk).innerHTML)))
            fk = trim($(fk).innerHTML);
        if (!isGuid(fk) && $(fk) && isGuid($(fk).value))
            fk = $(fk).value;

        url += "&fk=" + fk;

        for (var i = 0; i < obj.parentNode.childNodes.length; i++) {
            if (obj.parentNode.childNodes[i] == obj && obj.parentNode.childNodes[i - 1]) {
                url += "&txt=" + obj.parentNode.childNodes[i - 1].value;
                i = obj.parentNode.childNodes.length;
            }
        }
        if (isGuid(fk))
            LTWin = window.open(url, "", "width=565,height=400,scrollbars=1,resizable=0,location=no")
        return false;
    },
    closeWindow: function() {
        if (LTWin != null) {
            LTWin.close();
            LTWin = null;
        }
    }
}

var PopUp = {
	open: function(sender, link, name, height, width) {
		var parameter = "width=" + width + ",height=" + height
		parameter += ",menubar=no,location=no,toolbar=no,status=no";
		parameter += ",resizable=yes,scrollbars=yes";
		var Fenster = window.open(link, name, parameter);
		if (Fenster)
			Fenster.focus();
		return !Fenster
	},

	openLocalisation: function(senderID, link, name, height, width) {
		var parameter = "width=" + width + ",height=" + height
		parameter += ",menubar=no,location=no,toolbar=no,status=no";
		parameter += ",resizable=yes,scrollbars=yes";
		var Fenster = window.open(link, name, parameter);
		if (Fenster)
			Fenster.focus();
		return !Fenster
	}
}

function my_PickFunc() {
	DaD.onDragStart();
}

function my_DragFunc() {
	DaD.onDrag();
	//window.status = 'dd.elements.' + dd.obj.name + '.x  = ' + dd.obj.x + '	 dd.elements.' + dd.obj.name + '.y = ' + dd.obj.y;
}

function my_ResizeFunc() {
	DaD.onResize();
	//window.status = 'dd.elements.' + dd.obj.name + '.w  = ' + dd.obj.w + '	 dd.elements.' + dd.obj.name + '.h = ' + dd.obj.h;
}
function my_DropFunc() {
	DaD.onDrop();
}
var DaD = { //Drag and Drop
	startX: 0,
	startY: 0,
	onDragStart: function() {
		startX = dd.obj.x;
		startY = dd.obj.y;
	},

	onDrag: function()
	{ },

	onResize: function()
	{ },

	onDrop: function() {
		var dropelem = dd.obj
		var ondrop = dropelem.div.getAttribute("ondropped");
		if (ondrop) {//wenn das gedropte Element eine "ondropped" Funktion besitzt
			if (typeof (ondrop) == "string")
				eval(ondrop);
			else
				ondrop();
			//um zu verhindern, dass ein weiteres Click Event ausgefuehrt wird
			dropelem.div.parentNode.onclick = null;
		}
		var dropTarget = dropelem.getEltBelow();
		if (dropTarget == null) {//wenn es ins Leere gezogen wurde
			dropelem.moveTo(startX, startY);
			return;
		}
		ondrop = dropTarget.div.getAttribute("ondrop");
		if (ondrop) {//wenn das Element auf das es gezogen wurde ein ondrop besitzt
			if (typeof (ondrop) == "string")
				eval(ondrop);
			else
				ondrop();
			//um zu verhindern, dass ein weiteres Click Event ausgefuehrt wird
			dropelem.div.parentNode.onclick = null;
		}
	}
}

function lkpImgOver(obj) {
	obj.className += " imgHover";
}

function lkpImgOut(obj) {
	obj.className = obj.className.replace("imgHover", "");
}

function openReportModal(url, framewidth, frameheight) {
	var win = new Window(m_id++, { className: 'alphacube', width: framewidth, height: frameheight, zIndex: 1000, resizable: true, title: "Report", showEffect: Element.show, hideEffect: Element.hide, draggable: true, url: url })
	win.showCenter(true);
}

// true falls 'value' in linearer Liste 'list', Trennzeichen 'seperator'
function isInList(list, value, seperator) {
	if (value == null || value == "")
		return true;
	if (list == null || list == "")
		return false;

	if (seperator == null || seperator == "" || seperator == "")
		return (list.indexOf(value) < 0) ? false : true;
	else {
		var llist = list.split(seperator);
		for (var i = 0; i < llist.length; i++)
			if (llist[i].indexOf(value) >= 0)
			return true;

		return false;
	}
	return false;
}

function PageQuery(q) {
	if (q.length > 1) this.q = q.substring(1, q.length);
	else this.q = null;
	this.keyValuePairs = new Array();
	if (q) {
		for (var i = 0; i < this.q.split("&").length; i++) {
			this.keyValuePairs[i] = this.q.split("&")[i];
		}
	}
	this.getKeyValuePairs = function() { return this.keyValuePairs; }
	this.getValue = function(s) {
		for (var j = 0; j < this.keyValuePairs.length; j++) {
			if (this.keyValuePairs[j].split("=")[0] == s)
				return this.keyValuePairs[j].split("=")[1];
		}
		return null;
	}
	this.getParameters = function() {
		var a = new Array(this.getLength());
		for (var j = 0; j < this.keyValuePairs.length; j++) {
			a[j] = this.keyValuePairs[j].split("=")[0];
		}
		return a;
	}
	this.getLength = function() { return this.keyValuePairs.length; }
}
function queryString(key) {
	var page = new PageQuery(window.location.search);
	var rk = page.getValue(key);
	if (rk)
		return unescape(rk);
	return null;
}

var FW = {//Flowweb
	chPath: null,
	openCharge: function(pk, charge) {
		var chTree = window.open(FW.chPath + charge, "Chargentree");
	}
}

var RS = {//Resize
	resizeable: false,
	lastViewport: 0,
	allCrToResize: [],
	doOnResize: function() {
		if (RS.resizeable)
			RS.resize();
	},

	getWidth: function(widthPanelMin, widthPanelMax, widthPanelReferenceObject) {
		RS.lastViewport = document.viewport.getWidth();
		var width = RS.lastViewport - 40;
		//		if (widthPanelReferenceObject != null)
		//			width = $(widthPanelReferenceObject).offsetWidth;
		if (widthPanelMin > 0 && width < widthPanelMin)
			width = widthPanelMin;
		if (widthPanelMax > 0 && width > widthPanelMax)
			width = widthPanelMax;
		return width;
	},

	resize: function() {
		var width = document.viewport.getWidth(), korrektur = 0;
		if (RS.lastViewport > width) {
			korrektur = RS.lastViewport - width;
			RS.lastViewport = width;
			width = width - 40;
		}
		else {
			RS.lastViewport = width;
			width -= 40;
		}
		for (var i = 0; i < RS.allCrToResize.length; i++) {
			if (RS.allCrToResize[i].widthPanelReferenceObject != null)
				width = $(RS.allCrToResize[i].widthPanelReferenceObject).offsetWidth - korrektur;
			if (RS.allCrToResize[i].widthPanelMin > 0 && width < RS.allCrToResize[i].widthPanelMin)
				width = RS.allCrToResize[i].widthPanelMin;
			else if (RS.allCrToResize[i].widthPanelMax > 0 && width > RS.allCrToResize[i].widthPanelMax)
				width = RS.allCrToResize[i].widthPanelMax;
			var divs = RS.allCrToResize[i].divs;
			for (var j = 0; j < divs.length; j++)
				divs[j].style.width = width;
		}
	}
}

window.onresize = RS.doOnResize