// -----------------------------------------------------------
// - jquery.databindextender.js
// -
// - Extensie die het mogelijk maakt om data uit een json object
// - te databinden aan een form.
// - BHE 20090122
// -----------------------------------------------------------

// GEBRUIK:
//  Maak <form> tag en voeg enkele inputs toe. De "name" attributen van de inputs moeten
//  overeen komen met de properties van het JSON object.
//
// AANROEP:
//  $("#mijnForm").dataBind(dataObject);


jQuery.fn.dataBind = function(dataObject)
{
  try
  {
    //alert($(this).html());
    var controlArray = $(this).find("*[name]");

    controlArray.each(function() {BindDataToInput(dataObject, $(this));});
  }
  catch(e)
  {
    alert(e);
  }
}

function BindDataToInput(dataObject, inputObject)
{
  try
  {
    //alert("Binding " + inputObject.attr("name"));
    if(dataObject[inputObject.attr("name")] != null)
    {
      if(inputObject.attr("type") == "checkbox")
      {
        inputObject.attr("checked", (dataObject[inputObject.attr("name")] == 1));
      }
      else
      {
        inputObject.val(dataObject[inputObject.attr("name")]);
      }
    }
  }
  catch(e)
  {
    alert(e);
  }
}


// En de terugweg
// Gebruik:
//  var mijnDataObject = $("#mijnForm").getDataObject();
jQuery.fn.getDataObject = function()
{
  var dataObject = {};

  formElement = $(this)[0];
  for(var i=0; i < formElement.elements.length; i++)
  {
    var elementObject = formElement.elements[i];
    if(elementObject.type == "radio" || elementObject.type == "checkbox")
    {
      if(elementObject.checked)
      {
        dataObject[elementObject.name] = 1;
      }
      else
      {
        dataObject[elementObject.name] = 0;
      }
    }
    else
    {
      dataObject[elementObject.name] = elementObject.value;
    }
  }

  return dataObject;
}

jQuery.fn.showUserError = function(userError)
{
  $(this).cleanupUserError();

  $(this).find(".userError").show();
  $(this).find(".userErrorText").text(userError.ErrorMessage);

  for(i in userError.InvalidProperties)
  {
    invalidProperty = userError.InvalidProperties[i];
    errorInput = $(this).find("input[name=" + invalidProperty.Name + "]");
    errorInput.addClass("ui-state-error");

    errorTextSpan = $("<span></span>");
    errorTextSpan.addClass('controlError').text(" " + invalidProperty.ErrorMessage);
    errorInput.after(errorTextSpan);
    //[name=" + invalidProperty.Name + "]
  }
}

jQuery.fn.cleanupUserError = function()
{
  $(this).find(".userError").hide();

  $(this).find("input").removeClass("ui-state-error");
  $(this).find("span[class=controlError]").remove();
}

// GEBRUIK:
//  Maak een lege <select> tag en vul die met een array van objecten.
//
// AANROEP:
//  $("#mijnSelect").addListItems(objectenArray, displayPropertyNaam, valuePropertyNaam, [selecteerbaarPropertyNaam], [isgeselecteerdPropertyNaam]);
jQuery.fn.addListItems = function(objectArray, textProperty, valueProperty, isSelectableProperty, isSelectedProperty)
{
    var selectObject = $(this);

    for(var i in objectArray)
    {
        var optionObject = $("<option></option>");
        optionObject.attr("value", objectArray[i][valueProperty]);
        optionObject.text(objectArray[i][textProperty]);
        if(isSelectableProperty)
        {
            if(!objectArray[i][isSelectableProperty])
            {
                optionObject.attr("disabled", "disabled");
            }
        }
        if(isSelectedProperty)
        {
          if(objectArray[i][isSelectedProperty])
          {
            optionObject.attr("selected", "selected");
          }
        }
        selectObject.append(optionObject);
    }
}

jQuery.fn.outerHTML = function(s)
{
  return (s)
  ? this.before(s).remove()
  : jQuery("<p>").append(this.eq(0).clone()).html();
}
