///*
//*************************************************************************
//**									*
//**	Copyright (C) 2003 Trans-Mit Pty. Ltd. Melbourne Australia	*
//**	This software may not be loaned, resold, changed or copied	*
//**	in any way without the express written permission of author	*
//**	and Trans-Mit Pty. Ltd., Australia.				*
//**									*
//*************************************************************************
//**
//**	$Header: /usr/local/lib/cake/RCS/rcshead,v 1.6 2000/01/24 01:16:29 root Exp $
//**	$Author: root $
//**	$Date: 2000/01/24 01:16:29 $
//**	$Locker:  $
//**
//*************************************************************************
//*/
//**Start Encode**

// Globals
var mytitle = "";
var workfolder = "";
var xlsfilepath = "";
var csvfilepath = "";
var pictureurl = "";
var docurl = "";
var DOFF = 2;
var NDROWS = 13
var RECORDNOCOL = 0;
var EMAILCOL = 0;
var PICTURECOL = 0;
var DOCCOL = 0;
var MSG1COL = 0;
var MSG2COL = 0;
var MSG3COL = 0;
var MSG4COL = 0;
var MSG5COL = 0;
var MSG6COL = 0;
var MSG7COL = 0;
var MSG8COL = 0;
var MSG9COL = 0;

var recfilt;
var colfilt = new Array();
var savesrchinput = new Array();
var unisoactiverow = -1;
var unisocurfld = -1;
var firsttime = 1;
var got_enqdatconfig = 0;
var mydonekey = 0;
var activerow = 0;
var curinput;
var reccountspoken = 0;
var curpos = 0;
var thisRecordNo = -1;
var lastRecordNo = -1;

var gmsg = "";
var gmsg1 = "";
var gmsg2 = "";
var gmsg3 = "";
var gmsg4 = "";
var gmsg5 = "";
var gmsg6 = "";
var gmsg7 = "";
var gmsg8 = "";
var gmsg9 = "";

var SPEECHSPEED_INC = 20;

var SPEECHPITCH_INC = 30;
var SPEECHPITCH_MIN = 30;
var SPEECHPITCH_MAX = 300;

var sayready = 0;
var saydesconfocus = 0;
var saytxtonfocus = 0;
var acthasmsg = 0;
var nflds = 0;
var curfld = 1;
var have_TEXINFO = 0;
var savemystatus = "";
var fld_datafld = new Array();
var fld_hdr = new Array();
var fld_len = new Array();
var fld_type = new Array();
var fld_hotkey = new Array();
var fld_desc = new Array();

var now = new Date()

var exccode = 0;
var ExcelApp;
var kickoff_isdone = 1;

var TTSON = 0;
var saymsgwhenisolate = 0;
var ttsidx = 1;
var max_ttsidx = 1;

// SPECIAL key codes
var BS_KEYCODE = 8;
var TAB_KEYCODE = 9;
var ENTER_KEYCODE = 13;

var SHIFT_KEYCODE = 16;
var CTRL_KEYCODE = 17;
var ALT_KEYCODE = 18;

var PAUSE_KEYCODE = 19;
var ESC_KEYCODE = 27;
var DOUBLEQUOTE_KEYCODE = 34;

var PAGEUP_KEYCODE = 33;
var PAGEDOWN_KEYCODE = 34;
var END_KEYCODE = 35;
var HOME_KEYCODE = 36;

var LEFTARROW_KEYCODE = 37;
var UPARROW_KEYCODE = 38;
var RIGHTARROW_KEYCODE = 39;
var DOWNARROW_KEYCODE = 40;

var INSERT_KEYCODE = 45;
var DELETE_KEYCODE = 45;

var DIG0_KEYCODE = 48;
var DIG1_KEYCODE = 49;
var DIG2_KEYCODE = 50;
var DIG3_KEYCODE = 51;
var DIG4_KEYCODE = 52;
var DIG5_KEYCODE = 53;
var DIG6_KEYCODE = 54;
var DIG7_KEYCODE = 55;
var DIG8_KEYCODE = 56;
var DIG9_KEYCODE = 57;

var KEYPAD0_KEYCODE = 96;
var KEYPAD1_KEYCODE = 97;
var KEYPAD2_KEYCODE = 98;
var KEYPAD3_KEYCODE = 99;
var KEYPAD4_KEYCODE = 100;
var KEYPAD5_KEYCODE = 101;
var KEYPAD6_KEYCODE = 102;
var KEYPAD7_KEYCODE = 103;
var KEYPAD8_KEYCODE = 104;
var KEYPAD9_KEYCODE = 105;
var KEYPADASTERIX_KEYCODE = 106;
var KEYPADPLUS_KEYCODE = 107;
var KEYPADDASH_KEYCODE = 109;
var KEYPADDOT_KEYCODE = 110;
var KEYPADSLASH_KEYCODE = 111;

var F1_KEYCODE = 112;
var F2_KEYCODE = 113;
var F3_KEYCODE = 114;
var F4_KEYCODE = 115;
var F5_KEYCODE = 116; // F5 - Reserverd for REFRESH
var F6_KEYCODE = 117;
var F7_KEYCODE = 118;
var F8_KEYCODE = 119;
var F9_KEYCODE = 120;
var F10_KEYCODE = 121;
var F11_KEYCODE = 122;
var F12_KEYCODE = 123;
var NUNLOCK_KEYCODE = 144;
var SCROLLLOCK_KEYCODE = 145;
var SLASH_KEYCODE = 191;

// Define feature code
var CLEARFIELD = 1;
var CLEARALL = 2;
var PAGEUP = 3;
var PAGEDOWN = 4;
var FIRSTPAGE = 5;
var LASTPAGE = 6;
var UPACTIVEROW = 7;
var DOWNACTIVEROW = 8;
var PREVIOUSFIELD = 9;
var NEXTFIELD = 10;
var SHOWMSG = 11;
var OPENEMAILAPP = 12;
var OPENDOCURL = 13;
var GOFIELD1 = 14;
var GOFIELD2 = 15;
var GOFIELD3 = 16;
var SPEAKCURRENT = 17;
var SPELLCURRENT = 18;
var FASTERSPEECH = 19;
var SLOWERSPEECH = 20;
var NEXTSPEAKER = 21;
var ABOUTSPEECH = 22;
var PREVIOUSSPEAKER = 23;
var PITCHUP = 24;
var PITCHDOWN = 25;
var CPLSPEECH = 26;
var SPEECHONOFF = 27;
var SAYMSGWHENISOLATEONOFF = 28;
var SPEECHDICTIONARY = 29;
var SHOWHELP = 30;
var XLEDITDATA = 31;
var ISOLATEREC = 32;
var UNISOLATE = 33;

var SAYMSGLINE1 = 41;
var SAYMSGLINE2 = 42;
var SAYMSGLINE3 = 43;
var SAYMSGLINE4 = 44;
var SAYMSGLINE5 = 45;
var SAYMSGLINE6 = 46;
var SAYMSGLINE7 = 47;
var SAYMSGLINE8 = 48;
var SAYMSGLINE9 = 49;

// masking for keycodes
var KEY_MASK = 65535;
var KEY_SHIFT = 1 * KEY_MASK;
var KEY_CTRL = 2 * KEY_MASK;
var KEY_ALT = 4 * KEY_MASK;

// define key map
var keycodemap = new Array();
keycodemap[CLEARFIELD] = ENTER_KEYCODE;
keycodemap[CLEARALL] = ESC_KEYCODE;
keycodemap[PAGEUP] = PAGEUP_KEYCODE;
keycodemap[PAGEDOWN] = PAGEDOWN_KEYCODE;
keycodemap[FIRSTPAGE] = HOME_KEYCODE + KEY_CTRL;
keycodemap[LASTPAGE] = END_KEYCODE + KEY_CTRL;
keycodemap[UPACTIVEROW] = UPARROW_KEYCODE;
keycodemap[DOWNACTIVEROW] = DOWNARROW_KEYCODE;
keycodemap[PREVIOUSFIELD] = LEFTARROW_KEYCODE + KEY_ALT;
keycodemap[NEXTFIELD] = RIGHTARROW_KEYCODE + KEY_ALT;
keycodemap[SHOWMSG] = F10_KEYCODE;
keycodemap[OPENEMAILAPP] = F11_KEYCODE;
keycodemap[OPENDOCURL] = F11_KEYCODE + KEY_ALT;
keycodemap[GOFIELD1] = F1_KEYCODE + (gofieldFKEYSwithALT ? KEY_ALT : 0);
keycodemap[GOFIELD2] = F2_KEYCODE + (gofieldFKEYSwithALT ? KEY_ALT : 0);
keycodemap[GOFIELD3] = F3_KEYCODE + (gofieldFKEYSwithALT ? KEY_ALT : 0);
keycodemap[SPEAKCURRENT] = F6_KEYCODE;
keycodemap[SPELLCURRENT] = F4_KEYCODE;
keycodemap[CPLSPEECH] = F12_KEYCODE + KEY_ALT;
keycodemap[SPEECHONOFF] = F12_KEYCODE + KEY_SHIFT;
keycodemap[SAYMSGWHENISOLATEONOFF] = F10_KEYCODE + KEY_SHIFT;
keycodemap[FASTERSPEECH] = F7_KEYCODE;
keycodemap[SLOWERSPEECH] = F7_KEYCODE + KEY_SHIFT;
keycodemap[PITCHUP] = F8_KEYCODE;
keycodemap[PITCHDOWN] = F8_KEYCODE + KEY_SHIFT;
keycodemap[ABOUTSPEECH] = F9_KEYCODE + KEY_CTRL;
keycodemap[NEXTSPEAKER] = F9_KEYCODE;
keycodemap[PREVIOUSSPEAKER] = F9_KEYCODE + KEY_SHIFT;
keycodemap[SPEECHDICTIONARY] = F9_KEYCODE + KEY_ALT;
keycodemap[SHOWHELP] = F1_KEYCODE + KEY_CTRL;
keycodemap[XLEDITDATA] = F12_KEYCODE;
keycodemap[ISOLATEREC] = UPARROW_KEYCODE + KEY_CTRL;
keycodemap[UNISOLATE] = DOWNARROW_KEYCODE + KEY_CTRL;
keycodemap[SAYMSGLINE1] = DIG1_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE2] = DIG2_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE3] = DIG3_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE4] = DIG4_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE5] = DIG5_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE6] = DIG6_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE7] = DIG7_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE8] = DIG8_KEYCODE + KEY_ALT;
keycodemap[SAYMSGLINE9] = DIG9_KEYCODE + KEY_ALT;


// -------------------------------------
window.status = "Loading Please Wait..."

mytitle = document.title
//document.title = window.status = mytitle + " - " + window.status;

// -------------------------------------

function setsrchfld(fld)
{
	curfld = fld;
	curinput = drows.rows[1].cells(curfld).firstChild.firstChild;
	curinput.blur();
	curinput.focus();
}

// -------------------------------------


function initT21Enquiry()
{
	//alert("initT21Enquiry()");

	if ( xlsfile != "" ) {
		var fso;
		fso = new ActiveXObject("Scripting.FileSystemObject");
		// get current working folder
		workfolder = fso.GetFolder(".\\");
	}

	//alert("workfolder=" + workfolder);
	if ( xlsfolder == "" )
		xlsfilepath = workfolder + "\\" + xlsfile;
	else
		xlsfilepath = xlsfolder + "\\" + xlsfile;
	//alert("xlsfolder=" + xlsfolder + "  xlsfile=" + xlsfile + "  xlsfilepath=" + xlsfilepath);

	if ( csvfolder == "" )
		csvfilepath = workfolder + "\\" + csvfile;
	else
		csvfilepath = csvfolder + "\\" + csvfile;
	//alert("csvfolder=" + csvfolder + "  csvfile=" + csvfile + "  csvfilepath=" + csvfilepath);

	if ( dospeech == 1 ) {
		document.all.but_speech_properties.disabled = true;
		document.all.but_about_speech.disabled = true;
		document.all.but_about_engine.disabled = true;
		document.all.but_next_speaker.disabled = true;
		document.all.but_previous_speaker.disabled = true;
		if ( cplspeechappurl != "" )
			document.all.but_speech_controlpanel.disabled = true;
		document.all.but_Lex.disabled = true;
		document.all.but_speech_onoff.disabled = true;
	}

	document.all.but_clearall.disabled = true;
	document.all.but_clearfield.disabled = true;
	document.all.but_showhelp.disabled = true;
	if ( exitbutton ) {
		document.all.but_exit.disabled = true;
	}

	setsrchfld(startfld);

	//dumpobj( drows.rows[1].cells[1] );
	//dumpobj( drows.rows[1].cells[1].firstChild.firstChild );
	//alert( drows.rows[1].cells[1].firstChild.firstChild.name );
	//alert( drows.rows[1].cells[1].firstChild.firstChild.id );
	//alert( drows.rows[1].cells[1].firstChild.firstChild.size );
	//alert( drows.rows[1].cells[1].firstChild.firstChild.accessKey );

	fixDate(now)
	now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000)

	if ( dospeech ) {
		TTSON = getCookie("TTSON")
		//alert("TTSON=[" + TTSON + "]");
		if (TTSON == null )
	      	TTSON = 0
		else
	      	TTSON = parseInt(TTSON)
		//alert("TTSON=[" + TTSON + "]");
	}

	if ( dospeech ) {
		saymsgwhenisolate = getCookie("saymsgwhenisolate")
		//alert("saymsgwhenisolate=[" + saymsgwhenisolate + "]");
		if (saymsgwhenisolate == null )
	     	 saymsgwhenisolate = 1
		else
	      	saymsgwhenisolate = parseInt(saymsgwhenisolate)
		//alert("saymsgwhenisolate=[" + saymsgwhenisolate + "]");
	}

	init_tts();

	document.all.but_clearall.disabled = false;
	document.all.but_clearfield.disabled = false;
	document.all.but_showhelp.disabled = false;
	if ( exitbutton ) {
		document.all.but_exit.disabled = false;
	}

	clearall(0);

	saydesconfocus = 1;
	saytxtonfocus = 1;

	firsttime = 0;
	
	//SPK
	//mysay(mytitle + " Ready.");
	//mysay("Ready.");
	//waitspeaking();

	// ZZZZ
	//dumpobj( window );
	//drows.onblur = blurT21Enquiry();
	//window.onblur = blurT21Enquiry();
	//document.onfocusout = blurT21Enquiry();
	//document.ondeactivate = blurT21Enquiry();

	//window.onfoucus = focusT21Enquiry();

	show_status("Ready.");

	curinput.blur();
	curinput.focus();
}

// -------------------------------------

function hflds_left()
{
	//alert("hflds_left()");
	show_status("hide " + fld_desc[6])
	hdr_hfld6.style.display = "none"
	inp_hfld6.style.display = "none"
	bdy_hfld6.style.display = "none"
}

function hflds_right()
{
	//alert("hflds_right()");
	show_status("show " + fld_desc[6])
	hdr_hfld6.style.display = "normal"
	inp_hfld6.style.display = "normal"
	bdy_hfld6.style.display = "normal"
}

// -------------------------------------

function focusT21Enquiry()
{
	//alert("focusblurT21Enquiry()");
	// got focus
	window.status = "got focus";
}

function blurT21Enquiry()
{
	//alert("blurT21Enquiry()");
	// losing focus
	show_status("lost focus");
	stopspeaking();
}

// -------------------------------------

function do_ondatasetchanged()
{
	//alert("event ondatasetchanged");
}

function do_ondataavailable()
{
	//alert("event ondataavailable");
}

function do_ondatasetcomplete()
{
	//alert("event ondatasetcomplete");
	get_enqdatconfig();
}

// -------------------------------------

function setCookie(name, value, expires, path, domain, secure) {
	var curCookie = name + "=" + escape(value) +
         ((expires) ? "; expires=" + expires.toGMTString() : "") +
         ((path) ? "; path=" + path : "") +
         ((domain) ? "; domain=" + domain : "") +
         ((secure) ? "; secure" : "")
	document.cookie = curCookie
}

function getCookie(name) {
      var prefix = name + "="
      var cookieStartIndex = document.cookie.indexOf(prefix)
      if (cookieStartIndex == -1)
         return null
      var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex +
         prefix.length)
      if (cookieEndIndex == -1)
         cookieEndIndex = document.cookie.length
      return unescape(document.cookie.substring(cookieStartIndex +
         prefix.length,
   cookieEndIndex))
}

function deleteCookie(name, path, domain) {
      if (getCookie(name)) {
         document.cookie = name + "=" +
         ((path) ? "; path=" + path : "") +
         ((domain) ? "; domain=" + domain : "") +
         "; expires=Thu, 01-Jan-70 00:00:01 GMT"
      }
}

function fixDate(date) {
      var base = new Date(0)
      var skew = base.getTime()
      if (skew > 0)
         date.setTime(date.getTime() - skew)
}

// -------------------------------------

function showhelp()
{
	stopspeaking();

	var helpmsg = "Help.\n\
Clear All\t\t - Escape. \t Clear Field\t - Enter.\n\
Previous Page\t - Page Up. \t Next Page\t - Page Down.\n\
First Page\t - Control-Home. \t Last Page\t - Control-End.\n\
\n\
Previous Row\t - Up Arrow.\n\
Next Row\t\t - Down Arrow.\n\
\n\
Next Field\t\t - Tab or Alt-Right Arrow.\n\
Previous Field\t - Shift-Tab or Alt-Left Arrow.\n\
\n\
Field Edit"
helpmsg += dospeech ? " and Spell" : ""
helpmsg += "\t- Left and Right Arrow, Home, End, Backspace, Delete\n\
\n"
helpmsg += "\
Isolate Record \t- Control-KeyPad #, Control-Up Arrow, Left Mouse Click #\n\
UnIsolate \t- Control-Down Arrow.\n\
\n"
helpmsg += "\
Goto " + fld_desc[1] + "\t - " +(gofieldFKEYSwithALT ? "Alt-" : "")+ "F1. \t\t \
Goto " + fld_desc[2] + "\t - " +(gofieldFKEYSwithALT ? "Alt-" : "")+ "F2.\n\
Goto " + fld_desc[3] + "\t - " +(gofieldFKEYSwithALT ? "Alt-" : "")+ "F3. \t\t \
Goto Field\t - Alt-accesskey.\n\
"

helpmsg += dospeech ? "\
Spell Current\t - F4. \t\t Speak Current\t - F6.\n\
Speech Faster\t - F7. \t\t Speech Slower\t - Shift-F7.\n\
Next Speaker\t - F9. \t\t Previous Speaker\t - Shift-F9.\n\
Speech Dictionary\t - Alt-F9.\t\t Say Msg Line\t - Alt-1..9.\n\
\n" : ""

helpmsg += dospeech  ? (MSG1COL ? "Say Message when isolate On/Off\t - Shift-F10\n" : "") : ""
helpmsg += "Stop Speech\t - Control.\n"
helpmsg += dospeech ? "Speech On/Off\t - Shift-F12.\n" : ""
helpmsg += "\n"

helpmsg += "Refresh Data\t - F5. \t\t Exit Telephone Directory - Alt-F4\n"

helpmsg += MSG1COL ? "Show Message\t - F10. \t\t" : ""
helpmsg += (EMAILCOL != 0 ) ? "Open Email App\t - F11.\n" : ""
helpmsg += (DOCCOL != 0 ) ? "Open Document\t - Alt-F11.\n" : ""
helpmsg += "Show Help\t - Control-F1.\n\
\n\
"
helpmsg += (xlsfile != "") ? "\n\
Excel Edit Data\t - F12. \t Control Panel Speech App\t - Alt-F12.\n\
\n\
" : ""

helpmsg += (workfolder != "") ? "workfolder=" + workfolder + "\n" : ""

if ( xlsfile != "" ) {
	helpmsg += "xlsfolder=" + xlsfolder +"\n"
	helpmsg += "xlsfile=" + xlsfile + "\t xlsfilepath=" + xlsfilepath + "\n"
	helpmsg += "csvfolder=" + csvfolder + "\n"
	helpmsg += "csvfile=" + csvfile + "\t csvfilepath=" + csvfilepath + "\n"
}

	show_status("Show Help");
	mysay( helpmsg );
	alert( helpmsg );
	show_status("Ready.");
	//rjs curinput.focus();
	clearall(1);
}


function saymsgline(msgline)
{
	if ( MSG1COL == 0 )
		return;

	stopspeaking();

	// no rows
	if (drows.rows.length <= DOFF) {
		mysay("No Rows.");
		curinput.focus();
		return 0
	}

	var msgcol = 0;
	switch( msgline ) {
	case 1:
		var msgcol = MSG1COL;
		break;
	case 2:
		var msgcol = MSG2COL;
		break;
	case 3:
		var msgcol = MSG3COL;
		break;
	case 4:
		var msgcol = MSG4COL;
		break;
	case 5:
		var msgcol = MSG5COL;
		break;
	case 6:
		var msgcol = MSG6COL;
		break;
	case 7:
		var msgcol = MSG7COL;
		break;
	case 8:
		var msgcol = MSG8COL;
		break;
	case 9:
		var msgcol = MSG9COL;
		break;
	}
	//alert("saymsgline(" + msgline + ") msgcol = " + msgcol);

	var mlstr = msgcol ? drows.rows[DOFF+activerow].cells[msgcol].innerText : "";
	mysay( expmsg(mlstr) );
	return (mlstr == "") ? 0 : 1;
}


function showmsg(arow,dodisplay)
{
	var retval = 0;

	if ( MSG1COL == 0 )
		return retval;

	if ( dodisplay )
		stopspeaking();

	// no rows
	if (drows.rows.length <= DOFF) {
		if ( dodisplay )
			mysay("No Rows.");
		curinput.focus();
		return retval
	}

	if ( dodisplay ) {
		show_status("Show Message.");
		//mysay("Show Message.");
	}

	var absrow = DOFF + arow;

	gmsg1 = MSG1COL ? drows.rows[absrow].cells[MSG1COL].innerText : "";
	gmsg2 = MSG2COL ? drows.rows[absrow].cells[MSG2COL].innerText : "";
	gmsg3 = MSG3COL ? drows.rows[absrow].cells[MSG3COL].innerText : "";
	gmsg4 = MSG4COL ? drows.rows[absrow].cells[MSG4COL].innerText : "";
	gmsg5 = MSG5COL ? drows.rows[absrow].cells[MSG5COL].innerText : "";
	gmsg6 = MSG6COL ? drows.rows[absrow].cells[MSG6COL].innerText : "";
	gmsg7 = MSG7COL ? drows.rows[absrow].cells[MSG7COL].innerText : "";
	gmsg8 = MSG8COL ? drows.rows[absrow].cells[MSG8COL].innerText : "";
	gmsg9 = MSG9COL ? drows.rows[absrow].cells[MSG9COL].innerText : "";

	gmsg = ""
	gmsg += gmsg1 == "" ? "\n" : gmsg1 + ".\n"
	gmsg += gmsg2 == "" ? "\n" : gmsg2 + ".\n"
	gmsg += gmsg3 == "" ? "\n" : gmsg3 + ".\n"
	gmsg += gmsg4 == "" ? "\n" : gmsg4 + ".\n"
	gmsg += gmsg5 == "" ? "\n" : gmsg5 + ".\n"
	gmsg += gmsg6 == "" ? "\n" : gmsg6 + ".\n"
	gmsg += gmsg7 == "" ? "\n" : gmsg7 + ".\n"
	gmsg += gmsg8 == "" ? "\n" : gmsg8 + ".\n"
	gmsg += gmsg9 == "" ? "\n" : gmsg9 + ".\n"

	if ( gmsg == "\n\n\n\n\n\n\n\n\n" ) {
		retval = 0;
		gmsg = "";
	}
	else {
		retval = 1;
		gmsg =  "Message is:\n" + gmsg
	}

	if ( !dodisplay )
		return retval;

	if ( retval ) {		// speak message & pop window with message
		//mysay("Hit Escape Key to Finish.");
		mysay(expmsg(gmsg));
		// record NOT iosolated, so pop message in mondow
		//if (! (activerow == 0 && drows.rows.length == (DOFF + 1)) )
		//	alert(gmsg);
		alert(gmsg);
		//WSK waitspeaking();
	}
	else {			// no message
		show_status("No Message.");
		mysay("No Message.");
		//WSK waitspeaking();
	}

	stopspeaking();
	curinput.focus();

	return retval;
}


function expmsg(str)
{
	var i;
	var c;
	var emstr = "";
	for ( i = 0; i < str.length; ++i ) {
		c = str.substr(i,1);
		if ( c >= "0" && c <= "9" )
			emstr += " ";
		emstr += c;
	}
	return emstr.toLowerCase();
}


function openemailapp()
{
	if ( EMAILCOL == 0 )
		return;

	stopspeaking();

	// no rows
	if (drows.rows.length <= DOFF) {
		mysay("No Rows.");
		curinput.focus();
		return
	}

	if ( EMAILCOL != 0 ) {
		if ( drows.rows[DOFF+activerow].cells[EMAILCOL].innerText != "" ) {
			var emurl = "mailto:" +
				drows.rows[DOFF+activerow].cells[EMAILCOL].innerText;
			//alert(emurl);
			mysay("Opening Email Application.");
			window.open(emurl,'','toolbar=no,menubar=no,location=no,height=300,width=650');
		}
		else {
			if ( TTSON )
				mysay("No Email address.");
			else
				alert("No Email Address");
		}
	}
}


function opendocurl()
{
	if ( DOCCOL == 0 )
		return;
	// no rows
	if (drows.rows.length <= DOFF)
		return;
	docurl = drows.rows[DOFF+activerow].cells[DOCCOL].innerText;
	if ( docurl.length > 0 ) {
		str1 = "Opening Document - " + docurl;
		mysay(str1);
		savemystatus = mystatus.innerHTML;
		show_status(str1);
		setTimeout(' window.open(docurl,"","toolbar=no,menubar=no,location=no,height=300,width=650"); ', 500, "JavaScript");
		setTimeout(' show_status(savemystatus); ', 3000, "JavaScript");
	}
}


function show_TEXINFO()
{
	if ( !have_TEXINFO )
		return 0;
	// no rows
	if (drows.rows.length <= DOFF) {
		return retval
	}
	// display TEXINFO fields
	fldcnt_TEXINFO = 0
	html_TEXINFO = "<TABLE ID='TEXINFOrows' width=100% CELLPADDING=2 CELLSPACING=0 "
	html_TEXINFO += " BORDER=0 BORDERCOLORDARK=#D7D7D7 BORDERCOLOR=#D7D7D7>"
	html_TEXINFO += "<TR>"
	for ( gi=1; have_TEXINFO && gi <= nflds; ++gi ) {
		if ( fld_type[gi] & 2 ) {
			// this many per row
			if ( fldcnt_TEXINFO > 0 && (fldcnt_TEXINFO % TEX_perline) == 0 ) {
				html_TEXINFO += "</TR>"
				html_TEXINFO += "<TR>"
			}
			html_TEXINFO += "<TD align=right BGCOLOR=#C0C0C0>"
			html_TEXINFO += "<FONT COLOR=white SIZE=2>"
			html_TEXINFO += "<b>"
			html_TEXINFO += fld_desc[gi]
			html_TEXINFO += ":"
			html_TEXINFO += "&nbsp;"
			html_TEXINFO += "</b>"
			html_TEXINFO += "</FONT>"
			html_TEXINFO += "</TD>"
			html_TEXINFO += "<TD align=left BGCOLOR=#C0C0C0>"
			//html_TEXINFO += "<FONT COLOR=white SIZE=2>"
			//html_TEXINFO += "&nbsp;"

			html_TEXINFO += "<SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<INPUT STYLE='background: #C0C0C0' type='text' ID='TEXfld" + gi + "' rows=1 size=" + fld_len[gi] + " accesskey='" + fld_hotkey[gi] + "' onfocus='TEXINFO_focus(" + gi + "," + fldcnt_TEXINFO + ");' value='";
			html_TEXINFO += drows.rows[DOFF+activerow].cells[gi].innerText;
			html_TEXINFO += "'></SPAN>";

			//html_TEXINFO += "</FONT>"
			html_TEXINFO += "</TD>"

			// say field desc then speak/spell content
			// sayfld(1,fld_type[gi]&1,activerow,gi,2|1);

			++fldcnt_TEXINFO
		}
	}
	// finish up last row
	while ( (fldcnt_TEXINFO++ % TEX_perline) != 0 ) {
		html_TEXINFO += "<TD align=right BGCOLOR=#C0C0C0>"
	 	html_TEXINFO += "&nbsp;"
	 	html_TEXINFO += "</TD>"
		html_TEXINFO += "<TD align=left BGCOLOR=#C0C0C0>"
	 	html_TEXINFO += "&nbsp;"
	 	html_TEXINFO += "</TD>"
	}
	html_TEXINFO += "</TR>"
	html_TEXINFO += "</TABLE>"
	//alert(html_TEXINFO);
	myTEXINFO.innerHTML = html_TEXINFO;
	return 1;
}


function show_status(str)
{
	//window.status = str;
	//mystatus.innerHTML = "<FONT COLOR=#FFFFFF>" + str + "</FONT>";
	mystatus.innerHTML = str;
	//document.title = mytitle + " - " + str;
	window.status = mytitle + " - " + str;
}


function dumpobj(obj1)
{
	for (prop in obj1) {
		if ( ! window.confirm("The property '" + prop + "' is " +
							 obj1[prop]) )
			break;
	}
}

//----------------------------------------


function clearall(dosearch)
{
	//alert("clearall(" + dosearch + ")");

	if ( dosearch )
		stopspeaking();

	clear_srch_vars();

	document.all.but_firstPage.disabled = true;
	document.all.but_previousPage.disabled = true;
	document.all.but_lastPage.disabled = true;
	document.all.but_nextPage.disabled = true;
	if ( MSG1COL != 0 )
		document.all.but_showmsg.disabled = true;
	if ( EMAILCOL != 0 )
		document.all.but_openemailapp.disabled = true;

	setsrchfld(startfld);

	if ( dosearch ) {
		// work around for Search... forever problem
		// occurs if clearall() is done twice without a search between
		curinput.value = "~";
		keySrchCol();
	
		curinput.value = "~Invalid";
		sayready = 1;
		keySrchCol();
		clear_srch_vars();
		//WSP waitspeaking();
	}
}


function clear_srch_vars()
{
	//alert("clear_srch_vars()")
	// clear input fields and column filter store
	for ( i = 1; i <= nflds; ++i ) {
		if ( i == PICTURECOL || i == DOCCOL )	// skip picture & doc
			continue;
		if ( have_TEXINFO && (fld_type[i] & 2) ) // skip TEXINFO field
			continue;
		drows.rows[1].cells(i).firstChild.firstChild.value = "";
		colfilt[i] = ""
	}

	recfilt = "";		// clear record search filter
}


function clearfield(dosearch)
{
	//alert("clearfield(" + dosearch + ")");

	if ( dosearch )
		stopspeaking();

	// work around for Search... forever problem
	// occurs if clearfield() is done twice without a search between
	if ( dosearch ) {
		curinput.value = "~";
		colfilt[curfld] = ""
		keySrchCol();
	}

	curinput.value = "";
	colfilt[curfld] = ""
	curinput.focus();
	if ( dosearch )
		keySrchCol();
}



function srchfocus(fld)
{
	//alert("srchfocus(" + fld + ")  fld_type[" + fld + "]=" + fld_type[fld] + "  saydesconfocus=" + saydesconfocus + "  saytxtonfocus=" + saytxtonfocus);

	curfld=fld;
	curinput = drows.rows[1].cells(curfld).firstChild.firstChild;

	//curinput.insertAdjacentText("beforeEnd", "x");

	curinput.select();
	curpos = -1;

	if ( fld_type[fld] & 1 )
		speak_spell = 1;
	else
		speak_spell = 0;

	var saywhat = 0;
	if ( saydesconfocus )
		saywhat += 2;	
	if ( saytxtonfocus )
		saywhat += 1;	
	if ( saywhat )
		sayfld(0,speak_spell,activerow,curfld,saywhat);
	saydesconfocus = 1;
	saytxtonfocus = 1;
}


function TEXINFO_focus(fld,TEXINFOfld)
{
	//alert("TEXINFO_focus(" + fld + "," + TEXINFOfld)  fld_type[" + fld + "]=" + fld_type[fld] + "  saydesconfocus=" + saydesconfocus + "  saytxtonfocus=" + saytxtonfocus);

	// get how many fields on each TEXINFO row
	xperrow = TEXINFOrows.rows[0].cells.length / 2
	TEXINFOrow = Math.floor(TEXINFOfld / xperrow)
	TEXINFOcell = ((TEXINFOfld % xperrow) * 2) + 1
	//alert("TEXINFOfld = " + TEXINFOfld + "  xperrow = " + xperrow + "  TEXINFOrow = " + TEXINFOrow + "  TEXINFOcell = " + TEXINFOcell)

	curfld=fld;

	//alert("xxx " + TEXINFOrows.rows[TEXINFOrow].cells(TEXINFOcell).firstChild)
	//dumpobj(TEXINFOrows.rows[TEXINFOrow].cells(TEXINFOcell).firstChild)

	curinput = TEXINFOrows.rows[TEXINFOrow].cells(TEXINFOcell).firstChild.firstChild;


	curinput.select();
	curpos = -1;

	if ( fld_type[fld] & 1 )
		speak_spell = 1;
	else
		speak_spell = 0;

	var saywhat = 0;
	if ( saydesconfocus )
		saywhat += 2;	
	if ( saytxtonfocus )
		saywhat += 1;	
	if ( saywhat )
		sayfld(0,speak_spell,activerow,curfld,saywhat);
	saydesconfocus = 1;
	saytxtonfocus = 1;
}



function keydownProc()
{
	//alert( "keydownProc() keyCode = " + event.keyCode + " shift = " + event.shiftKey + " ctrl = " + event.ctrlKey + " alt = " + event.altKey );

	if ( event.ctrlKey )
 		stopspeaking();

	//rjs curinput.focus();

	var mykey = event.keyCode + (event.shiftKey ? KEY_SHIFT : 0) +
				    (event.ctrlKey ? KEY_CTRL : 0) +
				    (event.altKey ? KEY_ALT : 0)

	// handle feature keys
	switch ( mykey ) {
	case keycodemap[CLEARFIELD]:	// clear field key
		clearfield(1);
		mydonekey = 1;
		break;
	case keycodemap[CLEARALL]:	// clear all key
		clearall(1);
		mydonekey = 1;
		break;
	case keycodemap[PAGEUP]:	// Page UP key
		previousPage();
		mydonekey = 1;
		break;
	case keycodemap[PAGEDOWN]:	// Page DOWN key
		nextPage();
		mydonekey = 1;
		break;
	case keycodemap[FIRSTPAGE]:	// First Page key
		firstPage();
		mydonekey = 1;
		break;
	case keycodemap[LASTPAGE]:	// Last Page key
		lastPage();
		mydonekey = 1;
		break;
	case keycodemap[UPACTIVEROW]:	// UP Active row
		setactiverow(1,-1);
		mydonekey = 1;
		break;
	case keycodemap[DOWNACTIVEROW]:	// DOWN Active row
		setactiverow(1,1);
		mydonekey = 1;
		break;

	case keycodemap[PREVIOUSFIELD]:	// move to previos field
		saydesconfocus = 0;
		if ( --curfld < 1 )
			curfld = nflds;
		setsrchfld(curfld);
		mydonekey = 1;
		break;
	case keycodemap[NEXTFIELD]:	// move to next field
		saydesconfocus = 0;
		if ( ++curfld > nflds )
			curfld = 1;
		setsrchfld(curfld);
		mydonekey = 1;
		break;

	case keycodemap[SHOWMSG]:	// Show Message
		showmsg(activerow,1);
		mydonekey = 1;
		break;
	case keycodemap[OPENEMAILAPP]:	// Open Email App
		openemailapp();
		mydonekey = 1;
		break;
	case keycodemap[OPENDOCURL]:	// Open Document URL
		opendocurl();
		mydonekey = 1;
		break;

	case keycodemap[GOFIELD1]:	// move to field 1 and say combo
		curinput.blur();
		stopspeaking();
		curfld = 1;
		curinput = drows.rows[1].cells(curfld).firstChild.firstChild;
		saydesconfocus = 0;
		saytxtonfocus = 0;
		curinput.focus();
		saycombo(0,1);
		mydonekey = 1;
		break;
	case keycodemap[GOFIELD2]:	// move to & say field 2
		curinput.blur();
		stopspeaking();
		curfld = 2;
		curinput = drows.rows[1].cells(curfld).firstChild.firstChild;
		saydesconfocus = 0;
		saytxtonfocus = 1;
		curinput.focus();
		mydonekey = 1;
		break;
	case keycodemap[GOFIELD3]:	// move to & say field 3
		curinput.blur();
		stopspeaking();
		curfld = 3;
		curinput = drows.rows[1].cells(curfld).firstChild.firstChild;
		saydesconfocus = 0;
		saytxtonfocus = 1;
		curinput.focus();
		mydonekey = 1;
		break;

	case keycodemap[SPEAKCURRENT]: // speak current field
		stopspeaking();
		sayfld(0,0,activerow,curfld,1);
		mydonekey = 1;
		break;
	case keycodemap[SPELLCURRENT]: // spell current field
		stopspeaking();
		sayfld(0,1,activerow,curfld,1);
		mydonekey = 1;
		break;

	case keycodemap[FASTERSPEECH]:	// speak faster
		fasterspeaking();
		mydonekey = 1;
		break;
	case keycodemap[SLOWERSPEECH]:	// speak slower
		slowerspeaking();
		mydonekey = 1;
		break;
	case keycodemap[PITCHUP]:	// pitch up
		pitchup();
		mydonekey = 1;
		break;
	case keycodemap[PITCHDOWN]:	// pitch down
		pitchdown();
		mydonekey = 1;
		break;
	case keycodemap[NEXTSPEAKER]:	// next speaker
		nextspeaker();
		mydonekey = 1;
		break;
	case keycodemap[PREVIOUSSPEAKER]:	// previous speaker
		previousspeaker();
		mydonekey = 1;
		break;
	case keycodemap[ABOUTSPEECH]:		// info about speech
		about_speech(1);
		mydonekey = 1;
		break;
	case keycodemap[SPEECHDICTIONARY]:	// speech dictionary lexicon
		TTSObj.LexiconDlg(TTSObj.hWnd,"LexiconDlg");
		mydonekey = 1;
		break;
	case keycodemap[SHOWHELP]:		// show help info
		showhelp();
		mydonekey = 1;
		break;
	case keycodemap[CPLSPEECH]:	// control panel speech App
		cplspeechapp();
		mydonekey = 1;
		break;
	case keycodemap[SPEECHONOFF]:	// Toggle speech on/off
		speech_onoff()
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGWHENISOLATEONOFF]: // Toggle say msg when isolate
		saymsgwhenisolate_onoff(1)
		mydonekey = 1;
		break;


	case keycodemap[XLEDITDATA]:	// edit data
		xleditdata();
		mydonekey = 1;
		break;

	case keycodemap[ISOLATEREC]:	// Copy active row to search input
		isolaterec(activerow);	// and isolate
		mydonekey = 1;
		break;

	case keycodemap[UNISOLATE]:	// go back to previous search input
		unisolate();		// before isolate
		mydonekey = 1;
		break;

	case keycodemap[SAYMSGLINE1]:	// say message line 1
		saymsgline(1)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE2]:	// say message line 2
		saymsgline(2)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE3]:	// say message line 3
		saymsgline(3)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE4]:	// say message line 4
		saymsgline(4)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE5]:	// say message line 5
		saymsgline(5)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE6]:	// say message line 6
		saymsgline(6)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE7]:	// say message line 7
		saymsgline(7)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE8]:	// say message line 8
		saymsgline(8)
		mydonekey = 1;
		break;
	case keycodemap[SAYMSGLINE9]:	// say message line 9
		saymsgline(9)
		mydonekey = 1;
		break;
					// handle key pad record isolation
	case KEY_CTRL + KEYPAD0_KEYCODE:
		isolaterec(0);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD1_KEYCODE:
		isolaterec(1);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD2_KEYCODE:
		isolaterec(2);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD3_KEYCODE:
		isolaterec(3);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD4_KEYCODE:
		isolaterec(4);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD5_KEYCODE:
		isolaterec(5);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD6_KEYCODE:
		isolaterec(6);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD7_KEYCODE:
		isolaterec(7);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD8_KEYCODE:
		isolaterec(8);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPAD9_KEYCODE:
		isolaterec(9);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPADDASH_KEYCODE:
		isolaterec(10);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPADPLUS_KEYCODE:
		isolaterec(11);
		mydonekey = 1;
		break;
	case KEY_CTRL + KEYPADDOT_KEYCODE:
		isolaterec(12);
		mydonekey = 1;
		break;
	}

	if ( mydonekey == 1 ) {
		event.keyCode = "";
		event.returnValue = false;
	}

	return;
}


function keyupProc()
{
	//alert( "keyupProc() keyCode = " + event.keyCode );

	// handle field edit keys
	switch ( event.keyCode ) {
	case LEFTARROW_KEYCODE:
		curpos = curpos == -1 ? 0 : curpos > 0 ? curpos - 1 : curpos;
		mysay(curpos > 0 ? curinput.value.substr(curpos-1,1) : "");	
		return;	// don't fall thru to search
	case RIGHTARROW_KEYCODE:
		var savcurpos = curpos;
		curpos = curpos == -1 ? curinput.value.length : curpos < curinput.value.length ? curpos + 1 : curpos;
		if ( curpos != savcurpos )
			mysay(curpos > 0 ? curinput.value.substr(curpos-1,1) : "");	
		return;	// don't fall thru to search
	case INSERT_KEYCODE:
		return;	// don't fall thru to search
	case HOME_KEYCODE:
		curpos = 0;
		return;	// don't fall thru to search
	case END_KEYCODE:
		curpos = curinput.value.length;
		mysay(curpos > 0 ? curinput.value.substr(curpos-1,1) : "");	
		return;	// don't fall thru to search
	case DELETE_KEYCODE:
		curpos = curpos == -1 ? 0 : curpos < curinput.value.length ? curpos + 1 : curpos;
		mysay(curpos > 0 ? curinput.value.substr(curpos-1,1) : "");	
		break;
	case BS_KEYCODE:
		curpos = curpos == -1 ? 0 : curpos > 0 ? curpos - 1 : curpos;
		mysay(curpos > 0 ? curinput.value.substr(curpos-1,1) : "");	
		break;
	}

	if ( event.keyCode == TAB_KEYCODE ) {
		return;
	}

	// don't search if key already processed
	if ( mydonekey ) {
		mydonekey = 0;
		return;
	}

	// key is not printable - so dont search
	// don't search if key is TAB
	// don't search if ctrl/chift/alt keys
	// but do search if edit keys or clearall or clearfield
	if ( (event.keyCode < 32 || event.keyCode > "~") &&
		event.keyCode != 8 &&
		event.keyCode != 10 &&
		event.keyCode != keycodemap[CLEARFIELD] &&
		event.keyCode != keycodemap[CLEARALL] &&
		event.keyCode != 127 ) {
		return;
	}

	curpos = curinput.value.length;

	keySrchCol();

	return;
}


function keypressProc()
{
	var forceupper = 1;

	if ( fld_desc[curfld] == "Email" )	// Email
		forceupper = 0;

	//alert( "keypressProc() keyCode = " + event.keyCode + " forceupper = " + forceupper );

	if ( mydonekey ) {
		event.keyCode = "";
		event.returnValue = false;
		return;
	}

	// Force uppercase
	if (forceupper && event.keyCode >= 97 && event.keyCode <= 122 )
		event.keyCode -= 32;

	//show_status("event.keyCode = " + event.keyCode);
	
	// don't allow double quote
	//if ( event.keyCode == DOUBLEQUOTE_KEYCODE ) {
	//	event.returnValue = false;
	//	mydonekey = 1;
	//	return;
	//}

	return;
}


function keySrchCol()
{
	//alert( "keySrchCol()");

	// don't search if no change to input field since last search
	if ( colfilt[curfld] == curinput.value + "*" )
		return;

	colfilt[curfld] = curinput.value;

	if ( colfilt[curfld] != "" )
		colfilt[curfld] += "*";

	//alert("colfilt[" + curfld + "] =" + colfilt[curfld]);

	recfilt = "";

	// build search filter
	for ( i = 1; i <= nflds; ++i ) {
		if ( i == PICTURECOL || i == DOCCOL )	// skip picture & doc
			continue;
		if ( have_TEXINFO && (fld_type[i] & 2) ) // skip TEXINFO field
			continue;
		recfilt += colfilt[i] == "" ? "" :
			" & (" + fld_datafld[i] + " = " + colfilt[i] + ")";
	}

	if ( recfilt != "" )
		recfilt = recfilt.substr(3);	// strip off first " & "

	//window.status = "colfilt[" + curfld + "] =" + colfilt[curfld];
	//window.status = " recfilt = " + recfilt;
	//alert("recfilt = " + recfilt);

	if ( curfld == 1 )
		enqdat.SortColumn = fld_datafld[1] + ";" + fld_datafld[2];
	else
		enqdat.SortColumn = fld_datafld[curfld];

	//enqdat.SortAscending = true;
	//enqdat.FilterValue = colfilt[curfld];
	//enqdat.FilterCriterion = '=';

	//enqdat.FilterColumn = fld_datafld[curfld];
	//enqdat.SortAscending = true;
	enqdat.Filter = recfilt

	// start again at top
	activerow = 0;

	reccountspoken = 0;

	myRecordNo.innerHTML = "";
	if ( have_TEXINFO )
		myTEXINFO.innerHTML = "";
	if ( MSG1COL != 0 )
		myMsg.innerHTML = ""; //"<BR>";
	if ( PICTURECOL != 0 )
		myPicture.innerHTML = "";

	show_status("Searching...");

	//Reset the DSO, this will in turn refresh any bound elements
	enqdat.Reset();
}



function colSort(fld)
{
	//alert( "colSort() fld = " + fld + "  Before... SortColumn = " + enqdat.SortColumn + "  SortAscending = " + enqdat.SortAscending );
	// invert sort order if current sort field
	var mtchsrt = "";
	if ( fld == 1 )
		mtchsrt = fld_datafld[1] + ";" + fld_datafld[2];
	else
		mtchsrt = fld_datafld[fld];
	if ( mtchsrt == enqdat.SortColumn ) {
		enqdat.SortAscending = !enqdat.SortAscending;
	}
	else { // Use current sort order for new column sort
		enqdat.SortColumn = mtchsrt;
	}
	//alert( "colSort()   After SortColumn = " + enqdat.SortColumn + "  SortAscending = " + enqdat.SortAscending );
	activerow = 0;	// start at top
	enqdat.Reset();
}


function firstPage()
{
	activerow = 0;
	drows.firstPage();
}

function previousPage()
{
	drows.previousPage();
}

function nextPage()
{
	drows.nextPage();
}

function lastPage()
{
	activerow = drows.rows.length - DOFF - 1;
	drows.lastPage();
}


function set_page_button_state()
{
	//alert("set_page_button_state()");

	var str1 = ""

	if ( firsttime )
		return;

	//determine where the position of the first row is within the data set
	if (drows.readyState == "complete") {
		if (drows.rows.length > DOFF) {
			//window.status =
//"drows.rows.length=" + drows.rows.length + "  " +
//"drows.rows[DOFF].recordNumber = " + drows.rows[DOFF].recordNumber + "  " +
//"drows.rows[" + (drows.rows.length - 1) + "].recordNumber = " +
//	drows.rows[drows.rows.length - 1].recordNumber + "  " +
//"(" + enqdat.recordset.RecordCount + ")"

			show_status("Search Complete (" + enqdat.recordset.RecordCount + " Records Matched)");

			setactiverow(1,0);

			// determine if there is a previous page
			if (drows.rows[DOFF+activerow].recordNumber > 1) {
				document.all.but_firstPage.disabled = false;
				document.all.but_previousPage.disabled = false;
			}
			else {
				document.all.but_firstPage.disabled = true;
				document.all.but_previousPage.disabled = true;
			}

			//determine where the position of the last row is 
			if (drows.rows[drows.rows.length - 1].recordNumber <
						enqdat.recordset.RecordCount) {
				document.all.but_lastPage.disabled = false;
				document.all.but_nextPage.disabled = false;
			}
			else {
				document.all.but_lastPage.disabled = true;
				document.all.but_nextPage.disabled = true;
			}

			if ( MSG1COL != 0 ) {
				acthasmsg = showmsg(activerow,0);
				if ( acthasmsg )
					document.all.but_showmsg.disabled = false;
				else
					document.all.but_showmsg.disabled = true;
			}

			if ( EMAILCOL != 0 ) {
				if ( drows.rows[DOFF+activerow].cells[EMAILCOL].innerText != "" )
					document.all.but_openemailapp.disabled = false;
				else
					document.all.but_openemailapp.disabled = true;
			}

			// if only 1 record matches
			if (activerow == 0 && drows.rows.length == (DOFF + 1)) {
				thisRecordNo = RECORDNOCOL ? drows.rows[DOFF+activerow].cells[RECORDNOCOL].innerText : -1;
				// show TEXINFO info
				if ( have_TEXINFO )
					show_TEXINFO();
				if ( MSG1COL != 0 ) {
					if ( acthasmsg ) {
						//myMsg.innerHTML = gmsg;
						myMsg.innerHTML = "Message is:<br><br>";
						myMsg.innerHTML += gmsg1 + "<br>";
						myMsg.innerHTML += gmsg2 + "<br>";
						myMsg.innerHTML += gmsg3 + "<br>";
						myMsg.innerHTML += gmsg4 + "<br>";
						myMsg.innerHTML += gmsg5 + "<br>";
						myMsg.innerHTML += gmsg6 + "<br>";
						myMsg.innerHTML += gmsg7 + "<br>";
						myMsg.innerHTML += gmsg8 + "<br>";
						myMsg.innerHTML += gmsg9 + "<br>";
						if ( dospeech && saymsgwhenisolate )
							mysay(expmsg(gmsg));
					}
					else {
						myMsg.innerHTML = "No Message";
						if ( dospeech && saymsgwhenisolate )
							mysay(myMsg.innerHTML);
					}
				}
				if ( PICTURECOL != 0 ) {
					pictureurl = PICTURECOL ? drows.rows[DOFF+activerow].cells[PICTURECOL].innerText : "";
					if ( pictureurl.length > 0 ) {
						myPicture.innerHTML = "<IMG WIDTH=120 SRC='" + pictureurl + "' BORDER=0>"
					}
					else {
						//myPicture.innerHTML = "";
						myPicture.innerHTML = "<IMG SRC='" + defpictureurl + "' BORDER=0>"
					}
				}
				// auto open doc 
				if ( autodocurl && thisRecordNo != lastRecordNo && RECORDNOCOL ) {
					opendocurl();
				}
				lastRecorcNo = thisRecordNo
			}
			else {
				if ( have_TEXINFO )
					myTEXINFO.innerHTML = "";
				if ( MSG1COL != 0 )
					myMsg.innerHTML = ""; //"<BR>";
				if ( PICTURECOL != 0 )
					myPicture.innerHTML = "";
			}

		}
		else {	// now rows
			document.all.but_firstPage.disabled = true;
			document.all.but_lastPage.disabled = true;
			document.all.but_nextPage.disabled = true;
			document.all.but_previousPage.disabled = true;
			if ( MSG1COL != 0 ) {
				document.all.but_showmsg.disabled = true;
				myMsg.innerHTML = ""; //"<BR>";
			}
			if ( EMAILCOL != 0 )
				document.all.but_openemailapp.disabled = true;

			myRecordNo.innerHTML = "";

			if ( have_TEXINFO )
				myTEXINFO.innerHTML = "";
			if ( PICTURECOL != 0 )
				myPicture.innerHTML = "";

			stopspeaking();

			if ( sayready ) {
				mysay("Ready.");
				show_status("Ready.");
				sayready = 0;
			}
			else {
				mysay("No Matches.");
				show_status("No Matches.");
			}
		}
	}
}

//-------------------------------


function xleditdata()
{
	var str1 = ""

	if ( xlsfile.length <= 0 || csvfile.length <= 0 ) {
		str1 = "Excel Edit Feature is Disabled";
		mysay(str1);
		show_status(str1);
		return;
	}

	// no rows
	if (drows.rows.length <= DOFF) {
		mysay("No Rows.");
		return;
	}

	try {
		str1 = "Testing For Excel";
		//mysay(str1);
		show_status(str1);
		ExcelApp = GetObject("","Excel.Application");
	}
	catch ( exccode ) {
		str1 = "GetObject Excel App. Exception=" + exccode;
		//mysay(str1);
		//alert(str1);
		str1 = "Starting Excel"
		mysay(str1);
		show_status(str1);
		try {
			ExcelApp = new ActiveXObject("Excel.Application");
		}
		catch ( exccode ) {
			str1 = "Error Can't start Excel App. Exception=" + exccode;
			mysay(str1);
			show_status(str1);
			//alert(str1);
			return;
		}
	}

	// test if workbook is open
	try {
		str1 = "Testing For Workbook";
		//mysay(str1);
		show_status(str1);
		ExcelApp.Run("Set_Filenames", xlsfilepath, csvfilepath);
	}
	catch ( exccode ) {
		str1 = "Opening Workbook"
		mysay(str1);
		show_status(str1);
		// assume workbook is NOT open
		try {
			// open workbook
			ExcelApp.Workbooks.Open(xlsfilepath);
		}
		catch ( exccode ) {
			str1 = "Can't Open Excel Workbook [" + xlsfilepath + "]. Exception=" + exccode;
			mysay(str1);
			show_status(str1);
			//alert(str1);
			ExcelApp.Application.Quit();
			return;
		}

	}

	try {
		str1 = "Checking Workbook OK.";
		//mysay(str1);
		show_status(str1);
		ExcelApp.Run("Set_Filenames", xlsfilepath, csvfilepath);
	}
	catch ( exccode ) {
		str1 = "Error Set_Filename in Excel. Exception=" + exccode;
		mysay(str1);
		show_status(str1);
		//alert(str1);
		ExcelApp.Application.Quit();
		return;
	}

	ExcelApp.Application.Visible = true;

	////ExcelApp.Run("Save_and_Export");
	////ExcelApp.Columns("B:B").Select;
	////ExcelApp.Selection.Find("WUNDER", "", "");
	//var srchval = drows.rows[DOFF+activerow].cells[1].innerText;
	//ExcelApp.Run("Goto_Rec", srchval);

	var RecordNo = RECORDNOCOL ? drows.rows[DOFF+activerow].cells[RECORDNOCOL].innerText : -1;
	try {
		ExcelApp.Run("Goto_Rec", "B" + RecordNo);
	}
	catch ( exccode ) {
		str1 = "Error Got_Rec in Excel. Exception=" + exccode;
		mysay(str1);
		show_status(str1);
		//alert(str1);
		ExcelApp.Application.Quit();
		return
	}

	//var tmpstr = "Waiting for Excel"
	//show_status(tmpstr);
	//while ( 1 ) {
	//	if ( ! confirm(tmpstr) )
	//		break;
	//	if ( ExcelApp.Run("is_done", 1) ) {
	//		//alert("Do a Refresh");
	//		//document.execCommand("Refresh");
	//		alert("Force data reload");
	//		enqdat.DataURL = enqdat.DataURL;
	//		enqdat.Reset();
	//		break;
	//	}
	//}

	if ( kickoff_isdone ) {
		kickoff_isdone = 0;
		test_excel_saved();
	}

}

function test_excel_saved()
{
	//alert("test_excel_saved()");

	var isexceldone = 0;
	
	// test is_done flag in excel
	try {
		isexceldone = ExcelApp.Run("is_done", 1);
	}
	catch ( exccode ) {
		//alert("Error Test is_done in Excel. Exception=" + exccode);
		//mysay("error is done");
		isexceldone = 0;
	}

	//mysay("is done " + isexceldone);

	if ( isexceldone ) {
		//alert("go rest is_done");
		// reset is done flag in excel
		try {
			isexceldone = ExcelApp.Run("is_done", 0);
		}
		catch ( exccode ) {
			//alert("Error reset is_done in Excel. Exception=" + exccode);
			maysay("is_done reset Error.");
			isexceldone = 0;
		}
		//alert("Force Data Reload  is_done now = " + ExcelApp.Run("is_done", 1) );
		mysay("is done set - Reloading Data.");
		enqdat.DataURL = enqdat.DataURL;
		enqdat.Reset();

	}

	// test again later
	setTimeout('test_excel_saved();', 5000, "JavaScript");
}

//-------------------------------


function about_speech(dodisplay)
{
	stopspeaking();

	var str = "";
	str = str + TTSObj.ModeName(ttsidx) + ".";
	str = str + "\n" + "Speaker index is " + ttsidx + "."
	str = str + "  " + "Max index is " + max_ttsidx + ".";
	str = str + "\n" + "Manfacturer:" + TTSObj.MfgName(ttsidx) + ".";
	str = str + "\n" + "ProductName: " + TTSObj.ProductName(ttsidx) + ".";
	str = str + "\n" + "   ModeName: " + TTSObj.ModeName(ttsidx) + ".";
	str = str + "\n" + "    Speaker: " + TTSObj.Speaker(ttsidx) + ".";
	str = str + "\n" + "      Speed: " + TTSObj.Speed + ".";
	str = str + "\n" + "        Age: " + TTSObj.Age(ttsidx) + ".";
	str = str + "\n" + "      Style: " + TTSObj.Style(ttsidx) + ".";

	mysay(str);

	if ( dodisplay ) {
		mysay("Hit the Enter Key to continue.");
		str = str + "\n" + "    TTSMode: " + TTSObj.TTSMode + ".";
		alert("Speech: \n\n" + str);
	}

	//mysay("Hit ENTER for next Speaker or ESCAPE to cancel.");
	//if ( window.confirm("Go to next Speaker") ) {
	//	nextspeaker();
	//}
	curinput.focus();
}

function about_engine()
{
	TTSObj.AboutDlg(TTSObj.hWnd,"AboutDlg");
	curinput.focus();
}

function speech_properties()
{
	TTSObj.GeneralDlg(TTSObj.hWnd,"GeneralDlg");
	curinput.focus();
}


function sayfld(waitprev,speak_spell,row,fld,saywhat)
{
	var fldstr = "";

	//alert("sayfld() waitprev = " + waitprev + "  speak_spell = " + speak_spell + "  row = " + row + "  fld = " + fld + "  saywhat = " + saywhat + "  drows.rows.length=" + drows.rows.length);

	if ( !waitprev )	// dont wait for previous stuff to finish
		stopspeaking();

	if ( (saywhat & 2) && fld_desc[fld] != "" )	// say field name
		mysay(fld_desc[fld].toLowerCase());

	// have data and say contents flag set then say field contents
	if ( (drows.rows.length > (DOFF + row))  && (saywhat & 1) ) {
		fldstr = getfldtxt(speak_spell,row,fld);
	}

	//alert("fldstr=[" + fldstr + "]");
	mysay(fldstr);
}


function saycombo(sayfld1desc,stopfirst)
{
	var combostr = "";

	if (drows.rows.length <= (DOFF + activerow)) {
		return
	}

	if ( TTSON ) {
		combostr = "";

		// say search field content if not a combo field
		if ( curfld > 3 ) {
			//combostr += fld_desc[curfld].toLowerCase() + ". ";
			var tmpstr = getfldtxt(0,activerow,curfld);
			if ( tmpstr != "" )
				combostr += tmpstr + ". ";
		}

		if ( sayfld1desc ) {
			//sayfld(0,0,activerow,1, 2);
			combostr += fld_desc[1].toLowerCase() + ". ";
		}
		//sayfld(0,0,activerow,1,1);
		//sayfld(1,0,activerow,2,1);
		//sayfld(1,1,activerow,3,1);

		var fld1str = getfldtxt(0,activerow,1);
		var fld2str = getfldtxt(0,activerow,2);
		var fld3str = getfldtxt(0,activerow,3);

		combostr += fld1str + " " + fld2str + " " + fld3str;

		if ( stopfirst )
			stopspeaking();
		mysay(combostr);
		//alert("combostr=[" + combostr + "]");
	}
}


function mysay(str)
{
	if ( str == "" )
		return;
	TTSON && TTSObj.Speak(str);
}


function getfldtxt(speak_spell,row,fld)
{
	if ( drows.rows.length <= DOFF )
		return "No rows.";
	var fldtxt = drows.rows[DOFF+row].cells[fld].innerText.toLowerCase();
	if ( speak_spell || (fld_type[fld] & 1) ) // always spell field
		fldtxt = spreadout(fldtxt);
	if ( fldtxt == "" ) {
		//fldtxt = "Blank";
		//fldtxt = "no " + fld_desc[fld].toLowerCase();
		fldtxt = "";
	}
	return fldtxt;
}


function spreadout(str)
{
	var i;
	var c;
	var spstr = "";
	for ( i = 0; i < str.length; ++i ) {
		c = str.substr(i,1);
		if ( c == "'" )
			c = " apostrifee";
		if ( c == "." )
			c = " dot";
		if ( i > 0 )
			spstr += " ";
		spstr += c;
	}
	return spstr;
}


function spellstr(str)
{
	TTSON && TTSObj.Speak(spreadout(str));
}


function stopspeaking()
{
	TTSON && TTSObj.StopSpeaking();
}


function waitspeaking()
{
	//while ( TTSON && TTSObj.IsSpeaking ) {
	//	//Sleep(100);
	//	//WScript.Sleep(100);
	//	//wso = new ActiveXObject(".WScript");
	//
	//	//show_status("Wait Speaking...");
	//	//alert("Wait Speaking...");
	//
	//	//mydoevents();
	//
	//}

	//while ( TTSON && TTSObj.IsSpeaking ) {
	//	alert("Wait Speaking...");
	//}

	//setTimeout('time_out_func();', 100, "JavaScript");


	//var getwaitwin = window.open("aaa.htm",'','toolbar=no,menubar=no,location=no,height=30,width=80');
	//while ( !getwaitwin.closed )
	//	;


	alert("Wait Speaking...");
	while ( TTSON && TTSObj.IsSpeaking )
		;
}


function fasterspeaking()
{
	var str = "";
	stopspeaking();
	if ( !TTSON )
		return;
	var tmpspeed = TTSObj.Speed;
	TTSObj.Speed = TTSObj.Speed + SPEECHSPEED_INC;
	if ( TTSObj.Speed == tmpspeed ) {
		str = "Faster - Speech Speed at maximum of " + TTSObj.Speed;
		mysay(str);
		show_status(str);
	}
	else {
		str = "Faster - Speech Speed set to " + TTSObj.Speed;
		mysay(str);
		show_status(str);
	}
}

function slowerspeaking()
{
	var str = "";
	stopspeaking();
	if ( !TTSON )
		return;
	var tmpspeed = TTSObj.Speed;
	TTSObj.Speed = TTSObj.Speed - SPEECHSPEED_INC;
	if ( TTSObj.Speed == tmpspeed ) {
		str = "Slower - Speech Speed at minimum of " + TTSObj.Speed;
		mysay(str);
		show_status(str);
	}
	else {
		str = "Slower - Speech Speed set to " + TTSObj.Speed;
		mysay(str);
		show_status(str);
	}
}


function pitchup()
{
	stopspeaking();
	//mysay("Pitch UP - NOT implimented.");
	return;

	if ( !TTSON )
		return;
	//stopspeaking();
	//mysay("Increasing Pitch.");
	//TTSON && TTSObj.Speak("\\Pit=90\\");

	//alert("Pitch = " + TTSObj.Pitch);

	TTSObj.Pitch = TTSObj.Pitch + SPEECHPITCH_INC;
	if ( TTSObj.Pitch > SPEECHPITCH_MAX )
		TTSObj.Pitch = SPEECHPITCH_MAX;
	if ( TTSObj.Pitch == SPEECHPITCH_MAX ) {
		show_status("Higher - Speech Pitch at maximum of " + TTSObj.Pitch);
	}
	else {
		show_status("Higher - Speech Pitch set to " + TTSObj.Pitch);
	}
}

function pitchdown()
{
	stopspeaking();
	//mysay("Pitch DOWN - NOT implimented.");
	return;

	if ( !TTSON )
		return;
	//stopspeaking();
	//mysay("Decreasing Pitch.");

	TTSObj.Pitch = TTSObj.Pitch - SPEECHPITCH_INC;
	if ( TTSObj.Pitch < SPEECHPITCH_MIN )
		TTSObj.Pitch = SPEECHPITCH_MIN;
	if ( TTSObj.Pitch == SPEECHPITCH_MIN ) {
		show_status("Lower - Speech Pitch at minimum of " + TTSObj.Pitch);
	}
	else {
		show_status("Lower - Speech Pitch set to " + TTSObj.Pitch);
	}
}


function nextspeaker()
{
	if ( !TTSON )
		return;
	stopspeaking();
	//WSP mysay("Next Speaker.");
	//WSP waitspeaking();
	ttsidx = ttsidx + 1;
	if ( ttsidx > max_ttsidx )
		ttsidx = 1;
	selectspeaker(ttsidx);
	about_speech(0);
}

function previousspeaker()
{
	if ( !TTSON )
		return;
	stopspeaking();
	//WSP mysay("Previous Speaker.");
	//WSP waitspeaking();
	ttsidx = ttsidx - 1;
	if ( ttsidx  < 1 )
		ttsidx = max_ttsidx;
	selectspeaker(ttsidx);
	about_speech(0);
}


function selectspeaker(ttsidx)
{
	show_status("Selecting Speaker index " + ttsidx + ".");
	TTSObj.Select(ttsidx);
	if ( TTSObj.LastError ) {
		//mysay("ERROR! setting speaker index " + ttsidx + " Error Code is " + TTSObj.LastError + ".");
		//waitspeaking();
		show_status("ERROR! setting speaker index " + ttsidx + " Error Code is " + TTSObj.LastError + ".");
	}
	setCookie("ttsidx", ttsidx, now);	//save away setting
}


function cplspeechapp()
{
	if ( ! dospeech )
		return;
	var str1 = "Activate Control Panel Speech Application";
	mysay(str1);
	show_status(str1);
	//
	//var cplspeechObj = new ActiveXObject("Speech Properties");
	//
	window.open(cplspeechappurl,'','toolbar=no,menubar=no,location=no,height=300,width=650');
}


function saymsgwhenisolate_onoff()
{
	if ( (!dospeech) || (MSG1COL == 0) )
		return;
	var str = "";
	stopspeaking();
	saymsgwhenisolate = saymsgwhenisolate ? 0 : 1;
	setCookie("saymsgwhenisolate", saymsgwhenisolate, now); //save setting
	if ( saymsgwhenisolate )
		 str = "Say message when isolate - Now set to On.";
	else
		 str = "Say message when isolate - Now set to Off.";
	show_status(str);
	mysay(str);
	//WSP waitspeaking();
	// if only 1 record matches
	if (activerow == 0 && drows.rows.length == (DOFF + 1)) {
		// if active row has a message and say on then say msg
		if ( acthasmsg && saymsgwhenisolate ) {
			mysay(expmsg(gmsg));
		}
	}
}


function speech_onoff()
{
	if ( ! dospeech )
		return;
	var str = "";
	stopspeaking();
	if ( TTSON ) {
		//WSP mysay("Speech Off.");
		//WSP waitspeaking();
		str += "Hit Enter to turn Speech Off.";
		mysay(str);
		alert(str);
	}
	TTSON = TTSON ? 0 : 1;
	if ( ! TTSON )	// if turning off then save cookie before TTSObj
		setCookie("TTSON", TTSON, now);	//save away setting
	TTSObj.Enabled = TTSON
	init_tts();
	if ( TTSON ) {
		setCookie("TTSON", TTSON, now);	//save away setting
		//WSP mysay("Speech On.");
		//WSP waitspeaking();
		str += "Speech on. Hit Enter";
		mysay(str);
		alert(str);
		saycombo(0,0);
	}
	//WSP waitspeaking();
	//curinput.focus();
	clearall(1);
}


function init_tts()
{
	if ( dospeech == 1 ) {
		but_speech_onoff.value = TTSON ? "Speech is On" : "Speech is Off";
		document.all.but_speech_properties.disabled = TTSON ? false : true;
		document.all.but_about_speech.disabled = TTSON ? false : true;
		document.all.but_about_engine.disabled = TTSON ? false : true;
		document.all.but_next_speaker.disabled = TTSON ? false : true;
		document.all.but_previous_speaker.disabled = TTSON ? false : true;
		if ( cplspeechappurl != "" )
			document.all.but_speech_controlpanel.disabled = TTSON ? false : true;
		document.all.but_Lex.disabled = TTSON ? false : true;
		document.all.but_speech_onoff.disabled = false;
	}

	if ( ! TTSON ) {
		return
	}

	TTSObj.Initialized = 1;

	// disable Exceptions on TTS
	TTSObj.SuppressExceptions = 1;

	ttsidx = TTSObj.CurrentMode;
	//alert("CurrentMode = " + ttsidx);

	// set speaker
	//ttsidx = 18;
	//ttsidx = 1;
	ttsidx = getCookie("ttsidx")
	if (!ttsidx)
	      ttsidx = 1
	else
	      ttsidx = parseInt(ttsidx)

	//alert("setting Select ttsidx = " + ttsidx);
	selectspeaker(ttsidx);

	//alert("Device = " + TTSObj.Device);

	max_ttsidx = TTSObj.CountEngines;
	//max_ttsidx = 19;
	//alert("max_ttsidx = " + max_ttsidx);

	//ttsidx = TTSObj.Find("MfgName=TruVoice");
	//ttsidx = TTSObj.Find("Speaker=Mary in Hall");
	//alert("ttsidx = " + ttsidx);

}

//----------------------------------------------

function setactiverow(rel, offset)
{
	//alert("setactiverow(" + rel + "," + offset + ")");

	var dosaycombo = 1;

	var nrows = drows.rows.length - DOFF;
	if ( nrows <= 0 ) {
		myRecordNo.innerHTML = "";
		if ( have_TEXINFO )
			myTEXINFO.innerHTML = "";
		if ( MSG1COL != 0 )
			myMsg.innerHTML = ""; //"<BR>";
		if ( PICTURECOL != 0 )
			myPicture.innerHTML = "";
		return;
	}

	var i;
	var j;
	for ( i=DOFF;  i < drows.rows.length; ++i) {
		var rtag = i - DOFF + "";
		switch ( i-DOFF ) {
		case 10: rtag = "-"; break;
		case 11: rtag = "+"; break;
		case 12: rtag = "."; break;
		}

		// make # col click to isolate
		drows.rows[i].cells[0].innerHTML = "<TD BGCOLOR=#CCEEEE align=left><SPAN CLASS='rowhash' ID=id_isolaterec onclick='isolaterec(" + (i - DOFF) + ");'><LABEL>" + rtag + "</LABEL></SPAN></TD>";

		// make all (except hidden and email) fields click to isolate 
		//for ( j = 1; j <= nflds; ++j ) {
		//	switch ( j ) {
		//	case RECORDNOCOL:
		//	case EMAILCOL:
		//	case MSG1COL:
		//	case MSG2COL:
		//	case MSG3COL:
		//	case MSG4COL:
		//	case MSG5COL:
		//	case MSG6COL:
		//	case MSG7COL:
		//	case MSG8COL:
		//	case MSG9COL:
		//		continue;
		//	}
		//	drows.rows[i].cells[j].innerHTML = "<TD BGCOLOR=#EEEECC align=left><SPAN ID=id_isolaterec onclick='isolaterec(" + (i - DOFF) + ");'><LABEL>" + drows.rows[i].cells[j].innerText + "</LABEL></SPAN></TD>";
		//}

		drows.rows[i].cells[0].style.color = "black";
		if ( showmsg(i-DOFF,0) ) {
			drows.rows[i].cells[0].style.background = "lightgreen";
		}
		else {
			drows.rows[i].cells[0].style.background = "#CCEEEE";
		}

		docurl = drows.rows[i].cells[DOCCOL].innerText;
		if ( docurl.length > 0 ) {
			drows.rows[i].cells[0].style.color = "red";
		}
	}

	if ( offset < 0 && drows.rows[DOFF+activerow].recordNumber == 1 ) {
		stopspeaking();
		TTSON && TTSObj.Speak("First Row");
		//WSP waitspeaking();
		offset = 0;			// stay on first
		dosaycombo = 0;
	}

	if ( offset > 0 && drows.rows[DOFF+activerow].recordNumber == enqdat.recordset.RecordCount ) {
		stopspeaking();
		TTSON && TTSObj.Speak("Last Row");
		//WSP waitspeaking();
		offset = 0;			// stay on last
		dosaycombo = 0;
	}

	offset = offset % nrows;
	if ( rel ) {
		activerow = activerow + offset;
		if ( activerow < 0 ) {
			previousPage();
			activerow = drows.rows.length - DOFF - 1;
		}
		if ( activerow >= nrows ) {
			nextPage();
			activerow = 0;
		}
	}
	else {
		activerow = offset;
	}

	if ( activerow < 0 )
		activerow = 0;
	if ( activerow > nrows )
		activerow = drows.rows.length - DOFF - 1;

	if ( MSG1COL != 0 ) {
		if ( acthasmsg = showmsg(activerow,0) ) {
			drows.rows[DOFF+activerow].cells[0].style.color = "white";
			drows.rows[DOFF+activerow].cells[0].style.background = "green";
			document.all.but_showmsg.disabled = false;
		}
		else {
			drows.rows[DOFF+activerow].cells[0].style.color = "white";
			drows.rows[DOFF+activerow].cells[0].style.background = "blue";
			document.all.but_showmsg.disabled = true;
		}
		docurl = drows.rows[DOFF+activerow].cells[DOCCOL].innerText;
		if ( docurl.length > 0 ) {
			drows.rows[DOFF+activerow].cells[0].style.color = "red";
		}
	}
	else {
		drows.rows[DOFF+activerow].cells[0].style.color = "white";
		drows.rows[DOFF+activerow].cells[0].style.background = "blue";
	}

	// show RecordNo
	var RecordNo = RECORDNOCOL ? drows.rows[DOFF+activerow].cells[RECORDNOCOL].innerText : -1;
	//myRecordNo.innerHTML = "<FONT COLOR=#FFFFFF>" + "RecordNo=" + RecordNo + "</FONT>";
	myRecordNo.innerHTML = "RecordNo=" + RecordNo;

	// say record count
	if ( drows.rows.length > DOFF && enqdat.recordset.RecordCount != 1 && !reccountspoken ){
		//mysay(enqdat.recordset.RecordCount);
		//waitspeaking();
		reccountspoken = 1;
	}
	
	if ( dosaycombo )
		saycombo(0,1);

}


function isolaterec(thisrow)
{
	// no row
	if (drows.rows.length <= (DOFF + thisrow) ) {
		mysay("No Row.");
		return 0
	}

	//alert( "isolaterec() thisrow = " + thisrow);
	activerow = thisrow;

	// if not already isolated - save search
	if ( unisoactiverow < 0 ) {
		for ( var i=1; i <= nflds; ++i ) {
			if ( i == PICTURECOL || i == DOCCOL )	// skip picture & doc
				continue;
			if ( have_TEXINFO && (fld_type[i] & 2) ) // skip TEXINFO field
				continue;
			savesrchinput[i] = drows.rows[1].cells(i).firstChild.firstChild.value;
		}
		unisoactiverow = activerow;
		unisocurfld = curfld;
	}

	myRecordNo.innerHTML = "";
	if ( have_TEXINFO )
		myTEXINFO.innerHTML = "";
	if ( MSG1COL != 0 )
		myMsg.innerHTML = ""; //"<BR>";
	if ( PICTURECOL != 0 )
		myPicture.innerHTML = "";

	clear_srch_vars();

	for ( var i=1; i <= nflds; ++i ) {
		if ( i == PICTURECOL || i == DOCCOL )	// skip picture & doc
			continue;
		if ( have_TEXINFO && (fld_type[i] & 2) ) // skip TEXINFO field
			continue;
		var fldstr = drows.rows[DOFF+activerow].cells[i].innerText;
		fldstr = fldstr.replace( / *$/, "");	// trim trailing spaces
		fldstr = fldstr.replace( /&/, "\\&");	// fix search
		drows.rows[1].cells(i).firstChild.firstChild.value = fldstr;
		colfilt[i] = fldstr;
		//if ( i != curfld )
		//	colfilt[i] += "*";
	}

	// select current input field (to make left/right arrows code ok)
	curinput.select();
	curpos = -1;

	// work around for Search... forever problem
	// occurs Reset(); twice for same search
	enqdat.Filter = "RecordNo=-1";
	enqdat.Reset();

	keySrchCol();		// research to isolate

	return 1;
}


function unisolate()
{
	if ( unisoactiverow < 0 ) {
		show_status("unisolate() - NO saved search");
		return;
	}

	show_status("unisolate() unisoactiverow=" + unisoactiverow);

	myRecordNo.innerHTML = "";
	if ( have_TEXINFO )
		myTEXINFO.innerHTML = "";
	if ( MSG1COL != 0 )
		myMsg.innerHTML = ""; //"<BR>";
	if ( PICTURECOL != 0 )
		myPicture.innerHTML = "";

	//clear_srch_vars();
	clearall(0);

	curfld = unisocurfld;

	for ( var i=1; i <= nflds; ++i ) {
		if ( i == PICTURECOL || i == DOCCOL )	// skip picture & doc
			continue;
		if ( have_TEXINFO && (fld_type[i] & 2) ) // skip TEXINFO field
			continue;
		drows.rows[1].cells(i).firstChild.firstChild.value = savesrchinput[i];
		colfilt[i] = savesrchinput[i];
		//if ( i != curfld )
		//	colfilt[i] += "*";
	}

	// select current input field (to make left/right arrows code ok)
	curinput.select();
	curpos = -1;

	// work around for Search... forever problem
	// occurs Reset(); twice for same search
	enqdat.Filter = "RecordNo=-1";
	enqdat.Reset();

	keySrchCol();		// research to isolate

	activerow = unisoactiverow;
	unisoactiverow = -1;
}


//----------------------------------------------

function fixmailto(a)
{
	if ( a.href.indexOf("mailto:") == -1 ) {
		a.href = "mailto:" + a.href;
	}
}


function do_lexdict()
{
	TTSON && TTSObj.LexiconDlg(TTSObj.hWnd,'LexiconDlg - Dictionary');
	curinput.focus();
}


//----------------------------------------------

function w(str)
{
	//alert(str);
	document.writeln(str);
}

//================================================================

function fixextA(a)
{
	//alert("fixextA() a.href = " + a.href);
	if ( a.href.indexOf("extn_info") == -1 ) {
		var extn = a.href;
		var i = a.recordNumber;
		i = (i-1) % NDROWS;
		var ggid = drows.rows[DOFF+i].cells[5].innerText;
		var egid = drows.rows[DOFF+i].cells[8].innerText;
		a.href = 'Javascript: extn_info(' + '"' + ggid + '"' + ',"' + egid + '"' + ',"' + extn + '"' + ');';
	}
}

function extn_info(ggid, egid, extn)
{
	//alert("extn_info()");
	//alert("ggid = " + ggid);
	//alert("egid = " + egid);
	//alert("extn = " + extn);

	top.mainframes.document.frames.t21main.setCookie("ggid", ggid);
	top.mainframes.document.frames.t21main.setCookie("egid", egid);
	top.mainframes.document.frames.t21main.setCookie("extn", extn);

	top.mainframes.document.frames.t21topmenu.do_tog_dir();
	top.mainframes.document.frames.t21main.window.navigate("../nav/cdr.htm");
}

//================================================================

function fixggA(a)
{
	//alert("fixggA() a.href = " + a.href);
	var ggid = a.href;
	if ( a.href.indexOf("gg_info") == -1 ) {
		a.href = 'Javascript: gg_info("' + ggid + '");';
	}
}

function gg_info(ggid)
{
	//alert("gg_info(" + ggid + ")");

	top.mainframes.document.frames.t21main.setCookie("ggid", ggid);
	top.mainframes.document.frames.t21topmenu.do_tog_dir();
	top.mainframes.document.frames.t21main.window.navigate("../nav/gg.htm");
}

//================================================================

function fixegA(a)
{
	//alert("fixegA() a.href = " + a.href);
	if ( a.href.indexOf("eg_info") == -1 ) {
		var egid = a.href;
		var i = a.recordNumber;
		i = (i-1) % NDROWS;
		var ggid = drows.rows[DOFF+i].cells[5].innerText;
		a.href = 'Javascript: eg_info(' + '"' + ggid + '"' + ',"' + egid + '"' + ');';
	}
}

function eg_info(ggid,egid)
{
	//alert("eg_info(" + ggid + ")");
	//alert("eg_info(" + egid + ")");

	top.mainframes.document.frames.t21main.setCookie("ggid", ggid);
	top.mainframes.document.frames.t21main.setCookie("egid", egid);
	top.mainframes.document.frames.t21topmenu.do_tog_dir();
	top.mainframes.document.frames.t21main.window.navigate("../nav/eg.htm");
}


function do_t21mailto()
{
	window.open(t21mailto,'','toolbar=no,menubar=no,location=no,height=300,width=650');
}

//================================================================

function get_enqdatconfig()
{
//alert("get_enqdatconfig()");

if ( got_enqdatconfig )
	return

// data not ready yet or invalid or not accessable ???
if ( enqdat.recordset.fields.count <= 0 ) {
	alert("Data " + t21webdirdataurl + " has not loaded corectly." );
}

// get field headers,lengths,type,hotkeys,descriptions & number of fields
// up to first Message line
nflds = 0;
for ( ni=0; ni < enqdat.recordset.fields.count; ++ni ) {
	if ( enqdat.recordset.fields(ni).name == "RecordNo" ) {
		RECORDNOCOL = enqdat.recordset.fields.count;
		continue;
	}
	if ( enqdat.recordset.fields(ni).name == "Msg1" ) {
		MSG1COL = ni;
		continue;
	}
	if ( MSG1COL && enqdat.recordset.fields(ni).name == "Msg2" ) {
		MSG2COL = MSG1COL + 1;
		continue;
	}
	if ( MSG2COL && enqdat.recordset.fields(ni).name == "Msg3" ) {
		MSG3COL = MSG2COL + 1;
		continue;
	}
	if ( MSG3COL && enqdat.recordset.fields(ni).name == "Msg4" ) {
		MSG4COL = MSG3COL + 1;
		continue;
	}
	if ( MSG4COL && enqdat.recordset.fields(ni).name == "Msg5" ) {
		MSG5COL = MSG4COL + 1;
		continue;
	}
	if ( MSG5COL && enqdat.recordset.fields(ni).name == "Msg6" ) {
		MSG6COL = MSG5COL + 1;
		continue;
	}
	if ( MSG6COL && enqdat.recordset.fields(ni).name == "Msg7" ) {
		MSG7COL = MSG6COL + 1;
		continue;
	}
	if ( MSG7COL && enqdat.recordset.fields(ni).name == "Msg8" ) {
		MSG8COL = MSG7COL + 1;
		continue;
	}
	if ( MSG8COL && enqdat.recordset.fields(ni).name == "Msg9" ) {
		MSG9COL = MSG8COL + 1;
		continue;
	}
	// rjs
	//if ( ni < 10 )
	//	continue;

	++nflds;
	fld_datafld[nflds] = enqdat.recordset.fields(ni).name;
	fld_hdr[nflds] = "";
	fld_len[nflds] = 0;
	fld_type[nflds] = 0;
	fld_hotkey[nflds] = "";
	fld_desc[nflds] = "";
	for ( gi = 0; gi < fld_datafld[nflds].length; ++gi ) {
		gc = fld_datafld[nflds].substr(gi,1);
		if ( gc == "[" ) {	// [ field - TEXINFO
			have_TEXINFO = 1;
			fld_type[nflds] |= 2;
			//alert("TEXINFO fld_datafld[" + nflds + "] = " + fld_datafld[nflds] + "  fld_type[" + nflds + "] = " + fld_type[nflds]);
			continue;
		}
		if ( gc == "#" ) {	// # field - spell only
			fld_type[nflds] |= 1;
			//alert("SPELL fld_datafld[" + nflds + "] = " + fld_datafld[nflds] + "  fld_type[" + nflds + "] = " + fld_type[nflds]);
			continue;
		}
		fld_hdr[nflds] += gc;
		fld_len[nflds] += 1;
		if ( fld_hotkey[nflds] == "" && gc >= "A" && gc <= "Z" )
			fld_hotkey[nflds] = gc;
		if ( gc != '_' )
			fld_desc[nflds] += gc;
	}
	//alert("fld_datafld[" + nflds + "] = " + fld_datafld[nflds]);
	//alert("fld_hdr[" + nflds + "] = " + fld_hdr[nflds]);
	//alert("fld_len[" + nflds + "] = " + fld_len[nflds]);
	//alert("fld_type[" + nflds + "] = " + fld_type[nflds]);
	//alert("fld_hotkey[" + nflds + "] = " + fld_hotkey[nflds]);
	//alert("fld_desc[" + nflds + "] = [" + fld_desc[nflds] + "]");


	if ( fld_desc[nflds] == "Email" ) {
		EMAILCOL = ni;
	}
	if ( fld_desc[nflds] == "Picture" ) {
		PICTURECOL = ni;
	}
	if ( fld_desc[nflds] == "Document" ) {
		DOCCOL = ni;
	}

}
//alert("nflds = " + nflds);

// set sort order to first then second field
enqdat.SortColumn = fld_datafld[1] + ";" + fld_datafld[2];
enqdat.SortAscending = true;

// only run this once, NOT on every enqdat.Reset()
//enqdat.ondatasetcomplete = "";
got_enqdatconfig = 1
//alert("here 1");

// draw screen
enquiry_div.innerHTML = render_enquiry();

}


//----------------------------------------------

function render_enquiry()
{
//alert("render_enquiry()");

var outp = "";

if ( dospeech == 1 ) {

	outp += "		<LABEL ID=lab_speaker><b>Speaker: </b></LABEL>";
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_about_speech STYLE='font-size: 7pt' ONCLICK='about_speech(1);' VALUE='About'>";
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_previous_speaker STYLE='font-size: 7pt' ONCLICK='previousspeaker();' VALUE='Previous'>";
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_next_speaker STYLE='font-size: 7pt' ONCLICK='nextspeaker();' VALUE='Next'>";

	outp += "		&nbsp;&nbsp;";
	outp += "		<LABEL ID=lab_engine><b>Speech: </b></LABEL>";

	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_speech_properties STYLE='font-size: 7pt' ONCLICK='speech_properties(1);' VALUE='Properties'>";
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_about_engine STYLE='font-size: 7pt' ONCLICK='about_engine();' VALUE='Engine'>";
	if ( cplspeechappurl != "" )
		outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_speech_controlpanel STYLE='font-size: 7pt' ONCLICK='cplspeechapp();' VALUE='ControlPanel'>";
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_Lex STYLE='font-size: 7pt' ONCLICK='do_lexdict();' VALUE='Dictionary'>";
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_speech_onoff STYLE='font-size: 7pt' ONCLICK='speech_onoff();' VALUE='Speech is Off'>";

	if ( hr_afterspeechbuttons )
		outp += "<hr>";
}

outp += "<TABLE width=100% CELLPADDING=0 CELLSPACING=0 BORDER=2>";
outp += "<THEAD>";
//if ( !t21topheader ) {
//	outp += "<TABLE width=100% CELLPADDING=0 CELLSPACING=0 BORDER=2";
//	outp += "       ID='t21headerbar'>";
//	//outp += "<TABLE ID='t21headerbar'>";
//	outp += "<TR>";
//	outp += "<TD>";
//	if ( t21Heading != "" ) {
//		outp += "	<B><FONT FACE='Arial' COLOR=#000077 SIZE=3>";
//		outp += 	t21Heading;
//		outp += "	</FONT></B>";
//		outp += "	&nbsp; &nbsp;";
//		outp += "	&nbsp; &nbsp;";
//	}
//	if ( !t21mailtobutton && t21mailto != "" ) {
//		outp += "	<A tabindex=-1 HREF='" + t21mailto + "'>" + t21mailtomsg + "<A>"
//		if ( t21mailtoxtramsg != "" ) {
//			outp += t21mailtoxtramsg;
//		}
//		outp += "	&nbsp; &nbsp;";
//		outp += "	&nbsp; &nbsp;";
//	}
//	if ( !statusbelowbuttons ) {
//		outp += "		<FONT COLOR=black SIZE=1>";
//		outp += "		<SPAN ID=mystatus>";
//		outp += 			window.status;
//		outp += "		</SPAN>";
//		outp += "		</FONT>";
//		outp += "		&nbsp; &nbsp;";
//		outp += "		<FONT COLOR=black SIZE=1>";
//		outp += "		<SPAN ID=myRecordNo>";
//		outp += "		</SPAN>";
//		outp += "		</FONT>";
//	}
//	outp += "</TD>";
//	outp += "</TR>";
//	//outp += "</TABLE>";
//}

outp += "<TR BGCOLOR=#444466>";
outp += "<TD>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_firstPage STYLE='font-size: 7pt' ONCLICK='firstPage();' VALUE='First'>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_previousPage STYLE='font-size: 7pt' ONCLICK='previousPage();' VALUE='Prev'>";
outp += "<COMMENT>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_previousRow STYLE='font-size: 7pt' ONCLICK='previousRooutp += );' VALUE='Previous Row'>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_nextRow STYLE='font-size: 7pt' ONCLICK='nextRooutp += );' VALUE='Next Row'>";
outp += "</COMMENT>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_nextPage STYLE='font-size: 7pt' ONCLICK='nextPage();' VALUE='Next'>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_lastPage STYLE='font-size: 7pt' ONCLICK='lastPage();' VALUE='Last'>";
outp += "		&nbsp;";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_clearall STYLE='font-size: 7pt' ONCLICK='clearall(1);' VALUE='Clear All'>";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_clearfield STYLE='font-size: 7pt' ONCLICK='clearfield(1);' VALUE='Clear Field'>";
outp += "		&nbsp;";
if ( MSG1COL != 0 ) {
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_showmsg STYLE='font-size: 7pt' ONCLICK='showmsg(activerow,1);' VALUE='Message'>";
	outp += "		&nbsp;";
}
if ( EMAILCOL != 0 ) {
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_openemailapp STYLE='font-size: 7pt' ONCLICK='openemailapp();' VALUE='Email'>";
	outp += "		&nbsp;";
}
if ( t21mailtobutton && t21mailto != "" ) {
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 ID=but_t21mailto STYLE='font-size: 7pt' ONCLICK='do_t21mailto();' VALUE='" + t21mailtomsg + "'>";
	//outp += "		&nbsp;";
}
outp += "		&nbsp;";
outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_showhelp STYLE='font-size: 7pt' ONCLICK='showhelp();' VALUE='Help'>";

if ( 1 ) {
	// FFFFFFFF
	//outp = ""
	outp += "&nbsp;"
	outp += "<SPAN ID=hflds CLASS=hfld>"
	outp += "<INPUT TYPE='BUTTON' tabindex=-1 enabled ID=but_hflds_left STYLE='font-size: 7pt' ONCLICK='hflds_left();' VALUE='&#171'>"
	outp += "<INPUT TYPE='BUTTON' tabindex=-1 enabled ID=but_hflds_right STYLE='font-size: 7pt' ONCLICK='hflds_right();' VALUE='&#187'>"
	outp += "</SPAN>"
	//w(outp)
}

if ( exitbutton ) {
	outp += "		&nbsp;"
	outp += "		<INPUT TYPE='BUTTON' tabindex=-1 disabled ID=but_exit STYLE='font-size: 7pt' ONCLICK='self.close();' VALUE='Exit'>";
}

//if ( statusbelowbuttons || t21topheader ) {
	if ( statusbelowbuttons ) {
		outp += "		<br>";
	}
	outp += "		<FONT COLOR=white SIZE=1>";
	outp += "		<SPAN ID=mystatus>";
	outp += 			window.status;
	outp += "		</SPAN>";
	outp += "		</FONT>";
	outp += "		&nbsp; &nbsp;";
	outp += "		<FONT COLOR=white SIZE=1>";
	outp += "		<SPAN ID=myRecordNo>";
	outp += "		</SPAN>";
	outp += "		</FONT>";
//}
outp += "</TD>";
outp += "</TR>";
outp += "</THEAD>";

outp += "<TR>";
outp += "<TD>";
outp += "<TABLE width=100% ID='drows' DATASRC='#enqdat' DATAPAGESIZE=" + NDROWS;
outp += "		CELLSPACEING=0";
outp += "		onreadystatechange='set_page_button_state();'>";
outp += "	<THEAD>";
outp += "		<TR BGCOLOR=#0000EE>";
outp += "			<TH align=left><SPAN CLASS='rowhash'>#</SPAN></TH>";

for ( gi=1; gi <= nflds; ++gi ) {
	// don't display PICTURE or DOC cols
	if ( gi == PICTURECOL || gi == DOCCOL ) {
		outp += "<TH STYLE='display: none'></TH>";
		continue;
	}
	// dont display TEXINFO field in enquiry template
	if ( have_TEXINFO && (fld_type[gi] & 2) ) {
		outp += "<TH STYLE='display: none'></TH>";
	}
	else {
		outp += "<TH align=left ID='hdr_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'" + ">" + "<A tabindex=-1 HREF='Javascript: colSort(" + gi + ");'>" + fld_hdr[gi] + "</A></SPAN></TH>";
	}
}

if ( MSG1COL != 0 ) {
	//outp += MSG1COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG2COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG3COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG4COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG5COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG6COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG7COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG8COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG9COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	outp += MSG1COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG2COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG3COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG4COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG5COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG6COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG7COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG8COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG9COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
}
//outp += "<TH align=left><SPAN CLASS='RecordNo'>RecordNo</SPAN></TH>";
outp += "<TH STYLE='display: none'></TH>";

outp += "		</TR>";
outp += "		<TR BGCOLOR=#E0E0E0>";

outp += "			<TD><SPAN CLASS='rowhash'> </SPAN></TD>";

for ( gi=1; gi <= nflds; ++gi ) {
	// don't display PICTURE or DOC cols
	if ( gi == PICTURECOL || gi == DOCCOL ) {
		outp += "<TH STYLE='display: none'></TH>";
		continue;
	}
	// dont display TEXINFO field in enquiry template
	if ( have_TEXINFO && (fld_type[gi] & 2) ) {
		outp += "<TD STYLE='display: none'></TD>";
	}
	else {
		outp += "<TD ID='inp_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<INPUT type='text' ID='srchfld" + gi + "' rows=1 size=" + fld_len[gi] + " accesskey='" + fld_hotkey[gi] + "' onfocus='srchfocus(" + gi + ");'></SPAN></TD>";
	}
}

if ( MSG1COL != 0 ) {
	//outp += MSG1COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG2COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG3COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG4COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG5COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG6COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG7COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG8COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	//outp += MSG9COL != 0 ? "<TH><SPAN CLASS='Msg'></SPAN></TH>" : "";
	outp += MSG1COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG2COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG3COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG4COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG5COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG6COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG7COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG8COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
	outp += MSG9COL != 0 ? "<TH STYLE='display: none'></TH>" : "";
}
//outp += "<TD><SPAN CLASS='RecordNo'></SPAN></TD>";
outp += "<TD STYLE='display: none'></TD>";

outp += "			</TD>";
outp += "		</TR>";
outp += "	</THEAD>";
outp += "	<TBODY>";
outp += "		<TR>";

outp += "			<TD BGCOLOR=#CCEEEE align=center><SPAN CLASS='rowhash'><LABEL> </LABEL></SPAN></TD>";

for ( gi=1; gi <= nflds; ++gi ) {
	switch ( fld_desc[gi] ) {
	case "eXtension":
	case "Extension":
	case "Exten":
	case "eXten":
		outp += "<TD BGCOLOR=#EEEECC align=left ID='bdy_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<A tabindex=-1 datasrc='#enqdat' datafld=" + fld_datafld[gi] + " STYLE='Text-Decoration:None' ONMOUSEOVER='fixextA(this);' title='Show Extension Call Details.'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></A></SPAN></TD>";
		break;
	case "Div":
	case "ParentID":
		outp += "<TD BGCOLOR=#EEEECC align=left ID='bdy_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<A tabindex=-1 datasrc='#enqdat' datafld=" + fld_datafld[gi] + " STYLE='Text-Decoration:None' ONMOUSEOVER='fixggA(this);' title='Show Customer Service ID Summary.'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></A></SPAN></TD>";
		break;
	case "ServiceID":
	case "GroupID":
	case "ExtGroupID":
	case "ExtGrid":
		outp += "<TD BGCOLOR=#EEEECC align=left ID='bdy_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<A tabindex=-1 datasrc='#enqdat' datafld=" + fld_datafld[gi] + " STYLE='Text-Decoration:None' ONMOUSEOVER='fixegA(this);' title='Show Service ID Call Summary.'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></A></SPAN></TD>";
		break;
	case "Email":
		// dont display TEXINFO field in enquiry template
		if ( have_TEXINFO && (fld_type[gi] & 2) ) {
			outp += "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></TD>";
		}
		else {
			outp += "<TD BGCOLOR=#EEEECC align=left ID='bdy_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<A tabindex=-1 datasrc='#enqdat' datafld=" + fld_datafld[gi] + " STYLE='Text-Decoration:None' ONMOUSEOVER='fixmailto(this);' title='Send an Email.'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></A></SPAN></TD>";
		}
		break;
	default:
		// don't display PICTURE or DOC cols
		if ( gi == PICTURECOL || gi == DOCCOL ) {
			outp += "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></TD>";
			continue;
		}
		// dont display TEXINFO field in enquiry template
		if ( have_TEXINFO && (fld_type[gi] & 2) ) {
			outp += "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></TD>";
		}
		else {
			var xstr = "<TD BGCOLOR=#EEEECC align=left ID='bdy_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></SPAN></TD>";
			alert(xstr)
			outp += "<TD BGCOLOR=#EEEECC align=left ID='bdy_hfld" + gi + "'" + "><SPAN CLASS='fld_" + fld_desc[gi] + "'>" + "<DIV datasrc='#enqdat' datafld=" + fld_datafld[gi] + "></DIV></SPAN></TD>";
		}
	}
}

if ( MSG1COL != 0 ) {
	//outp += "<DIV ID='Msg1-9'>";
	//outp += MSG1COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg1></SPAN></TD>" : "";
	//outp += MSG2COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg2></SPAN></TD>" : "";
	//outp += MSG3COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg3></SPAN></TD>" : "";
	//outp += MSG4COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg4></SPAN></TD>" : "";
	//outp += MSG5COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg5></SPAN></TD>" : "";
	//outp += MSG6COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg6></SPAN></TD>" : "";
	//outp += MSG7COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg7></SPAN></TD>" : "";
	//outp += MSG8COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg8></SPAN></TD>" : "";
	//outp += MSG9COL != 0 ? "<TD><SPAN CLASS='Msg' datasrc='#enqdat' datafld=Msg9></SPAN></TD>" : "";
	//outp += "</DIV>";
	outp += MSG1COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg1></DIV></TD>" : "";
	outp += MSG2COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg2></DIV></TD>" : "";
	outp += MSG3COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg3></DIV></TD>" : "";
	outp += MSG4COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg4></DIV></TD>" : "";
	outp += MSG5COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg5></DIV></TD>" : "";
	outp += MSG6COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg6></DIV></TD>" : "";
	outp += MSG7COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg7></DIV></TD>" : "";
	outp += MSG8COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg8></DIV></TD>" : "";
	outp += MSG9COL != 0 ? "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=Msg9></DIV></TD>" : "";
}

//outp += "<TD BGCOLOR=#EEEECC align=left><SPAN CLASS='RecordNo' datasrc='#enqdat' datafld=RecordNo></SPAN></TD>";
outp += "<TD STYLE='display: none'><DIV datasrc='#enqdat' datafld=RecordNo></DIV></TD>";

outp += "";
outp += "		</TR>";
outp += "	</TBODY>";
outp += "	<TFOOT>";
outp += "	</TFOOT>";
outp += "</TABLE>";
outp += "";
outp += "</TD>";
outp += "</TR>";
// Extended template info TEXINFO
if ( have_TEXINFO ) {
	outp += "<TABLE width=100% CELLPADDING=0 CELLSPACING=0 BORDER=0>";
	outp += "<TR>";
	outp += "<TD>";
	outp += "<SPAN ID=myTEXINFO>";
	outp += "</SPAN>";
	outp += "</TD>";
	outp += "</TR>";
	outp += "</TABLE>";
}
outp += "</TABLE>";
if ( PICTURECOL != 0 || MSG1COL != 0 ) {
	outp += "<TABLE width=100% CELLPADDING=2 CELLSPACING=0";
	outp += "       BORDER=2 BORDERCOLORDARK=black BORDERCOLOR=#C0C0C0>";
	outp += "		<TR>";
	if ( PICTURECOL != 0 ) {
		outp += "		<TD BGCOLOR=#C0C0C0>";
		outp += "		<SPAN ID=myPicture>";
		outp += "		</SPAN>";
		outp += "		</TD>";
	}
	if ( MSG1COL != 0 ) {
		outp += "		<TD  BGCOLOR=#D7D7D7 WIDTH=800>";
		outp += "		<FONT SIZE=2><SPAN ID=myMsg>";
		outp += "		</SPAN></FONT>";
		outp += "		</TD>";
	}
	outp += "		</TR>";
	outp += "</TABLE>";
}
outp += "</TABLE>";
outp += "";

return outp;
}

//----------------------------------------
// MAIN

w("<BODY ")
if ( t21webdirbkgrnd != "" )
	w("background='" + t21webdirbkgrnd + "'")
w("	OnLoad='initT21Enquiry();'")
// ZZZZ
//w("	onblur='blurT21Enquiry();'")
//w("	ondeactivate='blurT21Enquiry();'")
//w("	onfocusout='blurT21Enquiry();'")
//w("	onfocusin='focusT21Enquiry();'")

w("	onkeydown='keydownProc();'")
w("	onkeypress='keypressProc();'")
w("	onkeyup='keyupProc();'")
w(">")

if ( t21webdirbanner1 != "" ) {
	w("<IMG SRC='" + t21webdirbanner1 + "'>")
}
if ( mytitle_nexttobanner1 ) {
	for ( var i = 1; i <= nexttobanner1_padding; ++i ) {
		w("&nbsp;")
	}
	w("<B><FONT COLOR=#777777 SIZE=5>")
	w("<SPAN CLASS=mytitle_header>")
	w(mytitle)
	w("</SPAN>")
	w("</FONT></B>")
}

if ( hr_afterbanner1 )
	w("<hr>")

if ( t21topheader ) {
	if ( t21Heading != "" || (!t21mailtobutton && t21mailto != "") ) {
		w("<TABLE width=760 CELLPADDING=3 CELLSPACING=0 BORDER=0>")
		w("<THEAD BGCOLOR=white>")
		w("<TR>")
		if ( t21Heading != "" ) {
			w("<TD>")
			w("<B><FONT FACE='Arial' COLOR=#000077 SIZE=3>" + t21Heading + "</FONT></B>")
			w("</TD>")
		}
		if ( !t21mailtobutton && t21mailto != "" ) {
			w("<TD align=center>")
			w("<A tabindex=-1 HREF='" + t21mailto + "'>" + t21mailtomsg + "<A>")
			if ( t21mailtoxtramsg != "" ) {
				w(t21mailtoxtramsg);
			}
			w("</TD>")
		}
		w("</TR>")
		w("</THEAD>")
		w("</TABLE>")
	}
}

if ( defbgsoundurl != "" )
	w("<BGSOUND SRC='" + defbgsoundurl + "'>")

if ( dospeech ) {
	// SAPI 4.0a Runtime binaries
	// - auto download and install
	//w("<OBJECT ID='SAPI40a' width=0 height=0")
	//w(" CLASSID='CLSID:0C7F3F20-8BAB-11d2-9432-00C04F8EF48F'")
	//w(" CODEBASE='#VERSION=4,0,0,0'")
	//w(">")
	//w("</OBJECT>")

	// MSTTS 4.0 Text To Speech Engine - English
	// - auto download and install
	//w("<OBJECT ID='MSTTS40E' width=0 height=0")
	//w(" CLASSID='CLSID:2a46E4C0-4EDA-101B-931A-00AA0047BA4F'")
	//w(" CODEBASE='#VERSION=4,0,0,0'")
	//w(" CODEBASE='http://www.directextras.com/Download/msttsa22l.exe#VERSION=4,0,0,0'")
	//w(">")
	//w("</OBJECT>")

	// Lernout Hauspie TruVoice American. English. TTS Engine
	// - auto download and install
	//w("<OBJECT ID='TruVoiceTTSAE' width=0 height=0")
	//w(" CLASSID='CLSID:B8F2846E-CE36-11D0-AC83-00C04FD97575'")
	////w(" CODEBASE='http://activex.Microsoft.com/controls/agent/engine.exe#VERSION=1,5,0,0'")
	//w(" CODEBASE='#VERSION=6,0,0,0'")
	//w(">")
	//w("</OBJECT>")

	// Lernout Hauspie TTS3000 Engine - British English
	// - auto download and install
	//w("<OBJECT ID='LHTTS3000BE' width=0 height=0")
	//w(" CLASSID='CLSID:1D87F5B2-05F1-11D2-AD7C-0000F8799342'")
	//w(" CODEBASE='#VERSION=1,0,0,0'")
	//w(">")
	//w("</OBJECT>")

	w("<COMMENT>MS SAPI 4.0 Voice Text Control</COMMENT>")
	w("<OBJECT tabindex=-1 ID='TTSObj' width=0 height=0")
	w(" CLASSID='CLSID:2398E32F-5C6E-11D1-8C65-0060081841DE'")
	w(">")
	w("</OBJECT>")

	//w("<COMMENT>MS SAPI 5 MSSam</COMMENT>")
	//w("<OBJECT tabindex=-1 ID='TTSObj' width=0 height=0")
	//w(" CLASSID='CLSID:65DBDDEF-0725-11D3-B50C-00C04F797396'")
	//w(">")
	//w("</OBJECT>")

	//w("<COMMENT>MS DOWNLOADABLE SPEECH API (????)</COMMENT>")
	//w("<OBJECT tabindex=-1 ID='TTSObj' width=0 height=0")
	//w(" classid='clsid:0C7F3F20-8BAB-11D2-9432-00C04F8EF48F'")
	//w(" data='DATA:application/x-oleobject;")
	//w("      BASE64,ID9/DKuL0hGUMgDAT470jwICAADYEwAA2BMAAA'")
	//w(">")
	//w("</OBJECT>")
}

w("<COMMENT>MS IE DHTML Databinding Tabular Data Control</COMMENT>")
//w("<SCRIPT LANGUAGE='Javascript' FOR=enqdat EVENT=ondatasetchanged>")
//w("	do_ondatasetchanged();")
//w("</SCRIPT>")
//w("<SCRIPT LANGUAGE='Javascript' FOR=enqdat EVENT=ondataavailable>")
//w("	do_ondataavailable();")
//w("</SCRIPT>")
w("<SCRIPT LANGUAGE='Javascript' FOR=enqdat EVENT=ondatasetcomplete>")
w("	do_ondatasetcomplete();")
w("</SCRIPT>")
w("<OBJECT tabindex=-1 ID=enqdat CLASSID='clsid:333C7BC4-460F-11D0-BC04-0080C7055A83'>")
w("	<PARAM NAME='DataURL' VALUE='" + t21webdirdataurl + "'> ")
w("	<PARAM NAME='UseHeader' VALUE='True'>")
w("	<PARAM NAME='FieldDelim' VALUE=','>")
w("	<PARAM NAME='TextQualifier' VALUE='\"'>")
w("	<PARAM NAME='EscapeChar' VALUE='\\'>")
w("	<PARAM NAME='CaseSensitive' VALUE='False'>")
w("	<PARAM NAME='Filter' VALUE='RecordNo = -1'>")
w("</OBJECT>")

w('<div id="enquiry_div">');
//-----------------------------
w( "<h4>Enquiry Data Loading...<h4>" );
//-----------------------------
w('</div>');

w("</BODY>")