/// <reference path="prototype-1.7.js" />
/// <reference path="jquery-1.6.2-vsdoc.js" />
var NPage_NoValidation = false;
var $j = jQuery.noConflict();
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),
    focused: null,
    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 () {
        $j("select").keydown(BASE.NoReturn);
    },
    InitIEDisabledFields: function () {
        $j("input[disabled][type=text], input[disabled][type=textarea], input[disabled][type=password], input[readonly]").addClass("disabled");
    },
    InitF7TextBoxes: function (parent) {
        $j(parent).find("input[type=text], textarea").keydown(AL.openF7Win);
    },
    InitSetFocused: function () {
        $j("input,select,textarea,button").focus(function (ev) { BASE.focused = ev.currentTarget.id });
    },
    Init: function () {
        Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt($j.browser.version.slice(0, 1)) == 6;
        BASE.InitNoReturn();
        if (window.name.indexOf("widget") == 0)
            $('DPC').className = 'clear';
        $j("select[Grouped=1]").not("[GroupedReady=1]").each(DC.makeGroup);
        if (N$("txtUser") && N$("txtPassword")) { }
        else
            var ping = new Ajax.Request(location.href, { method: 'get', parameters: $H({ dynload: 'true', param: '' })});
        if (BASE.isIE) {
            BASE.InitIEDisabledFields();
            if (document.documentMode && document.documentMode >= 9)
                return;
            $j("table.ND tr td:last-child, table.ND tr th:last-child").css("border-right", "none");
            return;
        }
        $j("TD img.helps").addClass("nw");
    },
    NoReturn: function (event) {
        if (event.keyCode == 8)
            event.preventDefault();
    },
    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;
}

var BlockSubmitCheckEvent = "BlockSubmitCheckEvent";
function NValidatorOnSubmit() {
    var block = { blockSubmit: false };
    $j(document).trigger(BlockSubmitCheckEvent, block);
    if (block.blockSubmit)
        return false;
    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.display = 'none';
	$("ifrMenubg").style.visibility = 'hidden';
}
function MenuisShowElement(obj) {
	return (obj.style.display == 'block');
}
function nMenuShow(obj) {
	obj.style.zIndex = 999;
	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.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');
    },
    hideMenus: function (init) {
        var speed = (init) ? 0 : 300;
        if (!MN.menusHidden) {
            $j("div.DHNav,div#DivNSub,div#DivNSub2,div.linkHome").hide(speed);
            $j("body").addClass("nmn");
            $j("div#DCON").css("margin-top", "0").find("div#DPSH div.ocb").addClass("ocbo");
            MN.menusHidden = true;
        }
        else {
            $j("div.DHNav,div#DivNSub,div#DivNSub2,div.linkHome").show(speed);
            $j("body").removeClass("nmn");
            $j("div#DCON").css("margin-top", "").find("div#DPSH div.ocb").removeClass("ocbo");
            MN.menusHidden = false;
        }
        if (!init)
            var myAjax = new Ajax.Request(location.href + "&dynload=true&saveSesamHidden=1&id=btnHideMenus&hidden=" + MN.menusHidden);
        $j(window).resize();
    }
};

//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");
            $j("<img />").attr('src', '../css/themes/alphacube/top-middle.gif');//Preload Images
            $j("<img />").attr('src', '../css/themes/alphacube/bottom-middle.gif');
            $j("<img />").attr('src', '../css/themes/alphacube/frame-right.gif');
            $j("<img />").attr('src', '../css/themes/alphacube/frame-left.gif');
            $j("<img />").attr('src', '../css/themes/alphacube/left-top.gif');
            $j("<img />").attr('src', '../css/themes/alphacube/right-top.gif');
            $j("<img />").attr('src', '../css/themes/alphacube/bottom-left-c.gif');
            $j("<img />").attr('src', '../css/themes/alphacube/bottom-right-c.gif');
            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.init();
        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 = '380px';  /*100% IE7 bug */

            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 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 || Prototype.Browser.Opera)
            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;
                $j(drp).change();
                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);
                    }
                }
           );
    },

    ReqLinkedCmbSync: 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: false,
                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);

        if (!zielObj) {
            var idFix = idPrefix + id;
            if ($(idFix)) 
                id = idFix;
            else {
                idFix = idPrefix + "_ctl0_" + id;
                if ($(idFix)) 
                    id = idFix;
            }
            zielObj = $(idFix);
        }

        //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;
    },
    makeGroup: function (idx, drp) {
        var lastGroup = "";
        for (var i = 0; i < drp.options.length; i++) {
            var option = drp.options[i];
            if (DC.isNullValue(option.value))
                continue;
            var aktGroup = option.getAttribute("G");
            if (aktGroup == lastGroup)
                continue
            else
                $j(drp).find("option[G='" + aktGroup + "']").wrapAll("<optgroup label=\"" + aktGroup + "\">");
            lastGroup = aktGroup;
        }
        drp.setAttribute("GroupedReady", "1");
    },
    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;
        return DC.isNullValue(value);
    },
    isNullValue: function (value) {
        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,
    fixedHeader: 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);
                if (grd.getAttribute("FixedHeader") == "true")
                    ND.fixedHeader = true;
                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);
                $j(grd).find("select[Grouped=1]").not("[GroupedReady=1]").each(DC.makeGroup);
                ND.doRowAnimation(grd, 1, 0);
            }
        }
    },

    InitSort: function (grid) {
        //klassisch initialisieren oder bei Fehler
        if (ND.fixedHeader == false || !(document.getElementById(grid.getAttribute("id") + "_fixedHeader"))) {
            var 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;
                }
            }
        }
        if (ND.fixedHeader == true && (document.getElementById(grid.getAttribute("id") + "_fixedHeader"))) {
            var fixedTable = $(grid.id + "_fixedHeader");
            var thCells_fixed = $A(fixedTable.getElementsByTagName("TH"));
            for (var ci = 0; ci < thCells_fixed.length; ci++) {
                var cell = thCells_fixed[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 (!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) {
                row.select("td[eb]").each(ND.InitSesam);
                /*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 if (ip.getAttribute("IsDate") == "1")
                                ND.InitEditEventsDate(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 {
                        if (button.id.search(/LkpButton$/) != -1)
                            ND.InitLkpButton(button);
                        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); };
        $(obj).observe("change", fkt, true);
        //$j(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;
        $(obj).observe("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); };
        $(obj).observe('keyup', fkt);
    },
    InitEditEventsDate: function (obj, rowID, newRow, idx) {
        $(obj).observe("blur", DT.pvd, true);
        $(obj).observe("change", DT.pvd, true);
        var calImg = obj.nextSibling;
        if (calImg && !calImg.disabled) {
            var objID = obj.id;
            Event.observe(calImg, "click", function (ev) { DT.clk(objID, ev.element(), '', ev); });
        }
        ND.InitEditEventsOk(obj, rowID, newRow);
    },
    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); };
        $(obj).observe('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); });
        $(obj).observe('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 MS11: opera auch contextmenu!! //(Prototype.Browser.Opera ? 'click' : */
        Event.observe(obj, '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);
        LKP.init($(obj.id.replace("_LkpButton", "") + "_Text"));
    },
    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);
        /*    if (Prototype.Browser.WebKit) {
        if (btn.parentElement.tagName.toLowerCase() == "button" && btn.tagName.toLowerCase() == "img")
        btn = btn.parentElement;
        }*/
        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 (refOpt.getAttribute("G") != null)
                opt.setAttribute("G", refOpt.getAttribute("G"));
            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);
        var master = $(linkTo.getAttribute('dropDownRef'));
        var gridPrefix = "";
        if (!master) {
            var gridId = ND.GetGridId(linkTo);
            master = $(gridId + '__' + linkTo.getAttribute('dropDownRef'));
            gridPrefix = gridId + '__';
        }
        if (!master || master.selectedIndex < 0 || key == 'null')
            return;

        if (linkTo.getAttribute("nullAllowed") == "1" && linkTo.options.length < 1) {
            var opt = document.createElement('option');
            opt.value = "null";
            opt.text = "---";
            linkTo.options.add(opt)
        }

        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('|'); 
            var fk_parent = optCopy.getAttribute("fk_match");
            if (showAllIfNull || fk_parent == key) {
                var opt = document.createElement('option');
                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.selectedIndex > -1) ? select.options[select.selectedIndex].getAttribute("match") : null;
        if (code != null)
            inp.value = code;
        select.parentNode.insertBefore(inp, select);
        $(select.parentNode).addClassName("nw");
    },

    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' && $j(txtState).attr("newRowInited") != "1") {
            $j(document).trigger("GridNewRowAdded");
            $j(txtState).attr("newRowInited", "1");
        }
        if (newRow == '1' && txtState.parentNode.parentNode.nextSibling != null)
            $j(txtState.parentNode.parentNode.nextSibling).removeClass("dn");
    },

    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 grd = $(gridID + "NDataGridTA");
        if (!grd || !pks)
            return;
        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 (cell.hasClassName("leaf_click"))
            cell.up().click();
        else 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);
                if ($F(del) == "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.GetGridId(obj);
        if (tab)
            tab = tab.replace("_fixedHeader", "");
        var fieldID = tab + "_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;
    },
    doRowAnimation: function (grid, start, count) {
        var animateRow = $j(grid).find("tr.highlight");
        if (animateRow.length == 0)
            return;
        if (start)
            animateRow.removeClass("hv").css("background-color", "rgb(254, 189, 104)");
        if (Prototype.Browser.IE && (document.documentMode == null || document.documentMode < 9)) {
            var color1 = "rgb(255,231,153)", color2 = "rgb(254, 189, 104)";
            animateRow.animate({ opacity: 0.9 }, 300, function () {
                var color = color2;
                if (count % 2 == 0)
                    color = color1;
                $j(this).css("background-color", color);
                if (count < 7)
                    ND.doRowAnimation(grid, 0, ++count);
            });
        }
        else
            animateRow.fadeTo(350, 0.1).fadeTo(350, 1).fadeTo(350, 0.1).fadeTo(350, 1).fadeTo(350, 0.1).fadeTo(350, 1).fadeTo(350, 0.1).fadeTo(350, 1);
    },
    Postback: function (row, postBackFieldId, pk, postBackCondition) {
        postBackFieldId = postBackFieldId || row.getAttribute('fieldID');
        //webkit fix: "null || value" nimmt trotzdem 'null'
        if(!pk)
            var 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) {
        return Element.hasClassName(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);
        for (var i = 0; i < CheckP.rows.length; i++) {
            var rrowFeld = idPrefix + gridId + '_' + i + '_' + colName;
            if ($(rrowFeld) && $(rrowFeld).disabled && NUM.getNumberO(rrowFeld) == aktuellesFeld) {
                $(aktFeldObj).value = aktuellesFeld = ND.tmpWertR;
                i = CheckP.rows.length
            }
        }
        if (aktuellesFeld <= CheckP.rows.length && aktuellesFeld != ND.tmpWertR) {
            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 {
            $(aktFeldObj).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) {
        var tab = $j($(elem)).closest("table.ND");
        if (tab.length > 0)
            return tab[0].id.replace("_NDataGridTA", "");
        return null;
    },
    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) {
        var width = 0;
        if (typeof (window.innerWidth) == 'number') {
            //Non-IE
            width = window.innerWidth;
        }
        else if (document.documentElement && document.documentElement.clientWidth) {
            //IE 6+ in 'standards compliant mode'
            width = document.documentElement.clientWidth;
        }
        var height = 0;
        if (typeof (window.innerHeight) == 'number') {
            //Non-IE
            height = window.innerHeight;
        }
        else if (document.documentElement && document.documentElement.clientHeight) {
            //IE 6+ in 'standards compliant mode'
            height = document.documentElement.clientHeight;
        }
        AL.openWin(document.location.pathname + '?' + param, wi || Math.floor(width / 2), hi || (height - 50), '...');
    },
    webLink: function (obj) {
        return (obj.getAttribute("href") != location.href + "#")
    },

    updateWebLink: function (obj) {
        var link = trim(obj.value);
        var linkObj = $j(obj).nextAll("a");
        if (isEmail(obj.value))
            linkObj.attr("href", "mailto:" + link).removeClass("dn");
        else if (isUrl(obj.value))
            linkObj.attr("href", ((link.indexOf("http://") == -1) ? "http://" : "") + link).removeClass("dn");
        else
            linkObj.addClass("dn");
    },
    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 });
    }
};

/* MG: Zusaetzlich in Grid Flag checkOneOnly eingebaut, um hier abfragen zu können, ob nur eine Zeile selektiert werden darf
  --> wenn gesetzt, dann alle anderen unchecked setzen, wenn eine Zeile selektiert wird */
function setCheck(o, val) {
    var gridid = ND.GetGridId(o) + '_';
    var rowidx = ND.getRowIdx(o);
	var o1 = $(gridid + "Check");
    var coo = $(gridid + "_checkOnlyOne");
    if (o != null && o1 != null) {
        if (o.checked)
            if (coo.checked) {
                o1.value = val + ";";
                gridEnsureChecked(val, gridid, rowidx, false);
            } else
                o1.value += val + ";";
        else
            o1.value = o1.value.replace(val + ";", "");
	}
}

/* MG110211: rausnehmen aus NContextMenue und hier einfuehren */
function gridEnsureChecked(pk, gridId, rowIdx, contextMenu) {
    var ckBx = $(gridId + rowIdx + '___check');
    if (!ckBx)
        return;
    if ((ckBx.checked && !contextMenu) || (!ckBx.checked && contextMenu)) {
        // wen row != checked und Kontextmenüaufruf, dann alle anderen unchecked setzen, wenn row = checked und NICHT Kontextmenüaufruf, dann alle anderen unchecked setzen
        setAllGridRowsUnchecked(gridId);
        ND.rowCheck(false, pk, gridId, rowIdx);
    }
}

function setAllGridRowsUnchecked(gridId, chkCol) {
    if (!chkCol) chkCol = '___check';
    var rows = $(gridId /*endet hier mit _*/ + "NDataGridTA").rows;
    $(gridId + "Check").value = '';
    ND.ClearAktRows(gridId);
    for (i = 0; i < rows.length; i++) {
        if (rows[i].getAttribute('pk')) {
            var cb = $(gridId + (i - 1) + chkCol);
            if (cb) {
                cb.checked = false;
            }
        }
    }
}

///// 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", "");
        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.setAttribute('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 = cell.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.getAttribute('val');
        var treeID = cell.getAttribute('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.getAttribute('val');
        var treeID = cell.getAttribute('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 ($("ms_ignore_" + chkBox.getAttribute("parentElementID") + "-" + cKey)) {
            chkBox.checked = !chkBox.checked;
            eval($("ms_ignore_" + chkBox.getAttribute("parentElementID") + "-" + cKey).getAttribute("alert"));
        }
        else 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)
                    continue;
                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 + "_";
                        if ($(txtStateId + "btnDel") && $(txtStateId + "btnDel").hasClassName("deleted"))
                        { }
                        else
                            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) {
            if (srcObj == null || srcObj.id == null || srcObj.id.indexOf("_btnDel") == -1)
	            MS.refresh();
	    }
	}
	if (MS.noCleanup)
		MS.noCleanup = false;
if ($("ncalender")) {
    $("ncalender").style.visibility = "hidden";
    $("ncalender").style.display = "none"; //IE7

}

	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 = [];
        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.removeClassName("isInVisible"); tr.removeClassName("isVisible");
                tr.addClassName("dn");
                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 + "px";
                    RS.widthPanelMinScrollbarCheck(div);
                    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.removeClassName("dn");

        if ($(regID)) {
            var jsOnload = $(regID).getAttribute("onload");
            if (jsOnload != null && !jsOnload.blank())
                window.setTimeout(jsOnload + "('" + selItemId + "');", 100);
        }

    },

    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.addClassName("dn");
            if (obj.parentNode == liTags[i]) {
                liTags[i].className = "s";
                if (aktReg) {
                    aktReg.style.display = "";
                    aktReg.removeClassName("dn");
                    selTag = aktReg;
                }
            }
        }
        $(clientIDPrefix + regID + "_SelItem").value = obj.getAttribute('key');
        //PK: Workaround FireFox
        if (BASE.isFF && selTag) {
            selTag.parentNode.style.display = "none";
            setTimeout(function () { selTag.parentNode.style.display = "inline"; }, 1);
        }

        if ($(regID)) {
            var jsOnload = $(regID).getAttribute("onload");
            if (jsOnload != null && !jsOnload.blank())
                window.setTimeout(jsOnload + "('" + obj.getAttribute("key") + "');", 1);
        }
    }
};

//DateTime Funktionen
var DT = {
    clk: function (parentvalue, img, dateFormat, event) {
        img = $(img); //IE7
        if (img && (img.disabled || (img.previous() && (img.previous().disabled || img.previous().hasClassName("disabled")))))
            return false;
        try {
            var ifrCal = $("ncalender");
            if (ifrCal)
                ifrCal.style.display = "";//IE7
            if (ifrCal.style.visibility == "visible")
                ifrCal.style.visibility = "hidden";
            else {
                var objParentvalue = $(parentvalue);
                with ($("ncalender")) {
                    style.left = nGetAbsoluteLeft(objParentvalue) + "px";
                    style.top = nGetAbsoluteBottom(objParentvalue) + "px";
                    style.visibility = 'visible';
                    src = 'frmCalender.aspx?date=' + objParentvalue.value + '&item=' + parentvalue + '&dateFormat=' + dateFormat + '&culture=' + DT.uCult;
                }
                if (event)
                    Event.stop(event);
                return true;
            }
        }
        catch (e) { }
    },
    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));
    },
    // hwg PreValidation
    // supports more usabilty: 'Date-Input': '.', '-', '/', ',', ' ' are supported
    // missing date-parts will be completed to date(today) due to culture
    pvd: function (id, defaultDate, setDefault) {
        if (!defaultDate)
            defaultDate = DT.compD;
        if (typeof (id) == "object")
            id = id.element().id;
        var seperators = new Array('.', '-', '/', ',', ' ');
        var dateVal = $(id).value;
        if (dateVal == "" && setDefault == null)
            return;
        for (var i = 0; i < seperators.length; i++)
            while (dateVal.indexOf(seperators[i]) > 0)
                dateVal = dateVal.replace(seperators[i], '|');

        while (dateVal.indexOf('||') > 0)
            dateVal = dateVal.replace('||', '|');

        var cultureVal = DT.curCult;
        for (var i = 0; i < seperators.length; i++)
            while (cultureVal.indexOf(seperators[i]) > 0)
                cultureVal = cultureVal.replace(seperators[i], '|');

        while (cultureVal.indexOf('||') > 0)
            cultureVal = cultureVal.replace('||', '|');

        var dateValues = dateVal.split('|'), defaultValues = defaultDate.split('|'), cultureValues = cultureVal.split('|');
        var yearIndex = 0, monthIndex = 0, dayIndex = 0;
        for (var i = 0; i < cultureValues.length; i++) {
            if (cultureValues[i] == 1975)
                yearIndex = i;
            if (cultureValues[i] == 10)
                monthIndex = i;
            if (cultureValues[i] == 18)
                dayIndex = i;
        }

        dateValues[yearIndex] = Number(dateValues[yearIndex]).toString().replace("NaN", "");
        if (dateValues[yearIndex]) {
            if (dateValues[yearIndex].length < 3) {
                if (dateValues[yearIndex].length < 2)
                    dateValues[yearIndex] = '0' + dateValues[yearIndex];
                dateValues[yearIndex] = '20' + dateValues[yearIndex];
                if (Number(dateValues[yearIndex]) > Number(defaultValues[0]) + 5)
                    dateValues[yearIndex] = Number(dateValues[yearIndex]) - 100;
            }
            else if (dateValues[yearIndex].length > 4)
                dateValues[yearIndex] = defaultValues[0];
            defaultValues[0] = dateValues[yearIndex];
        }
        if (dateValues[monthIndex])
            defaultValues[1] = Number(dateValues[monthIndex]).toString();
        if (dateValues[dayIndex])
            defaultValues[2] = Number(dateValues[dayIndex]).toString();

        for (var i = 1; i < 3; i++)
            if (defaultValues[i].length == 1)
                defaultValues[i] = '0' + defaultValues[i];

        var preValidatedDate = DT.curCult;
        var preY = Number(defaultValues[0]);
        var preM = Number(defaultValues[1]) - 1;
        var preD = Number(defaultValues[2]);
        var preDate = new Date(preY, preM, preD);

        if (preDate.getFullYear() != preY || preDate.getMonth() != preM || preDate.getDate() != preD)
            preValidatedDate = "";
        else {
            preValidatedDate = preValidatedDate.replace('1975', defaultValues[0]);
            preValidatedDate = preValidatedDate.replace('10', defaultValues[1]);
            preValidatedDate = preValidatedDate.replace('18', defaultValues[2]);
        }

        $(id).value = preValidatedDate;
        if (NPage_Validators) {
            for (var i = 0; i < NPage_Validators.length; i++) {
                if (NPage_Validators[i] == null)
                    continue;
                if (NPage_Validators[i].id == 'Validator_' + id)
                    NValidatorValidate(NPage_Validators[i]);
            }
        }
    }
};

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$j(ids) {
    var idString = "";
    for (var i = 0; i < N$j.arguments.length; i++)
        idString += "#" + idPrefix + N$j.arguments[i] + ",";
    idString = idString.substring(0, idString.length - 1);
    return $j(idString);
}

/*jQuery Intact Erweiterungen*/
(function ($) {
    $.fn.valI = function (value) {
		///	<summary>
		///		Set the value of every matched element, form element (value) or other DOM element (innerText)
		///	</summary>
		///	<returns type="jQuery" />
		///	<param name="value" type="String">
        ///		A string of text or an array of strings to set as the value property of each matched form element and the innerText property of each matched other element.
		///	</param>
        if (value === undefined)
            return this.val() || this.text();
        return this.val(value).text(value);
    };
})(jQuery);

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;
	if (eval(e)) {
	    var ev = eval(e + "." + id);
	    if (index != null) {
	        index = index.toString();
	        if (index == "" && subId != null)
	            ev += "_" + subId;
	        else if (subId != null)
	            ev += "_" + index + "_" + subId;
	        else
	            ev += "_" + index;
	    }
	    return ev;
	}
	return null;
}

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 jQuery.trim(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 = {
    vc: "VController.aspx?PopUp=True&Path=",
    id: 0,
    fkDokumentmappe: null,
    filePath: null,
	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;
		}
	}
};

var LKP = {
    init: function (obj) {
        if (obj != null)
            $(obj).observe("keyup", function (evt) {
                if (evt.keyCode == Event.KEY_TAB)
                    return;
                $(this.id.replace("_Text", "")).value = "";
                this.removeClassName("selected");
            })
    },
    setChecked: function (obj) {
        if (obj != "" && $(obj))
            $(obj).addClassName("selected");
    },
    lkpImgOver: function (obj) {
        $(obj).addClassName("imgHover");
    },
    lkpImgOut: function (obj) {
        $(obj).removeClassName("imgHover");
    }
}

 /* MG08022011: Workaround, solange ich nicht weiß ob das Reinverschieben in LKP bewusst gemacht wurde oder versehentlich */
function lkpImgOver (obj) {
    $(obj).addClassName("imgHover");
}

function lkpImgOut (obj) {
    $(obj).removeClassName("imgHover");
}

// 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 == "")
	    return (list.indexOf(value) < 0) ? false : true;
	else
	    return (list.split(seperator).indexOf(value) > -1)
}

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, alternativeQueryString) {
    ///	<summary>
    ///		Gibt einen Querystring-Value für einen übergebenen Key zurück
    ///	</summary>
    ///	<returns type="String" />
    ///	<param name="key" type="String">
    ///		Querystring key
    ///	</param>
    /// <param name="alternativeQueryString" type="String" optional="true">
    ///		Optionale Angabe des Querystrings. Per Default wird der Page-Querystring der Seite verwendet
    ///	</param>
    if (alternativeQueryString == null)
        alternativeQueryString = window.location.search;
    var page = new PageQuery(alternativeQueryString);
    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, div);
        div.style.width = width + "px";
        div.addClassName("gridOVx");
        RS.widthPanelMinScrollbarCheck(div);
        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;
        $j(div).find("table.noNav:last-child").removeClass("noNav");
    },
    getWidth: function (widthPanelMin, widthPanelMax, widthPanelReferenceObject) {
        RS.lastViewport = document.viewport.getWidth();
        var offsetleft = (typeof widthPanelReferenceObject == 'undefined' || widthPanelReferenceObject == null) ? 0 : $j(widthPanelReferenceObject).offset().left;
        if (offsetleft <= 15)
            offsetleft = 0;
        var width = RS.lastViewport - 40 - offsetleft; //-40 orig
        if (widthPanelMin > 0 && width < widthPanelMin)
            width = widthPanelMin;
        if (widthPanelMax > 0 && width > widthPanelMax)
            width = widthPanelMax;
        return width;
    },
    widthPanelMinScrollbarCheck: function (div) {
        if ($j(div).width() >= $j(div).find("table.ND:first ").width() && document.viewport.getWidth() > $j(div).width())
            $j(div).css("overflow-x", "auto");
        else
            $j(div).css("overflow-x", "scroll");
    },
    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++) {
                var offsetleft = (typeof widthPanelReferenceObject == 'undefined' || widthPanelReferenceObject == null) ? 0 : $j(divs[j]).offset().left;
                if (offsetleft >= 15)
                    width -= offsetleft;
                if (RS.allCrToResize[i].widthPanelMin > 0 && width < RS.allCrToResize[i].widthPanelMin)
                    width = RS.allCrToResize[i].widthPanelMin;
                if (RS.allCrToResize[i].widthPanelMax > 0 && width > RS.allCrToResize[i].widthPanelMax)
                    width = RS.allCrToResize[i].widthPanelMax;
                divs[j].style.width = width + "px";
                RS.widthPanelMinScrollbarCheck(divs[j]);
            }
        }
    },
    initSesam: function (id, buttonPosSelector, sesamSelector, addCssClass, hide, moveLeftOnHide) {
        if ($j(sesamSelector).length == 0 || $j("div#" + id).length > 0)
            return;
        var div = document.createElement("div");
        var objButtonPos = $j(buttonPosSelector);
        if (objButtonPos.is("table"))
            objButtonPos.parent().prepend(div);
        else
            objButtonPos.prepend(div);
        $j(div).attr("id", id).addClass("ocb").addClass(addCssClass).attr("sesamSelector", sesamSelector).attr("speed", "300").attr("moveLeft", moveLeftOnHide || 0).click(RS.sesam);
        if (hide)
            $j(div).attr("speed", "0").click();
    },
    sesam: function (evt) {
        var btn = $j(evt.currentTarget);
        var speed = NUM.getNumber(btn.attr("speed"));
        var moveLeftOnHide = NUM.getNumber(btn.attr("moveLeft"));
        var hidden = (typeof ($j(btn).attr("sesamHidden") == "boolean") && $j(btn).attr("sesamHidden") == true) || $j(btn).attr("sesamHidden") == "true";
        var selector = $j(btn).attr("sesamSelector");
        var mleft = NUM.getNumber(btn.css("margin-left").replace("px", "")), mtop = NUM.getNumber(btn.css("margin-top").replace("px", ""));
        if (hidden || hidden === "true") {
            $j(selector).show(speed);
            btn.css("margin-left", (mleft + moveLeftOnHide).toString()).css("margin-top", (mtop + 2).toString()).removeClass("ocbo");
        }
        else {
            if (speed == 0)//hide() greift nicht, wenn das Element ausgeblendet ist, z. B. in einem NCRegister
                $j(selector).each(function () { $j(this).addClass("dn"); });
            else
                $j(selector).hide(speed);
            btn.css("margin-left", (mleft - moveLeftOnHide).toString()).css("margin-top", (mtop - 2).toString()).addClass("ocbo");
        }
        if (speed == 0)
            btn.attr("speed", "300");
        btn.attr("sesamHidden", !hidden);
        $j(window).resize();
        var myAjax = new Ajax.Request(location.href + "&dynload=true&saveSesamHidden=1&hidden=" + (!hidden).toString() + "&id=" + btn[0].id);
    }
};

window.onresize = RS.doOnResize;

var info;
function NQuickInfo_Open(src, ns, dataAccessObjectName, key, summ, id, clientId, eventObj) {
    NQuickInfo_OpenEx(src, ns, dataAccessObjectName, key, 330, 300, summ, clientId, '', eventObj);
}
function NQuickInfo_OpenEx(src, ns, dataAccessObjectName, key, width, height, summ, clientId, language, eventObj) {
    if (!eventObj)
        eventObj = window.event;
    stopEvent(eventObj);
    var div = document.createElement("DIV");
    var frme = document.createElement("IFRAME");

    if (ns != "Help" && key == "") {
        if (clientId != null)
            key = document.getElementById(clientId).value;
    }

    if (ns == "Help")
        key = "HelpPage";
    if (key != "") {
        var frmeSrc = "frmQuickInfo.aspx?Ns=" + ns + "&DAO=" + dataAccessObjectName + "&Key=" + key + "&s=" + summ + "&lang=" + language;
        if (document.getElementById("quick_" + key) != null)
            return;

        div.id = "quick_" + key;
        frme.src = frmeSrc;
        frme.style.width = width;
        frme.style.height = height;
        frme.frameBorder = 0;
        frme.className = "ObjRefCtl_IFrame";

        div.appendChild(frme);
        document.body.appendChild(div);
        var absTop = nGetAbsoluteTop(src) - NQuickInfo_getOffsetTop(src);
        div.style.position = "absolute";
        if (ns != "Help") {
            if (absTop >= 350)
                div.style.top = absTop - 280;
            else
                div.style.top = absTop;

            if (nGetAbsoluteLeft(src) >= 400)
                div.style.left = nGetAbsoluteLeft(src) - 330;
            else
                div.style.left = nGetAbsoluteLeft(src) + 15;
        }
        else {
            div.style.top = nGetAbsoluteTop(src) + 60;
            div.style.left = nGetAbsoluteLeft(src) - 430;
        }
    }
}

function NQuickInfo_getOffsetTop(obj) {
    var tmp = obj;
    while (tmp) {
        if (tmp.tagName.toUpperCase() == "DIV")
            return tmp.scrollTop;
        tmp = tmp.parentElement;
    }
    return 0;
}

function NQuickInfo_IsOpen(key) {
    for (var iIdx = 0; iIdx < opened.length; iIdx++) {
        if (opened[iIdx] == key)
            return iIdx;
    }
    return -1;
}
function NQuickInfo_Cmd(eventObj, sender, cmd) {
    if (cmd == "close") {
        var div = NQuickInfo_GetCtl().parentNode;
        var parentElem = div.parentNode;
        parentElem.removeChild(div);
        eventObj.cancelBubble = true;
    }
}
function NQuickInfo_GetCtl() {
    return window.frameElement;
}

// QuickInfo fuer Control's  / art "1" = show / "0" is hide 
function NQuickInfo_ControlHelp(eventObj, src, key, text, width, height, art, CtrlId) {
    if (art)
        EV.ShowBubble(src, "", text, null, null, 350);
    else
        EV.HideBubble();
}

var NPage_IsValid = true;
var NPage_BlockSubmit = false;
var NPage_PostValidateRegCards = new Array();
var NPage_ValidationActive = false;
var NPage_Validators = new Array(); ;

function NValidatorInit(active, arr) {
    NPage_ValidationActive = active;
    NPage_Validators = arr;
    /*um das Array beim Unload zu entleeren und ein Leak zu vermeiden*/
    if (window.addEventListener) { window.addEventListener('unload', arr.clear.bind(arr), false); }
    else { window.attachEvent('onunload', arr.clear.bind(arr)); }
    NValidatorOnLoad();
}

function NValidatorUpdateDisplay(val) {
    if (!val.getAttribute("display"))
        val.display = "Dynamic";
    if (typeof (val.display) == "string") {
        if (val.display == "None")
            return;
        if (val.display == "Dynamic") {
            val.style.display = val.isvalid ? "none" : "inline";
            return;
        }
    }
    try {
        val.style.visibility = val.isvalid ? "hidden" : "visible";
    }
    catch (e) { }
}
function NValidatorUpdateIsValid() {
    var i;
    while (NPage_PostValidateRegCards.length > 0)
        NValidatorPostValidateCards(NPage_PostValidateRegCards.pop());
    for (i = 0; i < NPage_Validators.length; i++) {
        try {
            if (typeof (NPage_Validators[i]) == "undefined")
                continue;
            if (!NPage_Validators[i].isvalid) {
                NPage_IsValid = false;
                NValidatorSetValidatorState();
                return;
            }
        }
        catch (e) { }
    }
    NPage_IsValid = true;
    NValidatorSetValidatorState();
}

function NValidatorSetValidatorState() {
    if (document.getElementById('NValidator_ValidState') != null)
        document.getElementById('NValidator_ValidState').value = NPage_IsValid;
}
function NValidatorHookupControlID(controlID, val) {
    if (typeof (controlID) != "string")
        return;
    var ctrl = $(controlID);
    if (ctrl)
        NValidatorHookupControl(ctrl, val);
    else {
        val.isvalid = true;
        val.enabled = false;
    }
}
function NValidatorHookupControl(control, val) {
    if (typeof (control.tagName) == "undefined" && typeof (control.length) == "number") {
        var i;
        for (i = 0; i < control.length; i++) {
            var inner = control[i];
            if (!inner)
                continue;
            if (typeof (inner.value) == "string")
                NValidatorHookupControl(inner, val);
        }
        return;
    }
    else if (control.tagName != "INPUT" && control.tagName != "TEXTAREA" && control.tagName != "SELECT") {
        var i;
        for (i = 0; i < control.childNodes.length; i++)
            NValidatorHookupControl(control.childNodes.item(i), val);
        return;
    }
    else {
        if (typeof (control.NValidators) == "undefined") {
            var arr = new Array();
            /*um das Array beim Unload zu entleeren und ein Leak zu vermeiden
            eventuell kann man es vermeiden die DomObjekte zu halten indem man eine Array der ids speichert */
            if (window.addEventListener) { window.addEventListener('unload', arr.clear.bind(arr), false); }
            else { window.attachEvent('onunload', arr.clear.bind(arr)); }

            control.NValidators = arr;
            var ev;
            if (control.type == "radio")
                ev = control.onclick;
            else
                ev = control.onchange;

            if (typeof (ev) == "function") {
                ev = ev.toString();
                ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));
            }
            else
                ev = "";
            var func = new Function(" NValidatorOnChange(this); " + ev);
            if (control.type == "radio")
                control.onclick = func;
            else
                control.onchange = func;
        }
        control.NValidators[control.NValidators.length] = val;
    }
}

function NValidatorGetValue(id) {
    var control;
    control = $(id);
    if (!control)
        control = $(id + "_NDataGridTA");
    if (!control)
        return "";
    if (typeof (control.value) == "string") {
        if (control.tagName.toUpperCase() == "SELECT" &&
		                (control.value == "null" || control.value == "" || control.value == "0" || control.value == "00000000-0000-0000-0000-000000000000"))
            return "";
        else
            return control.value;
    }
    if (typeof (control.tagName) == "undefined" && typeof (control.length) == "number") {
        var j;
        for (j = 0; j < control.length; j++) {
            var inner = control[j];
            if (typeof (inner.value) == "string" && (inner.type != "radio" || inner.status == true))
                return inner.value;
        }
    }
    else
        return NValidatorGetValueRecursive(control);
    return "";
}
function NValidatorGetValueRecursive(control) {
    if (typeof (control.value) == "string" && (control.type != "radio" || control.status == true))
        return control.value;
    var i, val;
    for (i = 0; i < control.childNodes.length; i++) {
        val = NValidatorGetValueRecursive(control.childNodes[i]);
        if (val != "" && control.childNodes[i].type != "button") return val;
    }
    return "";
}
function NPage_ClientValidate() {
    var len;
    try {
        len = NPage_Validators.length;
    }
    catch (e) {
        len = -1;
        return NPage_IsValid;
    }

    for (i = 0; i < NPage_Validators.length; i++)
        NValidatorValidate(NPage_Validators[i]);
    NValidatorUpdateIsValid();

    NPage_BlockSubmit = !NPage_IsValid;
    return NPage_IsValid;
}
function NValidatorCommonOnSubmit(eventObj) {
    eventObj.returnValue = !NPage_BlockSubmit;
    NPage_BlockSubmit = false;
}
function NValidatorEnable(val, enable) {
    val.enabled = (enable != false);
    NValidatorValidate(val);
    NValidatorUpdateIsValid();
}
function NValidatorOnChange(eventObj) {
    var vals;
    vals = eventObj.NValidators;
    if (typeof (vals) == "undefined")
        return;
    var i;
    for (i = 0; i < vals.length; i++)
        NValidatorValidate(vals[i]);
    NValidatorUpdateIsValid();
}
function NValidatorUpdateError(val, errorMsg) {
    var oImg = null;
    if (val.childNodes.length == 0) {
        oImg = document.createElement("img");
        val.appendChild(oImg);
    } else
        oImg = val.childNodes.item(0);

    var src = NValidator_GetAttr(val, "errorimage");
    if (!src) {
        src = "images/error.gif";
        src.errorimage = src;
    }
    oImg.src = src;
    val.title = errorMsg;
}

function NValidatorValidate(val) {
    if (val != null)
        val.isvalid = true;
    else
        return;

    if (NValidator_GetAttr(val, "validationCondition") == "NCRegisterCard") {
        NPage_PostValidateRegCards.push(val);
        return;
    }

    if (typeof (NValidator_GetAttr(val, "validationCondition")) == "string") {
        var bConditionSucceeded = false;
        var condition = "bConditionSucceeded = (" + NValidator_GetAttr(val, "validationCondition") + ");";
        eval(condition);
        if (!bConditionSucceeded) {
            return;
        }
    }

    try {
        var control = document.getElementById(NValidator_GetAttr(val, "controlID"));
        if (control.disabled) {
            return;
        }
    } catch (e) { }

    if (val.enabled != false) {
        if (val.isvalid && (typeof (NValidator_GetAttr(val, "required")) == "string" && typeof (NValidator_GetAttr(val, "clientvalidationfunction")) != "string")) {
            val.isvalid = NRequiredFieldValidatorEvaluateIsValid(val);
            if (!val.isvalid)
                NValidatorUpdateError(val, NValidator_GetAttr(val, "error_required"));
        }

        if (val.isvalid && typeof (NValidator_GetAttr(val, "regex")) == "string") {
            val.isvalid = NRegularExpressionValidatorEvaluateIsValid(val);
            if (!val.isvalid)
                NValidatorUpdateError(val, NValidator_GetAttr(val, "error_regex"));
        }

        if (val.isvalid && typeof (NValidator_GetAttr(val, "clientvalidationfunction")) == "string") {
            var result = NCustomValidatorEvaluateIsValid(val);
            val.isvalid = result.IsValid;
            if (!val.isvalid)
                NValidatorUpdateError(val, result.ErrorText);
        }

        if (val.isvalid && typeof (NValidator_GetAttr(val, "validationtype")) == "string") {
            var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
            if (NValidatorTrim(value).length == 0) {
                val.isvalid = true;
            } else {
                if (NValidatorConvert(value, NValidator_GetAttr(val, "validationtype"), val) == null) {
                    val.isvalid = false;
                    NValidatorUpdateError(val, NValidator_GetAttr(val, "error_type"));
                } else {
                    val.isvalid = NRangeValidatorEvaluateIsValid(val);
                    if (!val.isvalid) {
                        NValidatorUpdateError(val, NValidator_GetAttr(val, "error_range"));
                    }
                }
            }
        }
    }
    NValidatorUpdateDisplay(val);
}

function NValidatorOnLoad() {
    if (typeof (NPage_Validators) == "undefined")
        return;
    var i, val;
    try {
        for (i = 0; i < NPage_Validators.length; i++) {
            val = NPage_Validators[i];
            if (typeof (val) != "object" || val == null)
                continue;
            if (typeof (val.evaluationfunction) == "string") {
                try {
                    val.evaluationfunction = eval(val.evaluationfunction + ";");
                }
                catch (e) { }
            }
            if (typeof (val.isvalid) == "string") {
                if (val.isvalid == "False") {
                    val.isvalid = false;
                    NPage_IsValid = false;
                }
                else
                    val.isvalid = true;
            } else
                val.isvalid = true;
            if (typeof (val.enabled) == "string")
                val.enabled = (val.enabled != "False");
            NValidatorHookupControlID(NValidator_GetAttr(val, "controlID"), val);
        }
    }
    catch (e) {
        var x = e;
    }
    NPage_ValidationActive = true;
}

function NValidatorConvert(op, dataType, val, compareValue) {
    if (!op)
        return;
    function GetFullYear(year) {
        return (year + parseInt(val.century)) - ((year < val.cutoffyear) ? 0 : 100);
    }
    var num, cleanInput, m, exp;

    if (dataType == "Integer") {
        exp = /^\s*[-\+]?\d+\s*$/;
        if (op.match(exp) == null)
            return null;
        num = parseInt(op, 10);
        return (isNaN(num) ? null : num);
    }
    else if (dataType == "Double") {
        var decChar = val.getAttribute("decimalchar");
        if (!compareValue)
            exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + decChar + "(\\d+))?\\s*$");
        else
            exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\.(\\d+))?\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        cleanInput = (!m[1] ? "" : m[1]) + ((m[2].length > 0 ? m[2] : "0")) + (!m[4] ? "" : "." + m[4]);
        num = parseFloat(cleanInput);

        return (isNaN(num) ? null : num);
    }
    else if (dataType == "Currency") {
        exp = new RegExp("^\\s*([-\\+])?(((\\d+)\\" + val.groupchar + ")*)(\\d+)"
                        + ((val.digits > 0) ? "(\\" + val.decimalchar + "(\\d{1," + val.digits + "}))?" : "")
                        + "\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        var intermed = m[2] + m[5];
        cleanInput = m[1] + intermed.replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((val.digits > 0) ? "." + m[7] : 0);
        num = parseFloat(cleanInput);
        return (isNaN(num) ? null : num);
    }
    else if (dataType == "Date") {
        var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})\\s*$");
        m = op.match(yearFirstExp);
        var day, month, year;
        if (m != null && (m[2].length == 4 || val.dateorder == "ymd")) {
            day = m[6];
            month = m[5];
            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10))
        }
        else {
            if (val) {
                if (val.dateorder == "ymd")
                    return null;
            }
            var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$");
            m = op.match(yearLastExp);
            if (m == null)
                return null;
            if (val.dateorder == "mdy") {
                day = m[3];
                month = m[1];
            }
            else {
                day = m[1];
                month = m[3];
            }
            year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10))
        }
        month -= 1;
        var date = new Date(year, month, day);
        return (typeof (date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
    }
    else
        return op.toString();
}

function NValidatorCompare(operand1, operand2, operator, val) {
    var dataType = NValidator_GetAttr(val, "validationtype");
    var op1, op2;
    if ((op1 = NValidatorConvert(operand1, dataType, val)) == null)
        return false;
    if (operator == "DataTypeCheck")
        return true;
    if ((op2 = NValidatorConvert(operand2, dataType, val, 1)) == null)
        return true;
    switch (operator) {
        case "NotEqual":
            return (op1 != op2);
        case "GreaterThan":
            return (op1 > op2);
        case "GreaterThanEqual":
            return (op1 >= op2);
        case "LessThan":
            return (op1 < op2);
        case "LessThanEqual":
            return (op1 <= op2);
        default:
            return (op1 == op2);
    }
}
function NCompareValidatorEvaluateIsValid(val) {
    var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
    if (NValidatorTrim(value).length == 0)
        return true;
    var compareTo = "";
    if (null == document.getElementById(NValidator_GetAttr(val, "controltocompare"))) {
        if (typeof (NValidator_GetAttr(val, "valuetocompare")) == "string") {
            compareTo = NValidator_GetAttr(val, "valuetocompare");
        }
    }
    else {
        compareTo = NValidatorGetValue(NValidator_GetAttr(val, "controltocompare"));
    }
    return NValidatorCompare(value, compareTo, val.operator, val);
}

function NCustomValidatorEvaluateIsValid(val) {
    var value = "";
    var isGrid = false;
    if (typeof (NValidator_GetAttr(val, "controlID")) == "string") {
        var ctlID = NValidator_GetAttr(val, "controlID");
        if ($(ctlID + "_NDataGridTA") && $(ctlID + "_NDataGridTA").tagName == "TABLE" && $(ctlID + "_NDataGridTA").className == "ND")
            isGrid = true;
        else
            value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
        //if (NValidatorTrim(value).length == 0)
        //   return true;
    }
    var args = { Value: value, IsValid: true, ErrorText: "" };
    if (typeof (NValidator_GetAttr(val, "clientvalidationfunction")) == "string") {
        eval(NValidator_GetAttr(val, "clientvalidationfunction") + "(val, args) ;");
    }
    return args;
}
function NRegularExpressionValidatorEvaluateIsValid(val) {
    var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
    if (NValidatorTrim(value).length == 0)
        return true;
    var rx = new RegExp(NValidator_GetAttr(val, "regex"));
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
}
function NValidatorTrim(s) {
    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (m == null) ? "" : m[1];
}
function NRequiredFieldValidatorEvaluateIsValid(val) {
    return (NValidatorTrim(NValidatorGetValue(NValidator_GetAttr(val, "controlID"))) != NValidatorTrim(NValidator_GetAttr(val, "initialvalue")));
}
function NRangeValidatorEvaluateIsValid(val) {
    var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
    if (NValidatorTrim(value).length == 0)
        return true;
    return (NValidatorCompare(value, NValidator_GetAttr(val, "minvalue"), "GreaterThanEqual", val) &&
            NValidatorCompare(value, NValidator_GetAttr(val, "maxvalue"), "LessThanEqual", val));
}
function NValidationSummaryOnSubmit() { }
function NValidator_SetAttr(obj, name, val) {
    obj.setAttribute(name, val);
}

function NValidator_GetAttr(obj, name) {
    try {
        return obj.getAttribute(name);
    }
    catch (e) { }
}
function NValidator_GetAttrObj(obj, name) {
    for (var iIdx = 0; iIdx < obj.attributes.length; iIdx++) {
        if (obj.attributes.item(iIdx).name.toLowerCase() == name.toLowerCase())
            return obj.attributes.item(iIdx);
    }
}

function NValidatorPostValidateCards(cardValidator) {
    var showError = false;
    var card = $(NValidator_GetAttr(cardValidator, "controlID"));
    if (card != null) {
        var table = $(BASE.GetTmpObj(card.getAttribute("key")));
        showError = NValidator_FindInnerValidatorErrors(table);
    }
    cardValidator.isvalid = !showError;
    if (showError)
        NValidatorUpdateError(cardValidator, "Fehler in untergeordnetem Feld");
    else {
        if (cardValidator.childNodes.length > 0)
            cardValidator.removeChild(cardValidator.firstChild);
    }
}

function NValidator_FindInnerValidatorErrors(node) {
    var innerValidators = NValidator_FindInnerValidators(node, true);
    var i = 0;
    var validator = innerValidators[i];
    while (validator) {
        if (validator.isvalid != undefined && !validator.isvalid)
            return true;
        i++;
        validator = spans[i];
    }
    return false;
}

function NValidator_FindInnerValidators(node, insertObject) {
    var innerValidators = new Array();
    if (!node)
        return innerValidators;
    spans = node.getElementsByTagName("span");
    if (!spans)
        return innerValidators;
    if (spans.length > 0) {
        var i = 0;
        var validator = spans[i];
        while (validator) {
            if (validator.id.substring(0, 9) == "Validator")
                innerValidators[innerValidators.length] = (insertObject) ? validator : validator.id;
            i++;
            validator = spans[i];
        }
    }
    return innerValidators;
}

// -> http://regexlib.com/default.aspx
function isGuid(str) {
    if (str == null || str == "")
        return false;

    var ergebnis = false;
    //if (Prototype.Browser.WebKit && !Prototype.Browser.Opera)        /*http://regexlib.com/RETester.aspx?regexp_id=1772 */ 
    var regExpGuid = new RegExp("[({]?(0x)?[0-9a-fA-F]{8}([-,]?(0x)?[0-9a-fA-F]{4}){2}((-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})|(,\{0x[0-9a-fA-F]{2}(,0x[0-9a-fA-F]{2}){7}\}))[)}]?");
    ergebnis = regExpGuid.test(str);
    if (!ergebnis) { // folgende alte REGEX wird ab IE9, Chrome, etc. als falsch erkannt!
        regExpGuid = new RegExp("^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$");
        ergebnis = regExpGuid.test(str);
    }
    return ergebnis;
}

function isEmail(str) {
    if (str == null || str == "")
        return false;
    var regExpEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$/;
    return regExpEmail.test(str);
}

function isUrl(str) {
    if (str == null || str == "")
        return false;
    str = str.replace("http://", "").replace("https://", "");
    var regExpUrl = /^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?/;
    return regExpUrl.test(str);
}
var compressed = true;

function isValidDateInput(objEvent) {
    var iKeyCode, strKey;
    if (BASE.isIE) 
        iKeyCode = objEvent.keyCode;
    else 
        iKeyCode = objEvent.which;

    strKey = String.fromCharCode(iKeyCode);

    var strValid = "1234567890.-/";
    var keyCodeValid = "|96|97|98|99|100|101|102|103|104|105|109|110|111|189|190|";
    if ((iKeyCode < 48 || strValid.indexOf(strKey) > -1 || keyCodeValid.indexOf("|" + iKeyCode + "|") > -1) && strKey != " ")
        return true;
    else {

        if (BASE.isIE)
            objEvent.keyCode = 0;
        else
            objEvent.which = 0;

        if (objEvent.preventDefault)
            objEvent.preventDefault();
        objEvent.returnValue = false;
        return false;

    }
}

/*
* JQuery Plugin Table Drager Resizer
*
* USAGE: $j(table).tabledragresizer(); [bei NDataGrid einfach grid.DragResizer=true auf Formular]
*
* Version : 1.0
*
* Intact.at Sep 2011
* 
*/
(function ($j) {
    $j.fn.tabledragresizer = function (options) {
        var defaults = {
            fixedheader: false,
            draggerpositionieren: false,
            id: null
        };

        var options = $j.extend(defaults, options); // get the defaults or any user set options

        return this.each(function () {
            var obj = $j(this); // the jQuery object the user calls tabledragresizer on (Tabelle)

            //wenn nur die dragger neu positioniert werden
            if (options.draggerpositionieren) {
                // obj ist neuzupositionierende tabelle
                obj.find("th").each(function () {
                    draggerPositionInit($j(this), options.id, options.fixedheader);
                });
                draggerresizing = false;

                resizeDivDragResizer(options.fixedheader, options.id);
            }
            else //normaler start
            {
                draggerresizing = false;
                //wenn fixedheadertable, dann gibt es zwei thead dieser tabelle und beide müssen synchron verändert werden
                if (obj.parent().hasClass("fht_table_body"))
                    options.fixedheader = true;

                initTable(obj, options);
            }
        });
    };

    function initTable(tabelle, options) {
        if (BASE.isIE && parseInt(jQuery.browser.version, 10) <= 7)
            return;
        //--- generiert ID falls mehrere tabellen tdr verwenden
        var jetzti = new Date();
        var idi = jetzti.getSeconds().toString();
        idi += jetzti.getMilliseconds().toString();

        //--- div erstellen das tabelle umschließt und ursprungspositionierungspunkt für dragger ist
        if (!options.fixedheader)
            tabelle.wrap("<div class=\"dragresizer\" id=\"" + idi + "\" fixedheader=\"" + options.fixedheader.toString() + "\"/>");
        else
            tabelle.parent().parent().wrapInner("<div class=\"dragresizer\" id=\"" + idi + "\" fixedheader=\"" + options.fixedheader.toString() + "\"/>");

        var dragresizer = $j("#" + idi);

        //unabsichtliches markieren des Tabellenheaders verhindern!
        tabelle.find("th").disableSelection();
        if (options.fixedheader)
            dragresizer.find(".fht_fixed_header table th").disableSelection();

        //für jede th Zelle wird ein Div Dragger angelegt und positioniert
        dragresizer.append("<div class=\"draggers\"></div>");
        if (!options.fixedheader)
            var ths = tabelle.find("th:visible");
        else
            var ths = dragresizer.find(".fht_fixed_header table th:visible");

        ths.each(function () {
            var i = $j(this).index();
            dragresizer.find(".draggers").append("<div class=\"dragger\" col=\"" + i + "\" dragresizer=\"" + idi + "\"></div><div class=\"line\" ></div>");

            draggerPositionInit($j(this), idi, options.fixedheader);

            //unabsichtliches markieren der Zellen verhindern beim draggen
            dragresizer.find(".draggers div[col='" + i + "']").disableSelection().mousedown(function (e) {
                draggerDragMouseDownInit($j(e.target))
            });
        });

        //--- IE7 Bug, damit Tabelle nicht über dragresizer div raussteht.
        if(dragresizer.parent().hasClass("gridOVx"))
            dragresizer.parent().css("position","relative");

        resizeDivDragResizer(options.fixedheader, idi);

        //--- Browser Resize: Dragger neuausrichten, weil eventuell fixedheader den table neu gebaut hat
        if (options.fixedheader) {
            $j(window).resize(function () {

                if (!draggerresizing) {
                    draggerresizing = true;
                    window.setTimeout(function () {

                        $j(document).find(".dragresizer").each(function () {
                            var fixedheader = $j(this).attr("fixedheader") == "true" ? true : false;
                            if(fixedheader){ //kann ja sein dass nur ein grid fixed header hat
                            var di = $j(this).attr("id");
                            $j(this).find(".fht_fixed_header table").tabledragresizer({ fixedheader: true, draggerpositionieren: true, id: di });
                            }
                        });
                    }, 1502);
                }
            });
        }

        //--- scrollen: benötigt ein umgebendes div, an welchem sich das scrollen orientieren kann
        //  [muss halt wissen welche scrollbar das scrollt.]
        //  [nur bei FixedHeader]
        if (options.fixedheader)
            var scrollingobj = dragresizer.find(".fht_table_body");
        else //if(dragresizer.parent().hasClass("gridOVx")) //nicht notwendig, da auch div dragresizer verschoben wird
        //var scrollingobj = dragresizer.parent();
            var scrollingobj = null;

        scrollingdraggers = false;
        if (scrollingobj != null) {
            scrollingobj.scroll(function () {
                if (!scrollingdraggers) {
                    scrollingdraggers = true;
                    var scr = this;
                    var widthdiv = $j("#" + idi).find(".fht_fixed_header").width();
                    $j("#" + idi).find(".draggers div").each(function () {
                        var alt = parseInt($j(this).css("left").replace("px", ""));
                        if ($j(this).attr("src"))
                            var src = $j(this).attr("src");
                        else
                            var src = 0;

                        var neu = src > scr.scrollLeft ? alt + (src - scr.scrollLeft) : alt - (scr.scrollLeft - src);

                        $j(this).css("left", neu);
                        $j(this).attr("src", scr.scrollLeft);

                        //um blaue pfeile über scrollbar ganz rechts bei fixed header zu verstecken
                        if (!$j(this).hasClass("line")) {
                            if (neu > widthdiv)
                                $j(this).css("display", "none");
                            else
                                $j(this).css("display", "block");
                        }
                    });
                    scrollingdraggers = false;
                }
            });
        }
        //falls skypeplugin, etc. einfach ein 2. mal, fällt gar nicht auf.
        window.setTimeout(function () {
            var dragresizer = $j(document).find("#"+idi);
            var fixedheader = dragresizer.attr("fixedheader") == "true" ? true : false;
            var di = dragresizer.attr("id");
            dragresizer.find(".fht_fixed_header table").tabledragresizer({ fixedheader: fixedheader, draggerpositionieren: true, id: di });  
      }, 1502);
    }

    function draggerPositionInit(cell, idi, fixedheader) {
        var obj = $j("#" + idi).find(".draggers div[col='" + (cell.index()) + "']");
        if(obj.length == 0)
            return;
        var line = obj.next();
        obj.css("left", (cell.position().left + cell.outerWidth() - 6));
        line.css("left", (cell.position().left + cell.outerWidth() - 6));
        obj.css("top", (cell.position().top));
        line.css("top", (cell.position().top));
        obj.css("display", "block");
        line.css("display", "none");
        obj.css("height", cell.parent().height());

        if (fixedheader) {
            //um blaue pfeile über scrollbar ganz rechts bei fixed header zu verstecken
            var fhtheadaer = $j("#" + idi).find(".fht_fixed_header");
            if (parseInt(obj.css("left").replace("px", "")) > fhtheadaer.width())
                obj.css("display", "none");
            var table = $j("#" + idi).find(".fht_table_body table:eq(0)");
        }
        else
            var table = $j("#" + idi).find("table:eq(0)");

        line.css("height", table.height()-3);
        obj.css("z-index", "auto");
        obj.css("z-index", "100");

        line.css("z-index", "-100");
    }

    function draggerDragMouseDownInit(target) {
        movingCell = $j(target).attr("col");
        movingCellObj = $j(target);
        movingCellObjLine = movingCellObj.next();
        var dragresizer = $j("#" + movingCellObj.attr("dragresizer"));

        movingCellObjLine.css("display", "block");
        movingCellObjLine.css("z-index", "100");
        //damit letzter dragger sichtbar während des draggens
        dragresizer.css("overflow", "visible");
        dragresizer.css("width", "auto");

        var fixedheader = dragresizer.attr("fixedheader") == "true" ? true : false;

        if (fixedheader)
            movingCellTableCell = dragresizer.find(".fht_table_body table:eq(0) th:visible:eq(" + movingCell + ")");
        else
            movingCellTableCell = dragresizer.find("table:eq(0) th:visible:eq(" + movingCell + ")");

        movingdragresizerleftoffset = dragresizer.offset().left;//.position().left;

        if (fixedheader)
            var tabellei = dragresizer.find(".fht_table_body table:eq(0)");
        else
            var tabellei = dragresizer.find("table:eq(0)");

        //--- MOUSEMOVE
        $j(document).mousemove(function (e) {
            var pos = e.pageX - movingdragresizerleftoffset - 10;
            movingCellObj.css("left", pos);
            movingCellObjLine.css("left", pos);
            if (BASE.isIE && !fixedheader)
                tabellei.closest(".gridOVx").css("height", (tabellei.height() + 18) + "px");
        });

        //--- MOUSEUP
        $j(document).mouseup(function () {
            $j(document).unbind('mousemove');
            $j(document).unbind('mouseup');
            var dragresizer = $j("#" + movingCellObj.attr("dragresizer"));
            //damit letzter dragger sichtbar während des draggens
            dragresizer.css("overflow", "hidden");
            //-------------------------- resizing
            var altebreite = movingCellTableCell.width();
            //--- neue gewünschte Breite laut dragger loslass position
            var neuebreite = movingCellObj.position().left - movingCellTableCell.position().left;
            //--- controls und breite werden temp gespeichert um erst am schluss zu resizen
            //--- beeinflusst sonst vorher die berechnungen, wenn manche td s schon vergroessert wurden
            var tdrControls = [];
            var i = 0;

            //--- alle td in dieser zeile durchgehen und controls mitresizen
            var spalte = $j("#" + tabellei[0].id + ">tbody>tr");

            // auf padding in TH rücksicht nehmen, da sonst Restbreite jedesmal um Padding größer wird
            var TH = tabellei.find("tr:eq(0) th:visible:eq(" + movingCell + ")");
            var paddingTH = TH.css("padding-left");
            if (paddingTH) {
                paddingTH = parseInt(paddingTH.replace("px", ""));
                var tempi = TH.css("padding-right");
                tempi = parseInt(tempi.replace("px", ""));
                paddingTH += tempi;
            }
            else
                paddingTH = 0;

            spalte.each(function () {
                var td = $j(this).find(">td:visible:eq(" + movingCell + ")");
                //--- td width wird normalerweise sowiewo ignoriert, sicherheitshalber
                if (td[0] != null && td[0].width != "")
                    td[0].width = "";

                var detailTable = false, originalTd = td;
                if (td.find("table.tblDet td").length > 0){
                    //td.find("table.tblDet").css("width"
                    detailTable = true;
                    td = td.find("table.tblDet td");
                }

                // ich denke nicht notwendig, da .width() sowieso ohne padding misst
                //                // auf padding in TD rücksicht nehmen, da sonst Restbreite jedesmal um Padding größer wird
                //                var paddingTD = td.css("padding-left");
                //                if (paddingTD) {
                //                    paddingTD = parseInt(paddingTD.replace("px", ""));
                //                    var tempi = td.css("padding-right");
                //                    tempi = parseInt(tempi.replace("px", ""));
                //                    paddingTD += tempi;
                //                }
                //                else
                //                    paddingTD = 0;

                //damit auch td s mit nowrap auf kleiner textbreite verkleinert werden können
                if ((td.children().length == 0 || td.find("br").length > 0 ) && td.css("white-space") == "nowrap") {
                    td.wrapInner("<span class=\"ov\" style=\"height:auto;\"></span>");
                }
                if (td.children().length == 0 && td.hasClass("br")) {
                    td.wrapInner("<span class=\"ov\" style=\"height:auto;\"></span>");
                }
                if(td.find("span").length > 1 && td.find("span").hasClass("skype_pnh_print_container")){
                    td.wrapInner("<span class=\"ov\" style=\"height:auto;\"></span>");                
                }
    //vielleicht buggy, nicht ausreichend getestet.!!
                if(originalTd.children().length > 0 && originalTd.find("table:first:visible").length > 0 && originalTd.find("table:first").css("width") != "auto" && originalTd.find("table:first td").length > 0 && originalTd.find("table:first td").css("width") != "auto" && originalTd.find("table:first td span").length > 0)
                {
                    originalTd.find("table:first").css("width","auto");
                    originalTd.find("table:first>tbody>tr>td").css("width","auto");
                    originalTd.find("table:first>tbody>tr>td>span").addClass("ov");
                }
                if($j(this).hasClass(".nav")){
                    //donothing, eventuellen Fehler abfangen, 
                }
                else if (td.children().length > 0) {
                    //--- kinder elemente durchgehen und auf breiten rücksicht nehmen
                    //--- DIV herum mit width und nw?
                    if (td.find("div:first:visible").length > 0) {
                        var div = td.find("div:first");
                        if (div.css("width") != "auto")
                            div.attr("tgr-width", div.css("width"));
                        if (div.children().length > 0) {
                            if(div.hasClass("nw") && div.find("a:first:visible").length > 0)
                                div.wrapInner("<span class=\"ov\" style=\"height:auto;\"></span>");
                            //normaler input wird mitresized
                            if (div.find("input:first:visible").length > 0 && div.find("input:first:checkbox").length <= 0 &&
                                div.find("input:first:button,input[type=image]:first").length <= 0 && div.find("input:first:radio").length <= 0) {
                                var control = div.find("input:first");
                                if (control.css("width") != "auto") {
                                    control.attr("tgr-width", control.css("width"));
                                    if (control.width() < td.width()) {
                                        var restbreite = td.width() - control.width();
                                        tdrControls[i] = new Object();
                                        tdrControls[i]["ctl"] = control;
                                        tdrControls[i]["neu"] = neuebreite;
                                        tdrControls[i]["rest"] = restbreite;
                                    }
                                    else {
                                        tdrControls[i] = new Object();
                                        tdrControls[i]["ctl"] = control;
                                        tdrControls[i]["neu"] = neuebreite;
                                    }
                                }
                            }
                            else if (div.find("span:first:visible").length > 0) {
                                var control = div.find("span:first");
                                if (control.css("width") != "auto") {
                                    control.attr("tgr-width", control.css("width"));
                                    if (control.width() < td.width()) {
                                        var restbreite = td.width() - control.width();
                                        tdrControls[i] = new Object();
                                        tdrControls[i]["ctl"] = control;
                                        tdrControls[i]["neu"] = neuebreite;
                                        tdrControls[i]["rest"] = restbreite;
                                    }
                                    else {
                                        tdrControls[i] = new Object();
                                        tdrControls[i]["ctl"] = control;
                                        tdrControls[i]["neu"] = neuebreite;
                                    }
                                }
                            }
                            else if (div.find("textarea:first:visible").length > 0) {
                                var control = div.find("textarea:first");
                                if (control.css("width") != "auto") {
                                    control.attr("tgr-width", control.css("width"));
                                    if (control.width() < td.width()) {
                                        var restbreite = td.width() - control.width();
                                        tdrControls[i] = new Object();
                                        tdrControls[i]["ctl"] = control;
                                        tdrControls[i]["neu"] = neuebreite;
                                        tdrControls[i]["rest"] = restbreite;
                                    }
                                    else {
                                        tdrControls[i] = new Object();
                                        tdrControls[i]["ctl"] = control;
                                        tdrControls[i]["neu"] = neuebreite;
                                    }
                                }
                            }
                        }
                        //DIV Breite erst nach Abmessen zuweisen
                        if (div.css("width") != "auto") {
                            i = tdrControls.length;
                            tdrControls[i] = new Object();
                            tdrControls[i]["ctl"] = div;
                            tdrControls[i]["neu"] = neuebreite;
                        }
                    }
                    else if (td.find("select:first:visible").length > 0) {
                        var control = td.find("select:first");
                        if (control.css("width") != "auto") {
                            control.attr("tgr-width", control.css("width"));
                            if (control.width() < td.width()) {
                                var restbreite = td.width() - control.width();
                                tdrControls[i] = new Object();
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                                tdrControls[i]["rest"] = restbreite;
                            }
                            else {
                                tdrControls[i] = new Object();
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                            }
                        }
                    }
                    else if (td.find("span:first:visible").length > 0) {
                        var control, eh, maxSpan;
                        if ($j(td[0]).find("span:visible").length > 1){
                            control = td.find("span:eq(1)");
                            eh = td.find("span:eq(2)");
                            maxSpan = eh.width();
                            eh.each(function(){var w = $j(this).width(); maxSpan = (w > maxSpan) ? w : maxSpan});
                       }
                        else
                            control = td.find("span:first:visible");
                        if (control.css("width") != "auto") {
                            control.attr("tgr-width", control.css("width"));
                            if (control.width() < originalTd.width()) {
                                //var restbreite = originalTd.width() - control.width();
                                tdrControls[i] = {};
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                                tdrControls[i]["rest"] = maxSpan;//restbreite;
                            }
                            else {
                                tdrControls[i] = {};
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                            }
                        }
                    }
                    else if (td.find("input:first:visible").length > 0 && td.find("input:first:checkbox").length <= 0 &&
                             td.find("input:first:button,input[type=image]:first").length <= 0 && td.find("input:first:radio").length <= 0) {
                        var control = td.find("input:first");
                        if (control.css("width") != "auto") {
                            control.attr("tgr-width", control.css("width"));
                            if (control.width() < td.width()) {
                                var restbreite = td.width() - control.width();
                                tdrControls[i] = new Object();
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                                tdrControls[i]["rest"] = restbreite;
                            }
                            else {
                                tdrControls[i] = new Object();
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                            }
                        }
                    }
                    else if (td.find("textarea:first:visible").length > 0) {
                        var control = td.find("textarea:first");
                        if (control.css("width") != "auto") {
                            control.attr("tgr-width", control.css("width"));
                            if (control.width() < td.width()) {
                                var restbreite = td.width() - control.width();
                                tdrControls[i] = new Object();
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                                tdrControls[i]["rest"] = restbreite;
                            }
                            else {
                                tdrControls[i] = new Object();
                                tdrControls[i]["ctl"] = control;
                                tdrControls[i]["neu"] = neuebreite;
                            }
                        }
                    }
                    //-- weitere Elemente die mitresized werden sollen HIER einfügen.
                    //einfach das "else if" kopieren und die zwei td.find() anpassen.
                    i++;
                }
            });

            //auf auto, damit table kein "eigenleben" hat [Eigenleben bei FixedHeader Feature nicht Bug!]
            dragresizer.css("width", "auto");
            //--- fertig breiten berechnet, nun resizen
            for (var ix = 0; ix < tdrControls.length; ix++) {
                if (typeof tdrControls[ix] == 'undefined')
                    continue;
                var ctl = tdrControls[ix]["ctl"];
                var breite = tdrControls[ix]["neu"] - (tdrControls[ix]["rest"] == undefined ? 0 : tdrControls[ix]["rest"]);
                ctl.css("width", breite);
                ctl.parent("span").css("width",tdrControls[ix]["neu"]);
            }
            movingCellTableCell.width(neuebreite - paddingTH);
            movingCellTableCell.css("width", neuebreite - paddingTH);
            if (movingCellTableCell.find("div:first:visible").length <= 0)
                movingCellTableCell.wrapInner("<div>");

            //movingCellTableCell.find("div:first").css("white-space", "nowrap"); //infoportal zb wird gewraped
            //--- um zu prüfen, ob th text überhaupt platz hat
            movingCellTableCell.find("div:first").css("width", "auto");
            if (movingCellTableCell.find("div:first").width() > neuebreite - paddingTH) {
                var mindestbreite = movingCellTableCell.find("div:first").width() + paddingTH;
                //--- wenn spalte nicht auf diese breite verkleinert werden konnte (weil inhalt zu groß) müssen textboxen
                //--- etc auf diese breite ausgerichtet werden
                for (var ix = 0; ix < tdrControls.length; ix++) {
                    if(typeof tdrControls[ix] == 'undefined')
                        continue;
                    var ctl = tdrControls[ix]["ctl"];
                    var breite = mindestbreite - (tdrControls[ix]["rest"] == undefined ? 0 : tdrControls[ix]["rest"]);
                    ctl.css("width", breite);
                }
                movingCellTableCell.width(mindestbreite - paddingTH);
                movingCellTableCell.css("width", mindestbreite - paddingTH);
                movingCellTableCell.find("div:first").css("width", mindestbreite - paddingTH);
            }
            else
                movingCellTableCell.find("div:first").css("width", neuebreite - paddingTH);


            if (fixedheader) {
                var movingCellTableCellDrag = dragresizer.find(".fht_fixed_header table:eq(0) th:eq(" + movingCell + ")");
                movingCellTableCellDrag.width(movingCellTableCell.width());
                movingCellTableCellDrag.css("width", movingCellTableCell.width());
                if (movingCellTableCellDrag.find("div:first:visible").length <= 0)
                    movingCellTableCellDrag.wrapInner("<div>");
                movingCellTableCellDrag.find("div:first").css("width", movingCellTableCell.width());
                if(!(dragresizer.width() <= dragresizer.find(".fht_table_body table:eq(0)").width()))
                    $j(window).trigger("resize");
            }

            //--- dragger neu positionieren
            if (fixedheader)
                var th = dragresizer.find(".fht_fixed_header table:eq(0) th");
            else
                var th = dragresizer.find("table:eq(0) th");

            th.each(function () {
                draggerPositionInit($j(this), movingCellObj.attr("dragresizer"), fixedheader);
            });

            resizeDivDragResizer(fixedheader, movingCellObj.attr("dragresizer"));

            //falls nach verkleinern table head und table body nicht mehr direkt übereinander gescrolled sind
            if(fixedheader){
                dragresizer.find(".fht_table_body").trigger("scroll");
            }

        });
    }

    // umschließendes div an inhaltbreite anpassen, damit dragger nicht drüberhinausstehen
    function resizeDivDragResizer(fixedheader, id) {
        if (fixedheader)
            $j("#" + id).css("width", $j("#" + id).find(".fht_table_body").width());
        else
            $j("#" + id).css("width", $j("#" + id).children().first().width());
    }
})(jQuery);


//--------------------------------------------------------
(function ($j) {
    $j.fn.disableSelection = function () {
        return this.each(function () {
            $j(this).attr('unselectable', 'on')
               .css({
                   '-moz-user-select': 'none',
                   '-webkit-user-select': 'none',
                   'user-select': 'none'
               })
               .each(function () {
                   this.onselectstart = function () { return false; };
                   //this.onmousedown=function(){return false;};
               });
        });
    };
})(jQuery);

//--------------------------------------------------------
(function ($j) {
    $j.fn.enableSelection = function () {
        return this.each(function () {
            $j(this).attr('unselectable', 'off')
               .css({
                   '-moz-user-select': 'text',
                   '-webkit-user-select': 'text',
                   'user-select': 'text'
               })
               .each(function () {
                   this.onselectstart = null;
                   //this.onmousedown=function(){return false;};
               });
        });
    };
})(jQuery);
//--------------------------------------------------------


