var Utils =
{
  getSelectedRow: function( grid)
  {
    var result = null;
    var record = grid.getSelectionModel().getSelected();
    var store = grid.getStore();

    var count = store.getCount();
    var i = 0;

    while (i < count && store.getAt( i) != record)
    {
      ++i;
    }

    if (i < count)
    {
      result = grid.getView().getRow( i);
    }

    return result;
  },

  /**
   * Formatea una cadena de caracteres, sustituyendo todas las expresiones {xxx}
   * por los valores correspondientes del parametro values. Si values es un
   * arreglo, las expresiones deben ser {0}, {1}, ..., {N} donde N es
   * values.length y se sustituye {i} por values[i]. Las expresiones {N+1}... se
   * quedan como estan. Si values no es un arreglo, se usan los nombres de las
   * propiedades. Por ejemplo, si values contiene las propiedades "nombre" y
   * "edad", se estos valores en todos los lugares donde se encuentren {nombre}
   * y {edad}.
   *
   * @param template Plantilla de texto, con expresiones entre llaves - {} que serán
   *          sustituidas por los valores del objeto values.
   * @param values Objeto de valores. Puede ser un arreglo, un objeto o un listado de valores.
   * @returns Texto con los valores sustituidos.
   */
  format: function( /*template, values... */)
  {
    var result = null;
    var template = arguments[0];
    var arr = null;
    var obj = null;

    if (arguments.length == 2)
    {
      // Solo 2 argumentos: puede ser un objeto, un arreglo o un valor simple
      var value = arguments[1];

      if (typeof value == "object") // Solo true si es un arreglo o un objeto
      {
        if (value.push && value.pop)
        {
          arr = value; // Camina como un arreglo...
        }
        else
        {
          obj = value; // Sino, es un objeto
        }
      }
      else // Y sino, es un pobre tipo simple: lo encapsulamos como arreglo
      {
        arr = [value];
      }
    }
    else // Mas de 2 argumentos: del segundo en adelante se convierten en un arreglo
    {
      arr = Array.prototype.slice.call( arguments, 1);
    }

    if (arr)
    {
      result = Utils.formatArray( template, arr);
    }
    else
    {
      result = Utils.formatObject( template, obj);
    }

    return result;
  },

  formatArray: function( template, arr)
  {
    var result = template;

    for (var i = 0; i < arr.length; i++)
    {
      var regex = new RegExp( '\\{' + i + '\\}', 'g');
      result = result.replace( regex, arr[i]);
    }

    return result;
  },

  formatObject: function( template, obj)
  {
    var result = template;

    for (var prop in obj)
    {
      if (obj.hasOwnProperty( prop))
      {
        var regex = new RegExp( '\\{' + prop + '\\}', 'g');
        result = result.replace( regex, obj[prop]);
      }
    }

    return result;
  },

  addMClass: function()
  {
    $('#month').addClass( 'validate[required]');
  },

  addDClass: function()
  {
    var month = document.getElementById( "month");

    if (month.value != '')
    {
      document.getElementById( "day").className = 'validate[required]';
    }
    else
    {
      document.getElementById( "day").className = '';
      alert( 'Month ==0');
    }
  },

  getUTCTime: function( date)
  {
    var minutes = date.getUTCMinutes();
    if (minutes < 10)
    {
      minutes = '0' + minutes;
    }

    return date.getUTCHours() + ':' + minutes;
  },

  makeVote: function()
  {
    var val = 0;
    var voteForm = document.forms.voto;

    for (var i = 0; i < voteForm.length; i++)
    {
      if (voteForm[i].checked)
      {
        val = voteForm[i].value;
      }
    }

    var pollBox = $( "#wait_msg");
    pollBox.innerHTML = '<div class="reload"><img src="images/loading.gif" alt="waiting" />' + "Waiting for vote...</div>";

    $.get( 'admin/lib/vote.php?processPoll&val=' + val, null, function( data){
      pollBox.html( data);
    }, 'html');
  },

  showSubmitFailure: function( form, action)
  {
    Ext.MessageBox.alert( this.errorMsgTitle, action.result.error_message);
  },

  submitForm: function( config)
  {
    var form = null;

    // Si nos pasan un FormPanel extraemos el BasicForm de adentro
    if (config.form instanceof Ext.form.FormPanel)
    {
      form = config.form.getForm();
    }
    else
    {
      form = config.form;
    }

    form.url = config.url;

    form.submit({
      method: config.method || 'post',
      waitTitle: config.waitTitle || 'Please wait...',
      waitMsg: config.waitMsg || 'Adding data...',

      params: config.params,

      // reset es true por defecto
      reset: (config.reset == false ? false : true),

      success: function( form, action)
      {
        if (config.reloadStore)
        {
          config.reloadStore.reload();
        }

        if (config.hideWindow)
        {
          config.hideWindow.hide();
        }

        if (config.success)
        {
          config.success.call( config.scope || window, action.result);
        }
      },

      failure: function( form, action)
      {
        switch (action.failureType)
        {
          case Ext.form.Action.CLIENT_INVALID:
            Dialogs.error( 'Form fields may not be submitted with invalid values');
            break;

          case Ext.form.Action.CONNECT_FAILURE:
            Dialogs.error( 'Server communication failed');
            break;

          case Ext.form.Action.SERVER_INVALID:
            Dialogs.error( action.result.error_message);
            break;

          default:
            Dialogs.error( action.result.error_message);
            break;
        }
      },

      scope: this
    });
  },

  getSelectedIds: function( grid, idField)
  {
    var result = [];
    var idFieldName = idField || 'id';

    var rows = grid.getSelectionModel().getSelections();
    var count = rows.length;

    for (var i = 0; i < count; i++)
    {
      result.push( rows[i].get( idFieldName));
    }

    return result;
  },

  getEditButton: function( el, grid)
  {
    var result = null;

    if (el instanceof Ext.Button)
    {
      result = el;
    }
    else
    {
      // Esto es para obtener el 2do boton del panel - el de Editar
      result = grid.getTopToolbar().items.get( 2);
    }

    return result.getId();
  },

  convertFloat: function( decimalPlaces)
  {
    var zeros = '';

    for (var i = 0; i < decimalPlaces; i++)
    {
      zeros += '0';
    }

    return function( value, record){
      return Ext.util.Format.number( value, '0.' + zeros);
    };
  },

  getMinDate: function()
  {
    var result = new Date();
    result.setYear( 2000);

    return result;
  },
  
  confirmedDelegate: function( message, action, scope)
  {
    return function() {
      Dialogs.confirm( message, action, scope);
    };
  }
};

