/*
 * get_params_from_url()
 * transform   in :
 * array( 'this' => array('that' , 'moo'), 'foo'=> 'bar')
 */
 
 
//<![CDATA[

function getParamsFromUrl(url)
{
  url = url || window.location.href;
  url = url.replace(/#$/, '');
  url = url.split('?');
  if(url.length > 1)
  {
    var urlStr = url[1];
  }
  else
  {
    var urlStr = url[0];
  }
  var parts = urlStr.split('&');
  var params = new Object();
  for (var i=0; i<parts.length; i++)
  {
    var paramData = parts[i].split('=');
    var key = paramData[0];
    if (typeof params[key] == "array")
    {
      params[key].push(paramData[1]);
    }
    else if (params[key])
    {
      var newData = new Array(params[key], paramData[1]);
      params[key] = newData;
    }
    else
    {
      params[key] = paramData[1];
    }
  }
  return params;
}
  
// use : serializeForms("div#content-main form")
// return : a string representing serialized forms within this container
function serializeForms(expr)
{
  var serialized_forms = new Array();
  
  var selection = $(expr);
  if(selection[0].tagName == 'FORM')
  {
	  selection.each(
		function()
		{
			serialized_forms.push(this.name + '=' + escape($(this).serialize()));
		}
	  );
  }
  else
	{
		var form_name = selection.parents('form').attr('name');
		serialized_forms.push(form_name + '=' + escape(selection.serialize()));
	}
  
  return escape(serialized_forms.join('&'));
}

// url : if not specified, will use the current url
// urlVariable : url variable name that contains forms serialized string
// return an object representing forms 
function unserializeForms(url, urlVariable)
{
  // url : http://server/file?this=that&this=moo&foo=bar&forms=floflo%3Dfoo%253Doof%2526bar%253Drab%26plan_selector%3Dplan%253Dplan3
  url = url || window.location.href;
  urlVariable = urlVariable || 'forms';
  
  var formsObj = new Object;
  
  // getParamsFromUrl(url)[urlVariable] : floflo%3Dfoo%253Doof%2526bar%253Drab%26plan_selector%3Dplan%253Dplan3 
  // unescaped : floflo=foo%3Doof%26bar%3Drab&plan_selector=plan%3Dplan3
  // split('&') : ['floflo=foo%3Doof%26bar%3Drab','plan_selector=plan%3Dplan3']
  $.each(unescape(getParamsFromUrl(url)[urlVariable]).split('&'),
      function(i, form)
      {                                                                 // 1st loop : form = 'floflo=foo%3Doof%26bar%3Drab'                       // 2nd loop: form = 'plan_selector=plan%3Dplan3'
        var formArray = form.split('=');                                // 1st loop : formArray = ['floflo','foo%3Doof%26bar%3Drab']              // 2nd loop: ...
        var formName = formArray[0];                                    // 1st loop : formName = 'floflo'                                         // 2nd loop: 
        //var formElts = unescape(formArray[1]).split('&');               // 1st loop : formElts = ["foo=oof", "bar=rab"]                           // 2nd loop: 
        formsObj[formName] = getParamsFromUrl(unescape(formArray[1]));
      }
    );
  return formsObj;
}

function restoreForms(forms)
{
  $.each(forms,
    function(formName, elements)
    {
      $.each(elements,
        function(eltName, eltValues)
        {
          var elt = $('form[@name=' + formName + ']').find('*[@name=' + eltName + ']');
          if(elt.length)
          {
            var eltTag = elt[0].tagName;
            var eltType = elt[0].type;
            
            if(eltTag == 'INPUT' && (eltType == 'checkbox' || eltType == 'radio')   ||   eltTag == 'SELECT')    // process radio buttons, checkboxes and select drop down separatly
            {
              var selector, selection;
              switch(eltTag)                                                                                    // define basic variables used in the script later on
              {
                case 'INPUT':
                  selector = $(elt);
                  selection = 'checked';
                  break;
                case 'SELECT':
                  selector = $(elt).children('option');
                  selection = 'selected';
              }
              
              selector.removeAttr(selection);                       // uncheck / unselect any preselected elements (only usefull for FF that retains previous form values)
              if (typeof eltValues != "object")                     // if there's only one item to check / select
              {
                eltValues = [eltValues];                            // then convert it to a list of one element
              }
              
              $.each(eltValues,                                     // go through all items
                function(i, eltValue)
                {
                  selector.filter('[@value=' + eltValue + ']').attr(selection,selection);   // and check / select them one by one
                }
              );
            }
            else if(eltTag == 'TEXTAREA')                           // Textareas
            {
              $(elt).html(eltValues);                              // set the inner HTML 
            }
            else                                                   // others (input text, hidden mainly)
            {
              $(elt).val(eltValues);                               // just set its value
            }

          }
        }
      );
    }
  );
}
//]]>