/**
 * @fileoverview 此文件用于实现checkbox或radio为控制器，控制text框、textarea或select框是否可以进行编辑。
 */

//HTML的refresh令FORM的元素的值会保留,如改变了form的元素的值，当refresh后,此元素已经是已改变的值了，故存在小小bug，但不大影响此js的功能。

/**
 * 用于保存"控制"和"被控制"的关系的数组。
 * 详细如:controlRelations[i]是一个关系，controlRelations[i][0]是controller,controlRelations[i][1].......controlRelations[i][n]是受控方。
 * @type Array
 */
controlRelations = new Array();


/**
 * 用于保存"控制者"和"受控者"的关系的二维数组。
 */
controlRelations[0] = new Array();
controlRelations[0][0] = "[0][0]";
controlRelations[0][1] = "[0][1]";


/**
 * 用于影响text,textArea的disable风格(背景颜色)的变量。
 * @type String
 */
var disabledTextBg = "#eeeeee";


/**
 * 用于保存text,textArea的enable时的风格(背景颜色)的"临时"全局变量。
 * @type String
 */
var originalCSSBg;

/**
 * 用于保存text,textArea的enable时的风格(背景图片)的"临时"全局变量
 */
var originalBgImage;


/**
 * 判断"控制者"和"受控者"的关系的二维数组是否存在。
 * @param {String} controllerName 控制者
 * @type boolean
 * @return "控制者"和"受控者"的关系的二维数组是否存在
 */
function checkControllerExist(controllerName)
{
//start of 遍历ArrayList里的items
  for (var i = 0; i < controlRelations.length; i++)
  {
    var elementItems = controlRelations[i];
    var ret = false;
    if (elementItems.length > 0 && controllerName == elementItems[0])
    {
      return true;
    }
  }
  return ret;
//end of 遍历ArrayList里的items
}


/**
 * 在"控制者"和"受控者"的关系的二维数组中追加新"受控者"。
 * @param {String} controllerName 控制者
 * @param {Array} fieldsName 受控者
 */
function addNewMember(controllerName, fieldsName)
{
  for (var i = 0; i < controlRelations.length; i++)
  {
    var elementItems = controlRelations[i];
    var elname = elementItems[0]
    var originalLen = controlRelations[i].length;
    if (elementItems.length > 0 && controllerName == elname)
    {
      for (var j = 0; j < fieldsName.length; j++)
      {
        controlRelations[i][originalLen+j] = fieldsName[j];
      }
    }
  }
}


/**
 * 获取当前受控者的数组。
 * @param {String} controllerName 控制者
 * @type Array
 * @return 受控者的数组
 */
function getControlledItems(controllerName)
{

//start of 得到按controller名对应的controlledItems
  var ret = new Array();
  for (var i = 0; i < controlRelations.length; i++)
  {
    var elementItems = controlRelations[i];
    if (elementItems[0] == controllerName)
    {
      for (var j = 1; j < elementItems.length; j++) //start from 1
      {
        ret[j - 1] = elementItems[j];
      }
      break;
    }
  }
  return ret;
//end of 遍历ArrayList里的items
}


/**
 * 取得 onChange 事件对象。
 */
function associateSelectOnchangeItems()
{
  var ns6 = document.getElementById && !document.all;
  var ie = document.all;
  var objectEvent = ie ? event.srcElement : event.target; //取得发生点的对象

  var currentlyControllerValue = objectEvent.value;
  var currentlyControllerName = objectEvent.name;

  getControlledValueArray(currentlyControllerName, currentlyControllerValue);
}


/**
 * 取得 onClick 事件对象。
 * @param {boolean} status 受控者状态
 */
function associateItemsOnClickEvent(status)
{
  var ns6 = document.getElementById && !document.all;
  var ie = document.all;
  var objectEvent = ie ? event.srcElement : event.target; //取得发生点的对象

  show = objectEvent.checked;
  ControllerName = objectEvent.name;

  var fieldsName_text = getControlledItems(ControllerName);

// start of 逐一判断里面的受控件的状态,决定enable还是disable
  for (var i = 0; i < fieldsName_text.length; i++)
  {
    var elementItems = document.getElementsByName(fieldsName_text[i]);
/**
    if(elementItems[0].type == "checkbox")
    {
      elementItems[0].checked = show;
      continue;
    }
 */
    if(status)
    {
      for (var j = 0; j < elementItems.length; j++)
      {
        switchDisabledWithTrueStatus(ControllerName, elementItems[j], show);
      }
    }
    else
    {
      for (var j = 0; j < elementItems.length; j++)
      {
        switchDisabledWithFalseStatus(ControllerName, elementItems[j], show);
      }
    }
  }

// end of 逐一判断里面的受控件的状态,决定enable还是disable
}


/**
 * 取得 onClick 事件对象。
 * @param {boolean} status 受控者状态
 */
function associateItemsOnClickEventToCheckboxes(status, tableHighlight, checked, uncheck)
{
  var ns6 = document.getElementById && !document.all;
  var ie = document.all;
  var objectEvent = ie ? event.srcElement : event.target; //取得发生点的对象

  show = objectEvent.checked;
  ControllerName = objectEvent.name;

  var fieldsName_text = getControlledItems(ControllerName);

// start of 逐一判断里面的受控件的状态,决定enable还是disable
  for (var i = 0; i < fieldsName_text.length; i++)
  {
    var elementItems = document.getElementsByName(fieldsName_text[i]);

    for(var n = 0; n < elementItems.length; n++)
    {
      var tr = elementItems[n].parentElement.parentElement;
      
      if(elementItems[n].checked)
      {

        if(typeof(tableHighlight) == "object")
        {

          tableHighlight.kindle(tableHighlight.className,tr);

          if(typeof(checked) == "function" && typeof(uncheck) == "function")
          {
            checked();
          }
        }
      }
      else
      {
        var className = "";

        n % 2 == 0 ? className = "odd" : className = "even";

        if(typeof(tableHighlight) == "object")
        {
            tableHighlight.kindle(className, tr);
            
            if(typeof(checked) == "function" && typeof(uncheck) == "function")
            {
              uncheck();
            }
        }
      }

      elementItems[n].checked = show;

    }
  }

// end of 逐一判断里面的受控件的状态,决定enable还是disable
}


/**
 * 级联控制入口。
 * @param {Object} controlledName 受控者
 */
function associateItemsWithSelectItems(controlledName)
{
  var controllerName = getControlledItems(controlledName.name);

  isChecked = controlledName.checked
// start of 逐一判断里面的受控件的状态,决定enable还是disable
  for (var i = 0; i < controllerName.length; i++)
  {
    var elementItems = document.getElementsByName(controllerName[i]);
    for (var j = 0; j < elementItems.length; j++)
    {
      switchDisabledWithFalseStatus(controlledName.name, elementItems[j], isChecked);
    }
  }
// end of 逐一判断里面的受控件的状态,决定enable还是disable
}


/**
 * 入口函数。
 * @param {Object} controllerName 控制者
 * @param {Object} fieldsName 受控者
 */
function associateItems(controllerName, fieldsName)
{
  associateItemsWithStatus(controllerName, fieldsName, false);
}


/**
 * 带状态参数的主函数。
 * @param {Object} controllerName 控制者
 * @param {Object} fieldsName 受控者
 * @param {boolean} status 受控者状态
 */
function associateItemsWithStatus(controllerName, fieldsName, status)
{
  var controllerItem = document.getElementsByName(controllerName);

  show = controllerItem[0].checked;

  keepOriginalEvent(controllerName, fieldsName, status);

// start of 判断里面是否有此item,无就加上
  var checkControllerExistInArray = checkControllerExist(controllerItem[0].name);

  if (!checkControllerExistInArray)
  {
    var i = controlRelations.length;
    controlRelations[i] = new Array();
    controlRelations[i][0] = controllerItem[0].name;
    for (var j = 0; j < fieldsName.length; j++)
    {
      controlRelations[i][j + 1] = fieldsName[j];
    }
  }
  else
  {
    addNewMember(controllerItem[0].name, fieldsName);
  }
// end of 判断里面是否有此item,无就加上

// start of 初始化受控者状态
  for (var i = 0; i < fieldsName.length; i++)
  {
    var elementItems = document.getElementsByName(fieldsName[i]);

    if(status)
    {
      for (var j = 0; j < elementItems.length; j++)
      {
        switchDisabledWithTrueStatus(controllerName, elementItems[j], show);
      }
    }
    else
    {
      for (var j = 0; j < elementItems.length; j++)
      {
        switchDisabledWithFalseStatus(controllerName, elementItems[j], show);
      }
    }

  }
// end of 初始化受控者状态
}


/**
 * 控制受控者的状态。
 * @param {Object} elementItem 受控者
 * @param {boolean} show 控制者的状态
 * @param {boolean} status 受控者的状态
 */
function switchDisabledWithFalseStatus(controllerName, elementItem, show)
{

  // 当field类型为(radio, checkbox)时, 修改其backgroundColor的css风格, 会使得外观很难看, 所以在此给予判断不作修改.
  var typeStatue = elementItem.type == "text" || elementItem.type == "textarea" || elementItem.type == "password" ? true : false;

  var isControllerDisabled = document.getElementById(controllerName).disabled;

  try
  {
    if(elementItem.type == "select-one") // 由于select-one的length>0,所以另起条件
    {
      elementItem.disabled = !show;

      if(isControllerDisabled)
      {
        elementItem.disabled = true;
      }

      return;
    }

    if (elementItem.length == null) // 不是数组element
    {
      if (originalCSSBg == null)
      {
        originalCSSBg = elementItem.style.backgroundColor;
        originalBgImage = elementItem.style.backgroundImage;
      }

      if(isControllerDisabled)
      {
        elementItem.disabled = true;
        if (typeStatue)
        {
          elementItem.style.backgroundColor = disabledTextBg;
          elementItem.style.backgroundImage = "none";
        }
        return;
      }

      elementItem.disabled = !show;
      if (show && typeStatue)
      {
        elementItem.style.backgroundColor = originalCSSBg;
        elementItem.style.backgroundImage = originalBgImage;
      }
      else
      {
        if (typeStatue)
        {
          elementItem.style.backgroundColor = disabledTextBg;
          elementItem.style.backgroundImage = "none";
        }
      }
      return;
    }

    if (elementItem.length > 0)
    {
      if (show || isControllerDisabled)
      {
        for (var i = 0; i < elementItem.length; i++)
        {
          elementItem[i].disabled = false;
        }
      }
      else
      {
        for (var i = 0; i < elementItem.length; i++)
        {
          elementItem[i].disabled = true;
        }
      }
      return;
    }
  }
  catch (e)
  {
  }
}

/**
 * 控制受控者的状态。
 * @param {Object} elementItem 受控者
 * @param {boolean} show 控制者的状态
 * @param {boolean} status 受控者的状态
 */
function switchDisabledWithTrueStatus(controllerName, elementItem, show)
{

  // 当field类型为(radio, checkbox)时, 修改其backgroundColor的css风格, 会使得外观很难看, 所以在此给予判断不作修改.
  var typeStatue = elementItem.type == "text" || elementItem.type == "textarea" || elementItem.type == "password" ? true : false;

  var isControllerDisabled = document.getElementById(controllerName).disabled;

  try
  {
    if(elementItem.type == "select-one") // 由于select-one的length>0,所以另起条件
    {
      elementItem.disabled = show;

      if(isControllerDisabled)
      {
        elementItem.disabled = false;
      }
      return;
    }

    if (elementItem.length == null) // 不是数组element
    {
      if (originalCSSBg == null)
      {
        originalCSSBg = elementItem.style.backgroundColor;
        originalBgImage = elementItem.style.backgroundImage;
      }

      if (show || isControllerDisabled)
      {
        elementItem.disabled = true;
        if (typeStatue)
        {
          elementItem.style.backgroundColor = disabledTextBg;
          elementItem.style.backgroundImage = "none";
        }
      }
      else
      {
        elementItem.disabled = false;
        if (typeStatue)
        {
          elementItem.style.backgroundColor = originalCSSBg;
          elementItem.style.backgroundImage = originalBgImage;
        }
      }
      return;
    }

    if (elementItem.length > 0)
    {
      if (show || isControllerDisabled)
      {
        for (var i = 0; i < elementItem.length; i++)
        {
          elementItem[i].disabled = true;
        }
      }
      else
      {
        for (var i = 0; i < elementItem.length; i++)
        {
          elementItem[i].disabled = false;
        }
      }
      return;
    }

  }
  catch (e)
  {
  }
}


/**
 * 控制器入口。
 * @param {Object} controllerName 控制者
 * @param {Array} controllerValue 控制者的value
 * @param {Object} controlledName 受控者
 * @param {boolean} status 受控者的状态
 */
function associateSelectItems(controllerName, controllerValue, controlledName, status)
{
  var controllerItem = document.getElementsByName(controllerName);
  var currentlyControllerValue = controllerItem[0].value;

  //保存受控者的onchange事件,在处理完此"关联控制"后,再执行此原来的onchange事件
  var originalOnchangeEvent = controllerItem[0].onchange;

  if (originalOnchangeEvent != null)
  {
    controllerItem[0].onchange = function()
    {
      originalOnchangeEvent(); //把受控者的onchange事件加上
      associateSelectOnchangeItems();
    }
  }
  else
  {
    controllerItem[0].onchange = associateSelectOnchangeItems;
  }

// start of 判断"控制者"和"受控者"的关系的二维数组是否存在,无就加上
  var checkControllerWithControledExistInArray = checkControllerExist(controllerItem[0].name + "_" + status);
  if (!checkControllerWithControledExistInArray)
  {
    var i = controlRelations.length;
    controlRelations[i] = new Array();
    controlRelations[i][0] = controllerItem[0].name + "_" + status;
    for (var j = 0; j < controlledName.length; j++)
    {
      controlRelations[i][j + 1] = controlledName[j];
    }
  }
// end of 判断"控制者"和"受控者"的关系的二维数组是否存在,无就加上

// start of 判断"控制者"和"控制者的value"的关系二维数组是否存在,无就加上
  var checkControllerWithValuesExistInArray = checkControllerExist(controllerItem[0].name + "Value_" + status);
  if (!checkControllerWithValuesExistInArray)
  {
    var i = controlRelations.length;
    controlRelations[i] = new Array();
    controlRelations[i][0] = controllerItem[0].name + "Value_" + status;
    for (var j = 0; j < controllerValue.length; j++)
    {
      controlRelations[i][j + 1] = controllerValue[j];
    }
  }
// end of 判断"控制者"和"控制者的value"的关系二维数组是否存在,无就加上

// start of 初始化受控者状态
  for (var i = 0; i < controlledName.length; i++)
  {
    var elementItems = document.getElementsByName(controlledName[i]);
    for (var j = 0; j < elementItems.length; j++)
    {
      switchControledStatus(elementItems[j], currentlyControllerValue, controllerValue, status);
    }
  }
// end of 初始化受控者状态
}


/**
 * 控制受控者的状态。
 * @param {Object} controlledName 控制者
 * @param {Array} currentlyControllerValue 当前控制者的value
 * @param {Object} controllerValue 受控者
 * @param {boolean} status 受控者的状态
 */
function switchControledStatus(controlledName, currentlyControllerValue, controllerValue, status)
{
  // 当field类型为(radio, checkbox)时, 修改其backgroundColor的css风格, 会使得外观很难看, 所以在此给予判断不作修改.
  var typeStatue = controlledName.type == "text" || controlledName.type == "textarea" || controlledName.type == "password" ? true : false;

  for (var i = 0; i < controllerValue.length; i++)
  {
    if (controllerValue[i] == currentlyControllerValue)
    {
      controlledName.disabled = status;

      if (originalCSSBg == null)
      {
        originalCSSBg = controlledName.style.backgroundColor;
        originalBgImage = controlledName.style.backgroundImage;
      }

      if (controlledName.disabled)
      {
        if (typeStatue)
        {
          controlledName.style.backgroundColor = disabledTextBg;
          controlledName.style.backgroundImage = "none";
        }
      }
      else
      {
        if (typeStatue)
        {
          controlledName.style.backgroundColor = originalCSSBg;
          controlledName.style.backgroundImage = originalBgImage;
        }
      }

      associateItemsWithSelectItems(controlledName);
      break;
    }
  }
}


/**
 * 获取当前受控者。
 * @param {Object} currentlyControllerName 当前控制者
 * @param {Array} currentlyControllerValue 当前控制者的value
 * @param {Array} controllerValue 控制者value
 * @param {boolean} status 受控者的状态
 */
function getControlled(currentlyControllerName, currentlyControllerValue, controllerValue, status)
{
  for (var i = 0; i < controlRelations.length; i++)
  {
    var elementItems = controlRelations[i];
    if (elementItems[0] == currentlyControllerName + "_" + status)
    {
      for (var j = 1; j < elementItems.length; j++) //start from 1
      {
        var controledName = document.getElementsByName(elementItems[j]);
        for (var t = 0; t < controledName.length; t++)
        {
          switchControledStatus(controledName[t], currentlyControllerValue, controllerValue, status);
        }
      }
      break;
    }
  }
}


/**
 * 获取控制当前受控者的value。
 * @param {Object} controllerName 当前控制者
 * @param {Array} controllerValue 当前控制者的value
 */
function getControlledValueArray(currentlyControllerName, currentlyControllerValue)
{
  var controllerValue = new Array();
  for (var i = 0; i < controlRelations.length; i++)
  {
    var elementItems = controlRelations[i];
    if (elementItems[0] == currentlyControllerName + "Value_false")
    {
      for (var j = 1; j < elementItems.length; j++) //start from 1
      {
        if (elementItems[j] == currentlyControllerValue)
        {
          for (var t = 1; t < elementItems.length; t++)
          {
            controllerValue[t - 1] = elementItems[t];
          }
          getControlled(currentlyControllerName, currentlyControllerValue, controllerValue, false);
        }
      }
    }
    else
    {
      if (elementItems[0] == currentlyControllerName + "Value_true")
      {
        for (var j = 1; j < elementItems.length; j++) //start from 1
        {
          if (elementItems[j] == currentlyControllerValue)
          {
            for (var t = 1; t < elementItems.length; t++)
            {
              controllerValue[t - 1] = elementItems[t];
            }
            getControlled(currentlyControllerName, currentlyControllerValue, controllerValue, true);
          }
        }
      }
    }
  }
}


/**
 * 保存控制者原来的onclick事件。
 * @param {Object} controllerName 控制者
 * @param {Object} fieldsName 受控者
 * @param {boolean} status 受控者状态
 */
function keepOriginalEvent(controllerName, fieldsName, status)
{
  var controllerItem = document.getElementsByName(controllerName);

  show = controllerItem[0].checked;

//保存此元素的onclick事件,在处理完此"关联控制"后,再执行此原来的onclick事件

  var originalOnclickEvent = controllerItem[0].onclick;
  if (originalOnclickEvent != null)
  {
    controllerItem[0].onclick = function()
    {
      originalOnclickEvent();//把控件原有的Javascript复原
      associateItemsOnClickEvent(status);
    }
  }
  else
  {
    controllerItem[0].onclick = function()
    {
      associateItemsOnClickEvent(status);
    }
  }

}


//============================ checkbox 控制 checkboxs =====================================


/**
 * checkbox关联控制入口函数。
 * @param {Object} controllerName 父(checkbox)
 * @param {Object} fieldsName 子(checkboxs)
 */
function associateCheckbox(controllerName, fieldsName, tableHighlight, checked, uncheck)
{
  associateCheckboxWithStatus(controllerName, fieldsName, false, tableHighlight, checked, uncheck)
}


/**
 * checkbox关联控制主函数。
 * @param {Object} controllerName 父(checkbox)控制者
 * @param {Object} fieldsName 子(checkboxs)受控者
 * @param {boolean} status 受控者状态
 */
function associateCheckboxWithStatus(controllerName, fieldsName, status, tableHighlight, checked, uncheck)
{
  var controllerItem = document.getElementsByName(controllerName);

  show = controllerItem[0].checked;

//保存此元素的onclick事件,在处理完此"关联控制"后,再执行此原来的onclick事件

  var originalOnclickEvent = controllerItem[0].onclick;
  if (originalOnclickEvent != null)
  {
    controllerItem[0].onclick = function()
    {
      originalOnclickEvent();//把控件原有的Javascript复原
      associateItemsOnClickEventToCheckboxes(status, tableHighlight, checked, uncheck);
    }
  }
  else
  {
    controllerItem[0].onclick = function()
    {
      associateItemsOnClickEventToCheckboxes(status, tableHighlight, checked, uncheck);
    }
  }

// start of 判断里面是否有此item,无就新创建,否则将其它受控者加上;

  var checkControllerExistInArray = checkControllerExist(controllerItem[0].name);

  if (!checkControllerExistInArray)
  {
    var i = controlRelations.length;
    controlRelations[i] = new Array();
    controlRelations[i][0] = controllerItem[0].name;
    for (var j = 0; j < fieldsName.length; j++)
    {
      controlRelations[i][j + 1] = fieldsName[j];
    }
  }
  else
  {
    addNewMember(controllerItem[0].name, fieldsName);
  }

// end of 判断里面是否有此item,无就新创建,否则将其它受控者加上;

// start of 初始化受控者状态
  if(show)
  {
    for (var i = 0; i < fieldsName.length; i++)
    {
      var elementItems = document.getElementsByName(fieldsName[i]);
      for(var n = 0; n < elementItems.length; n++)
      {
        elementItems[n].checked = true;
      }
    }
  }
// end of 初始化受控者状态

// '子(checkboxs)'控制'父(checkbox)'状态
  sonControllFather(fieldsName,controllerName);
}


/**
 * '子(checkboxs)'控制'父(checkbox)'状态。
 * @param {Object} son 控制者
 * @param {Object} father 受控者
 */
function sonControllFather(son,father){
  var num=0;
  for(var s = 0; s < son.length; s++)
  {
    var sonName = document.getElementsByName(son[s]);
    for(var n = 0; n < sonName.length; n++)
    {
      show = sonName[n].checked;

      if(show)
      {
        num++;
      }

      sonName[n].onclick = function()
      {
        associateItemsOnClickEventWithCheckboxs();
      }

// start of 判断里面是否有'子(checkboxs)'与'父(checkbox)'的二维数组是否存在,无就加上
      var checkControllerExistInArray = checkControllerExist(sonName[n].name);
      if (!checkControllerExistInArray)
      {
        var i = controlRelations.length;
        controlRelations[i] = new Array();
        controlRelations[i][0] = sonName[n].name;
        var controllerN = document.getElementsByName(father);
        controlRelations[i][1] = controllerN[0].name;
      }
// end of 判断里面是否有'子(checkboxs)'与'父(checkbox)'的二维数组是否存在,无就加上
    }
  }

// start of 判断里面是否有'子(checkboxs)'与'父(checkbox)'的二维数组是否存在,无就新创建,否则将其它受控者加上;
    var theName = document.getElementsByName(father);
    var checkControllerExistInArray = checkControllerExist(theName[0].name);
    if (!checkControllerExistInArray)
    {
      var i = controlRelations.length;
      controlRelations[i] = new Array();
      controlRelations[i][0] = theName[0].name;

      for(var j = 0; j < son.length; j++)
      {
        controlRelations[i][j+1] = son[j];
      }
    }
    else
    {
      addNewMember(theName[0].name, son);
    }
// end of 判断里面是否有'子(checkboxs)'与'父(checkbox)'的二维数组是否存在,无就新创建,否则将其它受控者加上;

// start of 初始化受控者状态

  if(num == son.length)
  {
    var fatherName = document.getElementsByName(father);
    fatherName[0].checked = true;
  }
// end of 初始化受控者状态

}


/**
 * 取得 onClick 事件的对象。
 */
function associateItemsOnClickEventWithCheckboxs()
{
  var ns6 = document.getElementById && !document.all;
  var ie = document.all;
  var objectEvent = ie ? event.srcElement : event.target; //取得发生点的对象

  show = objectEvent.checked;
  ControllerName = objectEvent.name;

  var fieldsName = getControlledItems(ControllerName);//获取受控者数组

// start of 逐一判断里面的受控件的状态,决定enable还是disable

  var elementItems = document.getElementsByName(fieldsName[0]);

  if(!show)
  {
    elementItems[0].checked = false;
    return;
  }

  var beController = getControlledItems(elementItems[0].name);
  var statu = true;

  for (var j = 0; j < beController.length; j++)
  {
    var allControllers = document.getElementsByName(beController[j]);
    for(var n = 0; n < allControllers.length; n++)
    {
      if(!allControllers[n].checked)
      {
       statu = false;
       return;
      }
    }
  }
  if(statu)
  {
    elementItems[0].checked = statu;
  }
// end of 逐一判断里面的受控件的状态,决定enable还是disable

}

/**
 * 组合控制多组 checkbox 对象。
 * @param {Object} controller 控制者
 * @param {Object} fieldsName 受控者
 */
function associateCheckboxes(controller,fieldsName,tableHighlight, checked, uncheck)
{

  checkbox = new Array();

  checkboxArray = new Array();

  checkboxsArray = new Array();

  var checkboxLen = 0;

  var checkboxArrayLen = 0;

  var checkboxsArrayLen = 0;

  for(var i = 0; i < fieldsName.length; i++)
  {

    var allControllers = document.getElementsByName(fieldsName[i]);

    var str = eval("fieldsName[i]");
    var strLen = str.length;
    if((str.charAt(strLen - 2) == "[") && (str.charAt(strLen - 1) == "]"))//判断是否传入一个checkbox数组
    {
      var checkboxName = str.substring(0, strLen - 1);
      var checkboxsName = str.substring(0, strLen - 2);
      for(var f = 0; f < document.forms.length; f++)
      {
        var obj = document.forms[f];

        if(typeof(obj.length) == "object")//当field 的名为 'length' 时,获取不了obj的length
        {
          alert("请不要在页面定义 field 的名为 'length'"); // SKIP CHECK: PropertiesInsteadMessage
          return;
        }

        for (var t = 0; t < obj.length; t++)
        {
          if ((obj.elements[t].type == "checkbox"))
          {
            var theName = obj.elements[t].name;

            if(theName.substring(0, strLen - 1) == checkboxName)
            {
               checkboxArray [checkboxArrayLen] = theName;
               checkboxArrayLen++;
            }

            if(theName.substring(0, strLen - 2) == checkboxsName)
            {
               checkboxsArray [checkboxsArrayLen] = checkboxsName;
               checkboxsArrayLen++;
            }

          }
        }
      }
      continue;
    }

    if(allControllers[0].type == "text")
    {
      alert("associateCheckboxes()只可以控制类型为 checkbox 的field,不能输入其它类型的field."); // SKIP CHECK: PropertiesInsteadMessage
      continue;
    }

    if(allControllers[0].type == "checkbox")
    {
     checkbox[checkboxLen] = allControllers[0].name;
     checkboxLen ++ ;
    }

  }

  if(checkbox.length > 0)
  {
    associateCheckbox(controller, checkbox, tableHighlight, checked, uncheck);
  }

  if(checkboxArray.length > 0)
  {
    associateCheckbox(controller, checkboxArray, tableHighlight, checked, uncheck);
  }

  if(checkboxsArray.length > 0)
  {
    associateCheckbox(controller, checkboxsArray, tableHighlight, checked, uncheck);
  }
}


