;(function($) {
  // center element(s) in the viewport
  $.fn.center = function() {
    return this.each(function() {
      $(this).css('position', 'fixed');
      $(this).css('top', ($(window).height() - $(this).height()) / 2 + 'px');
      $(this).css('left', ($(window).width() - $(this).width()) / 2 + 'px');
    });
  };

  // make current element fill another element
  $.fn.fill = function(element_to_fill) {
    return this.each(function() {
      $(this).height($(element_to_fill).height());
      $(this).width($(element_to_fill).width());
    });
  };

  $.fn.exists = function() {
    return $(this).length > 0;
  };

})(jQuery);


// alerts and confirmations
;(function($) {

  function extendCssClasses(one, two) {
    var tmp = $.merge(one, two);
    return $.unique(tmp);
  };

  function replaceTokensInString(string, substitutions) {
    var re, tmp = string;
    $.each(substitutions, function(k, v) {
      re  = new RegExp('#\{' + k + '\}', 'g');
      tmp = tmp.replace(re, v);
    });
    return tmp;
  };

  $.alert = {

    // graphical confirmation for form submission
    confirm: function(form, options) {
      opts = $.extend({
        cancel: 'No',
        confirm: 'Yes',
        classes: [],
        dim: true,
        message: 'Are you sure?'
      }, options);

      var template = '<div class="#{classes}">#{message}<button class="no">#{cancel}</button><button class="yes">#{confirm}</button></div>';
      var css_classes = extendCssClasses(['alert', 'confirmation', 'rounded'], opts.classes).join(' ');

      template = replaceTokensInString(template, {cancel:opts.cancel, classes:css_classes, confirm:opts.confirm, message:opts.message});

      if (opts.dim) $('#modal_dimmer').fill('body').show();

      // show the confirmation
      $(template).appendTo('body').center().show().corners('8px transparent')
      // cancel button removes it
      .children('button.no').click(function() {
        $(this).parent().remove();
        if (opts.dim) $('#modal_dimmer').hide();
      })
      .corners('4px')
      .end()
      // confirm button submits the form
      .children('button.yes').click(function() {
        $(form).submit();
        $(this).parent().remove();
        if (opts.dim) $('#modal_dimmer').hide();
      })
      .corners('4px');
    },

    // fading notice
    notice: function(message, options) {
      opts = $.extend({
        speed: 3000
      }, options);

      $('<div class="alert notice">' + message + '</div>').appendTo('body').center().show().corners('8px transparent').fadeOut(opts.speed, function() {
        $(this).remove();
      });
    }

  };
})(jQuery);
