﻿/* 

Provides encapsulated communication between date picker components.
 
ASSUMPTION:
particular date picker is located on web site and named with number - which specifies his rerefences to other date pickers
ex: there are three date pickers on the page (ucDatePicker1, ucDatePicker2, ucDatePicker3). 
It's mean that ucDatePicker3 should always has later date that others, ucDatePicker2 should has later date that ucDatePicker1 but ealier that ucDatePicker3
     
*/

//
// Following scripts will be evaluated first, and then discarded so mediator will start works.
//
$(document).ready(function() {
    var script = "<script>new DatePickersMediator();<\/script>";
    $("form").append(script);
});

DatePickersMediator = function() {
    this.components = {};
    this.registerComponents();
    this.registerHandlers();
}

DatePickersMediator.prototype.registerComponents = function() {
    this.components = $('input[id *= ucDatePicker]');
}

//
//  Bind mediator as onSelect and onChange events handlers for each component.
//
DatePickersMediator.prototype.registerHandlers = function() {

    var components = this.components;

    $.each(components, function(i, component) {
        $(component).datepicker('option', 'onSelect', function() {
            DatePickersMediator.prototype.compareDates(components, component);
        });
    });

    $.each(components, function(i, component) {
        $(component).change(function() {
            DatePickersMediator.prototype.compareDates(components, component);
        });
    });
}

//
//  Compare dates with other components.
//  Determine if decrease or increase related dates.
//
DatePickersMediator.prototype.compareDates = function(components, component) {

    var pickerDate = $(component).datepicker("getDate");
    var pickerNr = DatePickersMediator.prototype.parseDatePickerNumber(component.id);
    var offset = 1;

    $.each(components, function(i, colleague) {
        var collegueDate = $(colleague).datepicker("getDate");
        var colleguePickerNr = DatePickersMediator.prototype.parseDatePickerNumber(colleague.id);

        var ealierPicker = colleguePickerNr < pickerNr;
        var laterPicker = colleguePickerNr > pickerNr;

        if ((ealierPicker && collegueDate > pickerDate) ||
            (laterPicker && collegueDate < pickerDate)) {

                $(colleague).datepicker("setDate", pickerDate);
        }
    });
}

//
//  Parse for date picker number.
//    remarks: modify if range greater than 0-9 is required.
//
DatePickersMediator.prototype.parseDatePickerNumber = function(datePickerId) {

    var controlPartialName = "ucDatePicker";
    var index = datePickerId.indexOf(controlPartialName, 0) + controlPartialName.length;
    return datePickerId.substring(index, index + 1);
}