﻿if (typeof Olsk == 'undefined') Olsk = {}
Olsk.Forms = {}

//////////////////////////
Olsk.Forms.UrlBuilder = function (baseUrl, containerID, statusSummaryID) {
    this.BaseUrl = baseUrl;
    if (containerID != null) this.SetContainer(document.getElementById(containerID));
    if (statusSummaryID != null) this.StatusSummary = document.getElementById(statusSummaryID);
    this.Mediators = new Olsk.Dictionary();
}
Olsk.Forms.UrlBuilder.prototype.SetContainer = function (container) { this.Container = container; }
//controlID и container - optional parameters
Olsk.Forms.UrlBuilder.prototype.RegFormField = function (qsName, controlID, container) {
    if (qsName == null) return;
    if (controlID == null) controlID = qsName;
    if (container == null) container = this.Container;
    var mediator = new Olsk.Forms.FormFieldMediator(controlID, container);
    this.Mediators.Add(qsName, mediator);
}
Olsk.Forms.UrlBuilder.prototype.RegFormFieldCollection = function (qsName, controlIDs, container) {
    if (qsName == null || controlIDs == null) return;
    if (container == null) container = this.Container;

    var subMediators = new Array();
    for (var index in controlIDs) subMediators.push(new Olsk.Forms.FormFieldMediator(controlIDs[index], container));
    
    var mediator = new Olsk.Forms.CompositeMediator(subMediators);
    this.Mediators.Add(qsName, mediator);
}
Olsk.Forms.UrlBuilder.prototype.RegCustomField = function (qsName, mediator) {
    if (qsName == null || mediator == null) return;
    this.Mediators.Add(qsName, mediator);
}
Olsk.Forms.UrlBuilder.prototype.RegConstField = function (qsName, value) {
    if (qsName == null) return;
    var mediator = new Olsk.Forms.ConstMediator(value);
    this.Mediators.Add(qsName, mediator);
}

Olsk.Forms.FormStatusTypes = { Handling: 'Handling', Handled: 'Handled', HandledWithError: 'HandledWithError', HandledWithUnknownError: 'HandledWithUnknownError' }

Olsk.Forms.UrlBuilder.prototype.ShowStatusMessage = function (status, message) {
    var cssClass = 'status_message';
    switch (status) {
        case Olsk.Forms.FormStatusTypes.HandledWithUnknownError:
            message = 'При обработке формы на сервере произошла ошибка. Попробуйте позвонить в компанию.';
            cssClass = 'status_error';
            break;
        case Olsk.Forms.FormStatusTypes.HandledWithError:
            cssClass = 'status_error';
            break;
        case Olsk.Forms.FormStatusTypes.Handling:
            message = 'Форма обрабатывается на сервере...';
            cssClass = 'status_handling';
            break;
        case Olsk.Forms.FormStatusTypes.Handled:
            cssClass = 'status_handled';
            if (this.Container != null) this.Container.innerHTML = message;
            break;
    }
    if (this.StatusSummary != null) {
        this.StatusSummary.className = cssClass;
        this.StatusSummary.innerHTML = message;
    } else {
        alert(message);
    }
}

Olsk.Forms.UrlBuilder.prototype.RegSubmit = function (controlID, responseElementID) {
    var submitElement = document.getElementById(controlID);
    if (submitElement == null) return;
    var responseElement = document.getElementById(responseElementID);

    var thisObject = this;
    var responseHandler = function (response) {
        var formHandleResult = Olsk.DeserializeFromJSON(response);
        if (formHandleResult == null) {
            thisObject.ShowStatusMessage(Olsk.Forms.FormStatusTypes.HandledWithUnknownError);
        }
        var handledStatus = formHandleResult.IsSuccess == true
                            ? Olsk.Forms.FormStatusTypes.Handled
                            : Olsk.Forms.FormStatusTypes.HandledWithError;
        thisObject.ShowStatusMessage(handledStatus, formHandleResult.Message);
    }
    var requestAndReplace = function () {
        thisObject.ShowStatusMessage(Olsk.Forms.FormStatusTypes.Handling);
//        new Olsk.HttpRequest().Get(
//            thisObject.GetQS(),
//            { success: responseHandler }
//        );
        new Olsk.HttpRequest().Post(
            thisObject.BaseUrl,
            { success: responseHandler },
            thisObject.GetParameters()
        );
    }

    Olsk.AddEventListener(submitElement, "click", requestAndReplace);
}
Olsk.Forms.UrlBuilder.prototype.GetQS = function () {
    return this.BaseUrl
           + (this.BaseUrl.indexOf('?') != -1 ? "&" : "?")
           + this.GetParameters();
}
Olsk.Forms.UrlBuilder.prototype.GetParameters = function () {
    var qs = "";
    var thisObject = this;
    var getValueFunc = function (qs, qsName, mediator) {
        if (mediator.GetContainer() == null) mediator.SetContainer(thisObject.Container);
        return Olsk.AddQueryParameter(qs, qsName, mediator.GetValue());
    }
    var parameters = this.Mediators.ForEachWithResult(getValueFunc, qs);
    return parameters;
}

// Olsk.Forms.BaseMediator
Olsk.Forms.BaseMediator = function () { }
Olsk.Forms.BaseMediator.prototype.GetContainer = function () { return this.Container; }
Olsk.Forms.BaseMediator.prototype.SetContainer = function (container) { this.Container = container; }
Olsk.Forms.BaseMediator.prototype.GetValue = function () { return null; }

// Olsk.Forms.FormFieldMediator
Olsk.Forms.FormFieldMediator = function (controlID, container) {
    this.ControlID = controlID;
    this.Container = container;
}
Olsk.Forms.FormFieldMediator.prototype = new Olsk.Forms.BaseMediator();
Olsk.Forms.FormFieldMediator.prototype.GetValue = function () {
    var control = this.Container != null
                      ? Olsk.GetElementByID(this.Container, this.ControlID)
                      : document.getElementById(this.ControlID);
    var value = null;
    if (control != null) {
        switch (control.tagName) {
            case "INPUT":
                if (control.type == "checkbox" || control.type == "radio") {
                    if (control.checked == true) value = control.value;
                } else {
                    value = control.value;
                }
                break;
            case "TEXTAREA":
                value = control.value;
                break;
            case "SELECT":
                if (control.options.length > 0) {
                    value = control.options[control.selectedIndex].value;
                }
                break;
        }
    } else {
        alert(this.ControlID);
    }
    return value;
}

// Olsk.Forms.CompositeMediator
Olsk.Forms.CompositeMediator = function (mediators) {
    this.Mediators = mediators;
}
Olsk.Forms.CompositeMediator.prototype = new Olsk.Forms.BaseMediator();
Olsk.Forms.CompositeMediator.prototype.GetValue = function () {
    var resultString = "";
    for (var index in this.Mediators) {
        var inputValue = this.Mediators[index].GetValue();
        if (inputValue != null && inputValue != "") {
            if (resultString != "") resultString += ",";
            resultString += inputValue;
        }
    }
    return resultString;
}

// Olsk.Forms.ConstMediator
Olsk.Forms.ConstMediator = function (value) { this.Value = value; }
Olsk.Forms.ConstMediator.prototype = new Olsk.Forms.BaseMediator();
Olsk.Forms.ConstMediator.prototype.GetValue = function () { return this.Value; }

// Olsk.Forms.DelegateMediator
Olsk.Forms.DelegateMediator = function (delegate) { this.Delegate = delegate; }
Olsk.Forms.DelegateMediator.prototype = new Olsk.Forms.BaseMediator();
Olsk.Forms.DelegateMediator.prototype.GetValue = function () { return this.Delegate(); }
