/**
 * This function sets the values of form element variables from an array
 * This is the reverse process of Mark Constable's serialize function
 * It is expected to be used as a call back for an ajax call that retrieves the form data
 * @param data : array or hash containing name,value pairs for elements in the form
 *
 * Examples
 *
 * 1. Deserialize from an array
 *    $('#form-id').deserialize([{'name':'firstname','value':'John'},{'name':'lastname','value':'Resig'}]);
 *
 * 2. Deserialize from a hash(object)
 *    $('#form-id').deserialize({'firstname':'John','lastname':'Resig'});
 *
 * 3. Deserialize multiple config for select/radio/checkbox
 *    $('#form-id').deserialize({'toppings':['capsicum','mushroom','extra_cheese'],'size':'medium'})
 * which will set the corresponding select/radio/checkbox config for toppings
 *
 * 3. Deserialize multiple config for select/radio/checkbox and with isPHPnaming = true
 *    $('#form-id').deserialize({'toppings':['capsicum','mushroom','extra_cheese'],'size':'medium'},{isPHPnaming:true})
 * which will set the corresponding select/radio/checkbox config for toppings, but will ignore select names ending with []
 *
 * @return         the jQuery Object
 * @author         Ashutosh Bijoor (bijoor@reach1to1.com)
 * @version        0.35
 */
$.fn.deserialize = function(d,config) {
  var data= d;
  me  = this;
 
  if (d === undefined) {
    return me;
  }
 
  config = $.extend({ isPHPnaming : false,
            overwrite : true},config);
  
  // check if data is an array, and convert to hash, converting multiple entries of 
  // same name to an array
  if (d.constructor == Array) {
    data={};
    for(var i=0; i<d.length; i++) {
      if (typeof data[d[i].name] != 'undefined') {
        if (data[d[i].name].constructor!= Array) {
          data[d[i].name]=[data[d[i].name],d[i].value];
        } else {
          data[d[i].name].push(d[i].value);
        }
      } else {
        data[d[i].name]=d[i].value;
      }
    }
  }
 
  // now data is a hash. insert each parameter into the form
  $('input,select,textarea',me)
  .each(function() {
        var p=this.name;
        var v = [];
        
        // handle wierd PHP names if required
        if (config.isPHPnaming) {
          p=p.replace(/\[\]$/,'');
        }
        if(p && data[p] != undefined) {
          v = data[p].constructor == Array ? data[p] : [data[p]];
        }
        // Additional parameter overwrite
        if (config.overwrite === true || data[p]) {
          switch(this.type || this.tagName.toLowerCase()) {
          case "radio":
          case "checkbox":
            this.checked=false;
            for(var i=0;i<v.length;i++) {
              this.checked|=(this.value!='' && v[i]==this.value);
            }
            break;
          case "select-multiple" || "select":
            for( i=0;i<this.options.length;i++) {
              this.options[i].selected=false;
              for(var j=0;j<v.length;j++) {
                this.options[i].selected|=(this.options[i].value!='' && this.options[i].value==v[j]);
              }
            }
            break;
          case "button":
          case "submit":
            this.value=v.length>0?v.join(','):this.value;
              break;
          default:
            this.value=v.join(',');
          }
        }
      });
  return me;
};