/*
 * Como su propio nombre indica, contiene las funciones comunes
 */

// Objeto que contiene todos los mensajes a mostrar al usuario
var msg = {};

// Cargo los mensajes de los span contenidos en el div messages (el id del span se convierte en la propiedad del objeto msg)
$().ready(function () {
  $('#messages span').each(function() {
    msg[$(this).attr('id')] = $(this).html();
  });

  $('#messages').remove();
});


function notify(title, text)
{
  if (!text) {
    text = title;
    title = msg.info;
  }
  return $.gritter.add({title: title, text: text});
}


function enableDlgButton(id, enable)
{
  //var dlgFirstButton = $('.ui-dialog-buttonpane').find('button:first');
  /*var dlgFirstButton = $(id);

  if (enable) {
    dlgFirstButton.attr('disabled', '');
    dlgFirstButton.removeClass('ui-state-disabled');
  } else {
    dlgFirstButton.attr('disabled', 'disabled');
    dlgFirstButton.addClass('ui-state-disabled');
  }*/

  if (enable)
    $(id).button('enable');
  else
    $(id).button('disable');
}


function areYouSure(yesFunc, text)
{
  var div = $('<div/>').attr('title', 'Confirmación');

  if (!text) {
    text = msg.areYouSure;
  }
  //text = '<span class="ui-icon ui-icon-info" style="float:left; margin:0 7px 20px 0;"></span>' + text;
  text = '<img src="' + gPrintmaxWebInterfaceImg + 'question.gif" alt="?" style="float:left; margin:0 7px 20px 0;" />' + text;
  div.html(text);

  div.dialog({
    modal: true,
    resizable: false,
    width: 300,
    height: 'auto',
    buttons: {
      Si: function() {
        $(this).dialog("close");
        yesFunc();
      },
      No: function() {
        $(this).dialog("close");
      }
    }
  });
}


function popHTMLDialog(id, url, title)
{
  var div = $('#' + id);

  if (div.length == 0) {
    div = $('<div/>', {id: id, title: title});
    div.load(url);
  }

  div.dialog({
    modal: true,
    width: 800,
    height: 600,
    resizable: true
  });

  return false;
}


/*
 * Muestra u oculta una animación y bloquea el acceso a toda la página con un div transparente.
 * @param show Indica si debe mostrarse u ocultarse la animación (verdadero o falso)
 */
function waitScreen(show)
{
  var span;  // Para agrupar los divs y la imagen
  var div;

  debugLog('waitScreen ' + (show? 'ON': 'OFF'));

  if (show) {
    span = $('<span/>', {id: 'waitElements'});

    div = $('<div/>', {
      id: 'waitBack'
    }).append($('<div/>', {
      id: 'waitDiv',
      'class': 'transparent_class'
    }));

    span.append(div).append($('<img/>', {
      id: 'waitImg',
      src: gPrintmaxWebInterfaceImg + 'animated_progress.gif',
      alt: 'Espere...'
    }));
    $('body').append(span);
  }
  else {
    $('#waitElements').remove();
  }
}


/**
 * Vacía todos los campos de un formulario
 * @param id ID del form
 */
function clearForm(id)
{
  $(':input','#' + id)
   .not(':button, :submit, :reset, :hidden')
   .val('')
   .removeAttr('checked')
   .removeAttr('selected');
}


function getUrlParam(name)
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp(regexS,'i');
  var results = regex.exec(window.location.href);

  if (results == null)
    return "";
  else
    return results[1];
}


/*
 * Devuelve el nombre de la página actual.
 * @param extension Indica si queremos incluir la extensión de la página (por defecto verdadero).
 * @return Nombre de la página actual.
 */

function getPageName(extension)
{
  var page = window.location.pathname;

  if (typeof(extension) == 'undefined')
    extension = true;

  if (!extension)
    page = page.substring(0, (page.indexOf('.') == -1) ? page.length : page.indexOf('.'));

  return page.substring(page.lastIndexOf('/') + 1);
}


/**
 * Comprueba si una dirección de email tiene el formato correcto
 * @param email Cadena con el email a comprobar
 * @return Verdadero si el formato es correcto
 */
function isValidEmail(email)
{
  var EMAIL = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  // TODO: añadir el + a valores permitidos, pero da error invalid range in character class
  return EMAIL.test(email);
}


/**
 * Comprueba si un NIF/CIF/NIE tiene la estructura correcta
 * @param nif Cadena con el NIF a comprobar
 * @return Verdadero si la estructura es correcta
 * @example
 *   if (! isNIF(nif))
 *     $('#btn').attr('disabled') = true;
 */
function isValidNIF(nif)
{
  var NIF = /^[a-s]\d{8}|\d{8}[a-z]$|x\d{7}[a-z]$/i;
  return NIF.test(nif);
}


var mySendButton;  // Almacena una referencia al botón de envío
var myCheckField = new Object();  // Almacena el número de campos de clase chequear que han sido validados correctamente

/**
 * Añade validación a un formulario según las clases de cada label de cada campo.
 * También añade el asterisco a los campos obligatorios.
 * Clases:
 * - obligatorio: El campo debe contener algún caracter
 * - numero: El campo solo puede contener números
 * - email: El campo debe tener formato de email
 * - nif: El campo debe contener un NIF/CIF/NIE válido
 * @param form ID del formulario a validar (sin #)
 * @param button ID del botón de envío (sin #)
 */
function validateForm(form, button)
{
  mySendButton = $('#' + button);

  $('#' + form + ' .obligatorio').append($('<span/>').addClass('asterisk').html(' *'));
  $('#' + form + ' .chequear').each(function() {
    var input = $(this);

    input.after($('<img/>', {src: gPrintmaxWebInterfaceImg + 'progress.gif', alt: 'Espere', id: input.attr('id') + 'Image', 'class': 'chequear-img displaynone'}));
    input.width(input.width() - 20);
    input.blur(checkFormField);
    myCheckField[input.attr('id')] = false;
  });
  $('#' + form + ' input[type=text]').keyup(enableSendButton);
  $('#' + form + ' input[type=checkbox]').click(enableSendButton);

  enableSendButton();
}

/**
 * Hace una petición ajax para comprobar el contenido del campo
 */
function checkFormField() {

  var input = $(this);
  var image = input.next();

  enableMySendButton(false);

  if (input.val() == '') {
    image.attr('src', gPrintmaxWebInterfaceImg + 'ko.png').removeClass('displaynone');
  }
  else {
    image.attr('src', gPrintmaxWebInterfaceImg + 'progress.gif').removeClass('displaynone');

    $.get(gPrintmaxVerificarClienteDuplicado, input.attr('id') + '=' + input.val(), function(xml) {
      if ($(xml).find('status').text() == 'ok') {
        image.attr('src', gPrintmaxWebInterfaceImg + 'ok.png');
        myCheckField[input.attr('id')] = true;
        enableSendButton();
      }
      else {
        image.attr('src', gPrintmaxWebInterfaceImg + 'ko.png');
        myCheckField[input.attr('id')] = false;
      }
    });
  }
}

/**
 * Comprueba que los dos campos de contraseña son iguales y si no avisa al usuario y los borra
 */
function checkFormPassword(id1, id2) {

  if ($(id1).val() != '' && $(id2).val() != '') {
    if ($(id1).val() != $(id2).val()) {
      alert('Las contraseñas no coinciden');
      $(id1).val('');
      $(id2).val('');
    }
  }
}

function enableSendButton()
{
  var enabled = true;
  var id;

  // Comprueba que se rellenen los campos obligatorios
  $('.obligatorio').each( function() {
    id = '#' + $(this).attr('for');

    if ($(id).attr('type') == 'checkbox') {
      enabled = $(id).attr('checked');
    }
    else {
      if ($(id).val().replace(/^\s*|\s*$/g,"") == '') {  // Trim()
        enabled = false;
      }
    }

    if (!enabled) {
      return false;  // Exit each loop
    }
  });

  if (enabled) {
    // Comprueba que los campos numéricos tengan solo números
    $('.numero').each( function() {
      id = '#' + $(this).attr('for');
      if (isNaN($(id).val())) {
        enabled = false;
        return false;  // Exit each loop
      }
    });

    if (enabled) {
      // Comprueba que los campos con NIF sean correctos
      $('.nif').each( function() {
        id = '#' + $(this).attr('for');
        if (! isValidNIF($(id).val())) {
          enabled = false;
          return false;  // Exit each loop
        }
      });

      if (enabled) {
        // Comprueba que los campos con email sean correctos
        $('.email').each( function() {
          id = '#' + $(this).attr('for');
          if (! isValidEmail($(id).val())) {
            enabled = false;
            return false;  // Exit each loop
          }
        });
      }
    }
  }

  if (enabled) {
    for(var key in myCheckField) {
      if (!myCheckField[key]) {
        enabled = false;
      }
    }
  }
  enableMySendButton(enabled);
}


function enableMySendButton(enable) {

  if(mySendButton.hasClass('ui-button')) {  // Si es botón de jquery-ui
    if (enable)
      mySendButton.button('enable');
    else
      mySendButton.button('disable');
  }
  else
    mySendButton.attr('disabled', !enable);
}


/*
 * Convierte un formulario a tabla HTML para ser enviado por email
 * @param formID ID del formulario a validar (sin #)
 */
function formToHTML(formID)
{
  var body = '<table>';

  $('#' + formID + ' :input').each(function() {
    var id    = $(this).attr('id');
    var label = $('label[for=' + id + ']').text();
    var val;

    switch ($(this).attr('type')) {
      case 'text':
        val = $(this).val();
        break;
      case 'checkbox':
        val = $(this).attr('checked')? 'Si': 'No';
        break;
      default:
        return true;
        break;
    }

    if (label && val) {
      body += '<tr><td valign="top" width="200">' + label + ':</td><td valign="top"><strong>' + val + '</strong></td></tr>';
    }
  });

  body += '</table>';
  return body;
}

// ***** Cookies ***************************************************************

// ***** setCookie *****

/*

PARAMETERS:

name, value  - cookie name & value
expires      - cookie expiration date (defaults to end of current session)
path, domain - cookie path & domain (defaults to document's path & domain)
secure       - cookie sent only over secure connection

example CALLS:

setCookie("counter", "1");
setCookie("counter", "1", Date("January 01, 2010 00:00:01"));
setCookie("counter", "1", undefined, '/');

*/

function setCookie(name, value, expires, path, domain, secure)
{
  document.cookie =
    name+"="+escape(value)+
    (expires ? "; expires="+expires.toGMTString() : "")+
    (path    ? "; path="   +path   : "")+
    (domain  ? "; domain=" +domain : "")+
    (secure  ? "; secure" : "");
  //alert('setCookie: ' + name);
}

// ***** setCookieLT *****

// PARAMETERS: lifetime - cookie lifetime in seconds

function setCookieLT(name, value, lifetime, path, domain, secure)
{
  if (lifetime) lifetime = new Date(Date.parse(new Date())+lifetime*1000);
  setCookie(name, value, lifetime, path, domain, secure);
}

// ***** getCookie *****

function getCookie(name)
{
  var cookie, offset, end;
  cookie  = " "+document.cookie;
  offset  = cookie.indexOf(" "+name+"=");
  if (offset == -1) return undefined;
  offset += name.length+2;
  end     = cookie.indexOf(";", offset)
  if (end    == -1) end = cookie.length;
  return unescape(cookie.substring(offset, end));
}

// ***** delCookie *****

// PARAMETERS:
//
// name         - cookie name
// path, domain - cookie path & domain (the same as those used to create cookie)

function delCookie(name, path, domain)
{
  if (getCookie(name)) {
    //document.cookie = name + '=; expires=Thu, 01-Jan-70 00:00:01 GMT;';
    setCookie(name, "", new Date("January 01, 2000 00:00:01"), path, domain);
    //alert('delCookie: ' + name);
  }
}


/**
 * Devuelve true si el usuario está logeado en printMax
 */
function isUserLogged() {
  return getCookie("printmax_loginuser") != undefined;
}


/**
 * Cambia la clase del bloque correspondiente al paso actual de la creación del presupuesto
 * Usa las clases stepN y active-step
 * @param step Paso actual, de 1 a 6
 */
function setActiveStep(step) {

  if (step == 0)
    $('#block-block-16').addClass('displaynone');
  else {
    $('#step1').removeClass('active-step');
    $('#step2').removeClass('active-step');
    $('#step3').removeClass('active-step');
    $('#step4').removeClass('active-step');
    $('#step5').removeClass('active-step');
    $('#step6').removeClass('active-step');

    $('#step' + step).addClass('active-step');
  }
}


function startUpload(id) {

  $('#submit').button('disable');
  setTimeout(uploadProgress, 500, id);
}

function uploadProgress(id) {

  $.get('/pwi/upload-save/' + id, {}, function(response) {
    $('#progressbar').progressbar('value', parseInt(response));
    setTimeout(uploadProgress, 500, id);
  });
}
