//##############################################################################
//# WHITE JAVASCRIPT LIBRARY
//##############################################################################

//### GLOBAL VARIABLES

if ('undefined' == typeof WHITE_PluginHooks)
{
  var WHITE_PluginHooks = new Object();
}

//### HOOK FUNCTIONS

function WHITE_RegisterHook(sHookName,mFunction) {
  if ('object' != typeof WHITE_PluginHooks)
  {
    WHITE_PluginHooks = new Object();
  }
  if ('array' != typeof WHITE_PluginHooks[sHookName])
  {
    WHITE_PluginHooks[sHookName] = new Array();
  }
  WHITE_PluginHooks[sHookName].push(mFunction);
}

function WHITE_ExecuteHooks(sHookName,aArgs) {
  var aResult = new Object();
  if ('string' == typeof sHookName)
  {
    if ('undefined' == typeof aArgs)
    {
      aArgs = new Array();
    }
    if ( 'object' == typeof WHITE_PluginHooks
         && 'object' == typeof WHITE_PluginHooks[sHookName] ) // must be array object
    {
      var aFunctions = WHITE_PluginHooks[sHookName];
      for (var iFu=0;iFu<aFunctions.length;iFu++)
      {
        var fFunction = aFunctions[iFu];
        if ('string' == typeof fFunction)
        {
          fFunction = document[fFunction]; // not tested
        }
        if ( fFunction
             && 'function' == typeof(fFunction) )
        {
          aFuncResult = fFunction(aArgs);
          if ('object' == typeof aFuncResult)
          {
            for (var sResultKey in aFuncResult)
            {
              aResult[sResultKey] = aFuncResult[sResultKey];
            }
          }
        }
      }
    }
  }
  return aResult;
}

//### STRING FUNCTIONS

function WHITE_Trim(sString) {
  sResult = sString;
  if ('string' == typeof sString)
  {
    var sOutput = sString;
    sOutput = sOutput.replace(/^\s+/g, '');
    sOutput = sOutput.replace(/\s+$/g, '');
    sResult = sOutput;
  }
  return sResult;
}

//### EVENT FUNCTIONS

function WHITE_AddLoadEvent(fAddFunction) {
  // http://simonwillison.net/2004/May/26/addLoadEvent/
  var fOldOnload = window.onload;
  if ('function' != typeof window.onload)
  {
    window.onload = fAddFunction;
  }
  else
  {
    window.onload = function()
    {
      if (fOldOnload)
      {
        fOldOnload();
      }
      fAddFunction();
    }
  }
}

function WHITE_AddEvent( obj, type, fAddFunction ) {
  // http://ejohn.org/projects/flexible-javascript-events/
  if ( obj.attachEvent )
  {
    obj['e'+type+fAddFunction] = fAddFunction;
    obj[type+fAddFunction] = function()
    {
      return obj['e'+type+fAddFunction]( window.event );
    }
    obj.attachEvent( 'on'+type, obj[type+fAddFunction] );
  }
  else
  {
    obj.addEventListener( type, fAddFunction, false );
  }
}

function WHITE_RemoveEvent( obj, type, fn ) {
  // http://ejohn.org/projects/flexible-javascript-events/
  if ( obj.detachEvent )
  {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  }
  else
  {
    obj.removeEventListener( type, fn, false );
  }
}

function WHITE_AddEventToClass(oParent,sClassName,sEventName,oFunction) {
  var aElements = WHITE_GetElementsByClass(oParent,sClassName);
  for (var iEl=0;iEl<aElements.length;iEl++)
  {
    if (aElements[iEl])
    {
      WHITE_AddEvent(aElements[iEl],sEventName,oFunction);
    }
  }
}

function WHITE_AddEventToElement(mElement,sEventName,oFunction) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement)
  {
    WHITE_AddEvent(oElement,sEventName,oFunction);
  }
}

//### ELEMENT FUNCTIONS

function WHITE_GetElementFlex(mElement,mForm) {
  //###
  //### You can pass the following:
  //###  - an element object
  //###  - a string with the id of an object
  //###  - a fieldname + the name of the form containing it
  //###  - a fieldname + the form object containing it
  //###
  //### This function returns one of the following:
  //###  -      if possible: the object from the parameter mElement
  //###  - else if possible: an array of form objects with name==mElement
  //###  - else if possible: a single form object with name==mElement
  //###  - else if possible: a object with id==mElement
  //###  -             else: false
  //###
  var oResult = false;
  if ('undefined' == typeof mElement)
  {
    oResult = false;
  }
  if ('object' == typeof mElement)
  {
    oResult = mElement;
  }
  else if ('string' == typeof mElement && '' != mElement)
  {
    if (mForm && 'string' == typeof mForm)
    {
      mForm = document.getElementById(mForm);
    }
    if ('object' == typeof mForm && mForm.elements[mElement])
    {
      oResult = mForm.elements[mElement];
    }
    else
    {
      oGetEl = document.getElementById(mElement);
      if (oGetEl)
      {
        oResult = oGetEl;
      }
    }
  }
  return oResult;
}

function WHITE_GetElementsByClass(mParent,sClassName) {
  var aResult = new Array();
  var oParent = WHITE_GetElementFlex(mParent);
  if (oParent && sClassName)
  {
    var aElements = oParent.getElementsByTagName('*');
    var oRe = new RegExp('(^|\\s)'+sClassName+'(\\s|$)');
    for (var iEl=0;iEl<aElements.length;iEl++)
    {
      if(oRe.test(aElements[iEl].className))
      {
        aResult.push(aElements[iEl]);
      }
    }
  }
  return aResult;
}

function WHITE_GetElementsByTagName(mParent,sTagName) {
  var aResult = new Array();
  var oParent = WHITE_GetElementFlex(mParent);
  if (oParent && sTagName)
  {
    aResult = oParent.getElementsByTagName(sTagName);
  }
  return aResult;
}

function WHITE_ReplaceElementContent(mElement, sInnerHTML) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (!sInnerHTML)
  {
    sInnerHTML = '';
  }
  if (oElement)
  {
    oElement.innerHTML = sInnerHTML;
  }
}

function WHITE_DisableSelect(mElement) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement)
  {
    oElement.onselectstart = function() {
        return false;
    };
    oElement.unselectable = "on";
    oElement.style.MozUserSelect = "none";
  }
}

function WHITE_InsertBeforeElement(mElement,sHtml) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement)
  {
    oNewSpan = document.createElement("span");
    oNewSpan.innerHTML = sHtml;
    var oParentNode = oElement.parentNode;
    if (oParentNode)
    {
      oParentNode.insertBefore(oNewSpan,oElement);
    }
  }
}

function WHITE_InsertAfterElement(mElement,sHtml) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement)
  {
    oNewSpan = document.createElement("span");
    oNewSpan.innerHTML = sHtml;
    var oParentNode = oElement.parentNode;
    var oNextNode = oElement.nextSibling;
    if (oParentNode && oNextNode)
    {
      oParentNode.insertBefore(oNewSpan,oNextNode);
    }
  }
}

//### CLASSNAME FUNCTIONS

function WHITE_AddClassName(mElement, sClassName) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement && sClassName)
  {
    if (!WHITE_HasClassName(oElement,sClassName))
    {
      oElement.className += (oElement.className ? ' ' : '') + sClassName;
    }
  }
}

function WHITE_RemoveClassName(mElement, sClassName) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement && sClassName)
  {
    var oClassReg = new RegExp("(^|\\s+)" + sClassName + "(\\s+|$)")
    oElement.className = WHITE_Trim(oElement.className.replace(oClassReg, ' '));
  }
}

function WHITE_ToggleClassName(mElement, sClassName) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement && sClassName)
  {
    if (WHITE_HasClassName(oElement,sClassName))
    {
      WHITE_RemoveClassName(oElement, sClassName)
    }
    else
    {
      WHITE_AddClassName(oElement, sClassName);
    }
  }
}

function WHITE_HasClassName(mElement, sClassName  ) {
  var bResult = false;
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement && sClassName)
  {
    var oClassReg = new RegExp("(^|\\s)" + sClassName + "(\\s|$)");
    var sObjClassName = oElement.className;
    if (sObjClassName.length > 0)
    {
      if (sObjClassName == sClassName || oClassReg.test(sObjClassName))
      {
        bResult = true;
      }
    }
 }
  return bResult;
}

function WHITE_DisableSelectClass(oParent,sClassName) {
  aElements = WHITE_GetElementsByClass(oParent,sClassName);
  for (var iEl=0;iEl<aElements.length;iEl++)
  {
    WHITE_DisableSelect(aElements[iEl]);
  }
}

//#### FORM FUNCTIONS

function WHITE_IsFormFieldSet(mField,oForm) {
  var bResult = false;
  var mFieldValue = WHITE_GetFormFieldValue(mField,oForm);
  var mFieldValue = WHITE_Trim(mFieldValue);
  if (mFieldValue)
  {
    bResult = true;
  }
  return bResult;
}

function WHITE_GetFormFieldValue(mField,oForm) {
  var oElement = WHITE_GetFormField(mField,oForm);
  var mResult = false;
  if (oElement)
  {
    if ('undefined' != typeof oElement[0] && 'radio' == oElement[0].type) // array of radio buttons
    {
      for (var iNr=0; iNr < oElement.length; iNr++)
      {
        if (oElement[iNr].checked)
        {
          mResult = true;
        }
      }
    }
    else if ('select-one' == oElement.type)  // drop-down select
    {
      if (oElement.options[oElement.selectedIndex])
      {
        if (oElement.options[oElement.selectedIndex].value)
        {
          // The <option> tag needs to containt "value=..." to make this work.
          mResult = oElement.options[oElement.selectedIndex].value;
        }
        else
        {
          mResult = oElement.options[oElement.selectedIndex].innerText;
        }
      }
    }
    else if ('checkbox' == oElement.type)
    {
      mResult = oElement.checked;
    }
    else if ('radio' == oElement.type)
    {
      mResult = oElement.checked;
    }
    else // default check value, works for type = text, file, textarea, ...
    {
      if ( null != oElement.value
           && 0 < oElement.value.length )
      {
        mResult = oElement.value;
      }
    }
  }
  return mResult;
}

function WHITE_GetFormField(mField,oForm) {
  var oElement = WHITE_GetElementFlex(mField,oForm);
  if (oElement && !oForm && oElement.name && oElement.form)
  {
    oFormEl = WHITE_GetElementFlex(oElement.name,oElement.form);
    if (oFormEl)
    {
      oElement = oFormEl;
    }
  }
  return oElement;
}

//### FOLD FUNCTIONS

//### do on load:   WHITE_AddEventToClass(document,'foldhead','click',WHITE_FoldHeadClickEvent);

function WHITE_FoldHeadClickEvent(oEvent) {
  var oBlock = WHITE_GetElementFlex(this.id+'_foldout');
  if (oBlock)
  {
    WHITE_ToggleClassName(oBlock, 'hidden');
    WHITE_FoldHeadUpdate(this);
  }
}

function WHITE_FoldHeadUpdate(mHeadElement) {
  var oHeadElement = WHITE_GetElementFlex(mHeadElement);
  var oBlock = WHITE_GetElementFlex(oHeadElement.id+'_foldout');
  if (oHeadElement && oBlock)
  {
    var oElementFoldout = WHITE_GetElementFlex(oHeadElement.id+'_foldout');
    var bIsOpen = !WHITE_HasClassName(oElementFoldout, 'hidden');

    var aImages = WHITE_GetElementsByTagName(oHeadElement,'img');
    for (var iNr=0; iNr < aImages.length; iNr++)
    {
      if (aImages[iNr].src)
      {
        var sImgSrc = aImages[iNr].src;
        if (bIsOpen)
        {
          sImgSrc = sImgSrc.replace(/close/, 'open');
        }
        else
        {
          sImgSrc = sImgSrc.replace(/open/, 'close');
        }
        aImages[iNr].src = sImgSrc;
      }
    }

    var aHeadInputs = WHITE_GetElementsByTagName(oHeadElement,'input');
    for (var iIn=0;iIn<aHeadInputs.length;iIn++)
    {
      if ('checkbox' == aHeadInputs[iIn].type)
      {
        aHeadInputs[iIn].checked = bIsOpen;
      }
    }

    var aBlockInputs = WHITE_GetElementsByTagName(oBlock,'input');
    for (var iNr=0; iNr < aBlockInputs.length; iNr++)
    {
      if (bIsOpen)
      {
        if (WHITE_HasClassName(aBlockInputs[iNr],'required_dis'))
        {
          WHITE_RemoveClassName(aBlockInputs[iNr],'required_dis');
          WHITE_AddClassName(aBlockInputs[iNr],'required');
        }
      }
      else // not open
      {
        if (WHITE_HasClassName(aBlockInputs[iNr],'required'))
        {
          WHITE_RemoveClassName(aBlockInputs[iNr],'required');
          WHITE_AddClassName(aBlockInputs[iNr],'required_dis');
        }
      }
    }
    var oHookParam = new Object();
    oHookParam['oHeadElement'] = oHeadElement;
    oHookParam['oBlockElement'] = oBlock;
    oHookParam['bIsOpen'] = bIsOpen;
    oHookResult = WHITE_ExecuteHooks('WHITE_FoldHeadAfterUpdate',oHookParam);
  }
}

function WHITE_FoldOut(mHeadElement) {
  var oHeadElement = WHITE_GetElementFlex(mHeadElement);
  if (oHeadElement)
  {
    var oBlock = WHITE_GetElementFlex(oHeadElement.id+'_foldout');
    if (WHITE_HasClassName(oBlock,'hidden'))
    {
      WHITE_RemoveClassName(oBlock, 'hidden');
      WHITE_FoldHeadUpdate(oHeadElement);
    }
  }
}

function WHITE_FoldIn(mHeadElement) {
  var oHeadElement = WHITE_GetElementFlex(mHeadElement);
  if (oHeadElement)
  {
    var oBlock = WHITE_GetElementFlex(oHeadElement.id+'_foldout');
    if (!WHITE_HasClassName(oBlock,'hidden'))
    {
      WHITE_AddClassName(oBlock, 'hidden');
      WHITE_FoldHeadUpdate(oHeadElement);
    }
  }
}

function WHITE_InitializeFolds() {
  var aFoldHeads = WHITE_GetElementsByClass(document,'foldhead');
  for ( var iEl=0 ; iEl<aFoldHeads.length ; iEl++ )
  {
    //### For each foldhead
    oHeadElement = aFoldHeads[iEl];
    if (oHeadElement)
    {
      var aHeadInputs = WHITE_GetElementsByTagName(oHeadElement,'input');
      //### If it has inputs
      if (0 < aHeadInputs.length)
      {
        bHeadIsChecked = false;
        bCheckBoxFound = false;
        //### For each input
        for (var iIn=0;iIn<aHeadInputs.length;iIn++)
        {
          //### If it is a checkbox
          if ( 'checkbox' == aHeadInputs[iIn].type )
          {
            bCheckBoxFound = true;
            if ( aHeadInputs[iIn].getAttribute('checked') )
            {
              bHeadIsChecked = true;
            }
          }
        }
        if (bCheckBoxFound)
        {
          if (bHeadIsChecked)
          {
            WHITE_FoldOut(oHeadElement);
          }
          else
          {
            WHITE_FoldIn(oHeadElement);
          }
        }
      }
    }
  }
}

//##############################################################################
//# WHITEFORM FUNCTIONS
//##############################################################################

function WhiteForm_FieldFocusEvent(oEvent) {
  WHITE_AddClassName(this,'focus');
  WHITE_RemoveClassName(this.id+'_help','hidden');
}

function WhiteForm_FieldUpdateEvent(oEvent) {
  WhiteForm_FieldUpdate(this);
}

function WhiteForm_FieldUpdate(mElement) {
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement)
  {
    var bFieldSet = WHITE_IsFormFieldSet(oElement);
    var sFieldPrefix = oElement.id;
    if (1 < sFieldPrefix.search('-')) // radio buttons have id="name-value"
    {
      sFieldPrefix = sFieldPrefix.substr(0,sFieldPrefix.search('-'));
    }
    var oErrorEl = WHITE_GetElementFlex(sFieldPrefix + '_error');
    var oHelpEl = WHITE_GetElementFlex(sFieldPrefix + '_help');
    var sErrorMsg = false;
    WHITE_RemoveClassName(oElement,'focus');
    WHITE_AddClassName(oHelpEl,'hidden');

    if (WHITE_HasClassName(oElement,'required')
         && !bFieldSet )                     // required and not set, show error
    {
      if ('function' == typeof WhiteForm_GetTextFieldRequired)
      {
        sErrorMsg = WhiteForm_GetTextFieldRequired(sFieldPrefix);
      }
      else
      {
        sErrorMsg = 'Required field.';
      }
    }
    if (!sErrorMsg && WHITE_HasClassName(oElement,'email'))
    {
      sFieldValue = WHITE_GetFormFieldValue(oElement);
      var oEmailReg = new RegExp('^[^\\@]+\\@([a-zA-Z0-9\-]+\\.)+[a-zA-Z0-9]{2,6}$');
      if (!oEmailReg.test(sFieldValue))
      {
        if ('function' == typeof WhiteForm_GetTextFieldRequired)
        {
          sErrorMsg = WhiteForm_GetTextInvalidEmail(sFieldPrefix);
        }
        else
        {
          sErrorMsg = 'Invalid email address.';
        }
      }
    }

    if (sErrorMsg)
    {
      if (!oErrorEl)
      {
        WHITE_InsertAfterElement(oElement,'<div class="fielderror" id="'+sFieldPrefix+'_error">'+sErrorMsg+'</div>');
      }
      WHITE_AddClassName(oElement,'error');
      WHITE_RemoveClassName(oErrorEl,'hidden');
      WHITE_ReplaceElementContent(oErrorEl,sErrorMsg);
      WHITE_RemoveClassName(oErrorEl,'hidden');
      WHITE_RemoveClassName(oElement,'good');
    }
    else // no error
    {
      if (bFieldSet)
      {
        WHITE_AddClassName(oElement,'good');
      }
      WHITE_RemoveClassName(oElement,'error');
      WHITE_AddClassName(oErrorEl,'hidden');
      WHITE_ReplaceElementContent(oErrorEl,'');
    }
  }
}

function WhiteForm_AutoNext(mElement,mNextElement) {
  var oElement = WHITE_GetElementFlex(mElement);
  var oNextElement = WHITE_GetElementFlex(mNextElement);
  if ( oElement
       && oElement.type
       && 'text' == oElement.type
       && oElement.type
       && oElement.maxLength
       && oNextElement )
  {
    oElement['AutoNextNextElement'] = oNextElement;
    oNextElement['AutoNextBackElement'] = oElement;
    WHITE_AddEventToElement(oElement,'keyup',WhiteForm_AutoNextKeyUpEvent);
    WHITE_AddEventToElement(oElement,'keydown',WhiteForm_AutoNextKeyDownEvent);
    WHITE_AddEventToElement(oNextElement,'keyup',WhiteForm_AutoNextKeyUpEvent);
  }
}

function WhiteForm_AutoNextKeyDownEvent(oEvent) {
  var iKeyCode = WhiteForm_GetEventKeyCode(oEvent);
  // forward
  if ( iKeyCode
       && 48 <= iKeyCode
       && this.value
       && this.value.length
       && this.maxLength
       && this.value.length >= this.maxLength
       && this['AutoNextNextElement'] )
  {
    this['AutoNextNextElement'].focus();
  }
}

function WhiteForm_AutoNextKeyUpEvent(oEvent) {
  var iKeyCode = WhiteForm_GetEventKeyCode(oEvent);
  // forward
  if ( iKeyCode
       && (48 <= iKeyCode || 39 == iKeyCode)
       && this.value
       && this.value.length
       && this.maxLength
       && this.value.length >= this.maxLength
       && this['AutoNextNextElement'] )
  {
    this['AutoNextNextElement'].focus();
  }
  // back
  if ( iKeyCode
       && (8 == iKeyCode || 37 == iKeyCode)
       && 0 == WhiteForm_GetInputCursorPos(this)
       && this['AutoNextBackElement'] )
  {
    this['AutoNextBackElement'].focus();
    if ( this['AutoNextBackElement'].value
         && this['AutoNextBackElement'].value.length )
    {
      var iMovePos = this['AutoNextBackElement'].value.length;
      WhiteForm_MoveInputCursor(this['AutoNextBackElement'],iMovePos);
    }
  }
}

function WhiteForm_MoveInputCursor(mElement,iIndex)
{
  var oElement = WHITE_GetElementFlex(mElement);
  if (oElement)
  {
    if( oElement.setSelectionRange ) // FF
    {
        oElement.setSelectionRange(iIndex,iIndex);
    }
    else if( oElement.createTextRange ) // IE
    {
      var oRange = oElement.createTextRange();
      oRange.collapse(true);
      oRange.moveEnd('character',iIndex);
      oRange.moveStart('character',iIndex);
      oRange.select();
    }
  }
}

function WhiteForm_GetInputCursorPos(mElement) {
  var oElement = WHITE_GetElementFlex(mElement);
	var iResult = false;
  if (oElement)
  {
    if (document.selection) // IE
    {
      oElement.focus();
      var oRange = document.selection.createRange ();
      oRange.moveStart ('character', -oElement.value.length);
      iResult = oRange.text.length;
    }
    else if (oElement.selectionStart || oElement.selectionStart == '0') // FF
    {
      iResult = oElement.selectionStart;
    }
  }
	return (iResult);
}

function WhiteForm_DebugMessage(sMsg) {
  var oElement = WHITE_GetElementFlex('debug');
  if (oElement)
  {
    oElement.innerHTML += '<br />'+sMsg;
  }
  else
  {
    window.alert(sMsg);
  }
}

function WhiteForm_DisableFormEnter(mFormElement) {
  var oFormElement = WHITE_GetElementFlex(mFormElement);
  var aElements = WHITE_GetElementsByTagName(oFormElement,'input');
  for (var iEl=0;iEl<aElements.length;iEl++)
  {
    var oElement = aElements[iEl];
    WHITE_AddEventToElement(oElement,'keydown',WhiteForm_EnterFilterInputKeyDownEvent);
  }
}

function WhiteForm_EnterFilterInputKeyDownEvent(oEvent) {
  var bResult = true;
  var iKeyCode = WhiteForm_GetEventKeyCode(oEvent);
  if ( 13 == iKeyCode )
  {
    if (window.event) // IE
    {
      if (oEvent.keyCode)
      {
        oEvent.keyCode = 9;
      }
    }
    else // FF: Ignore key
    {
      WhiteForm_CancelEvent(oEvent);
      bResult = false;
    }
  }
  return bResult;
}

function WhiteForm_GetEventKeyCode(oEvent) {
  var iResult = false;
  if ( 'object' == typeof oEvent)
  {
    if (oEvent.keyCode) // IE or modern FF
    {
      iResult = oEvent.keyCode;
    }
    else if (oEvent.which) // FF
    {
      iResult = oEvent.which;
    }
  }
  return iResult;
}

function WhiteForm_CancelEvent(oEvent) {
  if ('object' == typeof oEvent)
  {
    if ('boolean'  == typeof oEvent.returnValue)     oEvent.returnValue = false;
    if ('boolean'  == typeof oEvent.cancel)          oEvent.cancel = true;
    if ('function' == typeof oEvent.preventDefault)  oEvent.preventDefault();
    if ('function' == typeof oEvent.stopPropagation) oEvent.stopPropagation();
    if ('function' == typeof oEvent.preventDefault)  oEvent.preventDefault();
  }
}

function WhiteForm_SetLabelAllClick(mWhiteForm) {
  //### List of elements in Label to make clickable
  var aUpdateTagNames = new Array('img');
  //###
  var oWhiteForm = WHITE_GetElementFlex(mWhiteForm);
  if (oWhiteForm)
  {
    var aLabels = WHITE_GetElementsByTagName(oWhiteForm,'label');
    for (var iLa=0;iLa<aLabels.length;iLa++)
    {
      var oLabelEl = aLabels[iLa];
      for (var iTagNr=0;iTagNr<aUpdateTagNames.length;iTagNr++)
      {
        var sTagName = aUpdateTagNames[iTagNr];
        var aElements = WHITE_GetElementsByTagName(oLabelEl,sTagName);
        for (var iEl=0;iEl<aElements.length;iEl++)
        {
          var oElement = aElements[iEl];
          if (oElement)
          {
            oElement.oWhiteForm_TargetElement = oLabelEl;
            var fElementClick = function(oEvent)
            {
              if (this.oWhiteForm_TargetElement && this.oWhiteForm_TargetElement.click)
              {
                this.oWhiteForm_TargetElement.click();
              }
            }
            WHITE_AddEventToElement(oElement,'click',fElementClick);
          }
        }
      }
    }
  }
}

function WhiteForm_InstallDynamics() {
  var aWhiteForms = WHITE_GetElementsByClass(document,'whiteform');
  var oWhiteFormById = WHITE_GetElementFlex('whiteform');
  if (oWhiteFormById)
  {
    aWhiteForms.push(oWhiteFormById);
  }
  for (var iWf=0;iWf<aWhiteForms.length;iWf++)
  {
    var oWhiteForm = aWhiteForms[iWf];
    WHITE_AddEventToClass(oWhiteForm,'text','mousedown',WhiteForm_FieldFocusEvent); // doing this beside of focus fixes problem with select box
    WHITE_AddEventToClass(oWhiteForm,'text','focus',WhiteForm_FieldFocusEvent);
    WHITE_AddEventToClass(oWhiteForm,'text','blur',WhiteForm_FieldUpdateEvent);
    WHITE_AddEventToClass(oWhiteForm,'textarea','focus',WhiteForm_FieldFocusEvent);
    WHITE_AddEventToClass(oWhiteForm,'textarea','blur',WhiteForm_FieldUpdateEvent);
    WHITE_AddEventToClass(oWhiteForm,'radio','focus',WhiteForm_FieldFocusEvent);
    WHITE_AddEventToClass(oWhiteForm,'radio','blur',WhiteForm_FieldUpdateEvent);
    WHITE_AddEventToClass(oWhiteForm,'radio','click',WhiteForm_FieldUpdateEvent);
    WHITE_AddEventToClass(document,'foldhead','click',WHITE_FoldHeadClickEvent);
    WhiteForm_SetLabelAllClick(oWhiteForm);
  }
}

//###
//### Add an other JS file to your HTML, and add this on the bottom:
//###
/*

if ('function' == typeof WHITE_AddLoadEvent)
{
  if ('function' == typeof WhiteForm_InstallDynamics)
  {
    WHITE_AddLoadEvent(WhiteForm_InstallDynamics);
  }
}
*/
//###
