﻿/////////////////////////////////////////////////////////////////////////
//////////Общие положения и соглашение по именам/////////////////////////
/////////////////////////////////////////////////////////////////////////
//большинство input'ов и select'ов генерируются по аякс запросам на calculate.aspx
//названия/id начинаются с "select_", "chb_", "div_"  и т.д.
//элементы-контейнеры для input'ов и select'ов - div'ы
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////


var _calcDebug = false; // флаг отладки

/// url серверной части калькулятора
var _calcSrvUrl = "/_modules/calculator/active/calculate.aspx";

/// шлобальный флаг валидности формы калькулятора
var _isCalcValid = false;

/// флаг развернутого списка
var _calcFullList = false;

/// флаг возможности скачивать отчет
var _allowDownloadXL = true;

// флаг работы калькулятора с главной страницы
var _calcHomeMode = false;

// курс доллара
var _usdCost = 0;

// флаг указывает на то что имеетются элементов больше чем для краткого списка (10)
// это новый вариант взамен переключателя
var _calcMore = false;

// счетчик крутилки. когда 0 - крутилка скрывается
var _krutCounter = 0;

// флаг показывающий что выполняется запрос к доп форме
var _forceShowKrut = false;

/// инциализацтя калькулятора. 
/// попытка подгрузить поля формы и вывести результаты по возможности
function InitCalculator()
{
    FillMark(false);
}


/***** FILLs *********************************************/
/* 
эти методы формируют поля формы и отправляют значения для расчета
bool параметр sendValue указывает на необходимость обновить значение на сервере
bool параметр supressResponse указывает на ненужность обновлений вывода на клиентской части
bool параметер supressDependencies подавляет внутренние зависимые от обновленного поля ajax-обращения к серверу и т.п.
*/

/// хелп-метод для формирования url для ajax запроса fill метода
function _FillUrl(method, sendValue, parameters)
{
    url = _calcSrvUrl + "?method=" + method;
    if (sendValue) url += "&forcev=1";
    if (_calcDebug) url += "&cdebg=1";
    if (parameters) url += "&" + parameters;
    url += "&_nch=" + Date.parse(new Date());
    return url;
}


/// марка авто
function FillMark(sendValue)
{
    $.get(
        _FillUrl("fill_mark", sendValue, $("#select_mark").serialize()),
        function(response)
        {
            $('div#div_select_mark').html(response).show();
            $("#select_model").attr("disabled", "1");
            FillModel(false);
        }
    );
}

/// модель авто по марке
//
function FillModel(sendValue)
{
    $.get(
        _FillUrl("fill_model", sendValue, $("#select_model").serialize()),
        function(response)
        {
            $('div#div_select_model').html(response).show();
            FillPrice(false);
        }
    );
}


/// цена авто
function FillPrice(sendValue)
{
    $.get(
        _FillUrl("fill_price", sendValue, $("#cost").serialize() + "&" + $("#select_currency").serialize()),
        function(response)
        {
            // ответ приходит в виде "валюта|сумма"
            var curr = response.substr(0, response.indexOf("|"));
            var currCode = 1;
            if (curr == "usd") currCode = 0;
            if (curr == "rouble") currCode = 1;
            if (curr == "eur") currCode = 2;
            var cost = response.substr(response.indexOf("|") + 1);
            $('#cost').val(cost);
            $('#select_currency').val(currCode);
            
            // эта переменная объявлена только на главной странице,
            // и препятствует заполнению несуществующих на главной полей
            if (!_calcHomeMode) 
            {
                ValidateCalc();
                _forceShowKrut = _isCalcValid;
                FillAdvanced(false);
            }
        }
    );
}

/// подгружает всю нижнюю часть формы, парсит json, показывает если надо форму
/// и заполняет поля
function FillAdvanced(sendValue)
{
    //if (sendValue) alert($("#form_calc").serialize());
    ShowKrut();
    _forceShowKrut = false;
    $.get(
        _FillUrl("fill_advanced", sendValue, sendValue ? $("#form_calc").serialize() : ""),
        function(response)
        {
            FillResults(-1);
            ValidateCalc();
            DisplayAdvancedForm();
            if (_isCalcValid) { // если валидно
            
                var data = eval(response); // в response json ответ с данными всех полей
                
                if (data) 
                {
                    DrawYear(data.year, data.is_new); // год и "новая"
                    // опс
                    $("#div_select_ops_producer").html(data.ops_producer).show();
                    $("#div_select_ops_model").html(data.ops_model).show();
                    
                    // водилы
                    if (data.is_multidrive)
                    {
                        $("#chb_multidrive").attr("checked", "true");
                    }
                    else
                    {
                        $("#chb_multidrive").removeAttr("checked");
                    }
                    $("#div_select_experience").html(data.stages).show();
                    $("#div_select_age").html(data.ages).show();
                }
            }
            HideKrut();
        }
    );
}

/// отрисовка года выпуска и флага "новая"
function DrawYear(year, is_new)
{
    year = parseInt(year);
    date = new Date();
    if (isNaN(year) || year == 0) year = date.getYear();
    isNew = is_new > 0;
    if (isNew) {
        year = date.getYear();
        $("#select_car_year").val(year);
        $("#select_car_year").attr("disabled", "true");
        $("#chb_is_new").attr("checked", "true");
    } else {
        $("#select_car_year").val(year);
        $("#select_car_year").removeAttr("disabled");
        $("#chb_is_new").removeAttr("checked");
    }
}

/// подгружает и отображает результаты расчета или наоборот все скрывает
/// resultCurrency - валюта для вывода результата. если < 0 - не изменяется
function FillResults(resultCurrency)
{
    ValidateCalc();
    if (!_isCalcValid) 
    {
        DisplayResultList();
        DisplayFullListButton();
        return;
    }
    
    ShowKrut();
    $.get(
        _FillUrl("fill_result", false, "fulllist=" + (_calcFullList ? "1" : "0") + "&outcurr=" + resultCurrency),
        function(response)
        {
            ValidateCalc();
            if (!_isCalcValid) 
            {
                HideKrut();
                DisplayResultList();
            } 
            else 
            {
                if (response.length == 0)
                {
                    // форма валидна, но ответ с сервера пустой. косяк. повторный запрос
                    FillResults(-1);
                }
                
                var data = eval(response);
                if (data)
                {
                    _calcMore = data.allowFullList;
                    
                    /// подсветка кнопок выбора валюты результатов
                    $("#bcurr_usd").css("color", "#676767");
                    $("#bcurr_rouble").css("color", "#676767");
                    $("#bcurr_eur").css("color", "#676767");
                    $("#bcurr_" + data.resultCurrency).css("color", "#C40005");
                                
                    /// вывод курса валюты
                    if (data.resultCurrency == "rouble") {
                        $("#currBar").hide();
                    } else {
                        $("#currBar").show();
                        $("#currName").html(data.curr_name);
                        $("#currCost").html(data.curr_cost);
                    }
                    $('div#div_company_list').html(data.result);
                }
                
                HideKrut();
                DisplayResultList();
                DisplayFullListButton();
            }
            
        }
    );
}

/***** OnChanges *********************************************/

/// изменение марки
function OnChangeMark()
{
    FillMark(true);
}

/// изменение модели
function OnChangeModel()
{
    FillModel(true);
}

/// изменение цены
function OnChangePrice()
{
    FillPrice(true);
}

/// изменение поля на доп форме
function OnChangeAdv()
{
    $("#select_car_year").removeAttr("disabled");
    FillAdvanced(true);
}

/// клик на кнопку "полный список"
function OnChangeFullList(newMode)
{
    _calcFullList = newMode;
    FillResults(-1);
}

/// клик на кнопку "сохранить отчет"
function SaveToXLS()
{
    if (!_allowDownloadXL) return;
    _allowDownloadXL = false;
    DisplayReportButton();
    
    $.get(
        _FillUrl("download_report", false, ""),
        function(response)
        {
            try
            {
                if (response.length == 0 || response.charAt(0) == "^")
                {
                    var message = "Не удалось сформировать отчет.";
                    if (response.charAt(0) == "^" && response.length > 1)
                    {
                        response = response.substring(1, response.length - 1);
                        message += "\n" + response;
                    }
                }
                else
                {
                    document.location.href = response;
                }
            } catch(e) {
            } finally {
                _allowDownloadXL = true;
                DisplayReportButton();
            }
        }
    );
}

/********** utils *****************************/

/// уменьшает счетчик крутилок и если 0 отрисовывает
function HideKrut()
{
    --_krutCounter;
    if (_krutCounter < 0) _krutCounter = 0;
    if (_krutCounter == 0) DisplayResultList();
}

/// увеличивает счетчик крутилок и отрисовывает
function ShowKrut()
{
    ++_krutCounter;
    DisplayResultList();
}

/// управляет отображением нижней формой
function DisplayResultList()
{
    // отображаю крутилку если нужно и показана нижняя форма, или если установлен флаг _forceShowKrut
    if (_forceShowKrut || 
        (_krutCounter > 0 && $("#div_conditional_rendering_part_1").css("display") != "none")
        ) 
    {
        if ($("#div_company_list").css("display") != "none")
        {
            // если показан список результатов высота крутилки равна ему
            $('#tbKrut').css("height", $("#div_company_list").height() + $("#div_conditional_rendering_part_3").height());
        }
        else
        {
            // если списка результатов нет и крутилка еще не показана - нормализуем высоту
            if ($("#tbKrut").css("display") == "none") $('#tbKrut').css("height", "auto");
        }
        $('#tbKrut').show();
    }
    else 
    {
        $('#tbKrut').hide();
    }

    // рисую список и кнопки под ним
    if (_isCalcValid) {
        
        if (_krutCounter > 0) // даже если есть что показать проверяем крутилкой
        {
            $('#div_conditional_rendering_part_3').hide();
            $('#div_company_list').hide(); 
        }
        else 
        {
            $('#div_company_list').show();
            $('#div_conditional_rendering_part_3').show();
        }
        //$('#button_best').show();
        $('#button_zakaz').show();
        $('#button_calculate').hide();
        DisplayFullListButton();
        DisplayReportButton();
    } else {
        _calcFullList = false;
        $('#div_conditional_rendering_part_3').hide();
        $('#div_conditional_rendering_part_3').css("visibility", "visible");
        $('#div_company_list').hide();
        //$('#button_best').hide();
        $('#button_zakaz').hide();
        $('#button_calculate').show();
    }
}

/// управляет отображением кнопки "скачать отчет"
function DisplayReportButton()
{
    if (_allowDownloadXL) 
    {
        $("#div_SaveReport_disabled").hide();
        $("#div_SaveReport").show();
    } 
    else 
    {
        $("#div_SaveReport").hide();
        $("#div_SaveReport_disabled").show();
    }
}

/// управляет отображением кнопки "полный список"
function DisplayFullListButton()
{
    if (!_calcMore)  {
        $("#div_togglefulllist").html("").show();
        return;
    }
    /// это для нового варианта без переключателя. тут кстати _calcFullList всегда == null

    var resHtml = "";
    resHtml += "<table cellpadding=\"0\" cellspacing=\"0\" class=\"calcResultData\" >";
    resHtml += "<tr class=\"\">";
    resHtml += "<td align=\"center\" style=\"padding: 2px 0px; width:1%;\">";

    if (_calcFullList == 0)
    {
        resHtml += "<input id=\"input_image_fulllist\" name=\"input_image_fulllist\" type=\"image\" src=\"/i/bul-fulllist.gif\" style=\"width:12; height:9;\" onclick=\"OnChangeFullList(1);return false;\" alt=\"показать краткий список\" />";
        resHtml += "<div><img src=\"/_i/pix.gif\" width=\"25\" height=\"1\" alt=\"\" /></div></td>";
        resHtml += "<td style=\"padding-left: 0px; width:100%;\">";
//        resHtml += "<a href=\"\" onclick=\"OnChangeFullList(1);return false;\" style=\"color:#319535;\" id=\"a_togglefulllist\"  name=\"a_togglefulllist\">Полный список</a>";
        resHtml += "<a href=\"/calc/results/\">Полный список</a>";
    }
    if (_calcFullList == 1)
    {
        resHtml += "<input id=\"input_image_fulllist\" name=\"input_image_fulllist\" type=\"image\" src=\"/i/bul-fulllist.gif\" style=\"width:12; height:9;\" onclick=\"OnChangeFullList(0);return false;\" alt=\"показать краткий список\" />";
        resHtml += "<div><img src=\"/_i/pix.gif\" width=\"25\" height=\"1\" alt=\"\" /></div></td>";
        resHtml += "<td style=\"padding-left: 0px; width:100%;\">";
        resHtml += "<a href=\"\" onclick=\"OnChangeFullList(0);return false;\" style=\"color:#319535;\" id=\"a_togglefulllist\"  name=\"a_togglefulllist\">Краткий список</a>";  
    }
    resHtml += "</td><td></td><td></td><td></td></tr>";
    resHtml += "</table>";
    
    $("#div_togglefulllist").html(resHtml).show();
}

/// управляет отображением списка результатов
function DisplayAdvancedForm()
{
    if (_isCalcValid) $('#div_conditional_rendering_part_1').show();
    else $('#div_conditional_rendering_part_1').hide();
}


/// валидация формы. 
/// возвращает текст ошибки (пусто если ваолидно)
/// и устанавливает глобальный флаг _isCalcValid
function ValidateCalc()
{
    var error_message = '';
    if($('#select_mark').val() <= 0)
    {
        error_message += 'Не выбрана марка автомобиля. ';
    }
    if($('#select_model').val() <= 0)
    {
        error_message += 'Не выбрана модель автомобиля. ';
    }
    if($('#cost').val() <= 0)
    {
        error_message += 'Не указана цена автомобиля. ';
    }
    _isCalcValid = error_message.length == 0;
    return error_message;
}

/// типа нажали кнопку расчитать
function DoCalculate()
{
    var error_msg = ValidateCalc();
    DisplayResultList();
    if (!_isCalcValid)
    {  
        alert(error_msg);
    }
    else
    {
        FillAdvanced(false);
    }
}

/// типа нажали кнопку лучшая цена
function DoBestPrice()
{
    document.location.href = '/calc/best/';
}

/// отладочный вывод в новое окно
/// toTextAre - пишет в текстарию
function DebugWin(str, toTextArea)
{
    var w = window.open();
    if (toTextArea) str = '<textarea style="width:100%; height: 500px;">' + str + "</textarea>";
    w.document.open();
    w.document.write(str);
    w.document.close();
}
