title: jqGrid multi-checkbox custom edittype solution
body: <p>For those of you trying to understand jqGrid custom edit types ...</p>
  
  <p>I created a multi-checkbox form element, and thought I'd share. This was built using version 3.6.4. If anyone has a more efficient solution, please pass it on.</p>
  
  <p>Within the colModel, the appropriate edit fields look like this:</p>
  
  <pre><code>edittype:'custom'
  editoptions:{ custom_element:MultiCheckElem, custom_value:MultiCheckVal, list:'Check1,Check2,Check3,Check4' }
  </code></pre>
  
  <p>Here are the javascript functions (BTW, It also works – with some modifications – when the list of checkboxes is in a DIV block):</p>
  
  <pre><code>//————————————————————
  // Description:
  //   MultiCheckElem is the "custom_element" function that builds the custom multiple check box input
  //   element. From what I have gathered, jqGrid calls this the first time the form is launched. After
  //   that, only the "custom_value" function is called.
  //
  //   The full list of checkboxes is in the jqGrid "editoptions" section "list" tag (in the options
  //   parameter).
  //————————————————————
  function MultiCheckElem( value, options )
  {
     //———-
     // for each checkbox in the list
     //   build the input element
     //   set the initial "checked" status
     // endfor
     //———-
     var ctl = '';
     var ckboxAry = options.list.split(',');
  
     for ( var i in ckboxAry )
     {
        var item = ckboxAry[i];
        ctl += '&lt;input type="checkbox" ';
  
        if ( value.indexOf(item + '|') != -1 )
           ctl += 'checked="checked" ';
        ctl += 'value="' + item + '"&gt; ' + item + '&lt;/input&gt;&lt;br /&gt;&amp;nbsp;';
     }
  
     ctl = ctl.replace( /&lt;br /&gt;&amp;nbsp;$/, '' );
     return ctl;
  }
  
  
  
  //————————————————————
  // Description:
  //   MultiCheckVal is the "custom_value" function for the custom multiple check box input element. It
  //   appears that jqGrid invokes this function the first time the form is submitted and, the rest of
  //   the time, when the form is launched (action = set) and when it is submitted (action = 'get').
  //————————————————————
  function MultiCheckVal(elem, action, val)
  {
     var items = '';
     if (action == 'get') // the form has been submitted
     {
        //———-
        // for each input element
        //   if it's checked, add it to the list of items
        // endfor
        //———-
        for (var i in elem)
        {
           if (elem[i].tagName == 'INPUT' &amp;&amp; elem[i].checked )
              items += elem[i].value + ',';
        }
  
        // items contains a comma delimited list that is returned as the result of the element
        items = items.replace(/,$/, '');
     }
     else // the form is launched
     {
        //———-
        // for each input element
        //   based on the input value, set the checked status
        // endfor
        //———-
        for (var i in elem)
        {
           if (elem[i].tagName == 'INPUT')
           {
              if (val.indexOf(elem[i].value + '|') == -1)
                 elem[i].checked = false;
              else
                 elem[i].checked = true;
           }
        } // endfor
     }
  
     return items;
  }
  </code></pre>