﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("WebControls");

// This 'element' here should be the inputEl
WebControls.DateInput = function(element) {
    WebControls.DateInput.initializeBase(this, [element]);
}

WebControls.DateInput.prototype = {
    initialize: function() {
        WebControls.DateInput.callBaseMethod(this, 'initialize');

        // alert("init textInput");
        var that = this;
        
        if (this._showPicker) {
		    $(this._element).datepicker({
		    // $( "#" + this._element.id).datepicker({
			    inline: true,
			    dateFormat: 'dd M yy'
			    ,
			    // This should ensure it stays at the top (eg in traffic)
			    beforeShow: function(i, e) {
			      //alert("!");
                    // var z = jQuery(i).closest(".ui-dialog").css("z-index") + 4; 
                    // e.dpDiv.css('z-index', z);
                  // alert("!!");
			    }
		    });        
		}
        
    },
    dispose: function() {
        //Add custom dispose actions here
        WebControls.DateInput.callBaseMethod(this, 'dispose');
    },    

    get_value : function() {    
        var dateObject = parseDate(this._element.value);
        return dateObject;            
    },

    set_value : function(value) {
        if (value == null) {
            this._element.value = "";
        } else {
            var dateObject = new Date(value);
            var dateString = formatDate(dateObject);
            this._element.value = dateString;                        
        }
    },
    
    isValid : function(value) {

        var valid = true;

        var date = this.get_value();

        if (date == null) {
            valid = false;
        } else {        
            if (! (date.getTime() > 1) ) {
                valid = false;
            }    
            if (date.getFullYear() > 2500) {
                valid = false;
            }
        }
        
        if(this._allowBlankEntry && this._element.value.length == 0){
            valid = true;
        }
    
        return valid;
    },
    
    onBlur : function() {
        var value = this.formatForView(this._element.value);
        if (value == null) {
            this._element.value = "";
        } else {
            this._element.value = value;
        }
    },
            
    formatForView : function(value) {
        var dateString = value;
        
        if (dateString == null || dateString == '') {
            return "";
        }
        
        var date = parseDate(dateString);
        if (date == null || isNaN(date)) {
            return value;
        }       

        return formatDate(date);
    }
    
}

WebControls.DateInput.createProperty("showPicker");
WebControls.DateInput.registerClass('WebControls.DateInput', WebControls.BaseInput);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

function formatDateTime(dateObject) {
   if (dateObject == null) {
        return null;
    }
    var dateString = formatDate(dateObject);
    var timeString = formatTime(dateObject);
    
    return dateString + " " + timeString;
}

function formatTime(dateObject) {
   if (dateObject == null) {
        return null;
    }
    var curr_hour = dateObject.getHours().toString();
    var curr_min = dateObject.getMinutes().toString();
    var curr_sec = dateObject.getSeconds().toString();

    if (curr_hour.length == 1)
    {  
        curr_hour = "0" + curr_hour;
    }
    if (curr_min.length == 1)
    {
        curr_min = "0" + curr_min;
    }
    if (curr_sec.length == 1)
    {
        curr_sec = "0" + curr_sec;
    }
//    while (curr_msec.length < 3)
//    {
//        curr_msec = "0" + curr_msec;
//    }

    var timeString = curr_hour + ":" + curr_min + ":" + curr_sec; //+ "." + curr_msec;
    
    return timeString;
}

function formatDate(dateObject) {

    if (dateObject == null) {
        return null;
    }

    var dayOfMonth = dateObject.getDate();
    var month = dateObject.getMonth();
    var year = dateObject.getFullYear();
    
    // This is to compensate for a JavaScript bug/feature
    // where if year < 2000, getYear()
    // returns a 2-digit year
    if (year < 100) {
        year = 1900 + year;
    }
    
    var dayOfMonthString = "";
    if (dayOfMonth < 10) {
        dayOfMonthString = '0' + dayOfMonth;
    } else {
        dayOfMonthString = '' + dayOfMonth;
    }
    var monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var monthString = monthNames[month];
        
    var dateString = dayOfMonthString + ' ' + monthString + ' ' + year;
    
    return dateString;
}

function formatDateTime(dateObject) {
    var dateString = formatDate(dateObject);
    var minutes = dateObject.getMinutes();
    if (minutes < 10) { minutes = "0" + minutes; }
    var timeString = dateObject.getHours() + ":" + minutes;
    
    return dateString + " " + timeString;
}

function parseDate(dateString) {

    // If the date is invalid, return null from this function

    var monthsByName = {
        'jan' : 1,
        'feb' : 2,
        'mar' : 3,
        'apr' : 4, 
        'may' : 5, 
        'jun' : 6, 
        'jul' : 7, 
        'aug' : 8, 
        'sep' : 9, 
        'oct' : 10, 
        'nov' : 11, 
        'dec' : 12
    };
    
    var dateParts = dateString.split(/[\s/]/);

    if (dateParts.length < 2 || dateParts.length > 3) {
        return null;
    }
    
    var dayString = dateParts[0];
    var monthString = dateParts[1];
    var yearString = dateParts[2] || (new Date()).getFullYear();
    
    var month = parseInt(monthString, 10);
    if (isNaN(month)) {
        month = monthsByName[monthString.toLowerCase()];        
    }
    if (month < 1 || month > 12) {
        return null;
    }
    
    var year = parseInt(yearString, 10);
    // if (year >= 1 && year < 100) {
    if (year < 95) {
        year = 2000 + year;
    } else if (year >= 95 && year < 100) {
        year = 1900 + year;
    }
    
    var day = parseInt(dayString, 10);
    if (day < 1 || day > daysInMonth(month, year)) {
        return null;
    }

    // Need to adjust by the offset to stop
    // the 'descending dates' problem
    // var date1 = new Date(year, month - 1, day);
    var date1 = new Date(year, month - 1, day, 12, 0, 0, 0);
    var offset = date1.getTimezoneOffset();
    var milliseconds = date1.getTime() - offset * 60000;
    var date = new Date(milliseconds);
    // var date = new Date(year, month - 1, day);

    // var date = new Date(Date.UTC(year, month - 1, day, 0, 0, 0));
    
    return date;

}

function daysInMonth(month, year) {

    var leapYear = false;
    if (isLeapYear(year)) {
        leapYear = true;
    }

    var daysForMonth = {
        1 : 31,
        2 : leapYear ? 29 : 28,
        3 : 31,
        4 : 30,
        5 : 31,
        6 : 30,
        7 : 31,
        8 : 31,
        9 : 30,
        10 : 31,
        11 : 30,
        12 : 31    
    };
    
    return daysForMonth[month];

}

function isLeapYear(yr) {
  return new Date(yr,2-1,29).getDate()==29;
}

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();