<!--
//
// Sigma.js
//
// @author      Michael Skolik
// @version     5.1
// @date        November  06, 1999
// @modified    July      12, 2005
//
// @purpose:	Collection Utility functions
//
// Trims leading and trailing spaces.
//
// Implement Trim as a String-Function
String.prototype.trim = function() {
  var x	= this;
  x	= x.replace( /^\s*/, "" );
  x	= x.replace( /\s*$/, "" );
  return x;
}

String.prototype.replaceLead = function(oStr, nStr) {
  var x		= this;
  var rx	= new RegExp("^" + oStr + "*");
  return x.replace(rx, nStr);
}

String.prototype.replaceTail = function(oStr, nStr) {
  var x		= this;
  var rx	= new RegExp(oStr + "*$");
  return x.replace(rx, nStr);
}

function trim(str) {
  return str.trim();
//  var newStr = "";
//  for (var i = 0; i < str.length; i++){
//     if (str.charAt(i) != " ")	break;
//  }
//  if (i < str.length) {
//    for (var j = str.length-1; j > 0  &&  str.charAt(j) == " "; j--){
//       if (str.charAt(j) != " ")	break;
//    }
//    newStr += str.substring(i,j+1);
//  }
//  return newStr;
}

//
// Replaces oldString through newString in line.
//
function replace(line, oldString, newString) {
  var argv      = replace.arguments;
  var argc      = replace.arguments.length;
  var rOpts	= (argc > 3) ? argv[3] : "g";
  var rx	= new RegExp(oldString, rOpts);
  return line.replace(rx, newString);
//  var is = 0;
//  var ie = 0;
//  var oLen = oldString.length;
//  var str = "";

//  while ((ie = line.indexOf(oldString, is)) >= 0) {
//    str += line.substring(is, ie);
//    str += newString;
//    is = ie + oLen;
//  }
//  str += line.substring(is,line.length);
//  return str;
}

//
// Extract a SubList from a Vector based on an ID-List
//
// Arguments:
//	vID	  - ID Vector
//	vItems    - Itmes Vector 
//	Delimiter - Delimiter (default = ",")
//
function ExtractList(vID, vItems) {
  var argv      = ExtractList.arguments;
  var argc      = ExtractList.arguments.length;
  var Delimiter = (argc > 2) ? argv[2] : ",";
  var str = "";
  for (var i=0; i < vID.length; i ++) {
     str = AppendWord(str, vItems[vID[i]], i, Delimiter);
  } 
  return str;
}

//
// Concatinates all argument-list elements using Delimiter 
//
// Arguments:
//	Delimiter - Delimiter
//
function ConcatItems(Delimiter, FirstItem) {
  var argv      = ConcatItems.arguments;
  var argc      = ConcatItems.arguments.length;
  var str	= FirstItem;
  for (var i=2; i < argc; i ++)	str += Delimiter + argv[i];
  return str;
}

//
// Append a word with a delimiter to a string
//
// Arguments:
//	line		- String where word has to be added.
//	word		- Word to add.
//	AddEmptyWord	- Flag indicating, if an empty word should be added.
//	Delimiter	- Delimiter (default = ",") 
//
function AppendWord(Line, Word, AddEmptyWord) {
  var argv      = AppendWord.arguments;
  var argc      = AppendWord.arguments.length;
  var Delimiter	= (argc > 3) ? argv[3] : ",";
  if (Word.length > 0) {
    if (Line.length > 0)	Line += Delimiter;
    Line += Word;
  } else {
    if (AddEmptyWord)		Line += Delimiter;
  }
  return Line;
}

//
// Rounds a number and formats the string with digits decimals.
//
// Arguments:
//	number	- Number to format
//	digits	- number of digits
//
function FormatNumber(number, digits) {
  if (digits < 0)	return number;
  if (digits == 0)	return Math.floor(number*1+0.5);
  var d = Math.pow(10,digits);
  var f = Math.floor(number*d+0.5)/d;
  var s = new String(f);
  var l = s.length;
  var p = s.lastIndexOf(".");
  if (p < 0) {
    s += "."; p = l; l++;
  }

  for (var i = 1; i <= digits; i++) {
    if (p+i >= l)  s += "0";
  }
  return s;
}

function toNumber(str, def) {
  if (str.length == 0)	return def;
  return parseInt(str);
}

//
// Formats a number with leading zeros.
//
// Arguments:
//	price	- Number to format
//	digits	- number of digits
//
//
function FormatNumber1(number, digits) {
  var sNr = new String(number);
  if (digits < 2)	return sNr;
  var n = digits - sNr.length;
  if (n < 0) n = 0;

  str = "";
  for (var i = 0; i < n; i++)  str += "0";
  str += sNr;

  return str;
}

//
// Formats a Timestamp value into a proper Date format.
//
// Arguments:
//	tStamp	- Timestamp variable
//	Format	- Date/Time Template (YYYY-MM-DD hh:mm:ss is default)
//
function FormatTimestamp(tStamp) {
  var argv      = FormatTimestamp.arguments;
  var argc      = FormatTimestamp.arguments.length;
  var Template  = (argc > 1) ? argv[1] : "YYYY-MM-DD hh:mm:ss";

  var Year	= tStamp.substring(0, 4);
  var Month	= tStamp.substring(4, 6);
  var Day	= tStamp.substring(6, 8);
  var Hour	= tStamp.substring(8, 10);
  var Minute	= tStamp.substring(10, 12);
  var Second	= tStamp.substring(12, 14);

  var str	= Template;
  str = replace(str, "YYYY", Year);
  str = replace(str, "MM",   Month);
  str = replace(str, "DD",   Day);
  str = replace(str, "hh",   Hour);
  str = replace(str, "mm",   Minute);
  str = replace(str, "ss",   Second);
  
  return str;
}

//
// Converts a Zip/Postal-Code into a unified format - Uppercase and no spaces.
//
// Arguments:
//	Zip	- original Sip/Postal code
//	Return	- Unified ZipCode
//
function FormatZipCode(Zip) {
  return replace(oldZip.toUpperCase(), " ", "");
}

// Extension of indexOf, but for multiple characters.
//
// Arguments:
//	str		- string to search
//	SearchChars	- Characters to search for 
//	iStart		- start position
//
function MultiIndexOf(str, SearchChars, iStart) {
  var ie = 0;
  for (var i=0; i < SearchChars.length; i++) {
     if ((ie = str.indexOf(SearchChars.charAt(i), iStart)) >= 0)  break;
  }
  return ie;
}

//
// The following 2 functions parses a given text and converts a
// word starting with http:// into a hyperlink and a word containing
// a @ into a Mailto hyperlink.
//
// Arguments:
//	line	- text
//
function CreateHttpLink(line) {
  var argv      = CreateHttpLink.arguments;
  var argc      = CreateHttpLink.arguments.length;
  var aClass	= (argc > 1) ? argv[1] : "";
  var is	= 0;
  var ie 	= 0;
  var ll 	= line.length;
  var str;
  var s = "";
  
  while((ie = line.indexOf("http://", is)) >= 0) {
    s += line.substring(is, ie);
    is = isNextValidChar(line, VALIDLINKCHARS, ie+7, 1, false);
    str = line.substring(ie, is);
    s += "<a " + aClass + " target=\"_blank\" href=\"" + str + "\">" + str + "</a>";
  }
  s += line.substring(is, ll);
  return s;
}

function CreateMailLink(line) {
  var argv      = CreateMailLink.arguments;
  var argc      = CreateMailLink.arguments.length;
  var aClass	= (argc > 1) ? argv[1] : "";
  var is = 0;
  var ie = 0;
  var ia = 0;
  var ll = line.length;
  var str;
  var s = "";
  
  while((ia = line.indexOf("@", is)) >= 0) {
    ie = isNextValidChar(line, VALIDLINKCHARS, ia-1, -1, false) + 1;
    s += line.substring(is, ie);
    is = isNextValidChar(line, VALIDLINKCHARS, ia+1, 1, false)
    str = line.substring(ie, is);
    s += "<a " + aClass + " href=\"mailto:" + str + "\">" + str + "</a>";
  }
  s += line.substring(is, ll);
  return s;
}

function AddHttp(sURL) {
  if (sURL.length == 0)			return sURL;
  if (sURL.indexOf("http://") < 0)	return "http://" + sURL;
  else					return sURL;
}


// Hide Credit Card Number starting at Digit n
//
function CCnumberHide(CCnumber, n) {
  var str = "";
  for (var i = 0; i < CCnumber.length; i++) {
    if (i < n) {
      str += CCnumber.charAt(i);
    } else {
      if (CCnumber.charAt(i) == " ")	str += " ";
      else				str += "x"
    }
  }
  return str;
}


// Fill Variables in SQL Query from Form
//
function FillQueryFromForm(aForm, strSQL) {
  var vName, sName, vValue;

  var varStr	= aForm.Required.value;
  if (aForm.Optional.value.length > 0)	varStr += "," + aForm.Optional.value;
  var strArray	= varStr.split(",");
  for (var i=0; i < strArray.length; i++) {
     vName = trim(strArray[i]);
     sName = replace(vName, "'", "")
     vValue	= trim(getParameterValue(aForm, sName));
     if (vValue.length == 0) {
	vValue = "NULL";
     } else {
	vValue = replace(vName, sName, vValue);
     }
     strSQL = replace(strSQL, "$"+sName+"$", vValue);
  }

  return strSQL;
}

// Returns a comma delimited string based on
// the selected options.
//
// Arguments:
//	crtl  -  Option Box
//
function OptionsMakeString(ctrl, aList) {
  var i, n=0;
  var str = "";

  for (i=0; i<ctrl.options.length; i++) {
    if (ctrl.options[i].selected) {
      if (n > 0) str += ",";
      str += ctrl.options[i].value;
      n++;
    }
  }
  return str;
}

// Sets options in a Option/List box to selected
// based on a comma delimited string.
//
// Arguments:
//	crtl  -  Option Box
//	str   -  String containing the optionlist
//
function OptionsSetFromString(ctrl, str) {
  var i, n;
  var sOpt;
  var lstArray = str.split(",");

  for (n = 0; n < lstArray.length; n++) {
    sOpt = trim(lstArray[n]);

    for (i=0; i<ctrl.options.length; i++) {
      if (ctrl.options[i].value == sOpt)
		ctrl.options[i].selected = true;
    }
  }
}

function OptionsNotFirst(ctrl) {
  var Status = 1;
  if (ctrl.selectedIndex == 0) {
    alert ("??? was not selected.");
    Status = 0; 
  }
  return Status;
}

function OptionsClear(ctrl){
  for (var i = ctrl.options.length-1; i >= 0; i--)	ctrl.options[i] = null;
}

function OptionsFillFromOptionList(ctrl, OptionList) {
  var argv      = OptionsFillFromOptionList.arguments;
  var argc      = OptionsFillFromOptionList.arguments.length;
  var i = 0;

  if (argc > 2) {
    ctrl.options[0] = argv[2];
    i = 1;
  }

  for (; i < OptionList.length; i++){
    ctrl.options[ctrl.options.length] = OptionList[i];
    // ctrl.options[ctrl.options.length]=new Option(OptionList[i].text, OptionList[i].value);
  }
}

function OptionsCreateFromString(OptionString) {
  var oStr = "";
  if (OptionString.length == 0  ||  OptionString.indexOf("&nbsp") > -1)	return oStr;
  var OptionList = OptionString.split(",");
  for (var i = 0; i < OptionList.length; i++) {
    oStr += "<option value=\"" + OptionList[i] + "\">" + OptionList[i] + "</option>\n";
  }
  return oStr;
}

function OptionsCreateFromRecordList(RecordList) {
  var argv      = OptionsCreateFromRecordList.arguments;
  var argc      = OptionsCreateFromRecordList.arguments.length;
  var oStr	= "";
  
  if (argc > 1) {
    oStr += "<option value=\"" + argv[1].value + "\">" + argv[1].text + "</option>\n";
  }
  for (var i = 0; i < RecordList.length; i++){
    oStr += "<option value=\"" + RecordList[i].Value + "\">" + RecordList[i].Name + "</option>\n";
  }
  return oStr;
}

// Fills a checkbox from Recordlist, but filtered by Group
// Used with dependent Combo boxes, e.g States based on Country
//
// Arguments:
//	RecordList	-  RecordList
//	ctrl		-  Pointer to the Option control
//	sGroup		-  Filter to select entries from RecordList
//
function OptionsFillDependentComboBox(RecordList, ctrl, sGroup) {
  var argv      = OptionsFillDependentComboBox.arguments;
  var argc      = OptionsFillDependentComboBox.arguments.length;
  var i = 0;
  var n = 0;

  OptionsClear(ctrl);
  if (argc > 3) {
    ctrl.options[0] = argv[3];	// Add Top Entry which is not in RecordList, e.g. Blank entry
    i = 1;
    n = 1;
  }
  for (; i < RecordList.length; i++){
    if (sGroup == null  ||  RecordList[i].Group == sGroup) {
      ctrl.options[n] = new Option(RecordList[i].Name, RecordList[i].Value);
      n++;
    }
  }
  if (n > 0) ctrl.options[0].selected = true;
}

// Returns a comma delimited string based on
// the selected Checkboxes.
//
// Arguments:
//	form     -  Pointer to the form
//	Prefix   -  Prefix to identify the checkboxes
//
function CheckMakeString(aForm, Prefix) {
	var j = 0;
	var objCtrl;
	var str = "";

	// step through all of the controls on the form
	for (var i = 0; i < aForm.elements.length; i++) {
	   objCtrl = aForm.elements[i];
	   if (objCtrl.name.substring(0,Prefix.length) != Prefix)	continue;
	   if(objCtrl.type.toLowerCase() != "checkbox")			continue;
	    if (objCtrl.checked) {
		if (j > 0) str += ",";
		str += objCtrl.value;
		j++;
	    }
	}
	return str;
}

// Sets Checkboxes as check based on a comma delimited string.
//
// Arguments:
//	Name  -  Name of the Form
//	str       -  String containing the options
//	Prefix    -  Prefix to identify the checkboxes
//
function CheckSetFromString(FormName, str, Prefix) {
	var objCtrl;
	var str;
	var lstArray = str.split(",");
	
	for (var i=0; i < lstArray.length; i++) {
	  str = "document." + FormName + "." + Prefix + lstArray[i];
	  objCtrl = eval(str);
	  if (objCtrl != null)	  objCtrl.checked = true;
	}
}

function CheckSetFromStringByValue(aForm, str, Prefix) {
  var argv	= CheckSetFromStringByValue.arguments;
  var argc	= CheckSetFromStringByValue.arguments.length;
  var Delimiter	= (argc > 3) ? argv[3] : ',';
  var objCtrl;
  var str;
  var lstArray = str.split(Delimiter);
	
  for (var i = 0; i < aForm.elements.length; i++) {
    objCtrl = aForm.elements[i];
    if (objCtrl.name.substring(0,Prefix.length) != Prefix)	continue;
    if(objCtrl.type.toLowerCase() != "checkbox")		continue;
    for (var j=0; j < lstArray.length; j++) {
	if (objCtrl.value == lstArray[j]) {
		objCtrl.checked = true;
		break;
	}
    }
  }
}

function CheckClearSelection(aForm, Prefix) {
  var objCtrl;
 
  for (var i = 0; i < aForm.elements.length; i++) {
    objCtrl = aForm.elements[i];
    if (objCtrl.name.substring(0,Prefix.length) != Prefix)	continue;
    if(objCtrl.type.toLowerCase() != "checkbox")		continue;
    if (objCtrl.checked == true)	objCtrl.checked = false;
  }
}


function RadioGetSelectedID(objCtrl) {
  for (var i = 0; i < objCtrl.length; i++)
  	if (objCtrl[i].checked == true)	return i;
  return -1;
}

function RadioGetSelectedValue(objCtrl) {
  for (var i = 0; i < objCtrl.length; i++)
  	if (objCtrl[i].checked == true)	return objCtrl[i].value;
  return null;
}

function RadioClearSelection(objCtrl) {
  for (var i = 0; i < objCtrl.length; i++)
  	if (objCtrl[i].checked == true)	objCtrl[i].checked = false;
}

function RadioGetSelectedValueFromForm(aForm, Prefix) {
  var objCtrl;

  for (var i = 0; i < aForm.elements.length; i++) {
    objCtrl = aForm.elements[i];
    if (objCtrl.name.substring(0,Prefix.length) != Prefix)	continue;
    if(objCtrl.type.toLowerCase() != "radio")			continue;
    if (objCtrl.checked)	return objCtrl.value;
  }
  return null;
}

function RadioSetSelectedFromString(objCtrl, str) {
  for (var i = 0; i < objCtrl.length; i++) {
  	if (objCtrl[i].value == str) {
  		objCtrl[i].checked = true;
  		return true;
  	}
  }
  return false;
}

function RadioMakeString(aForm, Prefix) {
  var argv	= RadioMakeString.arguments;
  var argc	= RadioMakeString.arguments.length;
  var Delimiter	= (argc > 2) ? argv[2] : ',';
  var j = 0;
  var objCtrl;
  var str = "";

  // step through all of the controls on the form
  for (var i = 0; i < aForm.elements.length; i++) {
    objCtrl = aForm.elements[i];
    if (objCtrl.name.substring(0,Prefix.length) != Prefix)	continue;
    if(objCtrl.type.toLowerCase() != "radio")			continue;
	if (objCtrl.checked) {
	  if (j > 0) str += Delimiter;
	  str += objCtrl.value;
	  j++;
	}
  }
  return str;
}

function RadioSetFromStringByValue(aForm, str, Prefix) {
  var argv	= RadioSetFromStringByValue.arguments;
  var argc	= RadioSetFromStringByValue.arguments.length;
  var Delimiter	= (argc > 3) ? argv[3] : ',';
  var objCtrl;
  var str;
  var lstArray = str.split(Delimiter);
	
  for (var i = 0; i < aForm.elements.length; i++) {
    objCtrl = aForm.elements[i];
    if (objCtrl.name.substring(0,Prefix.length) != Prefix)	continue;
    if(objCtrl.type.toLowerCase() != "radio")			continue;
      for (var j=0; j < lstArray.length; j++) {
	if (objCtrl.value == lstArray[j]) {
		objCtrl.checked = true;
		break;
	}
      }
  }
}

//
// Checks, if all required parameters are filled out.
// The list of required parameters is specified in a hidden
// variable called 'Required'.
//
// Arguments:
//	form	- Form name
//
function isRequired(aForm) {
  var argv	= isRequired.arguments;
  var argc	= isRequired.arguments.length;
  var text	= (argc > 1) ? argv[1] : 'The following required fields are empty:';
  var rc	= true;
  var DescLen	= 0;
  var str;
  if (argc > 2) {
    var Descarray	= argv[2]
    DescLen		= DescArray.length;
  }
  if (aForm.Required.value.length == 0)	return true;
  var strArray = aForm.Required.value.split(",");
  text += "\n";
  for (var i=0; i < strArray.length; i++) {
     str = replace(trim(strArray[i]), "'", "");
     if (trim(getParameterValue(aForm, str)).length == 0) {
     	 if (DescLen > i)	str = DescArray[i];
         text += "\n  - " + str;
	 rc = false;
     }
  }

  if (rc == false)  alert(text);
  return rc;
}


var LOWER	= "abcdefghijklmnopqrstuvwxyz";
var UPPER	= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var NUMBER	= "0123456789";
var SIGN	= "+-";
var DOT		= ".";
var SPACE	= " ";
var VALIDLINKCHARS	= LOWER + UPPER + NUMBER + "./-_?&";
var VALIDLOGINCHARS	= LOWER + UPPER + NUMBER + "./-_";

// Checks, if the string contains valid characters.
//
// Arguments:
//	str		- string to check
//	ValidChars	- List of valid characters
//
function isValidString(str, ValidChars) {
  for (var i=0; i < str.length; i++) {
     if (ValidChars.indexOf(str.charAt(i)) == -1)  return false;
  }
  return true;
}
function isValidInteger(str)	{ return isValidString(str, SIGN+NUMBER); }
function isValidFloat(str)	{ return isValidString(str, NUMBER+SIGN+DOT); }

function isNextValidChar(str, ValidChars, is, dir, YesNo) {
  var s;
  var len = str.length
  for (var i=is; i>= 0 && i<len; i=i+dir) {
     s = str.substring(i, i+1);
     if (isValidString(s, ValidChars) == YesNo)  break;
  }
  return i;
}

// Checks, if the string contains a valid date.
//
// Arguments:
//	datein		- string that contains the date
//			  in the followin format:
//			  [YY]YY-MM-DD or [YY]YY/MM/DD
//
function isValidDate(datein) {
  var indate	= replace(datein, "-", "/");
  var sdate	= indate.split("/");
  var chkDate	= new Date(Date.parse(indate));
  var DateStr	= new String(chkDate);
  if (DateStr.indexOf("NaN", 0) > -1)	return false;

  var cmpYear = chkDate.getYear();
  if (cmpYear < 1000)	cmpYear += 1900;
  var cmpDate = (cmpYear) + "/" + (chkDate.getMonth()+1) + "/" + (chkDate.getDate());
  var indate2 = (Math.abs(sdate[0])) + "/" + (Math.abs(sdate[1])) + "/" + (Math.abs(sdate[2]));
  if (cmpDate.indexOf("NaN", 0) > -1)	return false;
  if (indate2.indexOf("NaN", 0) > -1)	return false;

  if (indate2 != cmpDate)		return false;
  return true;
}

function isValidTime(timein) {
  var argv      = isValidTime.arguments;
  var argc      = isValidTime.arguments.length;
  var minLen	= (argc > 1) ? argv[1] : 1;
  var ttime	= replace(timein, " ", "");
  if (ttime.length == 0)				return true;
  if (isValidString(ttime, NUMBER+":") == false)	return false;
  var vtime	= ttime.split(":");
  var str, nn;
  if (vtime.length < minLen)	return false;
  if (vtime.length > 0) {	// Hour
    nn	= toNumber(vtime[0].replaceLead("0", ""), 0);
    if (nn < 0  || nn > 23)	return false;
  }
  if (vtime.length > 1) {	// Minute
    nn	= toNumber(vtime[1].replaceLead("0", ""), 0);
    if (nn < 0 || nn > 59)	return false;
  }
  if (vtime.length > 2) {	// Seconds
    nn	= toNumber(vtime[2].replaceLead("0", ""), 0);
    if (nn < 0 || nn > 59)	return false;
  }
  return true;
}

// Checks, if the string contains a valid email address.
//
// Arguments:
//	Email		- string that contains the Email
//
function isValidEmail(Email) {
var argv      = isValidEmail.arguments;
var argc      = isValidEmail.arguments.length;
if (argc > 1  && Email.length == 0)	return true;
var EmailOk  = true
var Temp     = Email;
var AtSym    = Temp.indexOf('@')
var Period   = Temp.lastIndexOf('.')
var Space    = Temp.indexOf(' ')
var Length   = Temp.length - 1   // Array is from 0 to length-1

if ((AtSym < 1) ||                     // '@' cannot be in first position
    (Period <= AtSym+1) ||             // Must be atleast one valid char btwn '@' and '.'
    (Period == Length ) ||             // Must be atleast one valid char after '.'
    (Space  != -1))                    // No empty spaces permitted
   {  
      EmailOk = false
   }
return EmailOk
}

function isValidURL(url) {
if ( url == null )	return false;
// space extr
	var reg='^ *';
//protocol
	reg = reg+'(?:([Hh][Tt][Tt][Pp](?:[Ss]?))(?:\:\\/\\/))?';
//usrpwd
	reg = reg+'(?:(\\w+\\:\\w+)(?:\\@))?';
//domain
	reg = reg+'([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|localhost|([Ww][Ww][Ww].|[a-zA-Z0-9].)[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,6})';
//port
	reg = reg+'(\\:\\d+)?';
//path
	reg = reg+'((?:\\/.*)*\\/?)?';
//filename
	reg = reg+'(.*?\\.(\\w{2,4}))?';
//qrystr
	reg = reg+'(\\?(?:[^\\#\\?]+)*)?';
//bkmrk
	reg = reg+'(\\#.*)?';
// space extr
	reg = reg+' *$';

	return url.match(reg);
}

// Checks, if a password and its confirmation is valid
//
// Arguments:
//	pwd	- string that contains the password
//	cpwd	- string that contains the confirmed password
//
function isValidPwd(Pwd, cPwd) {
   if (Pwd.length < 4) {
     alert("Password must contain at least 4 characters.");
     return false;
   }

   if (Pwd != cPwd) {
      alert("Passwords don't match.");
      return false;
   }
   return true;
}

//
// Returns the value of a Form-Parameter
//
// Arguments:
//	aForm	- Pointer to the Form
//	aName	- Name of the Form Element
//
function getParameterValue(aForm, aName) {
  var aElement, Type, Value;
  for (var i=0; i < aForm.length; i++) {
     if (aForm.elements[i].name == aName) {
	aElement = aForm.elements[i];
	Type    = aElement.type;
	if (Type =="select-one") {
	  Value = aElement.options[aElement.options.selectedIndex].value; 
	} else {
	  Value = aElement.value;
	}
	return Value;
     }
  }
  return "";
//  return "N/A"
}

//
// Returns an Array of Option elements containing Name/Value parameters
// of the filtered Form Elements
//
// Arguments:
//	aForm	- Pointer to the Form
//	Prefix	- Prefix to filter Form elemets
//
function InputMakeArray(aForm, Prefix) {
  var PreLen	= Prefix.length;
  var InputList	= new Array();
  var objCtrl;
  var objValue;
  var n = 0;
  var id;

  for (var i=0; i < aForm.length; i++) {
    objCtrl = aForm.elements[i];
    if(objCtrl.type.toLowerCase() != "text")	continue;
    if (objCtrl.name.substring(0,PreLen) == Prefix) {
      objValue = trim(objCtrl.value);
      if (objValue.length > 0) {
	id = objCtrl.name.substring(PreLen);
	InputList[n] = new Option(id, objValue);
	n++;
      }
    }
  }
  return InputList;
}

// Creates a DateString (YYYY-MM-DD) from specified
// Form Controls, e.g. Option Boxes.
//
// Arguments:
//	cY, cM, cD  -  Controls containing Year, Month, Day
//
function DateStringFromOptionBox (cY, cM, cD) {
  return cY.options[cY.options.selectedIndex].value + "-"  + cM.options[cM.options.selectedIndex].value + "-" + cD.options[cD.options.selectedIndex].value;
}

// Creates a DateString (YYYY-MM-DD) from a Date variable.
//
// Arguments:
//	cT  -  Date variable
//
function DateStringFromDate (cT) {
  return GetYear(cT) + "-" + (cT.getMonth()+1) + "-" + cT.getDate();
}

// Creates a DateString (YYYY-MM-DD) based on today's date.
// AddDays days are added to today's date.  
//
// Arguments:
//	AddDays  -  # of days to add
//
function DateStringFromToday(AddDays) {
  var Today =  DateStringFromDate(new Date());
  if (AddDays != 0) Today = DateAddDays(Today, AddDays);
  return Today;
}

// Creates a DateString (YYYY-MM-DD) by adding
// AddDays days to the date specified by cDate.  
//
// Arguments:
//	cDate	 -  DateString
//	AddDays  -  # of days to add
//
function DateAddDays(cDate, AddDays) {
  var startDate = new Date(Date.parse(replace(cDate,"-", "/")));
  return  DateStringFromDate(new Date(startDate.getTime() + (AddDays * (24*60*60*1000))));
}

// Creates a DateString (YYYY-MM-DD) by adding
// AddYears years to the date specified by cDate.  
//
// Arguments:
//	cDate	 -  DateString
//	AddYears -  # of years to add
//
function DateAddYears(cDate, AddYears) {
  var lDate	= replace(cDate,"-", "/");
  var startDate = new Date(Date.parse(lDate));
  var newYear	= GetYear(startDate) + AddYears;
  var DateArray	= lDate.split("/");
  var newDate	= newYear + "/" + DateArray[1] + "/" + DateArray[2];
  return  DateStringFromDate(new Date(Date.parse(newDate)));
}

// Calulates the difference beween 2 dates in days
//
// Arguments:
//	sDate	 -  Start DateString
//	eDate	 -  End   DateString
//
function DateDiffInDays(sDate, eDate) {
  var startDate = new Date(Date.parse(replace(sDate,"-", "/")));
  var endDate   = new Date(Date.parse(replace(eDate,"-", "/")));
  return ((endDate - startDate) / (24*60*60*1000));
}

// Sets Date option box entries to the specified date.
//
// Arguments:
//	cY, cM, cD  -  Option box controls
//	cDate       -  DateString containing the date
//
function DateSetOptionBox(cY, cM, cD, cDate, StartYear) {  
  var td = new Date(Date.parse(replace(cDate,"-", "/")));
  cY.options[CheckBoundaries(0, cY.options.length-1, GetYear(td) - _StartYear)].selected = true;
  cM.options[CheckBoundaries(0, cM.options.length-1, td.getMonth())].selected     = true;
  cD.options[CheckBoundaries(0, cD.options.length-1, td.getDate()-1)].selected    = true;
}

// Calulates the week number.
//
// Arguments:
//	cDate       -  DateString containing the date
//
function DateGetWeekNum(cDate) {
 var yearstart, daysdiff, weeknum;
 var indate = new Date(Date.parse(replace(cDate,"-", "/")));

 // get the date for January 1 of the same year
 yearstart = new Date(GetYear(indate), 0, 1);

 // figure out what day of the year it is
 daysdiff = Math.floor((indate - yearstart) / (1000 * 60 * 60 * 24));

 // week number (for weeks starting w/ Monday)
 weeknum = Math.floor((daysdiff + yearstart.getDay()) / 7) + 1;

 return weeknum;
}

// Creates a DateString from Milliseconds
//
// Arguments:
//	ms   -  Date in Milliseconds
//
function DateStringFromMs (ms) {
  var argv      = DateStringFromMs.arguments;
  var argc      = DateStringFromMs.arguments.length;
  var Template  = (argc > 1) ? argv[1] : "YYYY-MM-DD hh:mm:ss";
  var cT;
  if (ms.length == 0  ||  ms < 0)	return "";
  if (ms == 0)	cT = new Date();
  else		cT = new Date(ms);
  var Year	= GetYear(cT);
  var Month	= FormatNumber1(cT.getMonth()+1, 2);
  var Day	= FormatNumber1(cT.getDate(), 2);
  var Hour	= FormatNumber1(cT.getHours(), 2);
  var Minute	= FormatNumber1(cT.getMinutes(), 2);
  var Second	= FormatNumber1(cT.getSeconds(), 2);

  var str	= Template;
  str = replace(str, "YYYY", Year);
  str = replace(str, "MM",   Month);
  str = replace(str, "DD",   Day);
  str = replace(str, "hh",   Hour);
  str = replace(str, "mm",   Minute);
  str = replace(str, "ss",   Second);
  
  return str;
}

// Compensates Netscape Date Problems
//
function GetYear(cT) {
  var year = cT.getYear();
  if (year < 1000)	year += 1900;
  return year;	
}

function CheckBoundaries(nMin, nMax, nVal) {
  if (nVal < nMin)	return nMin;
  if (nVal > nMax)	return nMax;
  return nVal;
}

function DateGerToMysql(DateStr) {
  var aDate	= DateStr.split(".");
  return aDate[2] + "-" + aDate[1] + "-" + aDate[0];
}

function DateMysqlToGer(DateStr) {
  var aDate	= DateStr.split("-");
  return aDate[2] + "." + aDate[1] + "." + aDate[0];
}

function TimeGetMillis(timein) {
  var ttime	= replace(timein, " ", "");
  if (ttime.length == 0)		return -1;
  if (isValidTime(ttime) == false)	return -1;
  var hour	= 0;
  var minute	= 0;
  var second	= 0;
  var millis	= 0;
  var vtime	= ttime.split(":");
  if (vtime.length > 0)	hour	= toNumber(vtime[0].replaceLead("0", ""), 0);
  if (vtime.length > 1)	minute	= toNumber(vtime[1].replaceLead("0", ""), 0);
  if (vtime.length > 2)	{
  	var vsec	= vtime[2].split(".");
  	if (vsec.length > 0)	second	= toNumber(vsec[0].replaceLead("0", ""), 0);
  	if (vsec.length > 1)	millis	= toNumber(vsec[1].replaceLead("0", ""), 0);
  }
  return (hour*3600 + minute*60 + second)*1000 + millis;
}

//
// Class ButtonControl
//
function ButtonControl(Type, Value, Action) {
  this.Type	= Type;
  this.Value	= Value;
  this.Action	= Action;
}

//
// Handles Lookup Form submission.
//
// Arguments:
//	FormName	- Form Name, normally Form_<ID>
//	Action		- Insert, Update, Delete, Clear
//
function CheckLookupForm(FormName, Action) {
  var aForm = eval("document." + FormName);
  Action		= Action.toUpperCase();
  aForm.Action.value	= Action;
  
  if (Action == "CLEAR") {
    aForm.ID.value	= "";
    aForm.Name.value	= "";
    return;
  }
  if (Action == "DELETE") {
    if (confirm("Are you sure you want to delete this entry?") == false)	return;
    aForm.submit();
    return;
  }

  if (isRequired(aForm) == false)	return;
  aForm.submit();
  return;
}

// Checks, if values were changed on a Form
var G__FormIsChanged_Numbers	= new Array();
var G__FormIsChanged_Names	= new Array();

function FormIsChanged(aForm) {
  var changed = false;
  for ( var i = 0; i < aForm.elements.length; i++ ) {
    var field = aForm.elements[i];
    switch ( field.type ) {
      case "radio":
      case "checkbox":
        if ( field.checked != field.defaultChecked ) {
          G__FormIsChanged_Numbers[G__FormIsChanged_Numbers.length] = i;
          G__FormIsChanged_Names[G__FormIsChanged_Names.length] = field.name;
          changed = true;
        }
        break;
      case "text":
//      case "textarea":
        if ( field.value != field.defaultValue ) {
          G__FormIsChanged_Numbers[G__FormIsChanged_Numbers.length] = i;
          G__FormIsChanged_Names[G__FormIsChanged_Names.length] = field.name;
          changed = true;
        }
        break;
      case "select-one":
//      case "select-multiple":
        for( j = 0; j < field.length; j++ ) {
          if ( field.options[j].selected != field.options[j].defaultSelected ) {
            G__FormIsChanged_Numbers[G__FormIsChanged_Numbers.length] = i;
             G__FormIsChanged_Names[G__FormIsChanged_Names.length] = field.name;
            changed = true;
          }
        }
        break;
    }
  }
  return changed;
}

function OpenWindow(exurl) {
  var argv      = OpenWindow.arguments;
  var argc      = OpenWindow.arguments.length;
  var owidth	= (argc > 1) ? new String(argv[1]) : "";
  var oheight	= (argc > 2) ? new String(argv[2]) : "";
  var Target	= (argc > 3) ? escape(argv[3]) : "_blank";
  var options   = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no";
  if (owidth.length > 0)	options += ",width=" + owidth;
  if (oheight.length > 0)	options += ",height=" + oheight;
  var exwin	= window.open(exurl, Target, options);
  exwin.focus();
}

function CopyToParent(TargetList) {
  var argv      = CopyToParent.arguments;
  var argc      = CopyToParent.arguments.length;
  var vTarget	= TargetList.split(",");
  var ctlr;
  for (var i=0; i < vTarget.length; i++) {
    ctlr = eval("window.opener.document." + vTarget[i]);
    if (ctlr != null)	ctlr.value = argv[i+1];
  }
  window.close();
}

function WindowRefeshParent() {
  if (window.opener && !window.opener.closed) {
    window.opener.location.reload();
  }
}

// W3C stands for the W3C standard, implemented in Mozilla (and Netscape 6) and IE5
var isW3C	= (document.getElementById) ? 1 : 0;
var isMinNS4	= (navigator.appName.indexOf("Netscape") >= 0 && parseFloat(navigator.appVersion) >= 4) ? 1 : 0;
var isMinIE4	= (document.all) ? 1 : 0;
var isMinIE5	= (isMinIE4 && navigator.appVersion.indexOf("5.")) >= 0 ? 1 : 0;

function getPageScrollX() {
  if (isMinNS4)
    return(window.pageXOffset);
  if (isMinIE4)
    return(document.body.scrollLeft);
  return(-1);
}

function getPageScrollY() {
  if (isMinNS4)
    return(window.pageYOffset);
  if (isMinIE4)
    return(document.body.scrollTop);
  return(-1);
}

function moveLayerTo(lay, x, y) {
  if (isMinNS4)
    lay.moveTo(x, y);
  if (isMinIE4) {
    lay.style.left = x;
    lay.style.top  = y;
  }
}

function getLayerByName ( name ) {
  var lay = null;
  if ( isW3C ) {
	lay = document.getElementById(name);
  } else if ( isMinNS4 ) {
	lay = document.layers[name];
  } else { // IE4
	lay = document.all[name];
  }
  return lay;
}

function showLayer(name) {
  var lay	= getLayerByName(name);
  if (lay == null)	return;
  if ( isW3C ) {
	lay.style.display = "block";
  } else if (isMinNS4) {
	lay.visibility = "show";
  } else {
	lay.style.visibility = "visible";
  }
}

function hideLayer(name) {
  var lay	= getLayerByName(name);
  if (lay == null)	return;
  if ( isW3C ) {
	lay.style.display = "none";
  } else if (isMinNS4) {
	lay.visibility = "hide";
  } else {
	lay.style.visibility = "hidden";
  }
}

function isVisible(lay) {
  if (isMinNS4 && lay.visibility == "show")		return(true);
  if (isMinIE4 && lay.style.visibility == "visible")	return(true);
  return(false);
}
// -->