﻿/// <reference name="MicrosoftAjax.js" />
function getIndexOf(source_array, value) {
    for (var i = 0; i < source_array.length && source_array[i] != value; i++)
    { }
    return i < source_array.length ? i : -1;
}

var osagoTHIdPattern = 'driver_{0}_osago_TH';

var paneTemplate = '<table class="DriverInfoTab-twoColumns">'
                    + '<tr>'
                    + '<td>'
                    + '<table width=350px>'
                    + '<tr>'
                    + '<td width=90px>'
                    + '<dl class="AgeBlock">'
                    + '<dd style="width: 90px;">Возраст</dd><br/>'
                    + '<div class="DriverSubAge">(полных лет)</div>'
                    + '</dl>'
                    + '</td>'
                    + '<td width=260px id="{0}"></td>'
                    + '</tr>'
                    + '</table>'
                    + '</td>'
                    + '<td>'
                    + '<table width=340px>'
                    + '<tr>'
                    + '<td width=120px>'
                    + '<dl class="AgeBlock">'
                    + '<dd style="width: 120px;">Стаж вождения</dd><br/>'
                    + '<div class="DriverSubAge">(полных лет)</div>'
                    + '</dl>'
                    + '</td>'
                    + '<td width=220px id="{2}">'
                    + '</td>'         
                    + '</tr>'                                   
                    + '</table>'
                    + '</td>'
                    + '</tr>'
                    + '<tr{7}>'
                    + '<td colspan="2" style="height: 8px;">'
                    + '</td>'
                    + '</tr>'
                    + '<tr{7}>'
                    + '<th id="{6}">Текущий год использования ОСАГО:</th>'
                    + '<th><div id="{5}" style="display:none" >Количество аварий с использованием ОСАГО:</div></th>'
                    + '</tr>'
                    + '<tr{7}>'
                    + '<td id="{1}"></td>'
                    + '<td>'
                    + '<table id="{3}" style="display:none">'
                    + '<tr>'
                    + '<th>за первый год:</th>'
                    + '<td id="{4}"></td>'
                    + '</tr>'
                    + '</table>'
                    + '</td>'
                    + '</tr>'
                    + '</table>';

function convertNumberToString(number) {
    switch(number)
    {
        case 0: return "Первый";
        case 1: return "Второй";
        case 2: return "Третий";
        case 3: return "Четвертый";
        case 4: return "Пятый";
        case 5: return "Шестой";
        case 6: return "Седьмой";  //AND020710 
        case 7: return "Восьмой";  //AND090611 DI-1263
        default : return "Очередной";
    }
}

//Инфа о водителе
//age - DIRadioGroup выбора возраста
//experience - DIRadioGroup выбора стажа
//headerDiv - ссылка на div заголовка панели
//contentDiv - ссылка на div содержания панели
Driver = function(age, experience, osago, osagoTable, kaskoCrash, headerDiv, contentDiv) {
    this._age = age;
    this._experience = experience;
    this._osago = osago;
    this._osagoTable = osagoTable;
    this._kaskoCrash = kaskoCrash;
    this._headerDiv = headerDiv;
    this._contentDiv = contentDiv;
}

Driver.prototype= {
	get_age: function() {
		return this._age;
	},
	
	get_experience: function() {
		return this._experience;
	},
	
	get_contentDiv: function() {
		return this._contentDiv;
	},
	
	get_kaskoCrash: function() {
		return this._kaskoCrash;
	},
	
	get_osago: function() {
		return this._osago;
	}
}

//Класс контролера бояна
//ageData - ссылка на строку с данными возрастов
//expData - ссылка на строку с данными стажа вождения
//selectedClass - класс для выбранного элемента
//unselectedClass - класс для невыбранного элемента
//exectlyAgeExpFlag - Параметр того чтоь создавать контрол задания точной даты
DriversController = function(ageData, expData, osagoData, crashData, selectedClass, unselectedClass, exectlyAgeExpFlag) {
    this._selectedClass = selectedClass;
    this._unselectedClass = unselectedClass;
    this._ageData = ageData;
    this._expData = expData;
    this._osagoData = osagoData;
    this._crashData = crashData;
    this._drivers = new Array();
    this._counter = 0;
    this._selectedIndexChangedListened = false;
    this._lastSelectedIndex = -1;
    this._indexes = new Array();
    this._indexes[0] = 0;
    this._stateChanged = null;
    this._multiDrive = false;
    this._exactlyAgeExp = exectlyAgeExpFlag;
}

DriversController.prototype = {

    _getDriverCount: function() {
        this._counter++;
        return this._counter;
    },

    //Функция создает наполение панели водителя
    //contentConteiner - div контейнер для наполнения
    //headerDiv - div заголоавка, нужен что бы получить индекс панели
    //needToSetDefaultValues - true, если нужно установить значения возраста и опыта в дефолтное значение
    //showAll - true, если нужно показывать все контролы, false, если только возраст и стаж
    //return - объект типа {ageControl, expControl}
    _createContent: function(contentConteiner, headerDiv, needToSetDefaultValues, showAll) {
        var index = this._getDriverCount();
        var ageConteinerId = "driver_" + index.toString() + "_age_conteiner";
        var expConteinerId = "driver_" + index.toString() + "_exp_conteiner";
        var crashTableId = "driver_osagotable_" + index.toString();
        var osagoConteinerId = "driver_" + index.toString() + "_osago_conteiner";
        var crash1ConteinerId = "driver_" + index.toString() + "_crash_1_conteiner";
        var captionId = "driver_" + index.toString() + "_osago_caption";
        var osagoTHId = String.format(osagoTHIdPattern, index.toString());
        contentConteiner.innerHTML = String.format(paneTemplate, ageConteinerId, osagoConteinerId, expConteinerId, crashTableId, crash1ConteinerId, captionId, osagoTHId, showAll ? '' : ' style="display:none;"');

        //AND280410 var ageControl = new DIRadioGroup(ageConteinerId, this._ageData, 'driver_' + index.toString() + "_age", null, null, this._selectedClass, this._unselectedClass, "|");
        //ageControl.select('18-21');
        //AND280410 var expControl = new DIRadioGroup(expConteinerId, this._expData, 'driver_' + index.toString() + "_exp", null, null, this._selectedClass, this._unselectedClass, "|");

        var ageControl = null;
        var expControl = null;
        if (this._exactlyAgeExp == "True"){
            ageControl = new DIAgeExpirience(ageConteinerId, this._ageData, 'driver_' + index.toString() + "_age", null, null, this._selectedClass, this._unselectedClass, "|");
            expControl = new DIAgeExpirience(expConteinerId, this._expData, 'driver_' + index.toString() + "_exp", null, null, this._selectedClass, this._unselectedClass, "|");
            } else {
            ageControl = new DIRadioGroup(ageConteinerId, this._ageData, 'driver_' + index.toString() + "_age", null, null, this._selectedClass, this._unselectedClass, "|");
            expControl = new DIRadioGroup(expConteinerId, this._expData, 'driver_' + index.toString() + "_exp", null, null, this._selectedClass, this._unselectedClass, "|");

        		if (needToSetDefaultValues) {
        			expControl.selectByIndex(0);
        			ageControl.selectByIndex(0);
        		}
            }

        //expControl.select('менее 2');
        //AND280410
        var osagoControl = new DIRadioGroup(osagoConteinerId, this._osagoData, 'driver_' + index.toString() + "_osago", null, null, this._selectedClass, this._unselectedClass);
        osagoControl.select('первый');
        osagoControl.setChildTableId(crashTableId);
        var osagoTable = $create(Renins.OsagoHistory, null, null, null, $get(crashTableId));
        osagoTable.setCaptionId(captionId);
        osagoTable.setPaneIndex(index);
        osagoControl.setClickHandler(osagoTable.setRowNumber);
        var crash1Control = new DIRadioGroup(crash1ConteinerId, this._crashData, 'driver_' + index.toString() + "_crash_1", null, null, this._selectedClass, this._unselectedClass);
        crash1Control.select('ни одной');
        osagoTable.addControl(crash1Control);

        this.addDriver(ageControl, expControl, osagoControl, osagoTable, null, headerDiv, contentConteiner);

        return { ageControl: ageControl, osagoControl: osagoControl, osagoTable: osagoTable, expControl: expControl };
    },

    //Получить строку с номером водителя
    //index - номер
    _getDriverNumber: function(index) {
        return convertNumberToString(index) + " водитель";
    },

    //прячет - показывает кнопку удалить панель
    //divConteiner - div заголовка
    //visible - видимость
    showHideDeleteSpan: function(divConteiner, visible) {
        if (divConteiner != null) {
            if (visible) {
                divConteiner.childNodes[1].childNodes[0].style.display = "";
            }
            else {
                divConteiner.childNodes[1].childNodes[0].style.display = "none";
            }
        }
    },

    //Обработчик события смены выделеной панели
    _selectedIndexChange: function(sender, e) {
        var index = e.get_selectedIndex();
        var oldIndex = e.get_oldIndex();
        var ctrl = Renins.DI.DriversController;
        if (oldIndex > 0 && oldIndex < ctrl._drivers.length) {
            ctrl.showHideDeleteSpan(ctrl._drivers[oldIndex]._headerDiv, false);
        }
        if (index > 0 && index < ctrl._drivers.length) {
            ctrl.showHideDeleteSpan(ctrl._drivers[index]._headerDiv, true);
        }
        if (navigator.userAgent.toLowerCase().indexOf('gecko') == -1) {
            sender._element.childNodes[1].className = 'DriverTop';
        }
        else {
            sender._element.childNodes[2].className = 'DriverTop';
        }
    },

    //выставляет правильный цсс класс для верхней панели.
    //behavior - контроллер аккордиона
    _set_ClassNameForTop: function(behavior) {
        //Мутим со стилями (грязный хак)
        if (navigator.userAgent.toLowerCase().indexOf('gecko') == -1) {
            behavior._element.childNodes[1].className = 'DriverTop';
        }
        else {
            behavior._element.childNodes[2].className = 'DriverTop';
        }
    },

    //Вызов обработчиков события изменения состояния
    _onStateChanged: function(data) {
        if (this._stateChanged != null) {
			for (var i = 0; i < this._stateChanged.length; i++){
				this._stateChanged[i](data);
			}
		}
    },

    //Добавляет контролы возраст, стаж, div заголовка и содержания во внутрений список.
    addDriver: function(age, exp, osago, osagoTable, kaskoCrash, headerDiv, contentDiv) {
        age.setAccordion(this);
        exp.setAccordion(this);
        osago.setAccordion(this);
        if (osagoTable) osagoTable.setAccordion(this);
        if (kaskoCrash) kaskoCrash.setAccordion(this);
        var index = this._drivers.length;
        this._drivers[index] = new Driver(age, exp, osago, osagoTable, kaskoCrash, headerDiv, contentDiv);
    },

    //Проверяем, чтобы у всех водителей были заполнен возраст и стаж
    checkAgeAndExpSelectedForAllDrivers: function(needToCheckKaskoCrash) {
        var success = true;
        for (var i = 0; i < this._drivers.length && success; i++) {
            success = this._drivers[i]._experience.getValue() != null && this._drivers[i]._experience.getValue() != '' &&
                      this._drivers[i]._age.getValue() != null && this._drivers[i]._age.getValue() != '' &&
                      this._drivers[i]._age.getValue() > 17 
        }
        success = success && (!needToCheckKaskoCrash || (this._drivers[0]._kaskoCrash.getValue() != null && this._drivers[0]._kaskoCrash.getValue() != ''));
        return success;
    },

    //Добавляет новую панель
    //behavior - ссылка на контроллер аккордиона
    //needToSetDefaultValues - true, если нужно установить значения возраста и опыта в дефолтное значение
    //return - возвращает объет типа {ageControl, expControl}
    addPane: function(behavior, needToSetDefaultValues, showAll) {
        if (!this._selectedIndexChangedListened) {
            behavior.add_selectedIndexChanged(this._selectedIndexChange);
            this._selectedIndexChangedListened = true;
        }
        behavior.set_SelectedIndex(-1);
        //var selectedPane = behavior.get_Pane(behavior.get_SelectedIndex());

        var index = behavior.get_Count();


        this._indexes[index] = this._drivers.length;
        //Создаем панельку
        var root = behavior.get_element();
        //Создаем заголовок
        var header = document.createElement("div");
        var divClass = '';
        header.innerHTML = "<span class='" + divClass + "'><a href='#'>" + this._getDriverNumber(this._drivers.length) + "</a></span>";
        header.innerHTML += "<kbd><a style='display:none;cursor:pointer'  onclick=\"Renins.DI.DriversController.removePane($find(accordionID + '_AccordionExtender'), this);\" >Удалить водителя</a></kbd>";

        //Выставляем класс для предыдущего
        //Создаем контейнер для контента
        var paneContent = document.createElement("div");
        //Добавляем их в боян
        paneContent.className = 'DriverInfo';
        root.appendChild(header);
        root.appendChild(paneContent);
        behavior.addPane(header, paneContent);

        //Создаем наполнение контента
        var ctrls = this._createContent(paneContent, header, needToSetDefaultValues, showAll);

        behavior.set_SelectedIndex(index);

        this._set_ClassNameForTop(behavior);

        return ctrls;
    },

    //Удаление панели
    //behavior - аккордион
    //span - ссылка на надпись удалить панель.
    removePane: function(behavior, span) {
        index = span.parentNode.parentNode._index;
        var correctIndex = this._indexes[index];
        var root = behavior.get_element();
        var driver = this._drivers[correctIndex];
        //Выбираем предыдущего водителя
        if (this._drivers.length > 1) {
            behavior.set_SelectedIndex(index - 1);
        }
        else {
            behavior.set_SelectedIndex(0);
        }
        //Меняем индексы у хедеров в аккордионе
        var i = 0;
        for (i = index; i < behavior._panes.length; i++) {
            behavior._panes[i].header._index = behavior._panes[i].header._index - 1;
        }
        //Удаляем из массивов
        this._drivers.splice(correctIndex, 1);
        behavior._panes.splice(index, 1);
        //Удаляем из DOM
        $removeHandler(driver._headerDiv, "click", behavior._headerClickHandler)
        root.removeChild(driver._contentDiv.parentNode);
        root.removeChild(driver._headerDiv);

        //Переписываем номера водителей
        for (i = 1; i < this._drivers.length; i++) {
            var spanInner = this._drivers[i]._headerDiv.childNodes[0].childNodes[0];
            var s = this._getDriverNumber(i);
            spanInner.innerHTML = s;
        }

        this._set_ClassNameForTop(behavior);

        this.stateChangedNotify(index);
    },

    selectIndex: function(behavior, index) {
        behavior.set_SelectedIndex(index);
    },

    setMultiDrive: function(behavior, value) {
        ///<summary></summary>
        this._multiDrive = value;
        if (this._multiDrive) {

        }
        else {
        }
    },

    _getDriverAge: function(age) {
        var index = getIndexOf(driverOldAge, age);
        if (index > -1) {
            return driverNewAge[index];
        }
        else {
            return age;
        }
    },

    //Восстанавливает состояние бояна
    //state - закодированное состояние. Массив объектов типа {age, exp}
    restoreState: function(behavior, state) {
        var oState = state;
        //Если в анкете возраст заполен по старому, по минимальному в диапазоне, то меппим его в новый режим (по максимуму)
        //oState[0].age != '' ? this._drivers[0]._age.selectByID(this._getDriverAge(oState[0].age)) : this._drivers[0]._age.selectByIndex(0);
        oState[0].age != '' ? this._drivers[0]._age.selectValueInRange(oState[0].age, false) : this._drivers[0]._age.selectByIndex(0);
        //this._drivers[0]._age.selectByID(oState[0].age);
        oState[0].exp != '' ? this._drivers[0]._experience.selectValueInRange(oState[0].exp, true) : this._drivers[0]._experience.selectByIndex(0);
        //this._drivers[0]._experience.selectByID(oState[0].exp);
        this._drivers[0]._kaskoCrash.selectByID(oState[0].kaskoCrash);
        this._drivers[0]._osago.selectByID(oState[0].osago);
        this._drivers[0]._osagoTable.restoreState(oState[0].crash);
        
        //При восстановлении значений контролов, показываем сразу и информацию по каско и по осаго.
        var trs = this._drivers[0].get_contentDiv().getElementsByTagName('tr');
        for (var i = 0; i < trs.length; i++){
			if (trs[i].style.display == 'none') {
				trs[i].style.display = '';
			}
		}
		var osagoTH = $get(String.format(osagoTHIdPattern, 0));
		if (osagoTH != null){
			osagoTH.style.display = '';
		}
		this._drivers[0].get_osago().getContainer().style.display = '';
		        
        for (var i = 1; i < oState.length; i++) {
            var pane = this.addPane(behavior, false, true);
            //oState[i].age != '' ? pane.ageControl.selectByID(this._getDriverAge(oState[i].age)) : pane.ageControl.selectByIndex(0);
            oState[i].age != '' ? pane.ageControl.selectValueInRange(oState[i].age, false) : pane.ageControl.selectByIndex(0);
            oState[i].exp != '' ? pane.expControl.selectValueInRange(oState[i].exp, true) : pane.expControl.selectByIndex(0);
            pane.osagoControl.selectByID(oState[i].osago);
            pane.osagoTable.restoreState(oState[i].crash);
        }
    },

    setStateChanged: function(handler) {
        if (this._stateChanged != null){
			this._stateChanged.push(handler);
		}
		else {
			this._stateChanged = [handler];
		}
    },

    stateChangedNotify: function(data) {
        this._onStateChanged(data);
    },

    getData: function() {
        var res = '';
        for (var i = 0; i < this._drivers.length; i++) {
            var dr = this._drivers[i];
            if (dr._age.getValue() != "" && dr._experience.getValue()) {
                res += 'age=' + dr._age.getValue() + ';exp=' + dr._experience.getValue() + ';osago=' + dr._osago.getValue() + ';';
                res += 'crash=' + dr._osagoTable.getData() + (dr._kaskoCrash ? ';kaskoCrash=' + dr._kaskoCrash.getValue() : '') + '&';
            }
        }
        return res;
    },

    getKaskoCrashControl: function() {
        return this._drivers[0]._kaskoCrash;
    },
    
    getDriver: function(index) {
		return this._drivers[index];
    }
}

//Создаем в случае необходимости глобальный объект renins
if(this.Renins == undefined || this.Renins == null)
{
    Renins = new Object();
}

if(this.Renins.DI == undefined || this.Renins.DI == null)
{
    Renins.DI = new Object();
}

//this.Renins.DI.DriversController = new DriversController(driverAgeData, driverExpData, driverYearData, driverCrashData, 'selected', "");
this.Renins.DI.DriversController = new DriversController(driverAgeData, driverExpData, driverYearData, driverCrashData, 'selected', "", ExectlyAgeExpirience);

function InitAccordionInDrivers(behavior) {
    //AND280410 var firstDriverAge = new DIRadioGroup('driver_1_age_conteiner_static', driverAgeData, 'driver_0_age', null, null, 'selected', '', "|");
    //firstDriverAge.select('18-21');
    
    var firstDriverAge;
    var firstDriverExp;
    if (ExectlyAgeExpirience == "True") {
        firstDriverAge = new DIAgeExpirience('driver_0_age_conteiner_static', driverAgeData, 'driver_0_age', null, null, 'selected', '', "|");
        firstDriverExp = new DIAgeExpirience('driver_0_exp_conteiner_static', driverExpData, 'driver_0_exp', null, null, 'selected', '', "|");
    } else {
        firstDriverAge = new DIRadioGroup('driver_0_age_conteiner_static', driverAgeData, 'driver_0_age', null, null, 'selected', '', "|");
        firstDriverExp = new DIRadioGroup('driver_0_exp_conteiner_static', driverExpData, 'driver_0_exp', null, null, 'selected', '', "|");
        }
    
    //firstDriverExp.select('менее 2');
    var firstDriverYear = new DIRadioGroup('driver_0_osago_conteiner_static', driverYearData, 'driver_0_osago', null, null, 'selected', '');
    firstDriverYear.select("первый");
    firstDriverYear.setChildTableId("driverOsagoHistory");

    var firstDriverCrash1 = new DIRadioGroup('driver_0_crash_1_conteiner_static', driverCrashData, 'driver_0_crash_1', null, null, 'selected', '');
    firstDriverCrash1.selectByID("0");

    var kaskoCrash = new DIRadioGroup('driver_0_kasko_crash_conteiner_static', kaskoCrashData, 'driver_0_kaskoCrash', null, SyncKaskoCrash, 'selected', '');

    var firstPaneOsagoHistory = $create(Renins.OsagoHistory, null, null, null, $get("driverOsagoHistory"));
    firstDriverYear.setClickHandler(firstPaneOsagoHistory.setRowNumber);
    firstPaneOsagoHistory.addControl(firstDriverCrash1);
    firstPaneOsagoHistory.setCaptionId("divCaption");
    
    this.Renins.DI.DriversController.addDriver(firstDriverAge, firstDriverExp, firstDriverYear, firstPaneOsagoHistory, kaskoCrash, behavior.get_Pane(0).header, behavior.get_Pane(0).content);

    //Собственник
    multiDriveOwnerOsagoBeh = new DIRadioGroup('multiDriveOwnerOsagoConteiner', driverYearData, 'multidriver_0_osago', null, null, 'selected', '');
    multiDriveOwnerOsagoBeh.select("первый");
    multiDriveOwnerOsagoBeh.setChildTableId("multiDriveOwnerCrashTable");
    multiDriveKaskoCrash = new DIRadioGroup('multidrive_kasko_crash_conteiner_static', kaskoCrashData, 'multidrive_kasko_crash', null, SyncKaskoCrash, 'selected', '');

    var multiDriveOwnerCrash1Beh = new DIRadioGroup('multiDriveOwnerCrash1Conteiner', driverCrashData, 'multidriver_0_crash_1', null, null, 'selected', '');
    multiDriveOwnerCrash1Beh.selectByID("0");

    multiDriveOsagoOwner = $create(Renins.OsagoHistory, null, null, null, $get("multiDriveOwnerCrashTable"));
    multiDriveOwnerOsagoBeh.setClickHandler(multiDriveOsagoOwner.setRowNumber);
    multiDriveOsagoOwner.addControl(multiDriveOwnerCrash1Beh);
    multiDriveOsagoOwner.setCaptionId("divCaption2");
    multiDriveOsagoOwner.setPrefix("multidriver_");
}


//Кликнули на чекбокс с мультидрайвом
function MultiDriveClick() {
    var multiDriveCheckBox = $find("multiDriveCheckBox");
    if (multiDriveCheckBox.get_checked()) {
        $get(drivers_div_id).style.display = "none";
        $get('multiDriveOwner').style.display = "";
    }
    else {
        $get(drivers_div_id).style.display = "block";
        $get('multiDriveOwner').style.display = "none";
    }
    
    if (typeof(SetCalcBtnStatus) == 'function') {
        SetCalcBtnStatus();
    }
    if (typeof (CalculatingNewPrices) == 'function') {
        CalculatingNewPrices()    
    }
}

function SyncKaskoCrash(radioGroup) {
    if (radioGroup.getValue() != multiDriveKaskoCrash.getValue()) {
        multiDriveKaskoCrash.selectByID(radioGroup.getValue());
    }
    else if (radioGroup.getValue() != Renins.DI.DriversController.getKaskoCrashControl().getValue()) {
		Renins.DI.DriversController.getKaskoCrashControl().selectByID(radioGroup.getValue());
    }
}

function disableMultiDrive(disabled) {
    $get("MultiDriveDiv").disabled = disabled;
}

function restoreDriverInfo(behavior, value) {
    if (value != '') {
        var state = eval(value);
        if (state.Drivers.length > 0)
            Renins.DI.DriversController.restoreState(behavior, state.Drivers);
        multiDriveOwnerOsagoBeh.selectByID(state.MultiDrive.osago);
        //if (!multiDriveCheckBox) {
        //var multiDriveCheckBox = $find("multiDriveCheckBox");
        //}
        //debugger;
        //if (multiDriveCheckBox.get_checked() != state.MultiDrive.checked)
        //    multiDriveCheckBox.click();
        multiDriveOsagoOwner.restoreState(state.MultiDrive.crash);
    }
}
