
  function MiniSite_ElmFieldType() {
  
    this.FieldType = [ "Text", "DropDown", "Number", "Boolean", "Date", "JoinBut", "Email", "Message", "DateTime", "Url", "Body", "Captcha", "RawHtml", "Hidden", "Preview" ];

    this.FieldType.Text = 0;
    this.FieldType.DropDown = 1;
    this.FieldType.Number = 2;
    this.FieldType.Boolean = 3;
    this.FieldType.Date = 4;
    this.FieldType.JoinBut = 5;
    this.FieldType.Email = 6;
    this.FieldType.Message = 7;
    this.FieldType.DateTime = 8;
    this.FieldType.Url = 9;
    this.FieldType.Body = 10;
    this.FieldType.Captcha = 11;
    this.FieldType.RawHtml = 12;
    this.FieldType.Hidden = 13;
    this.FieldType.Preview = 14;

    this.regTrim = /^\s*(\S+)\s*$/;
    this.getFieldValue = function(fieldInfo) {
      var ans = null;
      var FieldInput = document.getElementById("Page_Layout_Elm" + fieldInfo.ElementID + fieldInfo.ZoneUnique + "_FieldInput");
      switch (fieldInfo.Type) {
        case MiniSite_ElmField.FieldType.DropDown:
          var FieldDropDown = document.getElementById("Page_Layout_Elm" + fieldInfo.ElementID + fieldInfo.ZoneUnique + "_FieldDropDown");
          if (FieldDropDown.selectedIndex != 0) {
            ans = FieldDropDown[FieldDropDown.selectedIndex].value;
          }
          break;
        case 2:
          // number
          var s01 = FieldInput.value.replace(this.regTrim, "$1");
          ans = new Number(s01);
          if (isNaN(ans)) {
            ans = null;
          }
          break;
        case 3:
          // boolean
          var FieldCheckBox = document.getElementById("Page_Layout_Elm" + fieldInfo.ElementID + fieldInfo.ZoneUnique + "_FieldCheckBox");
          ans = FieldCheckBox.checked;
          break;
        case 4:
          // date
          var s02 = FieldInput.value.replace(this.regTrim, "$1");
          if (s02.length > 0) {
            ans = parseDate(s02);
          }
          break;
        case 5:
        case 14:
        case 11:
        case 7: 
          // Join / Leave Button / Preview / Captcha / Messages
          break;
        case 6:
          // Email
          var str006 = FieldInput.value.replace(this.regTrim, "$1");
          if (str006.length > 0) {
            ans = parseEmail(str006);
          }
          break;
        case 13:
          // Hidden
          var FieldHidden = document.getElementById("Page_Layout_Elm" + fieldInfo.ElementID + fieldInfo.ZoneUnique + "_FieldHidden");
          ans = FieldHidden.value;
          break;
        default:
          // simple filed Type = 0
          ans = FieldInput.value.replace(this.regTrim, "$1");
          break;
      }
      return ans;
  
    }

    this.value2DateValuePading = "                                                                       ";
    this.value2DataValue = function(v, type) {
      if (v == null) {
        return null;
      } else {
        switch (type) {
          case 2:
            // number
            var a = v.toString();
            var pos = a.indexOf(".");
            pos = pos > -1 ? 29 + a.length - pos : 29;
            a = this.value2DateValuePading.substr(0, pos) + a;
            return a;
            break;
          case 3:
            // boolean
            return v ? "True" : "False";
            break;
          case 4:
            // date
            var y = v.getFullYear();
            var m = v.getMonth() + 1;
            var d = v.getDate();
            var h = v.getHours();
            var n = v.getMinutes();
            var s = v.getSeconds();
            var ans = 
              y + "-" + 
              (m < 10 ? "0" : "") + m + "-" + 
              (d < 10 ? "0" : "") + d + "T" + 
              (h < 10 ? "0" : "") + h + ":" + 
              (n < 10 ? "0" : "") + n + ":" + 
              (s < 10 ? "0" : "") + s + ".000";
            return ans;
            break;
          case 7:
          case 11:
            // Messages 
            // Captcha
            return null;
            break;
          default:
            return v.toString();
            break;
        }
      }
    }
    
    this.regQuote = /\"/g;
    this.regBackSlash = /\\/g;
    this.getFieldID = function(f, n, zu) {
      var ans = "";
      ans += 
        "\"" + f.replace(this.regBackSlash, "\\").replace(this.regQuote, "\"") + "\"|" + 
        "\"" + n.replace(this.regBackSlash, "\\").replace(this.regQuote, "\"") + "\"|" + 
        "\"" + zu.replace(this.regBackSlash, "\\").replace(this.regQuote, "\"") + "\"";
      return ans;
    }
    
    this.getInput = function(field) {
      var input = null;
      switch (field.Type) {
        case MiniSite_ElmField.FieldType.DropDown:
          input = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_FieldDropDown");
          break;
        case MiniSite_ElmField.FieldType.Boolean:
          input = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_FieldCheckBox");
          break;
        case MiniSite_ElmField.FieldType.JoinBut:
        case MiniSite_ElmField.FieldType.Preview:
          input = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_FieldButton");
          break
        case MiniSite_ElmField.FieldType.Captcha:
        case MiniSite_ElmField.FieldType.Message: 
          break;
        case MiniSite_ElmField.FieldType.Hidden:
          input = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_FieldHidden");
          break;
        default: // simple filed Type = 0
          input = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_FieldInput");
          break;
      }
      return input;
    }
    
    this.FieldValueChanged = function(input, processedFields) {
      var field = input.FieldInfo;
      if (!field) {
        return;
      }
      var dv = this.value2DataValue(this.getFieldValue(field), field.Type);
      for (var i = field.DependentFields.length - 1; i > -1; i--) {
        var childField = field.DependentFields[i];
        this.SetFieldEnableState(childField, dv == childField.EnableValue, processedFields);
      }
    }
    
    this.SetFieldEnableState = function(field, enabled, processedFields) {
      function SetFieldEnableStateAux(field) {
        if (processedFields[field.ElementID]) {
          return;
        }
        processedFields[field.ElementID] = true;
        var row = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_FieldTableRow");
        var input = MiniSite_ElmField.getInput(field);
        var oldenabled = row.className.indexOf("fielddisabled") == -1;
        if (!oldenabled && enabled) {
          // switch state from disabled to enabled
          row.className = row.className.replace("fielddisabled", "");
          var verticalRow = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_VerticalRow");
          if (verticalRow) {
            verticalRow.className = verticalRow.className.replace("fielddisabled", "");
          }
          input.removeAttribute('readonly'); 
          input.removeAttribute('disabled'); 
          if (field.HideOnDisabled) {
            row.style.display = "";
            if (verticalRow) {
              verticalRow.style.display = "";
            }
            var rowPadding = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_EMPaddingTR");
            if (rowPadding) {
              rowPadding.style.display = "";
            }
          }
          if (input) {
            MiniSite_ElmField.FieldValueChanged(input, processedFields);
          }
        } else if (oldenabled && !enabled) {
          // switch state from enabled to disabled
          row.className += " fielddisabled";
          var verticalRow = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_VerticalRow");
          if (verticalRow) {
            verticalRow.className += " fielddisabled";
          }
          input.setAttribute('readonly', true); 
          input.setAttribute('disabled', true); 
          if (field.HideOnDisabled) {
            row.style.display = "none";
            if (verticalRow) {
              verticalRow.style.display = "none";
            }
            var rowPadding = document.getElementById("Page_Layout_Elm" + field.ElementID + field.ZoneUnique + "_EMPaddingTR");
            if (rowPadding) {
              rowPadding.style.display = "none";
            }
          }
          if (field.DependentFields) {
            for (var i = field.DependentFields.length - 1; i > -1; i--) {
              SetFieldEnableStateAux(field.DependentFields[i]);
            }
          }
        }
      }
      
      if (!processedFields) {
        processedFields = {};
      }
      SetFieldEnableStateAux(field);
    }

  }
  

  
  var MiniSite_ElmField; 
  var MiniSite_dicElmFields; 
  MiniSite_LoadFunctions[MiniSite_LoadFunctions.length] = function() { 
    MiniSite_ElmField = new MiniSite_ElmFieldType();
    MiniSite_dicElmFields = new Object();
    for (var i = MiniSite_aryElmFields.length - 1; i > -1; i--) {
      MiniSite_aryElmFields[i].FieldID = MiniSite_ElmField.getFieldID(MiniSite_aryElmFields[i].Form, MiniSite_aryElmFields[i].Name, MiniSite_aryElmFields[i].ZoneUnique);
      if (!MiniSite_dicElmFields[MiniSite_aryElmFields[i].FieldID]) {
        MiniSite_dicElmFields[MiniSite_aryElmFields[i].FieldID] = [];
      }
      var ary = MiniSite_dicElmFields[MiniSite_aryElmFields[i].FieldID];
      ary[ary.length] = MiniSite_aryElmFields[i];
      
    }
    for (var i = MiniSite_aryElmFields.length - 1; i > -1; i--) {
      if (MiniSite_aryElmFields[i].EnableField) {
        var ParentID = MiniSite_ElmField.getFieldID(MiniSite_aryElmFields[i].Form, MiniSite_aryElmFields[i].EnableField, MiniSite_aryElmFields[i].ZoneUnique);
        var aryParents = MiniSite_dicElmFields[ParentID];
        //MiniSite_aryElmFields[i].ParentFields = aryParents;
        if (aryParents) {
          for (var j = aryParents.length - 1; j > -1; j--) {
            var parentField = aryParents[j];
            if (!parentField.DependentFields) {
              parentField.DependentFields = [];
              switch (parentField.Type) {
                case MiniSite_ElmField.FieldType.DropDown:
                  var FieldDropDown = document.getElementById("Page_Layout_Elm" + parentField.ElementID + parentField.ZoneUnique + "_FieldDropDown");
                  FieldDropDown.FieldInfo = parentField;
                  FieldDropDown.onchange = function() { MiniSite_ElmField.FieldValueChanged(this); }
                  break;
                case 3:
                  // boolean
                  var FieldCheckBox = document.getElementById("Page_Layout_Elm" + parentField.ElementID + parentField.ZoneUnique + "_FieldCheckBox");
                  FieldCheckBox.FieldInfo = parentField;
                  FieldCheckBox.onclick = function() { MiniSite_ElmField.FieldValueChanged(this); }
                  break;
                case 5:
                case 14:
                  // Join / Leave Button 
                  var FieldButton = document.getElementById("Page_Layout_Elm" + parentField.ElementID + parentField.ZoneUnique + "_FieldButton");
                  FieldButton.FieldInfo = parentField;
                  FieldButton.onchange = function() { MiniSite_ElmField.FieldValueChanged(this); }
                  break;
                case 11:
                case 7: 
                  // Preview / Captcha / Messages
                  break;
                case 13:
                  // Hidden
                  var FieldHidden = document.getElementById("Page_Layout_Elm" + parentField.ElementID + parentField.ZoneUnique + "_FieldHidden");
                  FieldHidden.FieldInfo = parentField;
                  FieldHidden.onchange = function() { MiniSite_ElmField.FieldValueChanged(this); }
                  break;
                default:
                  // simple filed Type = 0
                  var FieldInput = document.getElementById("Page_Layout_Elm" + parentField.ElementID + parentField.ZoneUnique + "_FieldInput");
                  FieldInput.FieldInfo = parentField;
                  FieldInput.onchange = function() { MiniSite_ElmField.FieldValueChanged(this); }
                  FieldInput.onkeyup = FieldInput.onchange;
                  FieldInput.onpaste = FieldInput.onchange;
                  FieldInput.onblur = FieldInput.onchange;
                  break;
              }
            }
            var aryDependentFields = parentField.DependentFields;
            aryDependentFields[aryDependentFields.length] = MiniSite_aryElmFields[i];
          }
        }
      }
    }
    if (window['MiniSite_aryDisabledElmFields']) {
      for (var i = MiniSite_aryDisabledElmFields.length - 1; i > -1; i--) {
        var o = document.getElementById(MiniSite_aryDisabledElmFields[i]);
        o.setAttribute('readonly', true); 
        o.setAttribute('disabled', true); 
      }
    }
  }
  
  function MiniSite_Elements_ElmField_openCaptchaDialogLoad(dialog, parameters) {
    var div = document.getElementById("captchadialogiframecontainer");
    var iframe = document.getElementById("Page_Layout_Elm" + parameters[0] + "_DisplayRecaptcha");
    iframe.parentNode.removeChild(iframe);
    div.appendChild(iframe);
    iframe.style.display = "";
    var formButton = document.getElementById("Page_Layout_Elm" + parameters[0] + "_FieldButton");
    var dialogButton = document.getElementById("captchadialogsendbutton");
    dialogButton.value = formButton.value;
    dialogButton.name = formButton.name;
    
    var formErrorSpan = document.getElementById("Page_Layout_Elm" + parameters[0] + "_ActionMessageLabel" + parameters[0]);
    var dialogErrorSpan = document.getElementById("captchadialogerror");
    if (formErrorSpan && formErrorSpan.firstChild) {
      dialogErrorSpan.firstChild.nodeValue = formErrorSpan.firstChild.nodeValue;
    }
    dialogButton.onclick = new Function("MiniSite_getMyRecaptcha('Page_Layout_Elm" + parameters[0] + "');" + parameters[1] + ";");
  }
  
