// GlobalShare 3.1 Web
// Copyright 2001-2003, FlySheet Information Services, Inc.
//
// webform.js
//   Web Form JavaScript
//   Launch: 1/05/01
//   Revise: 07/20/04


function keyhandler(e) {
    return window.event.keyCode != 13 || // bypass ENTER key
	   window.event.srcElement.type == "textarea";  // except in textarea
}

//-----------------------
//    Cursor Movement
//-----------------------

function keyuphandler(e) {
    var code = window.event.keyCode;
    if (code == 83 && window.event.ctrlKey && checkrec())  // CTRL-S: submit
	document.forms[0].submit();
    if (code != 33 && code != 34 && code != 38 && code != 40
	    || window.event.altKey || window.event.shiftKey
	    || window.event.ctrlKey)
	return;

    //----- Check source element type
    var elem = window.event.srcElement, focus = false;
    var form = elem.form, type = elem.type, name = elem.name;
    if (!(type == "text" || type == "radio" || type == "checkbox" ||
	    type == "select-one" && code <= 34))
	return;

    //----- Check element name
    var u = name.indexOf("_"), r = name.indexOf("r"), i;
    var n = Math.ceil(name.substr(1, u - 1));
    var f = r > 0 ? name.substr(u + 1, r - u) + "0" : name.substr(u + 1);
    if (name.charAt(0) != "f" || u < 0)
	return;

    //----- PgUp or PgDn for text, radio, checkbox and select
    if (code <= 34) {
	focus = form["f" + (code == 33 ? n - 1 : n + 1) + name.substr(u)];
	if (!focus)
	    focus = code == 33 ? form["f" + n + "_" + FldSeq[0]] :
		    form["f" + n + "_" + FldSeq[FldSeq.length - 1]];
    }

    //----- Up or Down for text, radio and checkbox
    else {
	var up = code == 38, seqlen = FldSeq.length;
	if (type == "text" && ! form[name].name) {  // multiple text input
	    for (i = 0; form[name][i] && elem != form[name][i]; i++)
		;
	    focus = form[name][up ? i - 1 : i + 1];
	}
	else if (r > 0)  // radio button
	    focus = form[name.substr(0, r + 1) + (name.substr(r + 1) +
		(up ? -1 : 1))];
	if ((i = FldSide.indexOf("/" + f + "/")) > 0) {  // move to head
	    i = FldSide.lastIndexOf(" ", i) + 1;
	    f = FldSide.substr(i, FldSide.indexOf("/", i) - i);
	}
	for (i = 0; i < seqlen && FldSeq[i] != f; i++)
	    ;
	if (! focus && i < seqlen) {  // set focus to prev or next line
	    n += Math.floor((i += up ? -1 : 1) / seqlen);
	    focus = form["f" + n + "_" + FldSeq[(i + seqlen) % seqlen]];
	}
    }

    if (focus)
	(focus.name ? focus : focus[0]).focus();
}

function setcursor() {
    var input = document.forms[0]["f0_" + FldSeq[0]];
    if (input)
	(input.name ? input : input[0]).focus();
}


//-----------------------------
//    Heading and Seperator
//-----------------------------

function thead(nrec) {
    return "<input type=hidden name=nrecord value=" + nrec + ">\n" +
	   "<table id=tbl0>\n" +
	   "<tr><td align=right class=fieldeg>(\"<font class=fieldb>" +
	       MsgText[0] + "</font>\"</td>\n" +
	   "    <td colspan=3 class=fieldeg>" + MsgText[1] + ")</td></tr>\n" +
	   "<tr><td colspan=4 height=2></td></tr>\n";
}

function sep(no, recno) {
    var input = "<input type=hidden name=f" + no + "_";
    var html = "</table>\n" + input + "0 value=" + (recno ? recno : "\"\"") +
	       ">\n\n";
    for (var i = 2; i < arguments.length; i += 2)
	html += input + arguments[i] + "v value=\"" + arguments[i+1] + "\">\n";
    return no == document.forms[0].nrecord.value - 1 ? html :
	   html + "<br>\n<table id=tbl" + (no + 1) + ">\n";
}


//--------------------------
//    Table Row and Cell
//--------------------------

function row(no) {
    var html = "<tr valign=top>\n", arglen = arguments.length;
    var todel = arguments[arglen - 2] == -1 ? arguments[arglen - 1] : 0;
    var i, ncol = todel ? (arglen - 3) / 2 : (arglen - 1) / 2;
    var expnbtn = "<br>\n    <input type=button name=insert\n    value=\"" +
	MsgText[2] + "\" style=\"font-weight:bold\" class=bsmall" +
	" tabindex=9999 onClick=\"expand('";
    if (arguments[1] == 0) {  // grouped input
	var fmt = arguments[2].split("\b"), val = new Array();
	var gi = FldGrouped.length, maxn = 1;
	FldGrouped[gi] = fmt;
	for (i = 2; i <= ncol; i++) {
	    val[i - 2] = arguments[i * 2].split("\b");
	    maxn = Math.max(maxn, val[i - 2].length);
	}
	html += "    <td align=right nowrap> &nbsp; <font class=fieldn>" +
		fmt[0] + "</font>" + (maxn > 1 ? expnbtn + "*" + no + "g" +
		gi + "')\">" : "") + "</td>\n    <td colspan=3>\n";
	for (i = fmt[0] = 0; i < maxn; i++)
	    html += rowgr(no, fmt, val, i);
	html += "<span id=" + no + "g" + gi + "i> </span></td>";
	ncol = 0;
    }
    for (i = 1; i <= ncol; i++) {  // parse input field and value
	var f = arguments[i * 2 - 1], egt;
	var eg = FldEg[f], n2sp = ncol > 2 && i > 1 ? "&nbsp" : "";
	var name = "f" + no + "_" + f, type = FldType[f];
	var value = arguments[i * 2];
	value = FldType[f] == "ch" ? new Array(value) : value.split("\b");
	html += "    <td align=right nowrap> &nbsp; <font class=field" +
		(FldRequired[f] ? "b>" : "n>") + FldName[f] + "</font>";
	egt = eg.indexOf("~~") < 0 ? eg : eg.substr(0, eg.indexOf("~~"));
	if (egt)
	    egt = "<small><font color=dimgray>(" + egt.replace(/\$VALUE/g,
		    value[0]) + ")</small></font>";
	if (value.length > 1 && FldType[f] != "re")
	    html += ((egt ? "<br>\n    &nbsp;" + egt : "") + expnbtn + name +
		    "')\">").replace(/<br>/g, n2sp + "<br>");
	html += n2sp + "</td>\n    <td" + (ncol == 1 ? " colspan=3>" :
		ncol == 2 ? ">" : i > 1 ? ">" : " colspan=3><table" +
		(arguments[ncol * 2 - 1] ? " width=100%" : "") +
		" cellspacing=0 cellpadding=0>\n    <tr valign=top><td>");
	for (var n = 0; n < value.length; n++) 
	    html += (n ? "<br>\n    " : "") + cell(n, f, value[n], name) +
		    (n || value.length == 1 || type.charAt(0) == "s" ? "" :
		    "&nbsp;");
	html += value.length > 1 ? "<span id=" + name + "i> </span></td>\n" :
		egt ? egt + "</td>\n" : "</td>\n";  // f#_#i - span id
    }
    if (ncol > 2)
	html += "    </tr></table></td>";
    if (todel)
	html += "\n    <td" + (todel != -1 ? " class=fieldn nowrap>" + todel :
		"><input type=button class=bsmall name=bd" + no + " value='" +
		MsgText[5] + "'\n    onClick=\"toggle(" + no + ")\" tabindex" +
		"=9999><input type=hidden name=d_" + no + ">") + "</td>";
    return html + "</tr>\n";
}

function rowgr(no, fmt, val, n) {
    var html = "\t<table cellspacing=0><tr>", vi = 0, e, f;
    fmt[0]++;
    for (var i = 1; i < fmt.length; i++)
	if (! fmt[i])
	    html += "</tr>\n\t<tr>";
	else {
	    e = fmt[i];
	    f = e.charAt(0) == "." ? e.substr(2) : e;
	    html += (e.charAt(0) == "." && ! isNaN(e) ? "<td colspan=" +
		    e.charAt(1) + ">" : "<td>") + (e.charAt(0) == " " ?
		    e.substr(1) : e.substr(0, 2) == ".n" ? "<font class=field"
		    + (FldRequired[f] ? "b>" : "n>") + FldName[f] + "</font>" :
		    cell(n, f, val && val[vi++].length > n ? val[vi - 1][n] :
		    "", "f" + no + "_" + f)) + "</td>";
	}
    return html + "</tr></table>\n";
}

function cell(i, f, val, name) {
    var html = "", type = FldType[f], tclass = " class=einput" + i % 2;
    var nvtag = "name=" + name + " value=\"" + val + "\"";
    var change = OnChangeFun ? " onChange='" + OnChangeFun + "()'" : "";
    if (f == 0)  // constant string
	return val;
    if (type.indexOf("/") > 0) {  // type nn/xxx
	var size = type.split("/");
	if (! isNaN(size[1]))  // type nn/nn (textarea)
	    return "<textarea name=" + name + tclass + " cols=" + size[0] +
		   " rows=" + size[1] + change + ">" + val + "</textarea>";
	html = "<input type=text " + nvtag + tclass + " size=" + size[0];
	if (size[1].substr(0, 1) == "f") {  // type nn/fulltext
	    var no = name.substr(1, name.indexOf("_") - 1);
	    var arg = name.substr(1).replace(/_/, ",");
	    return html + ">" + (i ? "" : " <input type=button name=bft_" +
		   no + " class=bsmall value='" + MsgFull + " (" + NFile[no] +
		   ")'\n    onClick='loadfile(" + arg + ")' tabindex=9999>");
	}
	else if (size[1].indexOf("y") >= 0)  // type nn/ymdnnnn-nnnn (date)
	    return html + change + " onBlur='checkdate(\"" + size[1] + "\")'>";
	else
	    return html + change + ">";
    }
    else if (! isNaN(type))  // type nn
	return "<input type=text " + nvtag + tclass + " size=" + type + change
	       + (FldEg[f].indexOf("~~") >= 0 ? " onBlur='checktext(\"" +
	       FldEg[f].substr(FldEg[f].indexOf("~~") + 2) + "\")'>" : ">");
    else if (type == "re")  // type readonly
	return val + "<input type=hidden " + nvtag + ">";

    var option = FldOption[f];
    if (typeof(option) != typeof(FldOption))  // error: options undefined
	return "*** ``" + FldName[name.substr(name.indexOf("_") + 1)] +
	       "'' not a table field ***";
    else if (type.charAt(0) == "s") {  // type select, sbegin, smatch
	var optstr = "\n\t<option>" + option.join("\n\t<option>") + "\n\t";
	if (val && optstr.indexOf("<option>" + val + "\n") > 0) {
	    var p = optstr.indexOf("<option>" + val + "\n") + 7;
	    optstr = optstr.substr(0, p) + " selected" + optstr.substr(p);
	}
	html = "<nobr><select name=" + name + tclass + change +
		"><option value=\"\">" + optstr + "</select>";
	if (type != "se")  // f#_#s - text input for sbegin or smatch
	    html += "\n    <input type=text size=6 class=einput0 name=" + name
		    + "s onKeyUp=\"search(" + (type == "sb" ? 1 : 0) + ")\">";
	if (ListAdd)
	    html += "\n    <input type=button name=addent value=\"" +
		    MsgText[3] + "\" class=bsmall\n    onClick=\"addentry('" +
		    name + "', " + i + ")\" tabindex=9999>";
	html += "</nobr>";
    }
    else if (type == "ra") {  // type radio; f#_#r# - radio button
	var input = "<input type=radio name=" + name + "r" + i + " value=\"";
	html = "<input type=hidden " + nvtag + ">\n    ";
	for (var j = 0; j < option.length; j++)
	    html += "<nobr>" + input + option[j] + (val == option[j] ?
		    "\" checked>" : "\">") + option[j] + "</nobr>\n    ";
	if (!FldRequired[f] || !val || i)  // f#_#c# - clean radio button
	    html += "<input type=button name=rclean value=\"" + MsgText[4] +
		    "\" class=bsmall onClick=\"clean('" + name + "r" + i +
		    "')\" tabindex=9999>\n    ";
    }
    else if (type == "ch")  // type checkbox
	for (var j = 0, val = "\b" + val + "\b"; j < option.length; j++)
	    html += "<nobr><input type=checkbox name=" + name + " value=\"" +
		    option[j] + (val.indexOf("\b" + option[j] + "\b") < 0 ?
		    "\">" : "\" checked>") + option[j] + "</nobr>\n    ";
    else  // error: type undeinfed
	return "*** type ``" + type + "'' undefined ***";
    return html;
}


//-------------------------
//    Toggle and Expand
//-------------------------

function toggle(n) {
    //----- Toggle delete/undelete
    var form = window.event.srcElement.form;
    var display = form["d_" + n].value == 1;
    document.all["tbl" + n].style.backgroundColor = display ? "" : "silver";
    form["bd" + n].value = display ? MsgText[5] : MsgText[6];
    form["d_" + n].value = display ? "" : 1;
}

function expand(id) {
    //----- Expand group input fields
    if (id.charAt(0) == "*") {
	id = id.substr(1);
	var v = id.split("g"), n = Math.floor(Math.sqrt(FldGrouped[v[1]][0]));
	while (n--)
	    document.all[id + "i"].innerHTML += rowgr(v[0], FldGrouped[v[1]]);
	return;
    }
    //----- Expand multiple fields
    var form = window.event.srcElement.form;
    var size = form[id].length;
    var name = id + "i", html = "";
    var i, f = id.substr(id.indexOf("_") + 1);
    for (i = 0; i < Math.floor(Math.sqrt(size)); i++)
	html += "<br>\n    " + cell(size + i, f, "", id);
    document.all[name].innerHTML += html;
    (FldType[f] == "ra" ? form[id + "r" + size][0] : form[id][size]).focus();
}


//----------------------
//    Search Options
//----------------------

function search(begin) {
    var textinput = window.event.srcElement;
    var name = textinput.name, value = textinput.value;
    //if (SText == -1 || SText == value) {
    //    SText = value;
    //    return;
    //}
    var form = textinput.form;
    var select = form[name.substr(0, name.length - 1)], i, size;
    if (! select.options) {
	for (i = 0; i < form[name].length && form[name][i] != textinput; )
	    i++;
	select = form[name.substr(0, name.length - 1)][i];
    }
    i = 0, size = select.length;
    if (begin) {  // type sbegin
	var vlen = value.length;
	while (i < size && select.options[i].text.substr(0, vlen) != value)
	    i++;
	if (i >= size)
	    for (i = 0; i < size && select.options[i].text < value; )
		i++;
    }
    else if (value)  // type smatch
	while (i < size && select.options[i].text.indexOf(value) < 0)
	    i++;
    select.selectedIndex = i >= size ? 0 : i;
    SText = value;
}


//----------------------------------
//    Add Select and Clean Radio
//----------------------------------

function addentry(name, i) {
    //----- Add entry for select box
    var form = window.event.srcElement.form, select = form[name];
    var entry = window.prompt(MsgText[7], form[name + "s"] ? select.options ?
	    form[name + "s"].value : form[name + "s"][i].value : "");
    if (! entry)
	return;
    if (! select.options)
	select = select[i];
    select.options[0].value = select.options[0].text = entry;
    select.selectedIndex = 0;
    SText = -1;
}

function clean(name) {
    //----- Clean radio button
    var radio = window.event.srcElement.form[name];
    radio[0].checked = true;
    radio[0].checked = false;
}


//------------------
//    Check Text
//------------------

function checkdate(fmt) {
    var dateinput = window.event.srcElement;
    var date = dateinput.value, yfrom = 0, yto = 9999;
    if (!date)
	return true;
    //----- Check date format
    if (fmt.length > 3) {
	var pair = fmt.match(/^([ymd]*)(.*)$/), n, d = new Date;
	var range = pair[2].split(pair[2].indexOf("~") >= 0 ? "~" : "-");
	fmt = pair[1];
	for (n = 0; n < 2; n++)
	    if (range[n].charAt(0) == "-" || range[n].charAt(0) == "+")
		range[n] = d.getFullYear() + range[n].substr(1) *
			(range[n].charAt(0) == "-" ? -1 : 1);
	yfrom = range[0] > 0 ? range[0] * 1 : 0;
	yto = range[1] > 0 ? range[1] * 1 : 9999;
    }
    var ymd = " " + fmt, fail;
    var yp = ymd.indexOf("y"), mp = ymd.indexOf("m"), dp = ymd.indexOf("d");
    date = date.match("^" + (isNaN(date) ? fmt.replace(/\w/g, "(\\d+)\\W*\\b")
	: fmt.replace(/m|d/g, "(\\d{2})").replace(/y/, "(\\d{2,4})")) + "$");
    if ((fail = yp < 0 ? 0 : !date ? 1 : date[yp] < yfrom ? 2 : date[yp] >
	    yto ? 3 : mp < 0 ? 0 : date[mp] < 1 || date[mp] > 12 ? 4 :
	    dp < 0 ? 0 : date[dp] < 1 || date[dp] > 31 ? 5 : 0) == 0)
	return true;
    //----- Alert and set focus back if date incorrect
    var i = -1, input = dateinput.form[dateinput.name];
    if (!input.name)
	for (i = 0; i < input.length && input.value != dateinput.value; i++)
	    ;
    if (arguments.length < 2)
	alert(MsgText[fail + 7] +
	    (fail == 2 ? " " + yfrom : fail == 3 ? " " + yto : ""));
    window.setTimeout("document." + dateinput.form.name + "." +
	dateinput.name + (i >= 0 ? "[" + i + "]" : "") + ".focus()", 1);
    return false;
}

function checktext(exp) {
    var textinput = window.event.srcElement;
    var text = textinput.value, yfrom = 0, yto = 9999;
    exp = new RegExp(exp);
    if (!text || exp.test(text))
	return true;
    alert(MsgText[22]);
    textinput.focus();
    return false;
}

function checkfile(exp) {
    if (!FldFull)
	return;
    //----- Check whether new file uploaded every half second
    if (window.status.substr(0, 5) == "FILE#") {
	var elem = document.forms[0][FldFull], i = elem.length;
	while (i && elem[i - 1].value == "")
	    i--;
	elem = (i || i == 0) && i != elem.length ? elem[i] : elem;
	if (elem.value == "")  // auto fill newly-uploaded file number
	    elem.value = window.status.substr(5);
	window.status = "";
    }
    window.setTimeout("checkfile()", 500);
}

//--------------------
//    Check Record
//--------------------

function checkrec() {
    //----- Check date validity
    var name = window.event.srcElement.name;
    var f = name.substr(name.indexOf('_') + 1);
    if (f > 0 && FldType[f].match(/\/[ymd]/) &&
	    !checkdate(FldType[f].split("/")[1], 1)) {
	window.focus();
	return false;
    }
    //----- Check required fields in record
    var form = window.event.srcElement.form, required = false, first, firstf;
    var nrec = form.nrecord ? form.nrecord.value : 0;

    for (f = 1; f < FldRequired.length && !required; f++)
	required = FldType[f] != "re" && FldRequired[f];
    for (var i = 0; i < nrec; i++) {
	var allhave = form["f" + i + "_0"].value || i == 0 ? true : -1;
	for (var f = 1; f < FldRequired.length; f++) {
            var fldno = f;
            if (fldno == null) continue;
	    name = "f" + i + "_" + f, type = FldType[fldno];
	    if (type == "ra") {  // reflect radio f#_#r# to hidden f#_#
		val = form[name + "r" + 0];
		for (var j=1, k; val && val.length > 0; j++) {
		    // find cheked entry in radio f#_#r#
		    for (k = val.length; --k >= 0 && !val[k].checked; ) ;
                    if (form[name].length == undefined) {
                        form[name].value = k < 0 ? "" : val[k].value;
                    } else {
                        form[name][j-1].value = k < 0 ? "" : val[k].value;
                    }
		    val = form[name + "r" + j];
		}
	    }
	    var field = form[name], val, defv = form[name + "v"];
	    if (type == "re" || required && !FldRequired[f] || !field)
		continue;
	    if (type == "ch") {
		for (var j = 0; j < field.length && !field[j].checked; j++)
		    ;  // find first checked entry
		field = j >= field.length ? field[0] : field[j];
		val = field.checked ? field.value : "";
	    }
	    else if (type && type.charAt(0) == "s") {
		field = field.options ? field : field[0];
		if (typeof(field) != "undefined") {
		    val = field.options[field.selectedIndex].text;
                } else {
		    val = "undefined";
                }
	    }
	    else
		field = field.length ? field[0] : field, val = field.value;
	    if (form[name + "v"] && val == form[name + "v"].value && val && i)
		continue;
	    if (allhave == -1)  // to be determined
		allhave = val ? true : false, first = field, firstf = f;
	    else if (required && (allhave ? !val : val)) {
		var e = val ? first : field;
		alert(MsgText[13] + FldName[val ? firstf : f]);
		(form[e.name + "r0"] ? form[e.name + "r0"][0] : e).focus();
		return false;
	    }
	}
	if (allhave != -1 && (!required || allhave) &&
		form["f" + i + "_0"].value <= 0)
	    form["f" + i + "_0"].value = "0";  // new record entered
    }
    return true;
}

function normradio() {
    //----- normalize the values of radio button fields
    var form = window.event.srcElement.form;
    var nrec = form.nrecord ? form.nrecord.value : 0;
    for (var i = 0; i < nrec; i++) {
	for (var y = 1; y < FldRequired.length; y++) {
	    name = "f" + i + "_" + y, type = FldType[y];
	    if (type == "ra") {  // reflect radio f#_#r# to hidden f#_#
		val = form[name + "r" + 0];
		for (var j=1, k; val && val.length > 0; j++) {
		    // find cheked entry in radio f#_#r#
		    for (k = val.length; --k >= 0 && !val[k].checked; ) ;
                    if (form[name].length == undefined) {
                        form[name].value = k < 0 ? "" : val[k].value;
                    } else {
                        form[name][j-1].value = k < 0 ? "" : val[k].value;
                    }
		    val = form[name + "r" + j];
		}
	    }
	}
        if (form["f" + 0 + "_0"].value <= 0)
            form["f" + 0 + "_0"].value = "0";  // new record entered
    }
}

//-----------------
//    List Form
//-----------------

function listform(ftag) {
    //----- Print empty new entries
    var input = "<input type=text size=20 class=einput0 name=";
    var i, html = "<input type=hidden name=nnew value=5>\n";
    html += "<input type=hidden name=change value=\"\n\">\n" +
	    "<input type=hidden name=ftag value=" + ftag + ">\n\n" +
	    "<table>\n<tr><th></th>\n    <th class=thead>" + MsgText[14] +
	    "</th><th class=thead>" + MsgText[15] + "</th></tr>\n" +
	    "<tr valign=bottom><td><input type=button name=insert value=\"" +
	    MsgText[2] + "\"\n     style=\"font-weight:bold\" class=bsmall" +
	    " onClick=expandt()></td>\n    <td colspan=2>";
    for (i = 0; i < 5; i++)
	html += input + "new" + i + ">\n    " + input + "nas" + i +
		(i < 4 ? "><br>\n    " : ">");
    html += "<span id=espan> </span></td></tr>\n</table>\n";
    if (NRecs.length <= 0 || NRecs.length == 1 && NRecs[0] == "")
	return html;

    //----- Print all list entries
    var row = new Array(), mouse = "onMouseOver=\"className='iover'\"" +
	    " onMouseOut=\"className=''\"\n     onClick=editlist";
    html += "<p>\n\n<table id=tedit border=1 bordercolor=gainsboro " +
	    "cellspacing=0>\n<tr class=thead><th class=theadno>&nbsp;</th>\n" +
	    "    <th>" + MsgText[14] + "</th><th>" + MsgText[15] +
	    "</th><th>" + MsgText[16] + "</th></tr>\n";
    for (i = 0; i < Entry.length; i++) {
	var nrec = Href && NRecs[i] > 0 ? "<a href=\"javascript:" + Href +
	    "(" + i + ")\" class=darklink>" + NRecs[i] + "</a>" : NRecs[i];
	row[i] = "<tr><td class=theadno>&nbsp;" + (i + 1) + "&nbsp;</td>\n" +
		"    <td nowrap " + mouse + "(" + i + ")>" + Entry[i] +
		"</td>\n" + "    <td " + mouse + "a(" + i + ")>" +
		(Alias[i] ? Alias[i] : "&nbsp;") +
		"</td>\n    <td align=center>" + nrec + "</td></tr>\n";
    }
    return html + row.join("") + "</table>\n";
}


//-----------------------
//    Edit List Entry
//-----------------------

function expandt() {
    //----- Expand list entries
    var form = window.event.srcElement.form;
    var nnew = Math.floor(form.nnew.value);
    var html = "";
    for (i = nnew; i < nnew + 5; i++)
	html += "<br>\n    <input type=text size=20 class=einput0 name=new" +
		i + ">\n    <input type=text size=20 class=einput0 name=nas" +
		i + ">";
    document.all.espan.innerHTML += html;
    form.nnew.value = nnew + 5;
    form["new" + nnew].focus();
}

function editlista(i) {
    editlist(i, true);
}

function editlist(i, alias, value) {
    //----- Guarantee entry and alias not modified simutaneously
    if (Changed[i] > 0 && Changed[i] != (alias ? 2 : 1))
	return alert(MsgText[23]);

    //----- Get new entry
    var oldent = alias ? Alias[i] : Entry[i], newent = "";
    var msg = alias ? MsgText[20] : MsgText[7] + MsgText[17];
    var ent = arguments.length > 2 ? value : window.prompt(msg, oldent);
    if (!ent && ent != "")
	return;
    ent = ent.replace(/^\s+/g,""); ent = ent.replace(/\s+$/g,"");
    if (ent == "" && NRecs[i] > 0 && !alias)
	return alert(MsgText[18] + NRecs[i] + MsgText[19]);
    for (var c = 0; ent.charCodeAt(c) > 0; c++)  // convert big5 to Unicode
	newent += String.fromCharCode(ent.charCodeAt(c));

    //----- Check duplication
    var val = newent.replace(/\/\//g, "\t");
    var oldval = "/" + (alias ? oldent.replace(/\/\//g, "\t") :
	oldent.replace(/\//g, "\t")) + "/";
    val = alias ? val.split("/") : new Array(val);
    if (!AllEnt)
	AllEnt = "/" + (Entry.join("\n").replace(/\//g, "\t") + "\n" + Alias.
	    join("\n").replace(/\/\//g, "\t") + "\n").replace(/\n+/g, "/");
    for (var j = CheckDup ? 0 : val.length; j < val.length; j++)
	if (val[j] && AllEnt.indexOf("/" + val[j] + "/") >= 0 && 
		oldval.indexOf("/" + val[j] + "/") < 0)
	    return alert(MsgText[21].split("%s").join(val[j].replace(/\t/g,
		"/")));

    //----- Set form.change and table cell
    var change = document.forms[0].change, s = change.value;
    var header = "\n" + Entry[i] + "\t" + (alias ? Alias[i] + "\t" : "");
    var pos = s.indexOf(header);
    var cells = document.all.tedit.rows[i + 1].cells
    if (pos > 0)
	s = s.substr(0, pos) + s.substr(s.indexOf("\n", pos + 1));
    change.value = newent == oldent ? s : header + newent + s;
    cells[alias ? 2 : 1].innerHTML = newent == oldent ? newent ? newent :
	    "&nbsp;" : (oldent ? "<font class=entryd>" + oldent +
	    "</font><br>\n" : "") + "<font class=entryi>" + newent + "</font>";
    if (!alias && !newent && Alias[i])  // delete alias too if entry deleted
	editlist(i, true, "");
    Changed[i] = newent == oldent ? 0 : alias ? 2 : 1;
}

