﻿

//WARNING: DO NOT USE THIS CLASS ON A CRM FORM. (dateFormat) WILL BREAK THE DATE CONTROLS ON A CRM FORM. USE ONLY ON A CUSTOM HTML PAGE

//Provides dateFormat functions
// Source: http://blog.stevenlevithan.com/archives/date-time-format
// Start
var dateFormat = function () {
    var k = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, l = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, s = /[^-+\dA-Z]/g, d = function (a, c) { a = String(a); for (c = c || 2; a.length < c; ) a = "0" + a; return a }; return function (a, c, h) {
        var f = dateFormat; if (arguments.length == 1 && Object.prototype.toString.call(a) == "[object String]" && !/\d/.test(a)) { c = a; a = undefined } a = a ? new Date(a) : new Date; if (isNaN(a)) throw SyntaxError("invalid date");
        c = String(f.masks[c] || c || f.masks["default"]); if (c.slice(0, 4) == "UTC:") { c = c.slice(4); h = true } var b = h ? "getUTC" : "get", g = a[b + "Date"](), n = a[b + "Day"](), i = a[b + "Month"](), o = a[b + "FullYear"](), e = a[b + "Hours"](), p = a[b + "Minutes"](), q = a[b + "Seconds"](); b = a[b + "Milliseconds"](); var m = h ? 0 : a.getTimezoneOffset(), r = { d: g, dd: d(g), ddd: f.i18n.dayNames[n], dddd: f.i18n.dayNames[n + 7], m: i + 1, mm: d(i + 1), mmm: f.i18n.monthNames[i], mmmm: f.i18n.monthNames[i + 12], yy: String(o).slice(2), yyyy: o, h: e % 12 || 12, hh: d(e % 12 || 12), H: e, HH: d(e), M: p, MM: d(p),
            s: q, ss: d(q), l: d(b, 3), L: d(b > 99 ? Math.round(b / 10) : b), t: e < 12 ? "a" : "p", tt: e < 12 ? "am" : "pm", T: e < 12 ? "A" : "P", TT: e < 12 ? "AM" : "PM", Z: h ? "UTC" : (String(a).match(l) || [""]).pop().replace(s, ""), o: (m > 0 ? "-" : "+") + d(Math.floor(Math.abs(m) / 60) * 100 + Math.abs(m) % 60, 4), S: ["th", "st", "nd", "rd"][g % 10 > 3 ? 0 : (g % 100 - g % 10 != 10) * g % 10]
        }; return c.replace(k, function (j) { return j in r ? r[j] : j.slice(1, j.length - 1) })
    }
} ();
dateFormat.masks = { "default": "ddd mmm dd yyyy HH:MM:ss",defaultdate: "mm/dd/yyyy", shortDate: "m/d/yy", mediumDate: "mmm d, yyyy", longDate: "mmmm d, yyyy", fullDate: "dddd, mmmm d, yyyy", shortTime: "h:MM TT", mediumTime: "h:MM:ss TT", longTime: "h:MM:ss TT Z", isoDate: "yyyy-mm-dd", isoTime: "HH:MM:ss", isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" };
dateFormat.i18n = { dayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] }; Date.prototype.format = function (k, l) { return dateFormat(this, k, l) };
// End

function DateAdd(timeU, byMany, dateObj) {
    var millisecond = 1;
    var second = millisecond * 1000;
    var minute = second * 60;
    var hour = minute * 60;
    var day = hour * 24;
    var year = day * 365;

    var newDate;
    var dVal = dateObj.valueOf();
    switch (timeU) {
        case "ms": newDate = new Date(dVal + millisecond * byMany); break;
        case "s": newDate = new Date(dVal + second * byMany); break;
        case "mi": newDate = new Date(dVal + minute * byMany); break;
        case "h": newDate = new Date(dVal + hour * byMany); break;
        case "d": newDate = new Date(dVal + day * byMany); break;
        case "y": newDate = new Date(dVal + year * byMany); break;
    }
    return newDate;
}

function getMonday(d) {
    var day = d.getDay(),
            diff = d.getDate() - day + (day == 0 ? -6 : 1); // adjust when day is sunday
    return new Date(d.setDate(diff));
}

function getSunday(d) {
    var day = d.getDay(),
            diff = d.getDate() - day;
    return new Date(d.setDate(diff));
}

function GetWeeksInYear(cYear) {
    var startofweek = 1; // 0 - Sunday, 1 - Monday
    var ti = new Date("1/1/" + cYear);
    // get the day of the week
    var startDay = ti.getDay();
    // if the day is past thursday move to the next week start
    if (startDay > 4) {
        ti = DateAdd("d", 7, ti);
    }
    // get the start of the week
    if (startofweek == 0)
        ti = getSunday(ti);
    else if (startofweek == 1)
        ti = getMonday(ti);

    var selectOption = "";

    // loop the weeks
    for (var w = 1; w <= 53; w++) {
        var startDate = ti;
        var htmlWeek = "Week " + w + " [" + dateFormat(ti, "m/d/yyyy");
        ti = DateAdd("d", 6, ti);
        htmlWeek += " - " + dateFormat(ti, "m/d/yyyy") + "]";

        if (startDate.getFullYear().toString() != cYear && w > 2) {

        }
        else {
            selectOption += '<option value"' + htmlWeek + '">' + htmlWeek + '</option>\n';
        }

        ti = DateAdd("d", 1, ti);

    }

    return selectOption;
}

