/**
 * jQuery Show Date Plug-in
 *
 * @version 1.0
 *
 * @author Alessandro Gambin da Silva <alessandrogambin@gmail.com>
 * @copyright Copyright (c) 2009, Alessandro Gambin da Silva
 */

$.fn.showDate = function (settings) {

  /**
   * Execute the plugin with all matched objects
   */
  return this.each(function () {

    /**
     * Set [default] plugin settings
     */
    settings = $.extend({
      'weekdayNames': [
        'sunday',
        'monday',
        'tuesday',
        'wednesday',
        'thursday',
        'friday',
        'saturday'
      ],
      'shortWeekdayNames': [
        'sun',
        'mon',
        'tue',
        'wed',
        'thu',
        'fri',
        'sat'
      ],
      'monthNames': [
        'january',
        'february',
        'march',
        'april',
        'may',
        'june',
        'july',
        'august',
        'september',
        'october',
        'november',
        'december'
      ],
      'shortMonthNames': [
        'jan',
        'feb',
        'mar',
        'apr',
        'may',
        'jun',
        'jul',
        'aug',
        'sep',
        'oct',
        'nov',
        'dec'
      ],
      'ucFirst': true,  // Require string.js (util folder)
      /**
       * Format options:
       *
       *  Day:
       *   j - 1 to 31
       *   d - 01 to 31
       *   w - 0 (for Sunday) through 6 (for Saturday)
       *   l (lowercase 'L') - Sunday through Saturday
       *   D - Mon through Sun
       *
       *  Month:
       *   n - 1 through 12
       *   m - 01 through 12
       *   F - January through December
       *   M - Jan through Dec
       *
       *  Year:
       *   Y - 1999 or 2009
       */
      'dateStringFormat': '%l, %F %d, %Y'
    }, settings);

    // Configure the date values
    var today = new Date();

    // Day with no leading zero (%j modifier)
    var day = today.getDate();

    // Day with leading zero (%d modifier)
    var dayLeadingZero = ((day < 10) ? '0' + day : day);

    // Numeric day of the week (%w modifier)
    var weekday = today.getDay();

    // Weekday name (%l modifier)
    var weekdayName = ((settings.ucFirst) ? settings.weekdayNames[weekday].ucFirst() : settings.weekdayNames[weekday]);

    // Short representation (three letters) of the weekday name (%D modifier)
    var shortWeekdayName = ((settings.ucFirst) ? settings.shortWeekdayNames[weekday].ucFirst() : settings.shortWeekdayNames[weekday]);

    // Month with no leading zero (%n modifier)
    var month = today.getMonth();

    // Month with leading zero (%m modifier)
    var monthLeadingZero = (((month + 1) < 10) ? '0' + (month + 1) : month + 1);

    // Month name (%F modifier)
    var monthName = ((settings.ucFirst) ? settings.monthNames[month].ucFirst() : settings.monthNames[month]);

    // Short representation (three letters) of the month name (%M modifier)
    var shortMonthName = ((settings.ucFirst) ? settings.shortMonthNames[month].ucFirst() : settings.shortMonthNames[month]);

    // Full numeric representation (four digits) of the year (%Y modifier)
    var year = today.getFullYear();

    /**
     * Regular expressions for the date format modifiers
     */
    var reModifier_j = /%j/g;
    var reModifier_d = /%d/g;
    var reModifier_w = /%w/g;
    var reModifier_l = /%l/g;
    var reModifier_D = /%D/g;
    var reModifier_n = /%n/g;
    var reModifier_m = /%m/g;
    var reModifier_F = /%F/g;
    var reModifier_M = /%M/g;
    var reModifier_Y = /%Y/g;

    /**
     * Date string parsed to show
     */
    var dateToShow = settings.dateStringFormat.replace(reModifier_j, day);
        dateToShow = dateToShow.replace(reModifier_d, dayLeadingZero);
        dateToShow = dateToShow.replace(reModifier_w, weekday);
        dateToShow = dateToShow.replace(reModifier_l, weekdayName);
        dateToShow = dateToShow.replace(reModifier_D, shortWeekdayName);
        dateToShow = dateToShow.replace(reModifier_n, month);
        dateToShow = dateToShow.replace(reModifier_m, monthLeadingZero);
        dateToShow = dateToShow.replace(reModifier_F, monthName);
        dateToShow = dateToShow.replace(reModifier_M, shortMonthName);
        dateToShow = dateToShow.replace(reModifier_Y, year);

    /**
     * Show de string date
     */
    $(this).text(dateToShow);

  });

};