var ctrlName;
function CreateDropDown(controlId)
{
    ctrlName = controlId;
    if(document.getElementById(ctrlName))
    {
        var newDateControl = new DropdownDateControl();
        return newDateControl;
    }
    else
    {
        return;
    }
}

function DropdownDateControl()
{
    this.id = ctrlName.toString();
    this.currentDate = new Date(),
    this.displayAllDaysAndMonths, //*SK* CR:32768-332
    this.renderedMonth,
    this.renderedYear,
    this.selectedDate,
    this.clientParameters,
    this.maximumDate,
    this.minimumDate,
    this.monthNames,
    this.dateDropdownId;
    this.monthDropdownId;
    this.yearDropdownId;
    this.serversideSelectedDateId;
    this.minimumYear;
    this.maximumYear;
    this.Init();
}

DropdownDateControl.prototype.Init = function()
{
    this.ResetValues();
    this.clientParameters = eval(this.id + "Parameters");
    this.monthNames = eval(this.clientParameters.monthNames);
    this.displayAllDaysAndMonths = this.clientParameters.displayAllDaysAndMonths;//*SK* CR#32768-332
    this.dateDropdownId = document.getElementById(this.clientParameters.dateDropdownId);
    this.monthDropdownId = document.getElementById(this.clientParameters.monthDropdownId);
    this.yearDropdownId = document.getElementById(this.clientParameters.yearDropdownId);
    this.serversideSelectedDateId = document.getElementById(this.clientParameters.serversideSelectedDate);
    this.selectedDate = (this.clientParameters.selectedDate) ? this.ParseDate(this.clientParameters.selectedDate): new Date();
    this.maximumDate = (this.clientParameters.dropdownMaximumDate)? this.ParseDate(this.clientParameters.dropdownMaximumDate): new Date(9999,12,31);
    this.minimumDate = (this.clientParameters.dropdownMinimumDate) ? this.ParseDate(this.clientParameters.dropdownMinimumDate): new Date(0001,1,1);
    this.minimumYear = (this.minimumDate) ? this.minimumDate.getFullYear() : this.currentDate.getFullYear();
    this.maximumYear = (this.maximumDate) ? this.maximumDate.getFullYear() : this.currentDate.getFullYear();
    this.renderedMonth = (this.selectedDate) ? this.selectedDate.getMonth() : this.currentDate.getMonth();
    this.renderedYear = (this.selectedDate) ? this.selectedDate.getFullYear() : this.currentDate.getFullYear();
    this.serversideSelectedDateId.value = this.FormatDate(parseInt(this.renderedYear),parseInt(this.renderedMonth),parseInt(this.selectedDate.getDate()));
    if(document.getElementById(this.id + "_minValue"))
    {
        var hiddenControl = document.getElementById(this.id + "_minValue");
        eval(hiddenControl.value);
        this.minimumDate = this.ParseDate(modifiedValues[0]);
        this.maximumDate = this.ParseDate(modifiedValues[1]);
        this.minimumYear = this.minimumDate.getFullYear();
        this.maximumYear = this.maximumDate.getFullYear();
    }
}

DropdownDateControl.prototype.CreateCalendar = function()
{
    var displayDate = new Date(this.renderedYear,this.renderedMonth,1);
    var startDate;
    var endDate;
    // Calculate start date
    if(displayDate <= this.minimumDate && this.displayAllDaysAndMonths == 'False')  //*SK* CR:32768-332
    {
        startDate = this.minimumDate.getDate();
        this.renderedMonth = this.minimumDate.getMonth();
        this.renderedYear = this.minimumDate.getFullYear();
    }
    else
    {
        startDate = 1;
    }
    displayDate = new Date(this.renderedYear,this.renderedMonth,this.GetDaysInMonth(this.renderedMonth,this.renderedYear));
    // Calculate end date
    if((displayDate >= this.maximumDate || (displayDate.getMonth() == this.maximumDate.getMonth() && displayDate.getFullYear() == this.maximumDate.getFullYear())) && this.displayAllDaysAndMonths == 'False') //*SK* CR:32768-332
    {
        endDate = this.maximumDate.getDate();
        this.renderedMonth = this.maximumDate.getMonth();
        this.renderedYear = this.maximumDate.getFullYear();
    }
    else
    {
        if(this.displayAllDaysAndMonths == 'True') //*SK* CR:32768-332
        {
            endDate = 31;
        }
        else
        {
            endDate = this.GetDaysInMonth(this.renderedMonth,this.renderedYear);
        }
    }
    // End
    

    
    for(var yearCounter = parseInt(this.minimumYear); yearCounter <= parseInt(this.maximumYear); yearCounter++)
    {
        this.AddOptionToDropDown(this.yearDropdownId,parseInt(yearCounter),parseInt(yearCounter));
    }
    this.SelectOption(this.yearDropdownId,this.renderedYear);
    
    var startMonth = (this.renderedYear == this.minimumYear && this.displayAllDaysAndMonths == 'False') ? this.minimumDate.getMonth() : 0 ;
    var endMonth = (this.renderedYear == this.maximumYear && this.displayAllDaysAndMonths == 'False') ? this.maximumDate.getMonth() : 11;
    
    if(startMonth == 11 && endMonth == 0)
    {
        this.AddOptionToDropDown(this.monthDropdownId,this.monthNames[11],11);
        this.AddOptionToDropDown(this.monthDropdownId,this.monthNames[0],0);
    }
    else
    {
        for(var monthCounter=startMonth;monthCounter <= endMonth; monthCounter++)
        {
            this.AddOptionToDropDown(this.monthDropdownId,this.monthNames[monthCounter],parseInt(monthCounter));
        }
    }

    this.SelectOption(this.monthDropdownId,this.renderedMonth);

    for(var dateCounter = startDate; dateCounter <= endDate; dateCounter++)
    {
        this.AddOptionToDropDown(this.dateDropdownId,parseInt(dateCounter),parseInt(dateCounter));
    }
    this.SelectOption(this.dateDropdownId,this.selectedDate.getDate());
}

DropdownDateControl.prototype.GetDaysInMonth = function(int_month,int_year)
{
   if (parseInt(int_month)==11 )
    {
        var new_month = 0
        var new_year_calc =parseInt(int_year)+1 ;
    }
    else if (int_month!=11 )
    {
        var new_month = parseInt(int_month)+1;
        var new_year_calc =parseInt(int_year);
    }
        
    //UBK CR:32768-321 Start
    //    date1=new Date(int_year,int_month,1);
    //    date2=new Date(new_year_calc,new_month,1);
    //var noOfDays =(date2.valueOf() - date1.valueOf())/86400000;
    
    date1 = adjustForDaylightSaving(new Date(int_year,int_month,1));
    date2 = adjustForDaylightSaving(new Date(new_year_calc,new_month,1));
 
    var noOfDays = days_between(date2,date1);
    //UBK End
    
    return noOfDays;
}

DropdownDateControl.prototype.ParseDate = function(dateString)
{
    if(dateString)
    {
        var formatString = this.clientParameters.DateFormat;
        var strValidString="dMy";
        var strSeparator;
        var datePart;
        var monthPart;
        var yearPart;
        
        for(var i=0;i<formatString.length;i++)
        {
            if(strValidString.indexOf(formatString.charAt(i)) == -1)
                { 
                    strSeparator = formatString.charAt(i);
                    break;
                }
        }        
        var arrFormatString = formatString.split(strSeparator);
        var arrDateString = dateString.split(strSeparator);
            
        for(var arrCounter=0; arrCounter < arrFormatString.length; arrCounter++)
        {
            switch(arrFormatString[arrCounter])
            {
                case 'd': case 'dd':
                {
                    datePart = parseInt(this.RemoveZero(arrDateString[arrCounter]));
                    break;
                }
                case 'M': case 'MM':
                {
                    monthPart = parseInt(this.RemoveZero(arrDateString[arrCounter]-1));
                    break;
                }
                case 'MMM':
                {
                    for(var counter=0; counter<this.monthNames.length; counter++)
                    {
                        var monthName = this.monthNames[counter];
                        if(arrDateString[arrCounter].toLowerCase() == monthName.toLowerCase())
                        {
                            monthPart = counter;
                            break;
                        }
                    }
                    break;
                }
                case 'yyyy': case 'yy':
                {
                    yearPart = parseInt(this.RemoveZero(arrDateString[arrCounter]));
                    if (yearPart<=99){yearPart=yearPart+2000;}
                    break;
                }
                default:
                {
                    alert("Unrecognised date format");
                }
            }
        }
        return new Date(yearPart,monthPart,datePart);
    }
}

DropdownDateControl.prototype.RemoveZero = function(value)
{
    if(value.length > 1 && value.substring(0,1) == "0")
        return value.substring(1, value.length);
    else return value;
}

DropdownDateControl.prototype.ResetValues = function()
{
    this.selectedDate = null;
    this.maximumDate = null;
    this.minimumDate = null;
//    this.renderedMonth = null;
//    this.renderedYear = null;
    this.clientParameters = null;
}

DropdownDateControl.prototype.OnChange = function()
{
    this.RenderSelectedDate();
    this.ClearDropdown(this.dateDropdownId,this.dateDropdownId.options.length-1);
    this.ClearDropdown(this.monthDropdownId,this.monthDropdownId.options.length-1);
    this.ClearDropdown(this.yearDropdownId,this.yearDropdownId.options.length-1);
    this.CreateCalendar();    
}

DropdownDateControl.prototype.FormatDate = function(year,month,date)
{
    var finalDate = this.clientParameters.DateFormat;
    
    if(finalDate)
    {
        finalDate = finalDate.replace("yyyy",year);
        finalDate = finalDate.replace("yy",this.FormattedText(year % 100));
        finalDate = finalDate.replace("dd",this.FormattedText(date));
        finalDate = finalDate.replace("d",date);
        finalDate = finalDate.replace("MMM","{0}"); // To avoid replacing M in month names
        finalDate = finalDate.replace("MM",this.FormattedText(month +1));
        finalDate = finalDate.replace("M",month+1);
        finalDate = finalDate.replace("{0}",this.monthNames[month]);
        return finalDate;
    }
}

DropdownDateControl.prototype.FormattedText = function(value)
{
    if(value)
    {
        return (value < 10) ? "0" + value : value;
    }
}

DropdownDateControl.prototype.RenderSelectedDate = function()
{
    var currentSelectedDate = this.CalculateSelectedDate(this.yearDropdownId.options[this.yearDropdownId.selectedIndex].value,this.monthDropdownId.options[this.monthDropdownId.selectedIndex].value,this.dateDropdownId.options[this.dateDropdownId.selectedIndex].value);

    this.renderedYear = currentSelectedDate.getFullYear();
    this.renderedMonth = currentSelectedDate.getMonth();
    var dateSelected = currentSelectedDate.getDate();
    this.selectedDate = currentSelectedDate;
    if(this.serversideSelectedDateId)
    {
        this.serversideSelectedDateId.value = this.FormatDate(parseInt(this.renderedYear),parseInt(this.renderedMonth),parseInt(dateSelected));
    }
}

DropdownDateControl.prototype.CalculateSelectedDate = function(year,month,date)
{
    if(date > this.GetDaysInMonth(month,year))
    {
        date = this.GetDaysInMonth(month,year);
    }
 
    var newSelectedDate = new Date(year,month,date);
    if(this.displayAllDaysAndMonths == 'False') //*SK* CR:32768-332
    {
        if(newSelectedDate < this.minimumDate)
        {
            newSelectedDate = this.minimumDate;
        }
        else if(newSelectedDate > this.maximumDate)
        {
            newSelectedDate = this.maximumDate;
        }
    }
    else
    {
      this.SetSelectedDate(this.dateDropdownId,newSelectedDate)
    }
    return newSelectedDate;
}

DropdownDateControl.prototype.ClearDropdown = function(controlId,length)
{
    if(controlId)
    {
        for(var counter=length; counter >= 0;counter--)
        {
            controlId.remove(counter);
            //controlId.options.remove(counter);
        }
    }
}

DropdownDateControl.prototype.AddOptionToDropDown = function(controlId,text,value)
{
    var newOption = document.createElement("OPTION");
    newOption.text=text;
    newOption.value=value;
    controlId.options.add(newOption)
    return true;
}

DropdownDateControl.prototype.SelectOption = function(controlId,value)
{
    if(controlId)
    {
        for(var counter =0; counter < controlId.options.length; counter++)
        {
            if(value == controlId.options[counter].value)
            {
                controlId.options[counter].selected = true;
                break;
            }  
        }
    }
}

DropdownDateControl.prototype.GetDropdownControl = function(controlId)
{
    try
    {
        var currentDropdownControl;
        if(controlId && document.getElementById(controlId) && controlId != this.id)
        {
            var currentDropdownControlParameters = (controlId+"Parameters");
            if(eval(currentDropdownControlParameters))
            {
                currentDropdownControl= CreateDropDown(controlId);    
            }
        }
        else
        {
            currentDropdownControl = CreateDropDown(this.id);
        }
    }
    catch(evalException)
    {
        currentDropdownControl = CreateDropDown(this.id);
    }
    return currentDropdownControl;
}


DropdownDateControl.prototype.GetSelectedDate = function(controlId)
{
    var currentDropdownControl = this.GetDropdownControl(controlId);
    currentDropdownControl.RenderSelectedDate();
    return (currentDropdownControl.selectedDate) ? currentDropdownControl.selectedDate : '';
}

DropdownDateControl.prototype.SetSelectedDate = function(controlId,date)
{
    var currentDropdownControl = this.GetDropdownControl(controlId);
    currentDropdownControl.selectedDate = date;
    currentDropdownControl.renderedMonth = currentDropdownControl.selectedDate.getMonth();
    currentDropdownControl.renderedYear = currentDropdownControl.selectedDate.getFullYear();        
    currentDropdownControl.ClearDropdown(currentDropdownControl.dateDropdownId,currentDropdownControl.dateDropdownId.options.length-1);
    currentDropdownControl.ClearDropdown(currentDropdownControl.monthDropdownId,currentDropdownControl.monthDropdownId.options.length-1);
    currentDropdownControl.ClearDropdown(currentDropdownControl.yearDropdownId,currentDropdownControl.yearDropdownId.options.length-1);
    currentDropdownControl.CreateCalendar();
    if(currentDropdownControl.serversideSelectedDateId)
    {
        var dateSelected = currentDropdownControl.dateDropdownId.options[currentDropdownControl.dateDropdownId.selectedIndex].value
        currentDropdownControl.serversideSelectedDateId.value = currentDropdownControl.FormatDate(parseInt(currentDropdownControl.renderedYear),parseInt(currentDropdownControl.renderedMonth),parseInt(dateSelected));
    }
}

DropdownDateControl.prototype.SetDateRange = function(controlId,minDate,maxDate)
{
    var currentDropdownControl = this.GetDropdownControl(controlId);
    if(minDate && maxDate)
    {
        currentDropdownControl.minimumDate = minDate;
        currentDropdownControl.maximumDate = maxDate;
        currentDropdownControl.minimumYear = minDate.getFullYear();
        currentDropdownControl.maximumYear = maxDate.getFullYear();
    }
}

DropdownDateControl.prototype.GetMaximumDate = function(controlId)
{
    var currentDropdownControl = this.GetDropdownControl(controlId);
    return (currentDropdownControl.maximumDate) ? currentDropdownControl.maximumDate : '';
}