var chkIsCompat = !document.compatMode || document.compatMode == "BackCompat";
var chkIsIECompat = chkIsCompat && navigator.userAgent.indexOf("MSIE") != -1;
var chkIEV = ((navigator.userAgent.match(/MSIE ([0-9]+)/) || [])[1] || 0) * 1;
var chklstOpen;
var chklstEventsHooked;
var chkStyleHtml = '<style>' +
'.chkhr {border:0;color:#000;background-color:#000;height:1px;margin:2px;padding:0}' +
'select.selchklst{border:0;padding:0;margin:0}'+
/*
'.chklst {' +
' overflow:auto; border:1px solid black; height:10em; cursor:default;' +
' background:window; display:none; z-index:9998;position:absolute' +
'}' +
'.chkpos {' +
' float:left; vertical-align:middle;' +
'}' +
'.chkchk {' +
' border:1px solid threedshadow; padding:1px; margin-left:2px;' +
'}' +
'.chktxt {' +
' width:100%; overflow:hidden; white-space:nowrap;' +
'}' +
*/
'.chklst {' +
' overflow:auto; border:1px solid black; height:10em; cursor:default;' +
' background:window; display:none; z-index:9998;position:absolute' +
'}' +
'.chkpos {' +
' float:left; vertical-align:middle;' +
'}' +
'.chkchk {' +
' display:block; background:window; float:left; border:1px solid threedshadow; width:7px; font-size:7px;height:7px; margin:1px;' +
(chkIEV && chkIEV <= 7 ? 'padding:1px' : 'padding:0px 1px 3px 1px; ') +
'}' +
'.chkrow{clear:both;margin:0 1px;line-height:normal}'+
'.chktxt {' +
' overflow:hidden; white-space:nowrap;' +
(chkIsIECompat ? 'width:100%;' : '') +
'}' +
'.chklih { background-color:highlight; color:highlighttext }' +
'.chkun { width:7px; line-height:7px; vertical-align:middle; max-width:none }'+
'.inn {' +
//' font-size:100%;' +
' border:0; margin:0; padding-left:1px;' +
'}' +
'.incb {' +
' height:1em; padding-top:25%; padding-bottom:25%;' +
'}' +
/*
'.incbi {' +
//' height:1em;' +
' display:inline-block;' +
' background-color:threedface;padding:0 3px;' +
' border-right:1px solid black; border-bottom:1px solid threeddarkshadow;' +
' border-left:1px solid threedlightshadow; border-top:1px solid threedlightshadow;' +
' cursor:default;' +
//' margin:1px;' +
//' height:expression(parentElement.offsetHeight)' +
'}' +
*/
/*
'.incbi1 {' +
' display:inline-block;' +
' white-space:nowrap;' +
' border-right:1px solid threeddarkshadow; border-bottom:1px solid threeddarkshadow;' +
' border-left:1px solid threedlightshadow; border-top:1px solid threedlightshadow;' +
' cursor:default;' +
' vertical-align:-1px;' +
'}' +
'.incbim {' +
' vertical-align:top;' +
//' margin: 2px 0px 2px 0px;' +
//' position: relative; left: 0; xfloat:right;' +
'}' +
'.incbi2 {' +
' display:inline-block;' +
' white-space:nowrap;' +
' background-color:threedface;padding:0 3px;' +
' border-right:1px solid threedshadow; border-bottom:1px solid threedshadow;' +
' border-left:1px solid threedhighlight; border-top:1px solid threedhighlight;' +
' cursor:default;' +
'}' +
*/
'.incbi1 {' +
' display:inline-block;' +
' white-space:nowrap;' +
' border-right:1px solid threeddarkshadow; border-bottom:1px solid threeddarkshadow;' +
' border-left:1px solid threedlightshadow; border-top:1px solid threedlightshadow;' +
' cursor:default;' +
' vertical-align:-1px;' +
'}' +
'.incbim {' +
' vertical-align:bottom' +
'}' +
'.incbi2 {' +
' display:inline-block;' +
' white-space:nowrap;' +
' background-color:threedface;padding:0 3px;' +
' border-right:1px solid threedshadow; border-bottom:1px solid threedshadow;' +
' border-left:1px solid threedhighlight; border-top:1px solid threedhighlight;' +
' cursor:default;' +
'}' +
(window.chklstStyle ||
('.clfb1 { border-top:1px solid threedshadow;border-left:1px solid threedshadow;border-right:1px solid threedhighlight;border-bottom:1px solid threedhighlight }' +
'.clfb2 { border-top:1px solid threeddarkshadow;border-left:1px solid threeddarkshadow;border-right:1px solid threedlightshadow;border-bottom:1px solid threedlightshadow }' +
'.clbb1 { border-top:1px solid threedlightshadow;border-left:1px solid threedlightshadow;border-right:1px solid threeddarkshadow;border-bottom:1px solid threeddarkshadow }' +
'.clbb2 { border-top:1px solid threedhighlight;border-left:1px solid threedhighlight;border-right:1px solid threedshadow;border-bottom:1px solid threedshadow;background-color:threedface }'
)) +
'</style>';
document.write(chkStyleHtml);

function chkattrquote(s) { return s.replace(/["&<>]/g, function(s) { return '&#' + s.charCodeAt(0) + ';'; }); }
function chkhtmlize(s) { return s.replace(/[&<>]/g, function(s) { return '&#' + s.charCodeAt(0) + ';'; }); }

function chkId(lst, sub) {
	return 'chk_' + lst.id + '_' + sub;
}

function chkFromElm(e) {
	return chkLists[e.id.substring(4, e.id.lastIndexOf('_'))];
}

function chkGetSub(cl, sub) {
	return (cl.ownerDocument || document).getElementById(chkId(cl, sub));
}

function chkSetCheckMark(e, newstate) {
	//var e = e.childNodes[0].childNodes[0].childNodes[0];
	e = e.firstChild.firstChild;
	var n;
	if (newstate) {
		n = e.ownerDocument.createElement("IMG");
		n.width = "7";
		n.height = "7";
		n.src = "/9000000/g/chk7x7.gif";
		n.className = "chkun";
	} else {
		n = e.ownerDocument.createElement("SPAN");
		n.className = "chkun";
		n.innerHTML = "&nbsp";
	}
	if (e.tagName == n.tagName)
		return;
	e.parentNode.replaceChild(n, e);
}

function chkRowToIndex(cl, row) {
	var drop = chkGetSub(cl, 'drop');
	if (row.sourceIndex) {
		var rowNumElm = cl.multiple ? 4 : 3;
		return Math.floor((row.sourceIndex - drop.sourceIndex - 1) / rowNumElm);
	}
	var cs = drop.children || drop.childNodes
	for (var i = 0; i < cs.length; i++)
		if (cs[i] == row)
			return i;
	return -1;
}

function chkDropFill(cl, drop) {
	var html = [];
	var opts = cl.opts;
	var sels = cl.sels;
	var multiple = cl.multiple;
	// tabindex="0"
	var pre = multiple ? '<div class="chkrow"><div class="chkchk">' : '<div class="chkrow"><div>';
	for (var i = 0; i < opts.length; i++)
		if (opts[i][0] || !i)
			html.push(pre,
				multiple ? 
					sels[i] ? 
						'<img src="/9000000/g/chk7x7.gif" width="7" height="7" class="chkun"></div><div class="chktxt">' :
						'<span class="chkun">&nbsp;</span></div><div class="chktxt">' :
					'</div><div class="chktxt">',
				chkhtmlize(opts[i][0]),
				'</div></div>');
		else
			html.push('<div><div><div><hr class="chkhr"></div></div></div>');
	drop.innerHTML = html.join('');
}

function chkGetRow(cl, ri) {
	var drop = chkDropGet(cl); //chkGetSub(cl, 'drop');
	return (drop.children || drop.childNodes)[ri];
}

function chkArraySet(vs, val, state) {
	var i;
	for (i = 0; i < vs.length; i++)
		if (vs[i] == val)
			break;
	if (i < vs.length) {
		if (!state)
			vs.splice(i, 1);
		return;
	}
	if (!state)
		return;
	for (i = 0; i < vs.length; i++)
		if (vs[i] > val)
			break;
	//alert(vs.length + ' ' + i);
	vs.splice(i, 0, val);
	//if (window.k21 == "vgh3m0ogtrow") alert(val + ' ' + vs);
}

function chkSetField(cl, value) {
	var fld = chkGetSub(cl, 'fld');
	if (fld.tagName == "INPUT")
		fld.value = value;
	else
		fld.firstChild.innerHTML = chkhtmlize(value) || '&nbsp;';
	//alert('/' + value  + '/' + "\n\n" + '/' + fld.firstChild.innerHTML + '/');
}

function chkGetField(cl) {
	var fld = chkGetSub(cl, 'fld');
	var s = fld.tagName == "INPUT" ? fld.value || fld.nvalue || "" : (fld.firstChild.textContent || fld.firstChild.innerText || '');
	if (s.slice(-1) == '\xa0')
		s = s.slice(0, -1);
	return s == '\xa0' || s == ' ' ? '' : s;
}

function chkSetValue(cl, ri) {
	var opt = ri == -1 ? ["", ""] : cl.opts[ri];
	var val = chkGetSub(cl, 'val');
	chkSetField(cl, opt[0]);
	if (val) {
		val.value = opt[1];
		if (cl.onchange) {
			val.selectedIndex = ri == 0 ? 0 : 1;
			val.options = [{text:cl.opts[0][0],value:cl.opts[0][1]}, {text:opt[0],value:opt[1]}];
			cl.onchange.call(val);
		}
	}
}

function chkSetCheck(cl, ri, state) {
	if (!cl.multiple)
		return;
	if (state == -1)
		state = !cl.sels[ri];
	cl.sels[ri] = state;
	if (chkGetSub(cl, 'drop')) {
		var row = chkGetRow(cl, ri);
		chkSetCheckMark(row, state);
	}
	var fldval = chkGetField(cl);
	var vs = fldval ? fldval.split(cl.sep) : [];
	var val = cl.opts[ri][cl.edit ? 1 : 0].replace(/[\t\n\r]+|  +/g, ' ');
	//if (window.k21 == "vgh3m0ogtrow") alert('vs='+vs+' val='+val+' state='+state);
	chkArraySet(vs, val, state);
	chkSetField(cl, vs.join(cl.sep));
	if (!cl.edit)
		chkValueSet(cl, cl.opts[ri][1], state);
	if (cl.onchange)
		cl.onchange.call({id:cl.id});
}

function chkSetClass(e, className, state) {
	var vs = e.className ? e.className.split(' ') : [];
	chkArraySet(vs, className, state);
	e.className = vs.join(' ');
}

function chkSetScrollTop(cl, idx) {
	var drop = chkGetSub(cl, 'drop');
	var cs = drop.children || drop.childNodes
	var st = drop.scrollTop;
	var cot = cl.ch ? cl.ch * idx : cs[idx].offsetTop, coh = cl.ch || cs[idx].offsetHeight;
	if (cot == -1 || coh == 0) {
		setTimeout(function(){chkSetScrollTop(cl, idx);},50);
		return;
	}
	var oh = cl.oh || drop.offsetHeight;
	if (cot < st)
		drop.scrollTop = cot;
	else if (cot + coh - st > oh)
		drop.scrollTop = cot + coh - Math.floor(oh / coh) * coh;
}

function chkHighlight(cl, ri) {
	if (ri && !cl.opts[ri][0])
		return 1;
	if (cl.lastRow != -1)
		chkSetClass(chkGetRow(cl, cl.lastRow).childNodes[1], 'chklih', false);
	if (ri != -1)
		chkSetClass(chkGetRow(cl, ri).childNodes[1], 'chklih', true);
	cl.lastRow = ri;
}

function chkFocus(cl, ri) {
	if (chkHighlight(cl, ri))
		return 1;
	cl.ftlen = 0;
	cl.lastFocus = ri;
	chkSetScrollTop(cl, ri);
	if (!cl.multiple)
		chkSetValue(cl, ri);
}

function chkDropEventPos(ev) {
	ev = ev || window.event;
	var e = ev.srcElement || ev.target;
	while (e && e.tagName && e.className.indexOf('chkrow') == -1)
		e = e.parentNode;
	if (!e || !e.tagName)
		return;
	var cl = chkFromElm(e.parentNode);
	var ri = chkRowToIndex(cl, e);
	return [cl, ri];
}

function chkDropClick(ev) {
	var epos = chkDropEventPos(ev||this.ownerDocument.parentWindow.event);
	if (!epos)
		return;
	var cl = epos[0], ri = epos[1];
	chkSetCheck(cl, ri, !cl.sels[ri]);
	chkFocus(cl, ri);
	if (!cl.multiple) {
		chkDropShow(cl, false);
		chkGetSub(cl, 'fld').focus();
	}
}

function chkDropOver(ev) {
	var epos = chkDropEventPos(ev||this.ownerDocument.parentWindow.event);
	if (!epos)
		return;
	var cl = epos[0], ri = epos[1];
	chkHighlight(cl, ri);
	cl.highlighted = true;
}

function chkEvCancel(ev) {
	ev.returnValue = false;
	ev.cancelBubble = true;
	if (ev.stopPropagation)
		ev.stopPropagation();
	if (ev.preventDefault)
		ev.preventDefault();
}

//window.onbeforeunload=function(){return "x";}
function chkDropKeyPress(ev) {
	var cl = chkFromElm(this);
	ev = ev || this.ownerDocument.parentWindow.event;
	var kc = ev.keyCode || ev.which;
	if (ev.charCode === 0 && kc > 32 && kc <= 40) { // prevent firefox scroll
		return false;
	}
	var cancel = true;
	//top.document.title = "keypress " + kc;
	if (kc >= 32) {
		if (kc == 32)
			chkSetCheck(cl, cl.lastRow, -1);
		var drop = chkGetSub(cl, 'drop');
		var cs = drop.children || drop.childNodes
		var nft = (cl.ftlen ? cl.opts[cl.lastRow][0].substr(0, cl.ftlen).toLowerCase() : "") + String.fromCharCode(kc).toLowerCase();
		var nftlen = nft.length;
		var start = cl.ftlen ? cl.lastRow : 0;
		var l = 1;
		var cslen = cs.length;
		for (var i = start; l || i != start; l = 0, i + 1 < cslen ? i++ : i = 0) {
			var ct = cl.opts[i][0];
			if (ct && ct.substr(0, nftlen).toLowerCase() == nft) {
				chkFocus(cl, i);
				cl.ftlen = nftlen;
				break;
			}
		}
	//} else if (kc == 8) {
	//	alert('bs');
	//	if (cl.ftlen)
	//		cl.ftlen--;
	} else
		cancel = false;
	if (cancel) {
		if(window.event)ev.keyCode = 0;
		//ev.which = 0;
		chkEvCancel(ev);
		return false;
	}
}

function chkDropKeyDown(ev) {
	var cl = chkFromElm(this);
	var drop = this;
	ev = ev || this.ownerDocument.parentWindow.event;
	var kc = (ev.keyCode || ev.which) +
		(ev.shiftKey ? 256 : 0) + (ev.ctrlKey ? 512 : 0) + (ev.altKey ? 1024 : 0);
	var cancel = true;
	//top.document.title = "keydown " + kc;
	if (kc == 8) {
		if (cl.ftlen)
			cl.ftlen--;
	} else if (kc == 9 || kc == 256 + 9 || kc == 27) {
		chkDropShow(cl, false);
		chkGetSub(cl, 'fld').focus();
		cancel = false;
	} else if (kc == 38) { // up
		for (var i = cl.lastRow - 1; i >= 0 && chkFocus(cl, i); i--) ;
	} else if (kc == 40) { // down
		var cs = drop.children || drop.childNodes
		for (var i = cl.lastRow + 1; i < cs.length && chkFocus(cl, i); i++) ;
	} else if (kc == 115) { // f4
		chkDropShow(cl, false);
		chkGetSub(cl, 'fld').focus();
	} else if (kc == 33) { // pgup
		var cs = drop.children || drop.childNodes
		var n = Math.floor(drop.offsetHeight / cs[0].offsetHeight) - 1;
		if (cl.lastRow - n > 0)
			for (var i = cl.lastRow - n; i >= 0 && chkFocus(cl, i); i--) ;
		else
			chkFocus(cl, 0);
	} else if (kc == 34) { // pgdn
		var cs = drop.children || drop.childNodes
		var n = Math.floor(drop.offsetHeight / cs[0].offsetHeight) - 1;
		if (cl.lastRow + n < cs.length)
			for (var i = cl.lastRow + n; i < cs.length && chkFocus(cl, i); i++) ;
		else
			chkFocus(cl, cs.length - 1);
	} else if (kc == 36) { // home
		chkFocus(cl, 0);
	} else if (kc == 35) { // end
		var cs = drop.children || drop.childNodes
		chkFocus(cl, cs.length - 1);
	} else
		cancel = false;
	if (cancel) {
		if(window.event)ev.keyCode = 0;
		//ev.which = 0;
		chkEvCancel(ev);
		return false;
	}
}

function chkDropGet(cl) {
	var doc = cl.ownerDocument;
	var drop = chkGetSub(cl, 'drop');
	if (drop)
		return drop;
	drop = doc.createElement('div');
	drop.id = chkId(cl, 'drop');
	drop.tabIndex = -1;
	drop.className = 'chklst';
	drop.style.display = 'none';
	//drop.onblur = function () { chkDropShow(chkFromElm(this), false); };
	drop.onselectstart = function () {return false; }
	drop.style.width = chkGetSub(cl, 'ftop').offsetWidth + 'px';
	drop.onmousedown = chkDropClick;
	drop.onkeypress = chkDropKeyPress;
	drop.onkeydown = chkDropKeyDown;
	if (!cl.multiple)
		drop.onmouseover = chkDropOver;
	//var ftop = chkGetSub(cl, 'ftop');
	//ftop.parentNode.insertBefore(drop, ftop);
	doc.body.appendChild(drop);
	chkDropFill(cl, drop);
	if (drop.firstChild) {
		var idx = 0, opts = cl.opts, sels = cl.sels;
		for (var i = 0; i < sels.length; i++)
			if (sels[i]) {
				idx = i;
				break;
			}
		chkFocus(cl, idx);
	}
	return drop;
}

function chkDropPosUpd(cl) {
	var cpIE = navigator.userAgent.indexOf("MSIE ") >= 0;
	function clientPos4(p, ref) {
		function pxw(s) { return s.charCodeAt(s.length - 1) == 120 ? parseInt(s) : 0; }
		var x = 0, y = 0;
		while (p && p != ref) {
			x += p.offsetLeft - p.scrollLeft;
			y += p.offsetTop - p.scrollTop;
			if (cpIE) { //  && p.tagName == "TD"
				x += pxw(p.currentStyle.borderLeftWidth);
				y += pxw(p.currentStyle.borderTopWidth);
			}
			if (0 && navigator.userAgent.indexOf("KHTML")) {
				var border = p.style.border;
				p.style.border = "1px solid green";
				if (!confirm(x + ' ' + y))return;
				p.style.border = border;
			}
			p = p.offsetParent;
		}
		return [x, y];
	}
	var drop = chkDropGet(cl);
	var ftop = chkGetSub(cl, 'ftop');
	var pos = clientPos4(ftop, document.body);
	var height = ftop.offsetHeight; // || ftop.firstChild.offsetHeight;
	drop.style.left = pos[0] + 'px';
	drop.style.top = (pos[1] + height) + 'px';
	var width = ftop.offsetWidth; // || ftop.firstChild.offsetWidth
	drop.style.width = width + 'px';
}

function chkDropShow(cl, show) {
	if (!!show == !!cl.dropped)
		return;
	if (show && chklstOpen && chklstOpen != cl)
		chkDropShow(chklstOpen, false);

	var drop = chkDropGet(cl);
	if (show) {
		chkDropPosUpd(cl);
		if (cl.highlighted) {
			cl.highlighted = false;
			chkHighlight(cl, cl.lastFocus || 0);
		}
	}
	drop.style.display = show ? 'block' : 'none';
//document.title = cl.id + ' ' + show + ' ' + cl.dropped + ' ' + drop.style.display;
	if (show)
		drop.focus();
		//(drop.firstChild || drop).focus();
	cl.dropped = show;
	chklstOpen = show && cl;
}

function chkScrollUpd() {
	if (chklstOpen)
		chkDropPosUpd(chklstOpen);
}

function chkDropToggle(cl) {
	var show = !cl.dropped;
	if (show && new Date().getTime() - cl.dropLastHideTime < 10) // ignore click after blur
		return;
	if (!show)
		cl.dropLastHideTime = new Date().getTime();
	chkDropShow(cl, show);
}

function chkbclk(event, id) {
	var cl = chkLists[id];
	cl.ownerDocument = (event.target || event.srcElement).ownerDocument;
	chkDropToggle(cl);
	if (!cl.dropped) {
		try { chkGetSub(cl, 'fld').focus(); } catch (e) {}
	}
}

function chkFldKeyDown(e, ev) {
	var cl = chkFromElm(e);
	ev = ev || window.event;
	cl.ownerDocument = (ev.target || ev.srcElement).ownerDocument;
	var kc = (ev.keyCode || ev.which) +
		(ev.shiftKey ? 256 : 0) + (ev.ctrlKey ? 512 : 0) + (ev.altKey ? 1024 : 0);
	var cancel;
	if (kc == 115) { // f4
		chkDropToggle(cl);
		if (!cl.dropped) {
			try { chkGetSub(cl, 'fld').focus(); } catch (e) {}
		}
		cancel = true;
	}
	if (!cancel && !cl.multiple)
		return chkDropKeyDown.call(chkDropGet(cl), ev);
	if (cancel) {
		if(window.event)ev.keyCode = 0;
		//ev.which = 0;
		chkEvCancel(ev);
		return false;
	}
}

function chkFldKeyPress(e, ev) {
	var cl = chkFromElm(e);
	ev = ev || window.event;
	cl.ownerDocument = (ev.target || ev.srcElement).ownerDocument;
	if (!cl.multiple)
		return chkDropKeyPress.call(chkDropGet(cl), ev);
}

function chkGetCSSWidth(e) {
	var w = e.style.width || (e.currentStyle && e.currentStyle.width) ||
		(window.getComputedStyle && document.defaultView.getComputedStyle(e,null).getPropertyValue("width"));
	return w && w != "auto" ? w : e.offsetWidth + 'px';
}

function chkCreateFieldHtml(lst, cssWidth, text) {
	var butimg = lst.multiple ? window.chklstImgM : window.chklstImgS;

	var inputtag;
	var inputpadding;
	if (lst.edit || !chkIsIECompat || !cssWidth || cssWidth.slice(-1) != "%") {
		if (navigator.userAgent.indexOf("Gecko/") >= 0)
			inputpadding = "1px";
		else
			inputpadding = "0 1px";
		// nbsp after value workaround for IE input-resizing bug
		inputtag = '<input onresize="if(this.nvalue){this.value=this.nvalue;this.nvalue=\'\'}" id="' + chkId(lst, 'fld') + 
			(lst.edit ? '" name="' + 'chklst_' + lst.id : '') + 
			'" style="x-vertical-align:-1px;border:0;padding:0;margin:0;width:100%" ' + (chkIsIECompat ? 'nvalue' : 'value') + '="' +
			chkattrquote(text) + 
			(lst.edit ? '' : '&nbsp;') +
			'" onkeydown="return chkFldKeyDown(this,event)" onkeypress="return chkFldKeyPress(this,event)"' +
			(!lst.edit ? ' onmousedown="chkbclk(event,\'' + lst.id + '\');event.cancelBubble = true;return false"' : '') +
			(lst.disabled ? ' disabled' : '') +
			(!lst.edit ? ' readonly tabindex="-1"' : '') +
			'>';
		//if (!lst.edit)
			//inputtag = '<span tabindex="0" onkeydown="return chkFldKeyDown(this,event)" onkeypress="return chkFldKeyPress(this,event)">' + inputtag + '</span>';
	} else {
		inputtag = '<div id="' + chkId(lst, 'fld') + '" class="chkfield" tabindex="0" style="width:100%;cursor:default;overflow:hidden;white-space:nowrap;x-position:absolute"' +
			' onkeydown="return chkFldKeyDown(this,event)" onkeypress="return chkFldKeyPress(this,event)"' + 
			' onmousedown="chkbclk(event,\'' + lst.id + '\');event.cancelBubble = true;return false"' +
			'><span x-style="padding:2px 0px 2px 2px">' + (chkhtmlize(text) || '&nbsp;') + '</span></div>';
		//inputpadding = "1px 1px 1px 3px";
		inputpadding = "0 1px";
	}

	var btnimgfn, btnimgw, btnimgh;
	if (lst.multiple) {
		btnimgfn = "/9000000/g/chk7x7.gif";
		btnimgw = 7;
		btnimgh = 7;
	} else {
		btnimgfn = "/9000000/g/arwd7x4.gif";
		btnimgw = 7;
		btnimgh = 4;
	}
	var btnimgpad = '2px 3px 2px 2px';
	//if (chkIsIECompat)
		//btnimgpad = '0px 3px 0px 2px';
	var html = '';
	var ua = navigator.userAgent;
	var i;
	var useDisplayInlineTable = ua.indexOf('KHTML') >= 0 ||
		(ua.indexOf("Gecko/") > 0 && (i = ua.indexOf("; rv:")) > 0 &&
			parseFloat(ua.substring(i + 5, ua.indexOf(".", ua.indexOf(".", i) + 1))) >= 1.9);
	html += '<table style="vertical-align:-0.25em;table-layout:fixed;display:inline;x-display:inline-table' +
		(useDisplayInlineTable ? ';display:inline-table' : '') +
		';width:' + cssWidth +
		'" cellpadding="0" cellspacing="0" id="' + chkId(lst, 'ftop') + '">' +
		'<tr><td style="padding:0;border-spacing:0">' + 
		'<table cellpadding="0" cellspacing="0" width="100%"><tr>' +
		'<td width="100%" class="clfb1 inb1">' +
		'<table cellpadding="0" cellspacing="0" width="100%"><tr><td class="clfb2 inb2" width="100%">' +
		'<table cellpadding="0" cellspacing="0" width="100%"><tr><td width="99%" style="padding:' + inputpadding + '">' + 
		inputtag +
		'</td><td height="100%" width="1%" onselectstart="return false" class="incbimp">' + 
		(butimg ? 
			'<img class="incbim" src="' + butimg + '" width=' + window.chklstImgW + ' height=' + window.chklstImgH +
				' onload="var e=document.getElementById(\'' + chkId(lst, 'fld') + '\');if(e&&e.onresize)e.onresize()" onmousedown="chkbclk(event,\'' + lst.id + '\');event.cancelBubble = true">' :
			'<table height="100%" cellpadding="0" cellspacing="0" onmousedown="chkbclk(event,\'' + lst.id + '\');event.cancelBubble = true;return false"><tr>' + 
			'<td class="clbb1"><table height="100%" cellpadding="0" cellspacing="0"><tr>' +
			'<td class="clbb2" style="padding:' + btnimgpad + '">' +
			'<img src="' + btnimgfn + '" width="' + btnimgw +'" height="' + btnimgh + '" onload="var e=document.getElementById(\'' + chkId(lst, 'fld') + '\');if(e&&e.onresize)e.onresize()" style="max-width:none">' +
			//'<img src="/9000000/g/arwd7x4.gif">' +
			'</td></tr></table></td></tr></table>') +
		'</td></tr></table></td></tr></table></td></tr></table></td></tr></table>';
	return html;
}

function chkValId(x) { return 'v-' + x.replace(/[^a-z0-9]/g, function(x) { return '-' + x.charCodeAt(0).toString(16); }); }

function chkCreateValueHtml(cl, vs) {
	if (!cl.multiple)
		return '<input type="hidden" id="' + chkId(cl, 'val') + '" name="' + cl.id + '" value="' + chkattrquote(vs[0] || "") + '">';
	var html = [];
	html.push('<span id="' + chkId(cl, 'fs') + '">');
	for (var i = 0; i < vs.length; i++)
		html.push('<input type="hidden" id="', chkId(cl, chkValId(vs[i])),
			'" name="', cl.id, '" value="', chkattrquote(vs[i]), '">');
	html.push('</span>');
	return html.join('');
}

function chkValueSet(cl, v, set) {
	var e = chkGetSub(cl, chkValId(v));
	if (e && !set)
		e.parentNode.removeChild(e);
	else if (!e && set) {
		var e = cl.ownerDocument.createElement('input');
		e.type = 'hidden';
		e.id = chkId(cl, chkValId(v));
		e.name = cl.id;
		e.value = v;
		chkGetSub(cl, 'fs').appendChild(e);
	}
}

function chkInstallResetHandler(cl) {
	var fld = chkGetSub(cl, 'fld');
	if (!fld || fld.tagName != "INPUT" || !fld.form)
		return;
	cl.initValues = chkGetListValues(cl);
	chkAddEvent(fld.form, "reset", function() {
		chkSetListValues(cl, cl.initValues);
	});
}

var chkLists = {};
var chkInitLists = [];
function chkLoadList(orglist) {
	var id = orglist.name;
	var cl = chkLists[id] = {id:id, multiple:orglist.multiple, sep:';', lastRow:-1,
		disabled:orglist.disabled, edit:orglist.multiple && !orglist.className.match(/\bchknoedit\b/),
		onchange:orglist.onchange, ownerDocument:orglist.ownerDocument};
	var orgopts = orglist.options;
	var opts = cl.opts = [];
	var sels = cl.sels = new Array(orgopts.length);
	var seltexts = [], selvalues = [];
	for (var i = 0, n = orgopts.length; i < n; i++) {
		var orgopt = orgopts[i];
		opts.push([orgopt.text, orgopt.value]);
		if (orgopt.selected) {
			sels[i] = 1;
			seltexts.push(orgopt.text);
			selvalues.push(orgopt.value);
		}
	}
	var text = cl.edit ? selvalues.join(";") : seltexts.join(";");
	text = text.replace(/[\t\n\r]+|  +/g, ' ')
	
	var field = document.createElement('span');
	var html = chkCreateFieldHtml(cl, chkGetCSSWidth(orglist), text)
	if (!cl.multiple || !cl.edit)
		html += chkCreateValueHtml(cl, selvalues);
	field.innerHTML = html;
	orglist.parentNode.replaceChild(field, orglist);
	chkInstallResetHandler(cl);
}

function chkCreateListHtml(args) {
	var cl = chkLists[args.id] = {sep:';', lastRow:-1};
	for (var x in args)
		cl[x] = args[x];
	var opts = args.opts, seltexts = [], selvalues = [];
	var sels = cl.sels = new Array(opts.length);
	if (args.selvalues) {
		var dselvalues = {};
		for (var a = args.selvalues, l = a.length, i = 0; i < l; i++)
			dselvalues[a[i]] = 1;
		for (var i = 0, n = opts.length; i < n; i++)
			if (dselvalues[opts[i][1]]) {
				sels[i] = 1;
				seltexts.push(opts[i][0])
				selvalues.push(opts[i][1]);
			}
	}
	var text = cl.edit ? selvalues.join(";") : seltexts.join(";");
	text = text.replace(/[\t\n\r]+|  +/g, ' ');
	//if (text) alert(cl.id + ' ' + text);
	var html = chkCreateFieldHtml(cl, args.width, text);
	if (!cl.multiple || !cl.edit)
		html += chkCreateValueHtml(cl, selvalues);
	return html;
}

function chkBodyClick(ev) {
	ev = ev || window.event;
	var target = ev.srcElement || ev.target;
	/*
	var a = [];
	for (var x in ev)
		a.push([x, typeof ev[x], ev[x] && ev[x].tagName]);
	alert(a.join("\n") + ' ' );
	*/
	if (chklstOpen) {
		if (!target.parentNode || target.parentNode.nodeType == 11) // just removed -> no hide
			return;
		var drop = chkGetSub(chklstOpen, "drop");
		while (target && target != drop)
			target = target.parentNode;
		if (!target)
			chkDropShow(chklstOpen, false);
	}
}

function chkAddEvent(e, evname, h) {
	if (e.attachEvent)
		e.attachEvent("on" + evname, h);
	if (e.addEventListener)
		e.addEventListener(evname, h, false);
}

function chkInitWin(w) {
	if (!w.chklstEventsHooked) {
		var e;
		w.chklstEventsHooked = true;
		chkAddEvent(w.document.body, "mousedown", chkBodyClick);
		if ((e = w.document.documentElement))
			chkAddEvent(e, "scroll", chkScrollUpd);
		chkAddEvent(w.document.body, "scroll", chkScrollUpd);
		if (w.driftScrollDiv && (e = w.document.getElementById(w.driftScrollDiv)))
			chkAddEvent(e, "scroll", chkScrollUpd);
	}
}

function chkInit() {
	chkInitWin(self);
}

function chkLoad() {
	for (var i = 0; i < chkInitLists.length; i++)
		chkLoadList(chkInitLists[i]);
	chkInitLists = [];
}
function chkFromSelect(e) {
	chkInitLists.push(e);
	chkAddEvent(window, "load", chkLoad);
}

// compat
function chkFromSelect2(e) { chkFromSelect(e); }
function chkGetList(name) {
	return chkLists[name];
}

function chkSetDisabled(lst, disabled) {
	lst.disabled = disabled;
	var e = chkGetSub(lst, 'fld');
	if (!e)
		return;
	if (e.tagName == "INPUT") {
		e.disabled = disabled;
	} else {
		e.tabStop = disabled ? "" : "0";
		e.style.color = disabled ? "gray" : "";
	}
}

function chkGetOptions(cl) {
	return cl.opts;
}

function chkSetOptions(cl, opts) {
	if (cl.opts.length == opts.length) {
		var eq = true;
		for (var i = 0; i < opts.length; i++)
			if (opts[i][0] != cl.opts[i][0] || opts[i][1] != cl.opts[i][1])
				eq = false;
		if (eq)
			return;
	}
	var selvals = {};
	if (cl.sels)
		for (var a = cl.sels, i = 0, x; x = a[i], i < a.length; i++)
			if (x)
				selvals[cl.opts[i][1]] = 1;
	chkDropShow(cl, false);
	var drop = chkGetSub(cl, 'drop')
	if (drop)
		drop.parentNode.removeChild(drop);
	cl.opts = opts;
	if (cl.sels) {
		cl.lastRow = -1;
		cl.sels = new Array(opts.length);
		for (var i = 0, opt; opt = opts[i], i < opts.length; i++)
			if (selvals[opt[1]])
				cl.sels[i] = 1;
	}
}

function chkSetDocument(cl, doc) {
	cl.ownerDocument = doc;
}

function chkGetOptionText(cl, option) {
	return option[0];
}

function chkFindByValue(cl, value) {
	var cs = chkGetOptions(cl);
	for (var i = 0; i < cs.length; i++)
		if (cs[i][1] == value)
			return i;
	return -1;
}

function chkGetListValues(cl) {
	if (!chkGetSub(cl, 'ftop')) // not yet added to DOM
		return cl.selvalues || [];
	if (!cl.multiple) {
		var val = chkGetSub(cl, 'val');
		return val ? [val.value] : [];
	}
	if (cl.edit) {
		var val = chkGetField(cl);
		return val ? val.split(cl.sep) : [];
	}
	var cs = chkGetSub(cl, 'fs').childNodes;
	var vs = [];
	for (var i = 0; i < cs.length; i++)
		vs.push(cs[i].value);
	return vs;
}

function chkSetListValues(cl, values) {
	if (!cl.multiple) {
		chkFocus(cl, values && values.length ? chkFindByValue(cl, values[0]) : 0);
		return;
	}
	var dnvalues = {};
	for (var i = 0; i < values.length; i++)
		dnvalues[values[i]] = 1;
	var ovalues = chkGetListValues(cl);
	var dovalues = {};
	for (var i = 0; i < ovalues.length; i++) {
		dovalues[ovalues[i]] = 1;
		if (!dnvalues[ovalues[i]])
			chkSetCheck(cl, chkFindByValue(cl, ovalues[i]), false);
	}
	for (var i = 0; i < values.length; i++)
		if (!dovalues[ovalues[i]])
			chkSetCheck(cl, chkFindByValue(cl, values[i]), true);
}

function chkToggle(cl, idx) {
	chkSetCheck(cl, idx, -1);
}

chkAddEvent(window, "load", chkInit);

function chkCopyHandler(w) {
	w.chkbclk = chkbclk;
	w.chkFldKeyDown = chkFldKeyDown;
	w.chkFldKeyPress = chkFldKeyPress;
	chkInitWin(w);
}

