var m_bFormDebug = false;
var m_bCanSubmitForm = true;

var MAXLENGTH_SUFFIX="_MaxLength";
var MINLENGTH_SUFFIX="_MinLength";

var VERIFYSTRING_NOTEMPTY              = 1 << 0;
var VERIFYSTRING_COMPATIBLEXML         = 1 << 1;
var VERIFYSTRING_COMPATIBLEHTML        = 1 << 2;
var VERIFYSTRING_COMPATIBLEFILESYSTEM  = 1 << 3;
var VERIFYSTRING_MAXSIZE               = 1 << 4;
var VERIFYSTRING_MINSIZE               = 1 << 5;

var m_temp_Popups;
var m_tempParentFormName;

function formGetForm(strFormName) {
   if (strFormName == null || strFormName == "") {
      var currentForm;
      var i;
      for (i=0; i<document.forms.length; i++) {
         currentForm = document.forms[i];
         if (_formCheckFieldExist(currentForm.Origin))
            return currentForm;
      }
      return null;
   }

   // Bug IE 6.0
   var foundForm = document.forms[strFormName];

   if (foundForm != null) {
      return foundForm;
   } else {
      for (i=0; i<document.forms.length; i++) {
         if (document.forms[i].name == strFormName)
            return document.forms[i];
      }
      return null;
   }
}

function formRefresh(strFormName) {
   var form;
   form=formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (formRefresh)");
      return false;
   }

   if (!_formCheckSubmitableAndLock())
      return false;

   form.action = form.Origin.value;
   form.target = "_self";
   // If popups must be closed, must do it now
   popupParentCloseAllPopupsOnUnload(strFormName);
   _popupPrepareFormForSubmit(strFormName);
   form.submit();
   return false;
}

function formSubmitExecuteCommand(strFormName, strCommand, strRedirect, strTarget) {
   var form;
   form=formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (formSubmitExecuteCommand)");
      return false;
   }
   if (!_formCheckSubmitableAndLock()) {
      return false;
   }

   form.action = INSTRASERVLET_URL;
   form.target = strTarget;
   form.Command.value = strCommand;
   form.Redirect.value = strRedirect;


   // If popups must be closed, must do it now
   if (strTarget=="_self")
      popupParentCloseAllPopupsOnUnload(strFormName);
   _popupPrepareFormForSubmit(strFormName);
   _formPushContext(strFormName, strTarget);
   form.submit();
   _formPopContext(strFormName, strTarget);
   return false;
}

function formSubmitUrl(strFormName, strUrl, strTarget) {
   var form;

   form=formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (formSubmitUrl)");
      return false;
   }

   if (!_formCheckSubmitableAndLock())
      return false;

   form.action = strUrl;
   form.target = strTarget;
   // If popups must be closed, must do it now
   if (strTarget=="_self")
      popupParentCloseAllPopupsOnUnload(strFormName);
   _popupPrepareFormForSubmit(strFormName);
   _formPushContext(strFormName, strTarget);
   form.submit();
   _formPopContext(strFormName, strTarget);
   return false;
}

function formCheckAll(strFormName, strPrefix) {
   _formSetChecked(strFormName, strPrefix, true);
}

function formUncheckAll(strFormName, strPrefix) {
   _formSetChecked(strFormName, strPrefix, false);
}

function formCheckFieldContent(strFormName, strFieldName, bitField) {
   var form;
   form=formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (formCheckFieldContent)");
      return false;
   }

   var bIsCompliant;
   var checkedField = form.elements[strFieldName];

   if (!_formCheckFieldExist(checkedField)) {
      _formFatal("Cannot find the field " + strFieldName);
      return false;
   }
   if (bitField & VERIFYSTRING_COMPATIBLEXML) {
      bIsCompliant = _formCheckFieldContentXmlCompliant(strFormName, checkedField);
      if (!bIsCompliant)
         return false;
   }
   if (bitField & VERIFYSTRING_COMPATIBLEHTML) {
      bIsCompliant = _formCheckFieldContentHtmlCompliant(strFormName, checkedField);
      if (!bIsCompliant)
         return false;
   }
   if (bitField & VERIFYSTRING_COMPATIBLEFILESYSTEM) {
      bIsCompliant = _formCheckFieldContentFileSystemCompliant(strFormName, checkedField);
      if (!bIsCompliant)
         return false;
   }
   if (bitField & VERIFYSTRING_MAXSIZE) {
      bIsCompliant = _formCheckFieldContentMaxSize(strFormName, checkedField);
      if (!bIsCompliant)
         return false;
   }
   if (bitField & VERIFYSTRING_MINSIZE) {
      bIsCompliant = _formCheckFieldContentMinSize(strFormName, checkedField);
      if (!bIsCompliant)
         return false;
   }
   return true;
}

function formCheckFieldExist(strFormName, strFieldName) {
   var form;
   var field;

   form = formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (formCheckFieldExist)");
      return false;
   }

   field = form.elements[strFieldName];
   if (_formCheckFieldExist(field))
      return true;
   return false;
}

function _formSetChecked(strFormName, strPrefix, bSetChecked) {
   var form;
   var i;
   var currentElement;

   form=formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (_formSetChecked)");
      return false;
   }
   for (i=0; i<form.elements.length; i++) {
      currentElement = form.elements[i];
      if (currentElement.type == "checkbox" && currentElement.name.indexOf(strPrefix) == 0 && currentElement.disabled == false )
         currentElement.checked = bSetChecked;
   }
}

function _formCheckFieldContentHtmlCompliant(strFormName, checkedField) {
   if (checkedField.value.indexOf('"') != -1
      || checkedField.value.indexOf('<') != -1
      || checkedField.value.indexOf('>') != -1) {
      return false;
   }
   return true;
}

function _formCheckFieldContentXmlCompliant(strFormName, checkedField) {
   var strValue = checkedField.value;
   var curChar;
   var nIndex = 1;

   if ((strValue == null) || (strValue.length == 0))
      return false;

   // Valid characters: letters or [_:]
   curChar = strValue.charCodeAt(0);
   if ((curChar < 0x3A) || ((curChar > 0x3A) && (curChar < 0x41))
      || ((curChar > 0x5A) && (curChar < 0x5F)) || (curChar == 0x60)
      || ((curChar > 0x7A) && (curChar < 0xAA))
      || ((curChar > 0xAA) && (curChar < 0xB5))
      || ((curChar > 0xB5) && (curChar < 0xBA))
      || ((curChar > 0xBA) && (curChar < 0xC0))
      || (curChar == 0xD7) || (curChar == 0xF7)
      ) {
      return false;
   }

   // Valid characters: letters, digits or [_-:.]
   while (nIndex < strValue.length) {
      curChar = strValue.charCodeAt(nIndex);
      
      if ((curChar < 0x2D) || (curChar == 0x2F) || ((curChar > 0x3A) && (curChar < 0x41))
         || ((curChar > 0x5A) && (curChar < 0x5F)) || (curChar == 0x60)
         || ((curChar > 0x7A) && (curChar < 0xAA))
         || ((curChar > 0xAA) && (curChar < 0xB5))
         || ((curChar > 0xB5) && (curChar < 0xBA))
         || ((curChar > 0xBA) && (curChar < 0xC0))
         || (curChar == 0xD7) || (curChar == 0xF7)
         ) {
         return false;
      }
      
      nIndex++;
   }
   
   return true;
}

function _formCheckFieldContentFileSystemCompliant(strFormName, checkedField) {
   if (checkedField.value.indexOf('*') != -1
      || checkedField.value.indexOf('?') != -1
      || checkedField.value.indexOf('"') != -1
      || checkedField.value.indexOf('<') != -1
      || checkedField.value.indexOf('>') != -1
      || checkedField.value.indexOf('|') != -1) {
      return false;
   }
   return true;
}

function _formCheckFieldContentMaxSize(strFormName, checkedField) {
   var form;
   var maxSizeField;
   var nMaxSize;
   var nCheckedFieldSize;

   form = formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (_formCheckFieldContentMaxSize)");
      return false;
   }

   nCheckedFieldSize = checkedField.value.length;
   maxSizeField = form.elements[checkedField.name + MAXLENGTH_SUFFIX];
   if (!_formCheckFieldExist(maxSizeField)) {
      _formFatal("Cannot find the hidden field " + checkedField.name + MAXLENGTH_SUFFIX + ": it is a mandatory field to check max size");
      return false;
   }
   nMaxSize = parseInt(maxSizeField.value);

   if (isNaN(nMaxSize))
      _formFatal("The field " + maxSizeField.name + " must contain a valid integer as value");

   if (nCheckedFieldSize > nMaxSize) {
      return false;
   }

   return true;
}

function _formCheckFieldContentMinSize(strFormName, checkedField) {
   var form;
   var minSizeField;
   var nMinSize;
   var nCheckedFieldSize;

   form = formGetForm(strFormName);
   if (form == null) {
      _formFatal("cannot find a valid form ("+strFormName+") in the parent. Probably because some fields are missing (_formCheckFieldContentMinSize)");
      return false;
   }

   nCheckedFieldSize = checkedField.value.length;

   minSizeField = form.elements[checkedField.name + MINLENGTH_SUFFIX];
   if (!_formCheckFieldExist(minSizeField)) {
      _formFatal("Cannot find the hidden field " + checkedField.name + MINLENGTH_SUFFIX + ": it is a mandatory field to check min size");
      return false;
   }
   nMinSize = parseInt(minSizeField.value);

   if (isNaN(nMinSize))
      _formFatal("The field " + minSizeField.name + " must contain a valid integer as value");

   if (nCheckedFieldSize < nMinSize) {
      return false;
   }

   return true;
}


function _formCheckFieldExist(field) {
   if (field == null)
      return false;

   return true;
}

function _formPushContext(strFormName, targetName) {
   var form = formGetForm(strFormName);

   if (targetName != "_self") {
      // if there is a _Popups field in the specified form, don't pass its value to the target, because the target could possibly behave also like a parent
      if (form._Popups != null) {
         m_temp_Popups = form._Popups.value;
         form._Popups.value = "";
      }
      // if there is a ParentFormName field in the specified form, don't pass its value to the target, because the target could possibly behave also like a parent
      if (form.ParentFormName != null) {
         m_tempParentFormName = form.ParentFormName.value;
         form.ParentFormName.value = form.name;
      }
   }
}

function _formPopContext(strFormName, targetName) {
   var form = formGetForm(strFormName);

   if (targetName != "_self") {
      if (form._Popups != null) {
         form._Popups.value = m_temp_Popups;
      }
      if (form.ParentFormName != null) {
         form.ParentFormName.value = m_tempParentFormName;
      }
   }
}

function _formFatal(strMessage) {
   if (m_bFormDebug)
      alert("***DEBUG ERROR***\n" + strMessage);
}

function _formError(strMessage) {
   if (m_bFormDebug)
      alert(strMessage);
}

function _formCheckSubmitableAndLock() {
   if (!m_bCanSubmitForm)
      return false;

   m_bCanSubmitForm = false;

   return true;
}

function _formUnlockForSubmit() {
   m_bCanSubmitForm = true;

   return true;
}

