/**
 * Recueil de fonction liées au temps
 *
 * Date de création  : 25 août 2009
 * Programmé par     : Antoine Lavoie
 * Version d'origine : 1.0
 * DÉPENDENCES :    
 *      Librairies:
 *
 **/

/**
 * FONCTIONS DOCUMENTÉES:
 *
 * datetostr(Date date, [format], [cdate])                      : Transforme un objet date en chaine de caractère au format AAAA-MM-JJ ou dans le format spécifié
 * dt2timestamp(Date strDate)                       						: Transforme une date formatée aaaa-mm-jj hh:mm:ss en un Timestamp.
 * dt2wday(Date strDate)                       									: À partir d'une date formatée aaaa-mm-jj hh:mm:ss, retourne le week day .
 * srttodate(String str)                                        : Transforme une date formatée AAAA-MM-JJ dans une chaine de caractere vers un objet date
 * incdate(Date date, [int year], [int month], [int day])       : Incrémente une date de l'écart spécifié dans les parametres

 */

/**
 * Transforme un objet date en chaine de caractère au format AAAA-MM-JJ ou dans le format spécifié
 * Paramètre : Date date, [String format], [Date cdate]
 * Retourne  : string (AAAA-MM-JJ) ou dans le format spécifié
 **/
function datetostr(date, format, cdate){
	var mois = new Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre");
	var joursem = new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi");
	switch (format){
		case 'JOURSEM le J MOIS AAAA':
		          var year = date.getFullYear();
				  var month = date.getMonth();
				  var day = date.getDate();
				  var wday = date.getDay();
				  return joursem[wday] + " le " + day + " " + mois[month] + " " + year;
				  break;
		case 'J [MOIS] [AAAA]':
		          if (cdate == 'undefined') return false;
				  var year = date.getFullYear();
				  var cyear = cdate.getFullYear();
				  var month = date.getMonth();
				  var cmonth = cdate.getMonth();
				  var day = date.getDate();
				  if (year == cyear) year = "";
				  else year = " "+year;
				  if (month == cmonth) month = "";
				  else month = " "+mois[month];
				  return day+month+year;
		          break;
	    case 'J MOIS AAAA':
                  var year = date.getFullYear();
                  var month = date.getMonth();
                  var day = date.getDate();
                  year = " "+year;
                  month = " "+mois[month];
                  return day+month+year;
                  break;
	    default : 
		          var year = date.getFullYear();
                  var month = str_pad(""+(date.getMonth() + 1),2,'0','STR_PAD_LEFT');
                  var day = str_pad(""+date.getDate(),2,'0','STR_PAD_LEFT');
                  return year+'-'+month+'-'+day;
				  break;
	}
}

/**
 * Transforme une date formatée aaaa-mm-jj hh:mm:ss en un weekday
 * Paramètre : string (aaaa-mm-jj hh:mm:ss)
 * Retourne  : Int Weekday
 **/
 
function dt2wday(strDate){
	var datum = strDate.replace(/-/g,"/");
	var d = new Date(datum);
	datum = d.getDay();
	return datum;
}

/**
 * Transforme une date formatée aaaa-mm-jj hh:mm:ss en un Timestamp
 * Paramètre : string (aaaa-mm-jj hh:mm:ss)
 * Retourne  : Timestamp
 **/
 
function dt2timestamp(strDate){
	var datum = strDate.replace(/-/g,"/");
	datum = Date.parse(datum);
	return datum/1000;
}

/**
 * Transforme une date formatée AAAA-MM-JJ dans une chaine de caractere vers un objet date
 * Paramètre : string (AAAA-MM-JJ)
 * Retourne  : Date date
 **/
function strtodate(str){
    var date = new Date();
    var array_str = str.split('-');
    date.setFullYear(array_str[0]);
    date.setMonth(array_str[1] - 1);
    date.setDate(array_str[2]);
    return date;
}

/**
 * Incrémente une date de l'écart spécifié dans les parametres
 * Paramètre : Date date, [int year], [int month], [int day]
 * Retourne  : Date date
 **/
function incdate(date, year, month, day){
    if (year == 'undefined') year = 0;
    if (month == 'undefined') month = 0;
    if (day == 'undefined') day = 0;
    date.setFullYear(date.getFullYear()+year);
    date.setMonth(date.getMonth()+month);
    date.setDate(date.getDate()+day);
	return date;
}

/**
 * Trouve le jour du mois du dimanche précédent de la date.
 * Paramètre : getdate() objDate 
 * Retourne  : DateStr sortie
 **/
function dimanchePrecedent(objDate) {
  var annee = objDate.year;
  var mois = objDate.mon;
  var jour = objDate.mday;
  var date = mktime(0,0,0,mois,jour,annee); 
  var diff = objDate.wday;
  jour = jour - diff;
  date = mktime(0,0,0,mois,jour,annee); 
	var newdate = getdate(date);
	var sortie = newdate.year+'-'+newdate.mon+'-'+newdate.mday;
	return sortie;
}

/**
 * Trouve le jour du mois du samedi suivant de la date.
 * Paramètre : getdate() objDate 
 * Retourne  : DateStr sortie
 **/
function samediSuivant(objDate) {
  var annee = objDate.year;
  var mois = objDate.mon;
  var jour = objDate.mday;
  var date = mktime(0,0,0,mois,jour,annee); 
  var diff = objDate.wday;
  jour = jour - diff;
	jour+=6;
  date = mktime(0,0,0,mois,jour,annee); 
	var newdate = getdate(date);
	var sortie = newdate.year+'-'+newdate.mon+'-'+newdate.mday;
	return sortie;
}

/**
 * Fonction PHP.js mktime(). Retourne le timestamp de la construction d'une date.
 * Paramètre : getdate() objDate 
 * Retourne  : DateStr sortie
 **/
function mktime () {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: baris ozdil
    // +      input by: gabriel paderni
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: FGFEmperor
    // +      input by: Yannoo
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: jakes
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Marc Palau
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: 3D-GRAF
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: mktime(14, 10, 2, 2, 1, 2008);
    // *     returns 1: 1201871402
    // *     example 2: mktime(0, 0, 0, 0, 1, 2008);
    // *     returns 2: 1196463600
    // *     example 3: make = mktime();
    // *     example 3: td = new Date();
    // *     example 3: real = Math.floor(td.getTime()/1000);
    // *     example 3: diff = (real - make);
    // *     results 3: diff < 5
    // *     example 4: mktime(0, 0, 0, 13, 1, 1997)
    // *     returns 4: 883609200
    // *     example 5: mktime(0, 0, 0, 1, 1, 1998)
    // *     returns 5: 883609200
    // *     example 6: mktime(0, 0, 0, 1, 1, 98)
    // *     returns 6: 883609200
 
    var no=0, i = 0, ma=0, mb=0, d = new Date(), dn = new Date(), argv = arguments, argc = argv.length;
 
    var dateManip = {
        0: function (tt){ return d.setHours(tt); },
        1: function (tt){ return d.setMinutes(tt); },
        2: function (tt){ var set = d.setSeconds(tt); mb = d.getDate() - dn.getDate(); d.setDate(1); return set;},
        3: function (tt){ var set = d.setMonth(parseInt(tt, 10)-1); ma = d.getFullYear() - dn.getFullYear(); return set;},
        4: function (tt){ return d.setDate(tt+mb);},
        5: function (tt){
            if (tt >= 0 && tt <= 69) {
                tt += 2000;
            }
            else if (tt >= 70 && tt <= 100) {
                tt += 1900;
            }
            return d.setFullYear(tt+ma);
        }
        // 7th argument (for DST) is deprecated
    };
 
    for (i = 0; i < argc; i++){
        no = parseInt(argv[i]*1, 10);
        if (isNaN(no)) {
            return false;
        } else {
            // arg is number, let's manipulate date object
            if (!dateManip[i](no)){
                // failed
                return false;
            }
        }
    }
    for (i = argc; i < 6; i++) {
        switch (i) {
            case 0:
                no = dn.getHours();
                break;
            case 1:
                no = dn.getMinutes();
                break;
            case 2:
                no = dn.getSeconds();
                break;
            case 3:
                no = dn.getMonth()+1;
                break;
            case 4:
                no = dn.getDate();
                break;
            case 5:
                no = dn.getFullYear();
                break;
        }
        dateManip[i](no);
    }
 
    return Math.floor(d.getTime()/1000);
}

function getdate (timestamp) {
// Get date/time information 
//
// version: 909.322
// discuss at: http://phpjs.org/functions/getdate
// +   original by: Paulo Ricardo F. Santos
// *     example 1: getdate(1055901520);
// *     returns 1: {'seconds': 40, 'minutes': 58, 'hours': 21, 'mday': 17, 'wday': 2, 'mon': 6, 'year': 2003, 'yday': 167, 'weekday': 'Tuesday', 'month': 'June', '0': 1055901520}
	var _w = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
	var _m = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var d = (typeof timestamp == 'number') ? new Date(timestamp * 1000) : new Date();
	var w = d.getDay();
	var m = d.getMonth();
	var y = d.getFullYear();
	var r = {};
	 
	r.seconds = d.getSeconds();
	r.minutes = d.getMinutes();
	r.hours = d.getHours();
	r.mday = str_pad(d.getDate(),2,0,'STR_PAD_LEFT');
	r.wday = w;
	r.mon = str_pad(m + 1,2,0,'STR_PAD_LEFT');
	r.year = y;
	r.yday = Math.floor((d - (new Date(y, 0, 1))) / 86400000);
	r.weekday = _w[w];
	r.month = _m[m];
	r['0'] = parseInt(d.getTime() / 1000, 10);
 
	return r;
}

function str_pad (input, pad_length, pad_string, pad_type) {
    // Returns input string padded on the left or right to specified length with pad_string  
    // 
    // version: 909.322
    // discuss at: http://phpjs.org/functions/str_pad
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // + namespaced by: Michael White (http://getsprink.com)
    // +      input by: Marco van Oort
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: str_pad('Kevin van Zonneveld', 30, '-=', 'STR_PAD_LEFT');
    // *     returns 1: '-=-=-=-=-=-Kevin van Zonneveld'
    // *     example 2: str_pad('Kevin van Zonneveld', 30, '-', 'STR_PAD_BOTH');
    // *     returns 2: '------Kevin van Zonneveld-----'
    var half = '', pad_to_go;

    var str_pad_repeater = function (s, len) {
        var collect = '', i;

        while (collect.length < len) {collect += s;}
        collect = collect.substr(0,len);

        return collect;
    };

    input += '';
    pad_string = pad_string !== undefined ? pad_string : ' ';
    
    if (pad_type != 'STR_PAD_LEFT' && pad_type != 'STR_PAD_RIGHT' && pad_type != 'STR_PAD_BOTH') { pad_type = 'STR_PAD_RIGHT'; }
    if ((pad_to_go = pad_length - input.length) > 0) {
        if (pad_type == 'STR_PAD_LEFT') { input = str_pad_repeater(pad_string, pad_to_go) + input; }
        else if (pad_type == 'STR_PAD_RIGHT') { input = input + str_pad_repeater(pad_string, pad_to_go); }
        else if (pad_type == 'STR_PAD_BOTH') {
            half = str_pad_repeater(pad_string, Math.ceil(pad_to_go/2));
            input = half + input + half;
            input = input.substr(0, pad_length);
        }
    }

    return input;
}
