// dynamisches laden des dialogs
if (window.initModalDialog==null && window.showModalAlert==null) {
	document.write('<script src="/js_css/system/js_alertpopup.js" type="text/javascript"></script>');
    document.write('<link rel="STYLESHEET" type="text/css" href="/js_css/system/js_alertpopup.css">');
}

// Für den Web-Edit:
function webDesignerStart(feld) {
	var ua = navigator.userAgent;
	var oldEditor = ua==null
						 || (ua.indexOf('MSIE')!=-1 && ua.indexOf('Windows NT 4.')!=-1)	// kein IE unter NT
						 || ua.indexOf('MSIE 5.0')!=-1	// kein alter IE
						 || ua.indexOf('MSIE 4.')!=-1;
	if (oldEditor)
		WEB_EDIT = window.open("/html/system/web_edit.htm?fdNummer="+feld,"WebEdit","width=750,height=500,left=0,top=0,screenX=0,screenY=0,dependent=yes;menubar=no,location=no,scrollbars=no,toolbar=no,status=no,resizable=yes");
	else
		WEB_EDIT = window.open("/js_css/system/htmlarea/htmlarea.htm?fdNummer="+feld,"WebEdit","width=750,height=500,left=0,top=0,screenX=0,screenY=0,dependent=yes;menubar=no,location=no,scrollbars=no,toolbar=no,status=no,resizable=yes");
	WEB_EDIT.focus();
}


function checkFormular(objForm){
   var bFormValid = true;
   
   for(sKeyName in objForm.LIST_ERROR) {
	  objElem = objForm[sKeyName];
      if(typeof(objElem.length) != "undefined" && objElem.ET_TYPE != "ETSelect")
         objElem = objElem[0];
      
		if(typeof(objElem.proofField) == "function")
	      if(!objElem.proofField())
   		   bFormValid = false;
   }
   
   if(!bFormValid) {
      alertLng({  "de_DE": "Das Formular wurde unvollständig oder fehlerhaft ausgefüllt!\n\nBitte überprüfen Sie die ROT bzw. mit \"*\" markierten Felder!",
                  "cs_CZ": "Formulá&#345; chyba!\n\n Prosím vypl&#328;te &#269;erven&#283; ozna&#269;ena pole z \"*\"!",
                  "en_GB": "Formular Error!\n\nPlease fill in the red fields and fields marked with \"*\"!",
                  "en_US": "Formular Error!\n\nPlease fill in the red fields and fields marked with \"*\"!",
                  "fr_FR": "Le formulaire rempli est incomplet ou erroné.\nMerci de remplir les champs en rouges ou indiqués d´une \"*\"!"
               });
      return false; 
   }
	return eventFormOnSubmit(objForm);	
}

// !!!! Helper ... sollte wieder raus !!!!
function showFieldName() {
   window.status = this.name;
}


function setStyleNotNullable(objElem) {
   // #FFFBF7
	if(objElem.ET_VIEW_OBJECT && objElem.ET_VIEW_OBJECT.style) {
	   objElem.ET_VIEW_OBJECT.style.border="1px #A5ACB2 solid";
		objElem.ET_VIEW_OBJECT.style.backgroundColor="#F2F6F9";		
	}
}


function setStyleBaseFromCurrent(objElem) {
	if(objElem.ET_VIEW_OBJECT && objElem.ET_VIEW_OBJECT.style) {
		objElem.ET_BASE_BACKGROUNDCOLOR = objElem.ET_VIEW_OBJECT.style.backgroundColor;
		objElem.ET_BASE_COLOR = objElem.ET_VIEW_OBJECT.style.color;
	}
}

   
function registerEditElement(sFormName,sName,sType,isNullable,isEditable,sSize,sScale,sValid,sViewObjectName,isOnblursubmit){
   // Mapping new System
   // WORKARROUND: Die JS-Datei sollte als eigenstädige version im webmox vorliegen
   if(sType=="WMEDouble" ) sType="ETFloat";
   if(sType=="WMEText"   ) sType="ETText";
   if(sType=="WMEBoolean") sType="ETCheckbox";
   if(sType=="WMEMemo"   ) sType="ETMemo";
   // mapping wegen moxanos-schicht
   if(sType=="ETDouble" ) sType="ETFloat";

   var objForm = getElem("id", sFormName, null);
	if(objForm==null) objForm = document[sFormName];
	var objElem = objForm[sName];
	
   /********************************************************************************
   *    Sonderbehandlung: BOOL-Feld
   ********************************************************************************/
   if(sType=="ETBool") {
		//objElem[0].onclick=function () { onChangeCheckSite(this); };
		//objElem[1].onclick=function () { onChangeCheckSite(this); };
		// Prüf-Handler einhängen
		objElem[0].onclick = onEditElementClick;
		objElem[1].onclick = onEditElementClick;
		objElem[0].proofField = proofFieldBoolean;
		objElem[1].proofField = proofFieldBoolean;
		return;
	} 

   /********************************************************************************
   *    Sonderbehandlung: RADIO-Feld
   ********************************************************************************/
	if(sType=="ETRadio") {
      if (objForm.LIST_ERROR[sName]==null) {
         
         // Object in Prüf/Fehler-Liste registrieren
         objForm.LIST_ERROR[sName] = ""; 
   
         // Parameter für einzelne Radios setzten
   		for(i=0; i < objElem.length;i++){
            oneRadio = objElem[i];

            // DD-Parameter setzten
            oneRadio.ET_FORMNAME  = sFormName;
            oneRadio.ET_NAME      = sName;
            oneRadio.ET_TYPE      = sType;
            oneRadio.ET_NULLABLE  = isNullable;
            oneRadio.ET_EDITABLE  = isEditable;
            oneRadio.ET_SIZE      = sSize;
            oneRadio.ET_SCALE     = sScale;
            oneRadio.ET_VALID     = sValid;
           
            // Methoden einhängen
   			oneRadio.onclick = onEditElementClick;
   			oneRadio.proofField = proofFieldRadio;
            oneRadio.ET_setStyleOK   = setStyleOK;
            oneRadio.ET_setStyleERR  = setStyleERR;
   
            // Objekt für die Statusanzeige einhängen (default: das eigene Object)
            oneRadio.ET_VIEW_OBJECT=oneRadio; // Default
            if(sViewObjectName!=null && sViewObjectName!="") {
               var objView = getElem("id", (sViewObjectName+i), null);
               if(objView != null) {
               	oneRadio.ET_VIEW_OBJECT = objView;
               	objView.ET_MASTER_OBJECT = oneRadio;
               } else {
                  objView = getElem("id", sViewObjectName, null);
                  if(objView != null) {
                  	oneRadio.ET_VIEW_OBJECT = document[sFormName][sViewObjectName];
                  	document[sFormName][sViewObjectName].ET_MASTER_OBJECT = oneRadio;
                  }
               }
            }
         
            // Styles setzen/merken
         	if(!oneRadio.ET_NULLABLE) { setStyleNotNullable(oneRadio); } // Style für Not-Nullable setzen
            setStyleBaseFromCurrent(oneRadio);      // Style merken
   		}
      }      
      
		return;
	}

   /********************************************************************************
   *    Standard-Feld  (z.B Text-Feld)
   ********************************************************************************/

   // DD-Parameter setzten
	objElem.ET_FORMNAME     = sFormName;
	objElem.ET_NAME         = sName;
	objElem.ET_TYPE         = sType;
	objElem.ET_NULLABLE     = isNullable;
	objElem.ET_EDITABLE     = isEditable;
	objElem.ET_SIZE         = sSize;
	objElem.ET_SCALE        = sScale;
	objElem.ET_VALID        = sValid;
	objElem.ET_ONBLURSUBMIT = isOnblursubmit;

   // Object in Prüf/Fehler-Liste registrieren
   objForm.LIST_ERROR[objElem.ET_NAME] = "";
   
   // Methoden einhängen
   objElem.ET_setStyleOK   = setStyleOK;           // Set-StyleOK einhängen
   objElem.ET_setStyleERR  = setStyleERR;          // Set-StyleERR einhängen
	objElem.onkeyup         = onEditElementKeyUp;   // Prüf-Handler einhängen
	objElem.onchange        = onEditElementChange;  // Prüf-Handler einhängen
	objElem.proofField      = proofField;           // Prüf-Funktion einhängen
	// ACHTUNG: der Event 'objElem.onmouseover' und 'objElem.onblur' wird bereits verwendet (HCS fragen)
	//objElem.onmouseover     = showFieldName;        // Feld-Name im Window-Status anzeigen (Debug, kann wieder entfernt werden)
	objElem.onblur          = eventOnBlur;          // hier wird der automatische onblur-event eingebunde

   // Objekt für die Statusanzeige einhängen (default: das eigene Object)
   objElem.ET_VIEW_OBJECT=objElem; // Default
   if(sViewObjectName!=null && sViewObjectName!="") {
      var objView = getElem("id", sViewObjectName, null);
      if(objView != null) {
      	objElem.ET_VIEW_OBJECT = objView;
      	objView.ET_MASTER_OBJECT = objElem;
      }
   }
  
   // Styles setzen/merken
	if(!objElem.ET_NULLABLE) { setStyleNotNullable(objElem); }  // Style für Not-Nullable setzen
   setStyleBaseFromCurrent(objElem);                           // Style merken
   
   if(window.afterRegisterEditElement!=null){
		afterRegisterEditElement(objElem);
	}

   /********************************************************************************
   *    Extra-Behandlung: PASSWORT-Feld
   ********************************************************************************/
   // zweites Passwort-Feld registrieren und mit erstem verknüpfen 
	if(sType == "ETPassword") {
		var objElem2 = getElem("id", sName+"2", null);
		if(objElem2==null) objElem2 = objForm[sName+"2"];

      // beide Passwort-Felder miteinander verknüpfen   
      objElem.ET_PASSWORD2    = objElem2;
      objElem2.ET_PASSWORD1   = objElem;

      // DD-Parameter setzten
      objElem2.ET_FORMNAME    = sFormName;
      objElem2.ET_NAME        = sName+"2";
      objElem2.ET_TYPE        = sType+"2";
      objElem2.ET_NULLABLE    = isNullable;
      objElem2.ET_EDITABLE    = isEditable;
      objElem2.ET_SIZE        = sSize;
      objElem2.ET_SCALE       = sScale;
      objElem2.ET_VALID       = sValid;

      // Methoden einhängen
      objElem2.ET_setStyleOK  = setStyleOK;        // Set-StyleOK einhängen
      objElem2.ET_setStyleERR = setStyleERR;       // Set-StyleERR einhängen
		objElem2.onkeyup        = onEditElementKeyUp;// Prüf-Handler einhängen
		objElem2.onclick        = onEditElementClick;// Prüf-Handler einhängen
		objElem2.proofField     = proofField;        // Prüf-Funktion einhängen
      objElem2.onmouseover    = showFieldName;     // Feld-Name im Window-Status anzeigen (Debug, kann wieder entfernt werden)

      // Objekt für die Statusanzeige einhängen (default: das eigene Object)
      objElem2.ET_VIEW_OBJECT = objElem2; // Default
      if(sViewObjectName!=null && sViewObjectName!="") {
         var objView = getElem("id", (sViewObjectName+"2"), null);
         if(objView != null) {
         	objElem2.ET_VIEW_OBJECT = objView;
         	objView.ET_MASTER_OBJECT = objElem2;
         }
      }      
   
      // Styles setzen/merken
		if(!objElem2.ET_NULLABLE){ setStyleNotNullable(objElem2); } // Style für Not-Nullable setzen
      setStyleBaseFromCurrent(objElem2);  // Style merken
	}
	
}


function onEditElementKeyUp() {
   if(this.ET_TYPE=="ETMemo") {
		tcSetMemoLength(this);
	}
	// prüfe ob der event noch von anderer stelle bearbeitet wird
	var sName = this.form.name +"_"+this.name.replace('.','_')+"OnKeyUp";
   if(window[sName])
	   eval(sName+"(document['"+this.form.name+"']['"+this.name+"'])");
	onChangeCheckSite(this);
	return this.proofField();
}

function onEditElementClick() {
	onChangeCheckSite(this);
   
   // prüfe ob der event noch von anderer stelle bearbeitet wird
	var sName = this.form.name +"_"+this.name.replace('.','_')+"OnClick";
   if(window[sName])
	   eval(sName+"(document['"+this.form.name+"']['"+this.name+"'])");
   
	return this.proofField();
}

function onEditElementChange() {
   if(this.ET_TYPE=="ETMemo") {
		tcSetMemoLength(this);
	}
	
	// prüfe ob der event noch von anderer stelle bearbeitet wird
	var sName = this.form.name +"_"+ this.name.replace('.','_').replace(/:/g,'_') +"OnChange";
   
   if(window[sName])
	   eval(sName+"(document['"+this.form.name+"']['"+this.name+"'])");
	
   doOnBlurSubmit(this);
	onChangeCheckSite(this);
	return this.proofField();
}


function doOnBlurSubmit(objElement) {
   if(typeof(objElement.ET_ONBLURSUBMIT) != "undefined" && objElement.ET_ONBLURSUBMIT)
      if(objElement.form.onsubmit())
         objElement.form.submit();
}

function setCheckBoxValueToHidden(objElement, sName, sValueOn, sValueOff){
	if(objElement.checked)
		objElement.form[sName].value = sValueOn;
	else 
		objElement.form[sName].value = sValueOff;
		
	onChangeCheckSite(objElement.form[sName]);
   
   // event weiterleite
   var sNameFunction = objElement.form.name +"_"+sName.replace('.','_')+"OnClick";
   
	if(window[sNameFunction])
		eval(sNameFunction+"(document['"+objElement.form.name+"']['"+sName+"'])");
   
	return objElement.form[sName].proofField();
}




/**
 * proofFieldRadio
 */
function proofFieldBoolean(){
   return true;
}	

/**
 * proofFieldRadio
 */
function proofFieldRadio(){
   var objElem       = this;
   var objParent     = this.form[this.ET_NAME];
	var bValidOK      = false;
	var sMessage      = "Eine der Optionen muss ausgewählt werden!";
	
   // nullable prüfen
   if(this.ET_NULLABLE)
   return true;
   
	// Nullableoption
   for(i=0; i < objParent.length;i++)
      if(objParent[i].checked)
         bValidOK = true
   
	if(!bValidOK) {
		this.form.LIST_ERROR[this.ET_NAME] = sMessage; // ERR in Liste eintragen 
      // ERR-Style setzen
      for(i=0; i<objParent.length; i++)
         oneRadio = objParent[i].ET_setStyleERR();
   }
	else { 
		this.form.LIST_ERROR[this.ET_NAME] = "";     // OK in Liste eintragen 
      // OK-Style setzen
      for(i=0; i<objParent.length; i++)
         oneRadio = objParent[i].ET_setStyleOK();
   }
	return bValidOK;
}


/**
 * proofField
 */
function proofField(){
	var sFieldValue   = TrimString(this.value);
	var bValidOK      = true;
   var bNullableOK   = true;
	var sMessage      = "";
   
	bNullableOK = bValidOK = tcCheckNullable(sFieldValue,this.ET_NULLABLE);
   if(!bValidOK) sMessage="Dieses Feld muss ausgefüllt werden!";
   else {
      if(this.ET_TYPE=="ETCheckbox" && !this.ET_NULLABLE){
   		bNullableOK = bValidOK = (sFieldValue!="false" && tcCheckNullable(sFieldValue,this.ET_NULLABLE));
   		if(!bValidOK) sMessage="Dieses Feld muss angeklickt werden!";
      }
      if(this.ET_TYPE=="ETInt"){
   		bValidOK = bValidOK && tcCheckScale(sFieldValue, 0, 0);
   		if(!bValidOK) sMessage="Bitte eine gültige Ganzzahl eingeben!";
   	}
   	if(this.ET_TYPE=="ETFloat"){
			// umwandlung von komma zu punkt
			if(sFieldValue.indexOf(',')!=-1) {
				sFieldValue = sFieldValue.replace(',', '.');
				this.value=sFieldValue;
			}
   		bValidOK = bValidOK && tcCheckScale(sFieldValue, 0, this.ET_SCALE);
   		if(!bValidOK) sMessage="Bitte eine gültige Zahl mit maximal "+this.ET_SCALE+" Nachkommastellen eingeben!";
   	}
   
   	if(this.ET_TYPE=="ETPassword"){
   		bValidOK = bValidOK && tcCheckMinSize(sFieldValue,3);
     		if(!bValidOK) sMessage="Bitte geben Sie mindestens 3 Zeichen ein!";
         else {
      		bValidOK = bValidOK && tcCheckPasswordSyntax(sFieldValue);
      		if(!bValidOK) sMessage="Bitte geben Sie nur Klein- & Großbuchstaben, Zahlen und Sonderzeichen(!#$) ein!";
         }
     		this.ET_PASSWORD2.proofField();
   	}
      // Nur ein Beispiel wie des Validation-Feld genutzt werden könnte
      if(this.ET_VALID !=null && this.ET_VALID.indexOf("[EMAIL]") == 0) {
         bValidOK = bValidOK && tcCheckEmailSyntax(sFieldValue);
   		if(!bValidOK) sMessage=this.ET_VALID.slice(this.ET_VALID.indexOf(":")+1);
      }
   }

   // Prüfung des 2. Passwort-Feldes auch bei Nullable-Fehler
   if(this.ET_TYPE=="ETPassword2"){
      bValidOK = true; // unterdrücken des Nullable-Fehlers, damit auch bei leerem Feld die Wiederholungs-Fehlermeldung kommt
		bValidOK = bValidOK && tcCheckPasswordSyntax(sFieldValue);
		if(!bValidOK) 
         sMessage="Bitte geben Sie nur Klein- & Großbuchstaben, Zahlen und Sonderzeichen(!#$) ein!";
      else {
   		bValidOK = bValidOK && sFieldValue == this.ET_PASSWORD1.value;
   		
   		if(!bValidOK) sMessage="Bitte wiederholen Sie des Passwort exakt!";
      }
  	}

   // Element, abhängig vom Fehlerstatus, in Fehler-Liste eintragen und Aussehen setzten
	if(bValidOK) {
		this.form.LIST_ERROR[this.ET_NAME] = ""; // OK in Liste eintragen
      this.ET_setStyleOK();                    // OK-Style setzen
		this.title = "";                         // Title löschen
      return true;
	} else {
      // Nullable-Fehler unterdrücken den Submit nur im DIRECT-MODE
      if(bNullableOK || typeof(this.form.IS_DIRECT)=="undefined" || this.form.IS_DIRECT)
 		   this.form.LIST_ERROR[this.ET_NAME] = sMessage; // ERR in Liste eintragen
      else
 		   this.form.LIST_ERROR[this.ET_NAME] = "";       // OK in Liste eintragen

      this.ET_setStyleERR(); // ERR-Style setzten
  		this.title = sMessage; // Title auf Fehlermeldung setzten
	}
	
	return false;
}

function setStyleOK() {
	this.ET_VIEW_OBJECT.style.backgroundColor = this.ET_BASE_BACKGROUNDCOLOR;
	this.ET_VIEW_OBJECT.style.color           = this.ET_BASE_COLOR;
}
function setStyleERR() {
   this.ET_VIEW_OBJECT.style.color           = "black";
   this.ET_VIEW_OBJECT.style.backgroundColor = "#FFD2D2";
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////  EVENTS   //////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function eventOnBlur(){
	var sName = this.form.name +"_"+this.name.replace('.','_')+"FocusLost";
	if(window[sName])
		eval(sName+"(document['"+this.form.name+"']['"+this.name+"'])");
}

function eventFormOnSubmit(objForm){
   var sName = objForm.name +"OnSubmit";
	if(window[sName])
		return eval(sName+"(document['"+objForm.name+"'])");
	else
	   return true;
}


// --------------------------------------------------------------------------------
// -----------   Type-Checker                                            ----------
// --------------------------------------------------------------------------------

// prüft auf die Min-Laenge
function tcCheckMinSize(sValue, nSize) {
   if(sValue=="") return true; // Nullable-Check darf nicht von den Syntax-Checkern gemacht werden
  	return sValue.length>=nSize;
}
// prüft auf die Max-Laenge
function tcCheckMaxSize(sValue, nSize) {
  	return sValue.length<=nSize;
}
// prüft auf Nullable
function tcCheckNullable(sValue, isNullable) {
	if(isNullable) return true;
	else return sValue!=null && sValue.length!=0;
}

// prüft auf Nummer (signed/unsigned int/float)
function tcCheckNumber(sValue) {
  var regx = /^[\-\+]{0,1}\d*[\.]{0,1}\d*$/;
  return regx.test(sValue);
}

// prüft Nachkommastellen (wenn scaleMin=0 muss kein '.' vorhanden sein)
function tcCheckScale(sValue, nScaleMin, nScaleMax) {
  var regx = /[\.](\d*)$/;
  if(tcCheckNumber(sValue)) {
     if(regx.exec(sValue)) {
        if(nScaleMax == 0)
           return false;
        if(RegExp.$1.length >= nScaleMin && RegExp.$1.length <= nScaleMax)
           return true;
     } else {
        if(nScaleMin==0)
           return true;
     }
  }
  return false;
}

// prüft Min und Max Wert (wenn für nRangeMin/nRangeMax keine Prüfung erwünscht -> 'null'-Wert angeben)
function tcCheckRange(sValue, nRangeMin, nRangeMax) {
  if(!tcCheckNumber(sValue)) return false;
  nValue = sValue-0;
  if(nRangeMin != null && sValue < nRangeMin) return false;
  if(nRangeMax != null && sValue > nRangeMax) return false;
  return true;
}

// Emailcheck: gibt true oder false zurueck
function tcCheckEmailSyntax(email) {
   var proto  = "(mailto:)?";
   var usr    = "([a-zA-Z0-9_][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
   var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
   var regex  = "^" + proto + "?" + usr + "\@" + domain + "$";
   var rgx    = new RegExp(regex);
   if(email==null || email=="") return true;
   return rgx.exec(email);
}

// Passwort: Syntax-Check (prüft nur auf Zeichen, noch nicht auf Komplexität)
function tcCheckPasswordSyntax(sValue) {
   var regx = new RegExp("^[a-zA-Z0-9!#\$]*$");
   if(regx.exec(sValue)==null)
   	return true;
   return regx.exec(sValue);
}

// Prüft die Länge 
function tcSetMemoLength(objMemo) {
	var nLength = objMemo.ET_SIZE;
	if(nLength!=0)
		if(objMemo.value.length>nLength) 
			objMemo.value = objMemo.value.substring(0,nLength);
}



// --------------------------------------------------------------------------------
// -----------   Helper                                                  ----------
// --------------------------------------------------------------------------------


//--- Helper für Mehrsprachigkeit -------------------------------

// gibt sprachabhängigen Alert aus
// Parameter: assoziatives Array (z.B.:  var msg = {"de_DE": "deutscher Text", "en_EN": "english Text"} )
function alertLng(sMessages) {
	initModalDialog();
	
	showModalAlert(getLngMessage(sMessages),300,100);
   //alert(getLngMessage(sMessages));
}

// gibt sprachabhängige Nachricht zurück
// Parameter: assoziatives Array (z.B.:  var msg = {"de_DE": "deutscher Text", "en_EN": "english Text"} )
function getLngMessage(sMessages) {
   var locale = "en_EN"; // English als Default
   
   // Globales Locale auslesen, falls vorhanden
   if(typeof(AC_LOCALE) != "undefined")
     locale = AC_LOCALE;

   if(sMessages[locale])
      // gewünschte Sprache angegeben -> Message zurückgeben;
      return sMessages[locale];
   
   // gewünschte Sprache nicht angegeben -> Fallback1: English(en_EN)
   if(sMessages["en_EN"])
      return sMessages["en_EN"];

   // Fallback English(en_EN) nicht angegeben -> Fallback2: English(en_GB)
   if(sMessages["en_GB"])
      return sMessages["en_GB"];

   // Fallback English(en_GB) nicht angegeben -> Fallback3: English(de_DE)
   if(sMessages["de_DE"])
      return sMessages["de_DE"];

   // KEINE passende Sprache angegeben -> erste Sprache zurückgeben
   // (Achtung: Browser-Abhängig! -> nicht alle Browser geben den als ersten eingetragenen Wert auch als erstes zurück)
   for(var firstLocale in sMessages)
      break;
      
   return sMessages[firstLocale];
}


//--- Helper für String-Verarbeitung -------------------------------

function TrimString(sInString) {
  sInString = sInString.replace( /^\s+/g, "" );// strip leading
  return sInString.replace( /\s+$/g, "" );// strip trailing
}



