function MultiForm()
{

  this.TargetField = false;
  this.ParentField = false;
  this.ValueDefault = false;
  this.AjaxURL = false;
  this.AjaxEvalURL = false;
  this.FetchData = FetchDataFunction;
  this.ValueSelected = false;
  this.OnloadTarget = false;
  this.OnloadEval = false;
  this.ParentAllowNull = false;
  this.StaticData = false;
  this.SelectText = true;
  this.DebugMode = false;
  this.DisableAllChildren = DisableAllChildrenFunction;
  this.OutputHandlerFunction = 'FetchDataCallback';
  this.SelectHeading = false;
  this.SelectHeadingDividerLeft = '----- '; // Space After
  this.SelectHeadingDividerRight = ' -----'; // Space Before
  this.SelectHeadingTextUnavailable = 'Unavailable'; // When Search results return nothing
  this.OnloadEval = false;
  
  function FetchDataFunction()
  {
    if(this.DebugMode)alert('FetchData function called'); // DEBUG OUTPUT
    var x = document.getElementById(this.TargetField);
    var MatchFound = false;
    if(this.ParentField)
    {
      var ParentFieldValue = document.getElementById(this.ParentField).value;
    }

    // Disables all child objects
    x.disabled = true;
    this.DisableAllChildren(this);

    if(this.AjaxEvalURL)
    {
      this.AjaxURL = eval(this.AjaxEvalURL);
      if(this.DebugMode)alert('AjaxEvalURL: '+this.AjaxURL); // DEBUG OUTPUT
      //prompt(this.AjaxURL,this.AjaxURL);
    }
    if ((ParentFieldValue || this.ParentAllowNull == true) && this.StaticData == false)
    {
      if(this.DebugMode)alert('Preparing to FORK.Ajax'); // DEBUG OUTPUT
      if (x.type == "select" || x.type == "select-one")
      {
        x.options.length = 1;
        x.options[0] = new Option(this.SelectHeadingDividerLeft+'Loading: Please Wait'+this.SelectHeadingDividerRight,'');
        x.selectedIndex = 0;
      }

      // URL ENCODE
      this.AjaxURL = this.AjaxURL.replace('+','%2B');
      
      new FORK.Ajax("GET", this.AjaxURL,
        {
          timeout: 5000,
          argument: {TargetObject: this},
          onComplete: function(o,x)
          {
            if(x.DebugMode)alert('FORK OnComplete Called'); // DEBUG OUTPUT
            eval(x.TargetObject.OutputHandlerFunction + '(o,x.TargetObject)');
            //FetchDataCallback(o,x.TargetObject);//, x.TargetField , x.ParentField, x.ValueSelected , x.ValueDefault, x.OnloadTarget);
          }
        }
      );
    }
    else if ((this.StaticData == true && this.ParentField == false) || (this.StaticData == true && ParentFieldValue && this.ParentField))// && this.ValueDefault)
    {
      if(this.DebugMode)alert('Parent is Null, no Ajax Call being made'); // DEBUG OUTPUT
      x.disabled = false;
      for (var xi = 0;xi < x.length;xi++)
      {
        if (xi == 0 && x[xi].value == '' && (x[xi].text == '' || x[xi].text == this.SelectHeadingDividerLeft+this.SelectHeadingTextUnavailable+this.SelectHeadingDividerRight))
        {
          if (this.SelectHeading == false)
          {
            x.options[0] = new Option(this.SelectHeadingDividerLeft+'Please Select'+this.SelectHeadingDividerRight,'');
          }
          else
          {
            x.options[0] = new Option(this.SelectHeadingDividerLeft+this.SelectHeading+this.SelectHeadingDividerRight,'');
          }
        }
        if (x[xi].value == this.ValueDefault)
        {
          if(this.DebugMode)alert('Match Found'); // DEBUG OUTPUT
          x.selectedIndex = xi;
          var MatchFound = true;
        }
      }
      if (this.OnloadEval && (this.ParentAllowNull == true || MatchFound == true))
      {
        if(this.DebugMode)alert('OnloadEval (1) called\n----------\n'+this.OnloadEval); // DEBUG OUTPUT
        eval(this.OnloadEval)
      }
      if (this.OnloadTarget && (this.ParentAllowNull == true || MatchFound == true))
      {
        var PeformTarget = eval(this.OnloadTarget);
        if (PeformTarget.ValueDefault || this.ValueDefault)
        {
          if(this.DebugMode)alert('OnloadTarget (1) ('+this.OnloadTarget+') function called'); // DEBUG OUTPUT
          PeformTarget.FetchData();
        }
      }
    }
  }
  
  function DisableAllChildrenFunction(TargetObject)
  {
    if (TargetObject)
    {
      var x = document.getElementById(TargetObject.TargetField);
      if ((TargetObject.StaticData == false && x) || (TargetObject.StaticData == true && TargetObject.ParentAllowNull == false && TargetObject.ParentField))
      {
        if (TargetObject.SelectText)
        {
          if (TargetObject.StaticData == true)
          {
            if(x.options[0].value == '')
            {
              x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+TargetObject.SelectHeadingTextUnavailable+TargetObject.SelectHeadingDividerRight,'');
            }
          }
          else if (x.options)
          {
            x.options.length = 1;
            x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+TargetObject.SelectHeadingTextUnavailable+TargetObject.SelectHeadingDividerRight,'');
          }
        }
        x.selectedIndex = 0;
        x.disabled = true;
      }
      else if (x)
      {
        x.disabled = false;
      }
      DisableAllChildrenFunction(eval(TargetObject.OnloadTarget));
    }
  }

  function FetchDataCallback(XMLHttpRequest,TargetObject)
  {
    if(TargetObject.DebugMode)alert('FetchDataCallback function called'); // DEBUG OUTPUT
    var data = eval(XMLHttpRequest.responseText);
    var MatchFound = false;
    var x = document.getElementById(TargetObject.TargetField);
    // If the Parent is blank, reset the child
    if (TargetObject.ParentField && TargetObject.ParentAllowNull == false)
    {
      if (document.getElementById(TargetObject.ParentField).value)
      {
        // Do Nothing
      }
      else
      {
        if (TargetObject.SelectText)
        {
          x.options.length = 1;
          x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+TargetObject.SelectHeadingTextUnavailable+TargetObject.SelectHeadingDividerRight,'');
        }
        // Duplication of OnloadTargetFromBelow
        if (TargetObject.OnloadTarget)
        {
          var PeformTarget = eval(TargetObject.OnloadTarget);
          PeformTarget.FetchData();
        }
        return;
      }
    }
    // Make Level
    x.options.length = 1;
    if (data)
    {
      if (data.length)
      {
        if (TargetObject.SelectText == true)
        {
          if (TargetObject.SelectHeading == false)
          {
            x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+'Please Select'+TargetObject.SelectHeadingDividerRight,'');
          }
          else
          {
            x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+TargetObject.SelectHeading+TargetObject.SelectHeadingDividerRight,'');
          }
          var indexmodifyer = 1;
        }
        else
        {
          var indexmodifyer = 0;
        }
        if(TargetObject.DebugMode)alert('FetchDataCallback - Loop Initiated'); // DEBUG OUTPUT
        for (var xi = 0;xi < data.length;xi++)
        {
          if (data[xi].attribute_count > 0)
          {
            x.options[xi + indexmodifyer] = new Option((data[xi].attribute_text) ? data[xi].attribute_text : data[xi].attribute_name + ' (' + data[xi].attribute_count + ')',data[xi].attribute_name);
          }
          else
          {
            x.options[xi + indexmodifyer] = new Option((data[xi].attribute_text) ? data[xi].attribute_text : data[xi].attribute_name,data[xi].attribute_name);
          }
          if (data[xi].attribute_name == TargetObject.ValueDefault)
          {
            x.selectedIndex = xi + indexmodifyer;
            TargetObject.ValueDefault = data[xi].attribute_name;
            var MatchFound = true;
          }
        }
        x.disabled = false;
      }
      else if (TargetObject.SelectText)
      {
        x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+TargetObject.SelectHeadingTextUnavailable+TargetObject.SelectHeadingDividerRight,'');
        x.disabled = true;
      }
    }
    else if (TargetObject.SelectText)
    {
      x.options[0] = new Option(TargetObject.SelectHeadingDividerLeft+TargetObject.SelectHeadingTextUnavailable+TargetObject.SelectHeadingDividerRight,'');
      x.disabled = true;
    }
    if (TargetObject.OnloadEval)
    {
      if(this.DebugMode)alert('OnloadEval (2) called\n----------\n'+TargetObject.OnloadEval); // DEBUG OUTPUT
      eval(TargetObject.OnloadEval);
    }
    if (TargetObject.OnloadTarget && (TargetObject.ParentAllowNull == true || MatchFound == true))
    {
      if(TargetObject.DebugMode)alert('FetchDataCallback - Trying Onload Target ('+TargetObject.OnloadTarget+')'); // DEBUG OUTPUT
      var PeformTarget = eval(TargetObject.OnloadTarget);
      //if (PeformTarget.ValueDefault || TargetObject.ValueDefault)
      if(PeformTarget.ParentAllowNull == true || MatchFound == true || TargetObject.ValueDefault || PeformTarget.ValueDefault) // || TargetObject.ParentAllowNull == true
      {
          if(TargetObject.DebugMode)alert('OnloadTarget (2) ('+TargetObject.OnloadTarget+') function called'); // DEBUG OUTPUT
          PeformTarget.FetchData();
      }
    }
  } //FetchDataCallback()

} // MultiForm()