/**
 * jquery.datemaker.js: Date Maker plugin
 *
 * Copyright (c) 2008 Doug Sparling
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 *
 * Create a Date object using the given date format string.
 *
 * Date formats like Perl CGI::Cookie:
 * Date formats like Rails ActiveSupport::CoreExtension::Numeric::Time
 *
 * @option String s number of seconds
 * @option String m number of minutes
 * @option String h number of hours
 * @option String d number of days
 * @option String M number of months
 * @option String y number of years
 * @option String s x.second.ago
 * @option String s x.second.from_now
 * @option String s x.seconds.ago
 * @option String s x.seconds.from_now
 * @option String s x.minute.ago
 * @option String s x.minute.from_now
 * @option String s x.minutes.ago
 * @option String s x.minutes.from_now
 * @option String s x.hour.ago
 * @option String s x.hour.from_now
 * @option String s x.hours.ago
 * @option String s x.hours.from_now
 * @option String s x.day.ago
 * @option String s x.day.from_now
 * @option String s x.days.ago
 * @option String s x.days.from_now
 * @option String s x.month.ago
 * @option String s x.month.from_now
 * @option String s x.months.ago
 * @option String s x.months.from_now
 * @option String s x.year.ago
 * @option String s x.year.from_now
 * @option String s x.years.ago
 * @option String s x.years.from_now
 * @option String midnight 
 * @option String now 
 *
 * @example 
 * $.datemaker('+30s');                // 30 seconds from now
 * $.datemaker('+5m');                 // 5 minutes from now
 * $.datemaker('+1h');                 // 1 hour from now
 * $.datemaker('-1d');                 // 1 day ago 
 * $.datemaker('+10d');                // 10 days from now 
 * $.datemaker('+2M');                 // 2 months from now      
 * $.datemaker('-6M');                 // 6 months ago      
 * $.datemaker('+1y');                 // 1 year from now      
 * $.datemaker('30.seconds.ago');      // 30 seconds ago     
 * $.datemaker('30.seconds.from_now'); // 30 seconds from now      
 * $.datemaker('5.minutes.ago');       // 5 minutes ago     
 * $.datemaker('5.minutes.from_now');  // 5 minutes from now      
 * $.datemaker('1.hour.ago');          // 1 hour ago     
 * $.datemaker('1.hour.from_now');     // 1 hour from now      
 * $.datemaker('10.days.ago');         // 10 days ago     
 * $.datemaker('10.days.from_now');    // 10 days from now      
 * $.datemaker('6.months.ago');        // 6 months ago     
 * $.datemaker('6.months.from_now');   // 6 months from now      
 * $.datemaker('1.year.ago');          // 1 year ago     
 * $.datemaker('1.year.from_now');     // 1 year from now      
 * $.datemaker('midnight');            // midnight
 * $.datemaker('now');                 // now
 * @desc Examples...
 * @example $.cookie('cookie_name', 'cookie_value', { expires: $.datemaker('+1h') });
 * @desc Using with jQuery cookie plugin
 *
 * @param String s Date format identifier.
 * @return Date object
 * @type Date object
 *
 * @name $.datemaker
 * @cat Plugins/Date
 * @author Doug Sparling/doug.sparling@gmail.com
 * @version 0.1.1
 */
(function($) {

  $.datemaker = function(expires) {

    var d1 = new Date();

    if ( ar = expires.match(/^([+|-])?(\d+)(\w)$/) ) {

      var action;
      RegExp.$1 == '+' || RegExp.$1 == ''  ? action = '+' : action = '-';

      if (RegExp.$3 == 's') {
        action  == '-' ? $.datemaker.advanceSeconds(d1, '-', RegExp.$2) : $.datemaker.advanceSeconds(d1, '+', RegExp.$2);
      } else if (RegExp.$3 == 'm') {
        action  == '-' ? $.datemaker.advanceMinutes(d1, '-', RegExp.$2) : $.datemaker.advanceMinutes(d1, '+', RegExp.$2);
      } else if (RegExp.$3 == 'h') {
        action  == '-' ? $.datemaker.advanceHours(d1, '-', RegExp.$2) : $.datemaker.advanceHours(d1, '+', RegExp.$2);
      } else if (RegExp.$3 == 'd') {
        action  == '-' ? $.datemaker.advanceDays(d1, '-', RegExp.$2) : $.datemaker.advanceDays(d1, '+', RegExp.$2);
      } else if (RegExp.$3 == 'M') {
        action  == '-' ? $.datemaker.advanceMonths(d1, '-', RegExp.$2) : $.datemaker.advanceMonths(d1, '+', RegExp.$2);
      } else if (RegExp.$3 == 'y') {
        action  == '-' ? $.datemaker.advanceYears(d1, '-', RegExp.$2) : $.datemaker.advanceYears(d1, '+', RegExp.$2);
      }
    } else if ( ar = expires.match(/^(\d+)\.seconds?\.ago$/) ) {
      $.datemaker.advanceSeconds(d1, '-', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.seconds?\.from_now$/) ) {
      $.datemaker.advanceSeconds(d1, '+', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.minutes?\.ago$/) ) {
      $.datemaker.advanceMinutes(d1, '-', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.minutes?\.from_now$/) ) {
      $.datemaker.advanceMinutes(d1, '+', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.hours?\.ago$/) ) {
      $.datemaker.advanceHours(d1, '-', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.hours?\.from_now$/) ) {
      $.datemaker.advanceHours(d1, '+', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.days?\.ago$/) ) {
      $.datemaker.advanceDays(d1, '-', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.days?\.from_now$/) ) {
      $.datemaker.advanceDays(d1, '+', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.years?\.ago$/) ) {
      $.datemaker.advanceYears(d1, '-', RegExp.$1);
    } else if ( ar = expires.match(/^(\d+)\.years?\.from_now$/) ) {
      $.datemaker.advanceYears(d1, '+', RegExp.$1);
    } else if (ar = expires.match(/^now$/)) {
      // just return d1
    } else if (ar = expires.match(/^midnight$/)) {
       d1.setDate(d1.getDate()+1);
       d1.setHours(0);
       d1.setMinutes(0);
       d1.setSeconds(0);
    }
    return d1;
  };

  // Advance functions
  $.datemaker.advanceSeconds = function(d1, direction, seconds) {
      direction == '-' ? d1.setSeconds( d1.getSeconds() - parseInt(seconds) ) : d1.setSeconds( d1.getSeconds() + parseInt(seconds) );
  }
  $.datemaker.advanceMinutes = function(d1, direction, minutes) {
      direction == '-' ? d1.setMinutes( d1.getMinutes() - parseInt(minutes) ) : d1.setMinutes( d1.getMinutes() + parseInt(minutes) );
  }
  $.datemaker.advanceHours = function(d1, direction, hours) {
      direction == '-' ? d1.setHours( d1.getHours() - parseInt(hours) ) : d1.setHours( d1.getHours() + parseInt(hours) );
  }
  $.datemaker.advanceDays = function(d1, direction, days) {
      direction == '-' ? d1.setDate( d1.getDate() - parseInt(days) ) : d1.setDate( d1.getDate() + parseInt(days) );
  }
  $.datemaker.advanceMonths = function(d1, direction, months) {
      direction == '-' ? d1.setMonth( d1.getMonth() - parseInt(months) ) : d1.setMonth( d1.getMonth() + parseInt(months) );
  }
  $.datemaker.advanceYears = function(d1, direction, years) {
      direction == '-' ? d1.setFullYear( d1.getFullYear() - parseInt(years) ) : d1.setFullYear( d1.getFullYear() + parseInt(years) );
  };
}) (jQuery)

