/// <reference path="prototype.js" />
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: " --- ",
    focused: null,
    focusInited : false,
    EscInitUrl: "&initEsc=true",
    Elements: [],
    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() {
        $$("select").each(function(select) { Event.observe(select, 'keydown', BASE.NoReturn, true); });
    },
    InitIEDisabledFields: function() {
        $$('input[disabled][type=text], input[disabled][type=textarea], input[disabled][type=password], input[readonly]').each(function(obj) { obj.addClassName("disabled"); });
    },
    InitF7TextBoxes: function(parent) {
        Element.select(parent, "input[type=text], textarea").each(function(obj) { Event.observe(obj, 'keydown', AL.openF7Win); });
    },
    InitSetFocused: function() {
        var start = new Date();
        $$("input,select,textarea,button").each(
            function(obj) {
                Event.observe(obj, 'focus', BASE.focus);
            }
        );
        var ende = new Date();
    },
    focus: function(ev) {
        BASE.focused = Event.element(ev).id;
    },

    Init: function() {
        BASE.InitNoReturn();
        if (window.name.indexOf("widget") == 0)
            $('DPC').className = 'clear';
        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);
    },
    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;
	var objParent = sender.parentNode;
	objParent.className = "d hv";
	if (sender.childNodes.length == 1)
		return false;
	var objPopup = sender.childNodes.item(1);

	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) - 1;
			objPopup.style.top = nGetAbsoluteTop(objParent) + objParent.offsetHeight;
			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) + objParent.offsetHeight;
		}
	}
	return true;
}
function MenueOut() {
	var sender = this;
	var objParent = sender.parentNode;
	objParent.className = "d";
	if (sender.childNodes.length == 1)
		return false;
	var objPopup = sender.childNodes.item(1);
	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 && td.nodeName.toUpperCase() != "TD")
            td = $("mn").rows[0].childNodes[1];
        if (td) {
            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");
        var width = (spans.length > 0) ? spans[0].offsetWidth : 0;
        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) };
                width += spans[i].offsetWidth;
            }
        }
        tb.setStyle({ width: width + "px" });
    },

    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&x=' + Math.random();
    },

    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";

        var ttCor = 0;
        if (Prototype.Browser.Gecko) {
            var tt = obj;
            do {
                if (tt.className == "regItem") {
                    ttCor += 21;
                    tt = null;
                }
                else
                    tt = tt.offsetParent;
            } while (tt)
        } 
        
        with (panel.style) {
        left = l;
            top = (nGetAbsoluteBottom(obj) + 2 + ttCor).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) {
            AL.loadCss("css/themes/default.css");
            AL.loadCss("css/themes/alphacube.css");
            try { AL.myDialog = Dialog; }
            catch (e) { }
            AL.isInit = true;
        }
    },
    loadCss: function(cssLink) {
        var css = document.createElement("link");
        css.type = "text/css";
        css.href = cssLink;
        css.rel = "stylesheet";
        css.id = "cssAlphacube";
        document.getElementsByTagName('head')[0].appendChild(css);
    },
    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();
        if (!title || trim(title) == '')
            title = '...';
        (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);
    },

    closeEditWin: function(event) {
        AL.hideWin();
        var inp = $('AL_EditWin');
        if (inp && inp.firstChild) {
            var txt = $(inp.getAttribute('last'))
            if (txt) {
                txt.value = inp.firstChild.value;
                fireEvent(txt, 'change');
                BASE.setTextSelected(txt);
            }
        }
    },

    openEditWin: function(sender, event) {
        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_EditWin');
        if (!inp) {
            inp = document.createElement('div');
            inp.setAttribute('hidden', 'hidden');
            inp.setAttribute('id', 'AL_EditWin');
            var st = inp.style;
            st.width = '100%';
            st.height = '100%';

            var t = document.createElement('textarea');
            Event.observe(t, 'keydown', AL.closeF7Win);
            st = t.style;
            st.width = '100%';
            st.height = '95%';

            inp.appendChild(t);

            var i = document.createElement('img');
            i.src = 'images/icon/check2_16.png';
            i.className = 'fr pointer';
            i.onclick = AL.closeEditWin;
            
            var dimg = document.createElement('div');
            dimg.appendChild(i);
            
            inp.appendChild(dimg);

            document.body.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_EditWin');
        win.showCenter(true);
        BASE.setTextSelected(ta);
    },

    closeF7Win: function(event) {
        var keycode = event.keyCode || event.which;
        if (keycode == 118 && (event.charCode ? event.charCode : 0) == 0)
            AL.closeEditWin(event);
    },
    openF7Win: function(event) {
        var keycode = event.keyCode || event.which;
        var sender = event.srcElement;
        if (keycode == 118 && (event.charCode ? event.charCode : 0) == 0 && sender)
            AL.openEditWin(sender, event);
    }
}

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 nGetFirstTagChild(oNode) {
    if (oNode == null)
        return;
    var objChild = oNode.firstChild;
    if (objChild == null)
        return null;
    while (objChild != null && objChild.tagName == null)
        objChild = objChild.nextSibling;
    return objChild;
}

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 {
        var o = $(objID);
        if(o && o.focus)
            o.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, v2 = null;
            if (isCmb) {
                name = refObject.options[iIdx].text;
                value = refObject.options[iIdx].value;
                match = refObject.options[iIdx].getAttribute(("match"));
                v2 = refObject.options[iIdx].getAttribute(("V2"));
            } else {
                match = DC.GetProp(rowsObj[iIdx], "match");
                name = DC.GetProp(rowsObj[iIdx], "Name");
                value = DC.GetRowKey(rowsObj[iIdx]);
                v2 = DC.GetProp(rowsObj[iIdx], "V2");
            }
            if (name == null) 
                continue;
            var option = document.createElement("Option");
            option.text = name;
            option.value = value.toLowerCase();
            if (match != null)
                option.setAttribute('match', match)
            if (v2 != null)
                option.setAttribute('V2', v2)
            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,
    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");

                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) {
                    var div = $(grd.id.replace("NDataGridTA", "") + "NDataGridTASpan");
                    RS.init(div, ND.widthPanelMin, ND.widthPanelMax);
                }
                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 = [];
        var 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];

                    ND.InitEditEventsCh(textarea, rowID, newRow);

                    var minHeight = textarea.getAttribute('minH');
                    var maxHeight = textarea.getAttribute('maxH');
                    if (minHeight && maxHeight && minHeight != maxHeight) {
                        textarea.onblur = function () { this.style.height = minHeight; };
                        textarea.removeAttribute('minH');

                        textarea.onfocus = function () { this.style.height = maxHeight; };
                        textarea.removeAttribute('maxH');
                    }
                    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);
                }
                var iframes = row.getElementsByTagName("iframe");
                for (var ifrIdx = 0; ifrIdx < iframes.length; ifrIdx++) {
                    var iframe = iframes[ifrIdx];
                    if (iframe.getAttribute("fileUpload") == "1")
                        iframe.setAttribute("rowID", rowID);
                }
                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-Combos 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 == null)
            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 parentObjName = dropDownRef.getAttribute("LinkToParentFK");
        if (parentObjName != null && parentObjName != "") {
            var key = $F(ND.getElementInSameRow(elem, parentObjName));
            var showAllIfNull = 0;
            if (dropDownRef.getAttribute("showAllIfNull") == "1")
                showAllIfNull = 1;
            ND.filterItems(key, elem, showAllIfNull);
            return;
        }
        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 to = dropDown.getAttribute("LinkTo");
        if (to == null || to == "")
            return;
        var linkToIDs = to.split("|");
        linkToIDs.each(function (drpID) {
            var linkTo = $(drpID);
            if (linkTo == null)
                return;
            var dropDownRef = $(linkTo.getAttribute("dropDownRef"));
            var key = $F(dropDown);
            if (dropDown.selectedIndex < 0 || key == "null" || key == "0")
                return;
            var gridId = ND.GetGridId(linkTo);
            var gridPrefix = gridId + '__';
            var showAllIfNull = ($(gridPrefix + dropDown.getAttribute('dropDownRef')).getAttribute("showAllIfNull") == "1");
            ND.filterItems(key, linkTo, showAllIfNull);
        });
    },
    filterItems: function (key, linkTo, showAllIfNull) {
        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 (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;

        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';
    },

    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) {
        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 {
                var rowID2 = rowID.substring(0, rowID.lastIndexOf("_"));
                rowID2 = rowID2.substr(rowID2.lastIndexOf("_") + 1);
                eval(delClientEvent + "('" + ND.GetPKValue(gridID + "_", rowID2) + "', rowID2, $(btn.id));");
            }
        }
        return false;
    },

    isRowDeleted: function (gridID, rowIdx) {
        var txtDel = document.forms[0].elements[gridID + "_" + rowIdx + '_Del'];
        if (txtDel == null)
            txtDel = document.forms[0].elements[idPrefix + gridID + "_" + rowIdx + '_Del'];

        if (txtDel == null || txtDel.value == "0")
            return false;
        else
            return true;
    },
    isRowActive: function (gridID, rowIdx) {
        if (ND.isRowDeleted(gridID, rowIdx))
            return false;

        var newRow = ND.isNewRow(gridID, rowIdx);
        var txtState = document.forms[0].elements[gridID + "_" + rowIdx + '_State'];
        if (txtState == null)
            txtState = document.forms[0].elements[idPrefix + gridID + "_" + rowIdx + '_State'];

        return (txtState == null || txtState.value == "1" || (txtState.value == "0" && !newRow))
    },
    isInNewRow: function (obj) {
        return ND.isNewRow(ND.GetGridId(obj).replace(idPrefix, ""), ND.getRowIdx(obj));
    },
    isNewRow: function (gridID, rowIdx) {
        var grd = $(gridID + "_NDataGridTA") || $(idPrefix + gridID + "_NDataGridTA");
        var objNew = grd.rows[Number(rowIdx) + 1];
        return (objNew.getAttribute("new") == "1");
    },

    SetRowClass: function (obj, className, setOrRemove) {
        if (!obj)
            return;
        var tr = ND.SearchParentObjByClass(obj, "d");
        if (tr == null)
            return;
        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;
        if (fullClassName == undefined)
            fullClassName = "";
        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) {
        elem = $(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);
    },
    getElementInSameRow: function (elem, otherColumn) {
        var gridID = ND.GetGridId(elem);
        return $(gridID + '_' + ND.getRowIdx(elem).toString() + '_' + otherColumn);
    },
    getElementPrevRow: function (gridID, rowIdx, column) {//Sucht die vorige Reihe und ignoriert dabei gelöschte Zeilen
        if (rowIdx == 0)
            return;
        var obj = null;
        rowIdx--;
        while (obj == null && rowIdx >= 0) {
            if (ND.isRowDeleted(gridID, rowIdx))
                rowIdx--;
            else
                obj = $(idPrefix + gridID + '_' + rowIdx.toString() + '_' + column);
        }
        return obj; ;
    },
    getElementNextRow: function (gridID, startIdx, column) {//Sucht die nächste Reihe und ignoriert dabei gelöschte und neue, noch nicht aktivierte Zeilen, Übergabe von -1 sucht die erste aktive Zeile
        var rowIdx = startIdx;
        if (rowIdx == -1)
            rowIdx = 0;
        var fullGridID = gridID;
        var txtState = document.forms[0].elements[gridID + "_" + rowIdx + '_State'];
        if (txtState == null) {
            txtState = document.forms[0].elements[idPrefix + gridID + "_" + rowIdx + '_State'];
            fullGridID = idPrefix + gridID
        }
        if (txtState == null)
            return null;
        if (startIdx == -1 && ND.isRowActive(gridID, rowIdx))
            return $(fullGridID + '_' + rowIdx.toString() + '_' + column);
        rowIdx++;
        txtState = document.forms[0].elements[fullGridID + "_" + rowIdx + '_State'];
        if (txtState == null)
            return null;
        while (txtState != null) {
            if (!ND.isRowActive(gridID, rowIdx)) {
                rowIdx++;
                txtState = document.forms[0].elements[fullGridID + "_" + rowIdx + '_State'];
            }
            else
                return $(fullGridID + '_' + rowIdx.toString() + '_' + column);
        }
    },
    usrSettings: function (param, wi, hi, event) {
        AL.openWin(document.location.pathname + '?' + param, wi || 400, hi || 800, ' ');
    },
    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,
    //autostart wird hier ignoriert - todo
    init: function(hi, lo, fkt, dez, auto, func) {
        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);
    },

    //Nur in eine Richtung, dafuer koennen mehrere Felder als Multiplikatoren angegeben werden.
    initOneWay: function(elements, target, faktor, dez, auto, func) {
        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);

        }
        if (auto) {
            FAKT.calculateOW($(elements[0]));
        }
    },

    initGrid: function(gridID, hi, lo, fkt, dez, auto, func) {
        var grid = $(gridID + "_NDataGridTA");
        if (!grid)
            return;
        var idShort = gridID.replace("NDataGridTA", "");
        var 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];
        }
    },

    initGridOneWay: function(gridID, elementCols, targetCol, faktor, dez, auto, func) {
        var grid = $(gridID + '_NDataGridTA');
        if (!grid)
            return;
        var idShort = gridID.replace('NDataGridTA', '');

        if (elementCols.lenght == 0 || !$(idShort + '_0_' + targetCol))
            return;
        rows = grid.getElementsByTagName('TR');
        var j = 0;
        var rowIdx = j;
        var row = rows[j]
        while (row) {
            if (ND.FindClassName(row, 'd') && !ND.FindClassName(row, 'll')) {
                var elems = [];
                for (var i = 0; i < elementCols.length; i++) {
                    elems[i] = $(idShort + '_' + rowIdx + '_' + elementCols[i]);
                }
                var target = $(idShort + '_' + rowIdx + '_' + targetCol);
                FAKT.initOneWay(elems, target, faktor, dez, auto, func);
                rowIdx++;
            }
            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]();

        fireEvent($(FAKT.hiField[idx]), "change")
        //$(FAKT.hiField[idx]).fireEvent("onchange");
    },

    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();
        }
    },
    changeDezimalStellen: function (stellen) {
        for (var i = 0; i < FAKT.dezimalStellen.length; i++)
            FAKT.dezimalStellen[i] = stellen;
    }
}

/***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: [],
    felderSummieren: [],
    felderSubtrahieren: [],
    feldZiel: [],
    autoStart: [],
    callFunction: [],
    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 idShort = $(gridID).id.replace("_NDataGridTA", "");
        var rowIdx = 0;
        var idFeldZiel = feldZiel;
        if (typeof (feldZiel) == "object")
            idFeldZiel = feldZiel.id;
        var objFeldZiel = $(idShort + "_" + rowIdx + "_" + idFeldZiel);
        while (objFeldZiel != null) {
            var txtGridSummieren = [], txtGridSubtrahieren = [];
            for (iSum = 0; iSum < felderSummieren.length; iSum++)
                txtGridSummieren[iSum] = idShort + "_" + rowIdx + "_" + felderSummieren[iSum];
            if (felderSubtrahieren) {
                for (iSub = 0; iSub < felderSubtrahieren.length; iSub++)
                    txtGridSubtrahieren[iSub] = idShort + "_" + rowIdx + "_" + felderSubtrahieren[iSub];
            }
            if (typeof (dezimalStellen) == "object")
                dezimalStellen = NUM.getNumberO(dezimalStellen);
            SUM.Init(txtGridSummieren, txtGridSubtrahieren, objFeldZiel, autoStart, dezimalStellen, callFunction);
            objFeldZiel = $(idShort + "_" + (++rowIdx) + "_" + idFeldZiel);
        }
    },
    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 (target.onchange)
                    target.onchange();
                else
                    fireEvent(target, "change");
            }
        }
        if (SUM.callFunction[sumIndex])
            eval(SUM.callFunction[sumIndex] + "()");
    },
    changeDezimalStellen: function (stellen) {
        for (var i = 0; i < SUM.dezimalStellen.length; i++)
            SUM.dezimalStellen[i] = stellen;
    }
}

//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 != null && 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 == 'SPAN')
		    $(obj).innerHTML = val;
		else 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, onlyOne) {
        var tds = $A($(treeID).getElementsByTagName("td"));
        for (var tdi = 0; tdi < tds.length; tdi++) {
            var td = tds[tdi];
            td.setAttribute('treeID', treeID);
            if (td.className == "x" || td.className == "c") { //AufZuklappen initialisieren
                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.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") {
                cb.onclick = NT.getCBOnclick(cb.parentNode.previousSibling.getAttribute("value"), cb.onclick, treeID, onlyOne);
            }
            else if (cb.parentNode.previousSibling.getAttribute("enabled") == "false")
                cb.disabled = true;
            /*});*/
        }
    },

    getCBOnclick: function (key, oc, treeID, onlyOne) {
        return function () {
            NT.ItemCheck(this, key, 1, treeID, onlyOne);
            if (oc)		//&& typeof(idPrefixW5) == "string" typeof idPrefixW5 is string == easy erfassung		    
                oc.call(this, this);
         };
    },

    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.getAttribute('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, onlyThis) {
        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 && !onlyThis)
                    NT.UncheckPreviousNodes(chkBox, hidd);
            }
        }
        if (!!onlyThis || 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) {

        if (obj == null) {
            obj = $(id + "_chk");
            if (obj != null)
                obj = $(id + "_chk").checked = true;
        }


        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 && (obj == null || x.checked != obj.checked))
                    x.click();
            }

        }
    }
}

var MS = { //Multiselect
    ms: false,
    msButtons: [],
    firstUsed: [],
    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")) {
            if (MS.msButtons.indexOf(bt.id) == -1)
                MS.msButtons[MS.msButtons.length] = bt.id;
            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);
        var oc;
        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";
            if (bt.getAttribute("oc") != null && bt.getAttribute("oc") != "")
                oc = bt.getAttribute("oc");
        }
        else {
            var div;
            if (MS.firstUsed.indexOf(bt.id) == -1) {
                div = document.createElement("div");
                div.className = "DivMultiselect";
                div.id = "div" + bt.id;
                Event.observe(div, 'click', MS.cancelBubble, true);
                document.body.appendChild(div);
                MS.firstUsed[MS.firstUsed.length] = bt.id;
            }
            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);
        MS.ctlOnchange(bt, oc);
        Event.stop(ev);
    },

    ctlOnchange: function(bt, oc) {
        if (oc != null)
            eval(oc + "($('" + bt.id.replace("_Expand", "") + "'))");
    },

    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) {
        var oc, ocBtn;
        for (var i = 0; i < MS.msButtons.length; i++) {
            if (bt == null || MS.msButtons[i] != bt.id) {
                var btn = $(MS.msButtons[i]);
                if (btn.value == "<" || btn.value == ">") {
                    if (btn.value == "<" && bt == null && (btn.getAttribute("oc") != null && btn.getAttribute("oc") != "")) {
                        oc = btn.getAttribute("oc");
                        ocBtn = btn;
                    }
                    btn.value = ">";
                }
                else
                    btn.className = "msButton";
                btn.open = "closed";
                if ($("div" + MS.msButtons[i])) {
                    if (MS.dynsave == "true" && ($("div" + MS.msButtons[i]).style.display = "none") && MS.check != "") { // save mit Ajax
                        SaveMultiselect(MS.DataTable, MS.pk_table, MS.hidd.value);
                        MS.check = "";
                    }
                    $("div" + MS.msButtons[i]).style.display = "none";
                    var msGrid = null;
                    try {
                        msGrid = ND.GetGridId(btn);
                    }
                    catch (e) { }
                    if (msGrid != null && msGrid != "") {
                        var rest = MS.msButtons[i].replace(ND.GetGridId(btn) + "_", "");
                        var rowID = rest.substr(0, rest.indexOf("_"));
                        var txtStateId = msGrid + "_" + rowID + "_";
                        ND.SetTxtEdit(btn, txtStateId, btn.getAttribute("newRow"));
                    }
                }
            }
        }
        MS.ctlOnchange(ocBtn, oc);
    },

    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) == null) ? $(clientIDPrefix + regID).getElementsByTagName("li") : $(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 = nGetFirstTagChild(tr);
				if (widthPanelMin > 0 && td) {
					var div = nGetFirstTagChild(td);
					if (div && div.tagName == "DIV" && div.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;
                        }
                        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;
        }
        var objSelItem = $(selItemId);
        if (!objSelItem)
            objSelItem = $(clientIDPrefix + selItemId);
        if (objSelItem)
            objSelItem.className = "isVisible";
    },

    Select: function(clientIDPrefix, regID, obj) {
        var liTags = ($(regID) == null) ? $(clientIDPrefix + regID).getElementsByTagName("li") : $(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));
	}
}


function validateTimeInput(obj, outside) {
    var val = obj.value;
    var oval = (obj.getAttribute("oval") == null || outside) ? "" : obj.getAttribute("oval");

    if (obj.id.indexOf("_Hrs") > 0)
        val = validateTimePart(val, oval, 23);
    else
        val = validateTimePart(val, oval, 59);

    obj.value = val;
    obj.setAttribute("oval", val);

    var vobj = $(obj.id.replace("_Hrs", "").replace("_Min", ""));
    var vval = vobj.value.split(" ")[0] + " ";
    vval += $(vobj.id + "_Hrs").value + ":";
    vval += $(vobj.id + "_Min").value + ":00";
    vobj.value = vval;

    if (obj.getAttribute("oc"))
        eval(obj.getAttribute("oc"));

    if (!outside)
        obj.select();
}

function validateTimePart(v, vv, r) {
    var tval = vv + "" + v;
    if (Number(tval) > r)
        tval = v + "";
    if (Number(tval) > r)
        tval = tval.substring(tval.length - 1, tval.length);
    tval = Number(tval) + "";
    if (tval.length == 1)
        tval = "0" + tval;

    return tval;
}






// 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();
    },
    init: function (div, widthPanelMin, widthPanelMax) {
        var width = RS.getWidth(widthPanelMin, widthPanelMax, null);
        div.style.width = width;
        div.addClassName("gridOVx");
        var divs = new Array(1);
        divs[0] = div;
        RS.allCrToResize[RS.allCrToResize.length] = { regID: div.id, widthPanelMin: widthPanelMin, widthPanelMax: widthPanelMax, widthPanelReferenceObject: null, divs: divs };
        RS.resizeable = true;
    },
    getWidth: function (widthPanelMin, widthPanelMax, widthPanelReferenceObject) {
        RS.lastViewport = document.viewport.getWidth();
        var width = RS.lastViewport - 40;
        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
