$.candidatelink = {
  helpers: {}
}

$.fn.indicateChange = function(element, options) {
  options = $.extend({
    updateClass: 'changes-pending'
  }, options || {});
  
  function setClass() {
    $(element).addClass(options.updateClass).attr('title', function(i, title) {
      return title === undefined ? 'There are changes awaiting to be saved' : title;
    });
  }
  
  this
    .find('input[type="text"], input[type="password"], select, textarea').change(setClass).end()
    .find('input[type="radio"], input[type="checkbox"]').click(setClass).end()
    .find('.ui-sortable').bind('sortchange', setClass).end()
    .find('.ui-slider').bind('slidechange', setClass);
}

// Return a helper with preserved width of cells
$.candidatelink.helpers.sortableFix = function(e, ui) {
  ui.children().each(function() {
    $(this).width($(this).width());
  });
  return ui;
};

$.candidatelink.helpers.tabsLoad = function(e, ui) {
  var tabs = $(this).data('tabs');
  
  $('a', ui.panel).not('[href="#"]').click(function() {
    var url = this.href, data = '', method = 'get';
    
    if ($(this).is('[data-confirm]') && !confirm($(this).attr('data-confirm'))) {
      return false;
    }
    
    if ($(this).is('[data-popup]')) {
      alert('popup');
      return false;
    }
    
    if ($(this).is('[data-url]')) {
      url = $(this).attr('data-url');
    }
    
    if ($(this).is('[data-method]')) {
      method = $(this).attr('data-method');
    }
    
    if ($(this).is('[data-with]')) {
      data = $(this).attr('data-with');
    }
    
    $.ajax({
      url: url,
      type: method,
      data: data,
      success: function(data, textStatus) {
        $(ui.panel).html(data);
        tabs._trigger('load', null, ui);
      }
    });
    
    return false;
  });
  $('form', ui.panel).not('[data-remote]').submit(function() {
    var data = {};
    $.each($(this).serializeArray(), function() {
      data[this['name']] = this['value'];
    });
    
    $(ui.panel).load(this.action, data, function() {
      tabs._trigger('load', null, ui);
    });
    return false;
  });
}

$.candidatelink.formDatePicker = function(selector) {
  $(document).ready(function() {
    var DAY = '[name$="(3i)]"]', MONTH = '[name$="(2i)]"]', YEAR = '[name$="(1i)]"]';

    var query = jQuery(selector),
        date = new Date(query.find(YEAR).val(), parseInt(query.find(MONTH).val()) - 1, query.find(DAY).val()),
        dateText = isValidDate(date) ? jQuery.datepicker.formatDate(jQuery.datepicker._defaults.dateFormat, date) : '',
        textfield = jQuery('<input type="text" readonly="readonly" value="' + dateText + '" />'),
        parent = null;

    query.find([DAY, MONTH, YEAR].join(', ')).each(function() {
      query.append('<input name="' + jQuery(this).attr('name') + '" type="hidden" value="' + jQuery(this).val() + '" />');
      parent = jQuery(this).parent().parent();
      jQuery(this).parent().remove();
    });
    parent.prepend(textfield);

    textfield
      .wrap('<li></li>')
      .parent().prepend('<label>Date</label>').end()
      .datepicker({
        changeMonth: true,
        changeYear: true,
        defaultDate: isValidDate(date) ? date : null,
        onSelect: function(dateText, inst) {
          query.find(DAY).val(inst.currentDay);
          query.find(MONTH).val(inst.currentMonth + 1);
          query.find(YEAR).val(inst.currentYear);
        }
      });
  });
}

$.candidatelink.dialogForm = function(id, options, noAjax) {
  options = $.extend({
    autoOpen: false,
    modal: true,
    buttons: {
      'Submit': function() {
        var dialog = $(this), form = $(this).find('form').eq(0);
        
        if (dialog.data('noAjax') != true) {
          $.ajax({
            url: form.attr('action') || document.location,
            data: form.serialize(),
            dataType: 'html',
            type: form.attr('method') || 'post',
            success: function (data, textStatus, xhr) {
              $('body').append(data);
              dialog.dialog('close');
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
              if (XMLHttpRequest.status == 500) {
                dialog.html(XMLHttpRequest.responseText);
              }
            }
          });
        }
        else {
          form.submit();
        }
      },
      'Cancel': function() {
        $(this).dialog('close');
      }
    },
    close: function() {
      $(this).find('form').each(function() {
        this.reset();
      });
    }
  }, options || {})
  
  $(document).ready(function() {
    $('#' + id).hide().find('form fieldset.buttons').hide().end().data('noAjax', noAjax || false).dialog(options);
  });
}

$.candidatelink.searchBox = function(selector, options) {
  $(selector).combobox($.extend({
    select: function(e, ui) {
      var url = null;
      try {
        url = $(ui.text).attr('data-url');
      }
      catch (e) { }
      if (url) {
        document.location = url;
      }
      else {
        $(this).val(ui.value);
      }
    },
    cache: false,
    control: false
  }, options || {}))
}

// TODO: currently not in use, maybe refactor into above function?
var genericDatetimeHelper = function(selector, label) {
  var DAY = '[name$="day]"]', MONTH = '[name$="month]"]', YEAR = '[name$="year]"]';
  var query = jQuery(selector),
      date = new Date(query.find(YEAR).val(), parseInt(query.find(MONTH).val()) - 1, query.find(DAY).val()),
      dateText = jQuery.datepicker.formatDate(jQuery.datepicker._defaults.dateFormat, date),
      textfield = jQuery('<input type="text" readonly="readonly" value="' + dateText + '" />'),
      parent = null;
  
  query.find([DAY, MONTH, YEAR].join(', ')).each(function() {
    query.append('<input name="' + jQuery(this).attr('name') + '" type="hidden" value="' + jQuery(this).val() + '" />');
    parent = jQuery(this).parent();
    jQuery(this).remove();
  });
  parent.prepend(textfield);
  
  textfield
    .parent().prepend('<label>' + label +'</label>').end()
    .datepicker({
      defaultDate: date,
      onSelect: function(dateText, inst) {
        query.find(DAY).val(inst.currentDay);
        query.find(MONTH).val(inst.currentMonth + 1);
        query.find(YEAR).val(inst.currentYear);
      }
    });
}

var isValidDate = function (date) {
  if ( Object.prototype.toString.call(date) !== "[object Date]" )
    return false;
  return !isNaN(date.getTime());
}

$.candidatelink.updatePositions = function (selector) {
  var i = 0;
  $(selector + ' input[name$="[position]"]').each(function() {
    if(this.value==-1) { 
      this.value = i++;
    } else {
      i++;
    }
  });
}