function stringReplace (str, findStr, repStr) {
   while (str.indexOf(findStr) > -1) {
      pos = str.indexOf(findStr)
      pre = str.substring(0,pos)
      post = str.substring(pos+findStr.length,str.length)
      str = pre + repStr + post
   }
   return(str) 
}


function EregStringReplace (text, szfind, szrep) {
//The above one has problems with sequences like \"
	eval ("var regxp=/"+szfind+"/g")
	var retval = text.replace ( regxp, szrep)
	return retval;
}

function fnBlockBackspace () { //Black <go back> capability of Backspace
  if (window.event.keyCode == 8 && window.event.srcElement.type!="text" && window.event.srcElement.tagName!="INPUT" && window.event.srcElement.tagName!="TEXTAREA") {
	event.returnValue=false;
  }
  else {event.returnValue=true; }
}

function trim_broken(str) {
    // this function doesn't seem to work, but the next one does
    alert("before (" +str+ ")");
    //str.replace(/^\s+/g, '').replace(/\s+$/g, '');
    //str.replace(/^\s*(.*\S|.*)\s*$/, '$1');
    alert("after (" +str+ ")");
    return str;
} 

// borrowed from ... Irakli :)
function trim (szTxt) {
		var lbound=-1; var rbound=-1;
		
		for (i=0; i < szTxt.length; i++) {
			if ( szTxt.substr(i,1) != " "  && lbound == -1 ) {lbound=i;}
		}
		
		for (i=szTxt.length-1; i>=0;  i--) {
			if ( szTxt.substr(i,1) != " " && rbound == -1) {rbound=i+1;}
		}
		
		return szTxt.substring(lbound,rbound);
}

//-----------------------------------------------

function _MessageBoxParam()
{
	var nLevel;			// 1 - Info, 2 - Warning, 3 - Error
	var nType;			// 0 - MBOK, 1 - MBYESNO 
	var szMessage;		// Message Text 
	var szOKString;		// OK/Yes caption 
	var szNoString;		// NO Caption 
}

function MessageBox( szMessage, nLevel, nType, szOKcap, szNOcap )
{
	var szURL;
	var localDate = new Date();
	var strFeatures = "dialogWidth:433px;dialogHeight:137px;" +
	   "help:no;maximize:no;minimize:no;scroll:no;status:no;resizable:no;";
	   
	 _MessageBoxParam.nLevel = nLevel;
	 _MessageBoxParam.nType = nType;	 
	 _MessageBoxParam.szMessage = szMessage;
	 _MessageBoxParam.szOKString = null;
	 _MessageBoxParam.szNoString = null;
	 
 	 if (szOKcap != "undefined") { _MessageBoxParam.szOKString = szOKcap }
	 if (szNOcap != "undefined") { _MessageBoxParam.szNoString = szNOcap }
	 	
	szURL =  "messagebox.html"		
	szURL += "?counter="+ localDate.getMinutes() * 100000 + localDate.getSeconds() * 1000 + localDate.getMilliseconds();			

	return showModalDialog( szURL, _MessageBoxParam, strFeatures );
}
//----------------------------------------------

function fillSelectList (list, array, numCols, valCol, labelCol, valList) {
   var span, str, pos, arr, i

   span = eval(list)
   str = span.innerHTML
   pos = str.indexOf("></")
   post = str.substring(pos+1,str.length)
   str = str.substring(0,pos+1)
   arr = eval(array)
   for (i = 0; arr[i*numCols] != "~"; i++) {
      val = arr[(i*numCols) + valCol]
      if (valList.indexOf(val) == -1) { 
         str = str + "<option value=\"" + val + "\">" + arr[(i*numCols) + labelCol] + "</option>"
      } else {
         str = str + "<option SELECTED value=\"" + val + "\">" + arr[(i*numCols) + labelCol] + "</option>"
      }
   }
   str = str + post
   span.innerHTML = str
}

function changeSelectList (list, array, numCols, valCol, labelCol, valList) {
   var span, str, pos, arr, i

   span = eval(list)
   str = span.innerHTML;
   begin_pos = str.indexOf(">");
   end_pos = str.indexOf("</SELECT");
   post = str.substring(end_pos,str.length)
   str = str.substring(0,begin_pos+1);
   arr = eval(array)
   for (i = 0; arr[i*numCols] != "~"; i++) {
      val = arr[(i*numCols) + valCol]
      if (valList.indexOf(val) == -1) { 
         str = str + "<option value=\"" + val + "\">" + arr[(i*numCols) + labelCol] + "</option>"
      } else {
         str = str + "<option SELECTED value=\"" + val + "\">" + arr[(i*numCols) + labelCol] + "</option>"
      }
   }
   str = str + post
   span.innerHTML = str
}

function spanRow(tablename, spanname, j) {
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   dTable = eval(tablename)
   dTable.insertRow(j+1)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>","</SPAN>")
   dTable = eval(tablename)
   dTable.insertRow(j)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>","<SPAN id=\"" + tablename + spanname + "\">")
}

function setupTable(tablename) {
   var dTable, numRows, j, numCells, i, str, cpv_id_field, cpv_id_desc;

   cpv_id_field = "";
   cpv_desc_field = "";
   dTable = eval(tablename)
   dTable.insertAdjacentHTML("beforeBegin","<span id=\"" + tablename + "span\">")
   dSpan = eval(tablename + "span")
   dTable.applyElement(dSpan)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"_addfunc_","adddata(\"" + tablename + "\")")
   dTable = eval(tablename)
   dArray = eval(dTable.array)
   dSpan.okdata = -1
   numRows = dTable.rows.length - 1
   for (j = 0; j < numRows; j++) {
      if (dTable.rows(j).rowtype == "static") {
      } else if (dTable.rows(j).rowtype == "nodata") {
         spanRow(tablename, "nospan", j)
         dTable = eval(tablename)
         noSpan = eval(tablename + "nospan")
         dSpan.nodata = noSpan.innerHTML
	 dTable.deleteRow(j--)
      } else if (dTable.rows(j).rowtype == "okdata") {
         dSpan.okdatapos = j
         spanRow(tablename, "okspan", j)
         dTable = eval(tablename)
         if (dTable.rows(j).sortcol != null) {
            dSpan.reorder = dTable.rows(j).sortcol
         } else {
            dSpan.reorder = -1
         }
         dCell = dTable.rows(j).cells(0)
         dCell.innerHTML = "<input id=mod_#id# type=hidden name=" + tablename + "_modflag value=0>"+dCell.innerHTML
         dCell.innerHTML = "<input id=del_#id# type=hidden name=" + tablename + "_delflag value=0>"+dCell.innerHTML
         okSpan = eval(tablename + "okspan")
         dSpan.okdata = stringReplace(okSpan.innerHTML,"<VARIABLE>","#transvalue#<input id=#triple# type=hidden name=#varname# value=#value#>")
         dSpan.okdata = stringReplace(dSpan.okdata,"<HIDDEN>","<input id=#triple# type=hidden name=#varname# value=#value#>")
         dSpan.okdata = stringReplace(dSpan.okdata,"<READONLY>","#transvalue#<input id=#triple# type=hidden name=#varname# value=#value#>")
         args = "('" + tablename + "', #row#)"
         dSpan.okdata = stringReplace(dSpan.okdata,"_editfunc_","editdata" + args)
         dSpan.okdata = stringReplace(dSpan.okdata,"_deletefunc_","deletedata" + args)
         dSpan.okdata = stringReplace(dSpan.okdata,"_undeletefunc_","undeletedata" + args)
         dSpan.okdata = stringReplace(dSpan.okdata,"_upfunc_","updata" + args)
         dSpan.okdata = stringReplace(dSpan.okdata,"_downfunc_","downdata" + args)
	 // alert(dSpan.okdata)
      } else if (dTable.rows(j).rowtype == "inputdata") {
         numCells = dTable.rows(j).cells.length
         for (i = 0; i < numCells; i++) {
            str = tablename + ".rows(" + j + ").cells(" + i + ")"
            dCell = eval(str)
            dCell.innerHTML = stringReplace(dCell.innerHTML,"#id#",tablename + "_add_" + i)
	    if (dCell.innerHTML.indexOf("cpv_id") > 0) {
		cpv_id_field = tablename + "_add_" + i
	    }
	    if (dCell.innerHTML.indexOf("cpv_desc") > 0) {
		cpv_desc_field = tablename + "_add_" + i
	    }
            if (dCell.innerHTML.indexOf("SELECT") > 0) {
               str = "fillSelectList(\"" + str + "\", \""  + dCell.array + "\", "
               str = str+ dCell.numcols + ", " + dCell.valcol + ", " + dCell.labelcol + ", \"\")"
               eval(str)
            }
         }
	 for (i=0; i < numCells; i++) {
	     str = tablename + ".rows(" + j + ").cells(" + i + ")"
	     dCell = eval(str)
	     dCell.innerHTML = stringReplace(dCell.innerHTML,"_searchfunc_","do_search('" + cpv_id_field + "','" + cpv_desc_field + "')");
	     dCell.innerHTML = stringReplace(dCell.innerHTML,"_browsefunc_","do_browse('" + cpv_id_field + "','" + cpv_desc_field + "')");
	 }
         spanRow(tablename, "inspan", j)
         dTable = eval(tablename)
         inSpan = eval(tablename + "inspan")
         dSpan.adddata = inSpan.innerHTML
         dSpan.editdata = stringReplace(inSpan.innerHTML, "_add_", "_edit_")
         dSpan.editdata = stringReplace(dSpan.editdata,"_OKfunc_","OKdata('" + tablename + "')")
         dSpan.editdata = stringReplace(dSpan.editdata,"#OKid#",tablename + "_OK")
	 //alert(dSpan.editdata)
      } else {
         alert("Missing or invalid rowtype!")
      }
   }
   okSpan = eval(tablename + "okspan")
   okSpan.innerHTML = ""
   dTable.style.display = "block"
   dSpan.datarows = 0
   if (dArray.length == 1) {
      dSpan.innerHTML = stringReplace(dSpan.innerHTML,tablename + "okspan>",tablename + "okspan >" + dSpan.nodata)
   } else {
      arrayname = dTable.array
      while ((dSpan.datarows * numCells) + 1 < dArray.length) {
         dTable.insertRow(dSpan.okdatapos + dSpan.datarows)
         dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>",dSpan.okdata)
         makeOK(tablename, arrayname, dSpan.datarows)
	 dTable = eval(tablename)
	 if (dSpan.reorder != -1) {
            if (dSpan.datarows) {
               up = eval("up_" + tablename + "_" + dSpan.datarows)
               up.style.visibility = "visible"
               down = eval("down_" + tablename + "_" + (dSpan.datarows - 1))
               down.style.visibility = "visible"
            }
         }
         dSpan.datarows++
      }
   }
   dSpan.editrow = -1
   dSpan.sequence = 0;
   //dbgwindow(dSpan.innerHTML);
}

function getTrans(arrayname, labelcol, valcol, numcols, value) {
   var array, i, l, v, n

   array = eval(arrayname)
   l = parseInt(labelcol); v = parseInt(valcol); n = parseInt(numcols)
   for (i = 0; array[i*n] != "~" && array[(i*n)+v] != value  && i < 300; i++) {}
   if (array[i*n] == "~") {return("ERROR")}
   return(array[(i * n) + l])
}

function makeOK(tablename, which, row) {
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"#id#",tablename + "_" + row)
   dTable = eval(tablename)
   dRow = dTable.rows(dSpan.okdatapos + row)
   
   numCells = dRow.cells.length
   if (which != "_add_" && which != "_edit_") {
	array = eval(which)
   }
   for (i = 0; i < numCells; i++) {
      if (which != "_add_" && which != "_edit_") {
	 val = array[(row * numCells) + i]
      } else {
         from = "form1." + tablename + which + i
         fromcell = eval(from)
	 if (fromcell == null) continue;
         val = fromcell.value
		 val = EregStringReplace (val, "\"", "&#34;")
 		 val = EregStringReplace (val, "<", "&lt;")
 		 val = EregStringReplace (val, ">", "&gt;")		 
  		 val = EregStringReplace (val, "\'", "&#39;")		 
      }
      dCell = dRow.cells(i)
      if (dCell.array == null) {
         dCell.innerHTML = stringReplace(dCell.innerHTML,"#transvalue#",val)
      } else {
         trans = getTrans(dCell.array, dCell.labelcol, dCell.valcol, dCell.numcols, val)
         dCell.innerHTML = stringReplace(dCell.innerHTML,"#transvalue#",trans)
      }
      dCell.innerHTML = stringReplace(dCell.innerHTML,"#triple#",tablename + "_" + row + "_" + i)
      dCell.innerHTML = stringReplace(dCell.innerHTML,"#varname#",dCell.varname);
      if (dCell.innerHTML.indexOf("INPUT") > 0) {
	  dCell.innerHTML = stringReplace(dCell.innerHTML,"#value#","\"" + val + "\"");
      } else {
	  // make read only values grey
	  dCell.innerHTML = stringReplace(dCell.innerHTML,"#value#",val);
      }	  
      dCell.innerHTML = stringReplace(dCell.innerHTML,"#row#",row)
   }
   //alert(dRow.innerHTML)
}

function adddata(tablename) {

  ret = fnCheckRow (tablename, 1, "_add_")
  if (ret != "OK") {return;}

   var dSpan, dTable

   dSpan = eval(tablename + "span");
   //(dSpan.innerHTML);
   if (dSpan.editrow != -1) {
      alert("You may not add a row while editing a row.  Please click on OK to finish editing a row.")
      return
   }
   if (dSpan.datarows == 0) {
      okspan = eval(tablename + "okspan")
      okspan.innerHTML = "#replace#"
      dSpan.innerHTML = stringReplace(dSpan.innerHTML,"#replace#",dSpan.okdata)   
   } else {
      dTable = eval(tablename)
      dTable.insertRow(dSpan.okdatapos + dSpan.datarows)
      dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>",dSpan.okdata)
   }
   makeOK(tablename, "_add_", dSpan.datarows)
   if (dSpan.reorder != -1) {
      sortinput = eval("form1." + tablename + "_" + dSpan.datarows + "_" + dSpan.reorder);
      sortinput.value = dSpan.datarows
      if (dSpan.datarows > 0) {
         dn = eval("down_" + tablename + "_" + (dSpan.datarows-1))
         dn.style.visibility = "visible"
         up = eval("up_" + tablename + "_" + dSpan.datarows)
         up.style.visibility = "visible"
      }
   }
   inSpan = eval(tablename + "inspan")
   inSpan.innerHTML = ""
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,tablename + "inspan>",tablename + "inspan >" + dSpan.adddata)
   dSpan.datarows++;

   OK_to_leave='no';
}

function editdata(tablename, row) {
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   if (dSpan.editrow != -1) {
      alert("You may only edit one row at a time.  Please click on OK to finish editing a row.")
      return
   }
   dSpan.editrow = row
   dTable = eval(tablename)
   dTable.insertRow(dSpan.okdatapos + row)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>",dSpan.editdata)

   dTable = eval(tablename)
   dRow = dTable.rows(dSpan.okdatapos + row)
   dRow.style.backgroundColor = "transparent"
   numCells = dRow.cells.length
   for (i = 0; i < numCells; i++) {
      fromstr = "form1." + tablename + "_" + row + "_" + i
      from = eval(fromstr)
      if (from == null) continue;
      tostr = "form1." + tablename + "_edit_" + i
      to = eval(tostr)
      to.value = from.value
   }
   dTable.deleteRow(dSpan.okdatapos + row + 1)
   ok = eval(tablename + "_OK")
   ok.style.visibility = "visible"
   //alert("end edit data\n" + dSpan.innerHTML);
   OK_to_leave='no';
}

function OKdata(tablename) {
   ret = fnCheckRow (tablename, 1, "_edit_")
   if (ret != "OK") {return;}
   
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   dTable = eval(tablename)
   dTable.insertRow(dSpan.okdatapos + dSpan.editrow)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>",dSpan.okdata)
   makeOK(tablename, "_edit_", dSpan.editrow)
   if (dSpan.reorder != -1) {
      sortinput = eval("form1." + tablename + "_" + dSpan.editrow + "_" + dSpan.reorder)
      sortinput.value = dSpan.editrow
      if (dSpan.editrow > 0) {
         up = eval("up_" + tablename + "_" + dSpan.editrow)
         up.style.visibility = "visible"
      }
      if (dSpan.datarows > dSpan.editrow + 1) {
         dn = eval("down_" + tablename + "_" + (dSpan.editrow))
         dn.style.visibility = "visible"
      }
   }
   modflag = eval("form1.mod_" + tablename + "_" + dSpan.editrow)
   modflag.value = 1;
   dTable = eval(tablename)
   dTable.deleteRow(dSpan.okdatapos + dSpan.editrow + 1)
   dSpan.editrow = -1
// alert(dRow.innerHTML)
   OK_to_leave='no';
}

function deletedata(tablename, row) {
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   delflag = eval("form1.del_" + tablename + "_" + row)
   delflag.value = 1;
   dTable = eval(tablename)
   dRow = dTable.rows(dSpan.okdatapos + row)
   numCells = dRow.cells.length
   for (i = 0; i < numCells; i++) {
      dRow.cells(i).innerHTML = "<strike>" + dRow.cells(i).innerHTML + "</strike>"
   }
   edit = eval("edit_" + tablename + "_" + row)
   edit.style.visibility = "hidden"
   del = eval("delete_" + tablename + "_" + row)
   del.style.visibility = "hidden"
   undel = eval("undelete_" + tablename + "_" + row)
   undel.style.visibility = "visible"
// alert(dRow.innerHTML)   
   OK_to_leave='no';
}

function undeletedata(tablename, row) {
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   delflag = eval("form1.del_" + tablename + "_" + row)
   delflag.value = 0;
   dTable = eval(tablename)
   dRow = dTable.rows(dSpan.okdatapos + row)
   numCells = dRow.cells.length
   for (i = 0; i < numCells; i++) {
      dRow.cells(i).innerHTML = stringReplace(dRow.cells(i).innerHTML,"<STRIKE>","")
      dRow.cells(i).innerHTML = stringReplace(dRow.cells(i).innerHTML,"</STRIKE>","")
   }
   undel = eval("undelete_" + tablename + "_" + row)
   undel.style.visibility = "hidden"
   edit = eval("edit_" + tablename + "_" + row)
   edit.style.visibility = "visible"
   del = eval("delete_" + tablename + "_" + row)
   del.style.visibility = "visible"
// alert(dRow.innerHTML)   
   OK_to_leave='no';
}

function updata(tablename, row) {
   var dSpan, dTable

   dSpan = eval(tablename + "span")
   if (dSpan.editrow != -1) {
      alert("You may not reorder while editing a row.  Please click on OK to finish editing the row.")
      return
   }
   uID1 = tablename + "', " + row
   dID1 = tablename + "', " + (row-1)
   uID2 = tablename + "_" + row
   dID2 = tablename + "_" + (row-1)

   spanRow(tablename, "upspan" + dSpan.sequence, dSpan.okdatapos + row - 1)
   upspan = eval(tablename + "upspan" + dSpan.sequence)
   rowHTML = upspan.innerHTML
   uprowHTML = stringReplace(rowHTML,dID1,uID1)
   uprowHTML = stringReplace(uprowHTML,dID2,uID2)
   upspan.innerHTML = ""
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<SPAN ID=upspan" + dSpan.sequence + "></SPAN>","")
   dTable = eval(tablename)
   dTable.insertRow(dSpan.okdatapos + row - 1)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>",uprowHTML)
   dSpan.sequence++

   spanRow(tablename, "upspan" + dSpan.sequence, dSpan.okdatapos + row)
   upspan = eval(tablename + "upspan" + dSpan.sequence)
   rowHTML = upspan.innerHTML
   uprowHTML = stringReplace(rowHTML,uID1,dID1)
   uprowHTML = stringReplace(uprowHTML,uID2,dID2)
   upspan.innerHTML = ""
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<SPAN ID=upspan" + dSpan.sequence + "></SPAN>","")
   dTable = eval(tablename)
   dTable.insertRow(dSpan.okdatapos + row - 1)
   dSpan.innerHTML = stringReplace(dSpan.innerHTML,"<TR></TR>",uprowHTML)
   dSpan.sequence++

   dTable = eval(tablename)
   if (row == 1) {
      up = eval("up_" + tablename + "_0")
      up.style.visibility = "hidden"
      up = eval("up_" + tablename + "_1")
      up.style.visibility = "visible"
   }
   if (row == dSpan.datarows - 1) {
      dn = eval("down_" + tablename + "_" + (row-1))
      dn.style.visibility = "visible"
      dn = eval("down_" + tablename + "_" + row)
      dn.style.visibility = "hidden"
   }
   usortinput = eval("form1." + tablename + "_" + (row-1) + "_" + dSpan.reorder)
   dsortinput = eval("form1." + tablename + "_" + (row) + "_" + dSpan.reorder)
   temp = usortinput.value
   usortinput.value = dsortinput.value
   dsortinput.value = temp
   modflag = eval("form1.mod_" + tablename + "_" + (row-1))
   modflag.value = 1;
   modflag = eval("form1.mod_" + tablename + "_" + row)
   modflag.value = 1;
   OK_to_leave='no';
}

function downdata(tablename, row) {
   updata(tablename, row+1)
}

function dbgwindow(someText) {
    dbgwindow=window.open("js-debug.html", "debug_win", "resizable=yes, menubar=yes, scrollbars=yes, status=yes");
    dbgwindow.document.open();
    dbgwindow.document.write(someText);
    dbgwindow.document.close();
}

function disableInput() {
    form1.cpv_desc.onfocus = 'alert("Please finish editing above. Then click \'OK\'");blur()';
    form1.cpv_id.onfocus = 'alert("Please finish editing above. Then click \'OK\'");blur()';
    form1.mytxtarea.onfocus = 'alert("Please finish editing above. Then click \'OK\'");blur()';
}

function enableInput() {
    form1.cpv_desc.onfocus = '';
    form1.cpv_id.onfocus = '';
    form1.mytxtarea.onfocus = '';
}

