﻿/// <reference path="/Shared/Libs/vex-3.1.1/js/vex.js" />


$(function () {
    AjaxInit();
});

function AjaxInit() {
}



function VexDialogAddNiceCloseButton(contentClassName) {
    var closeMe = $("<div class='CloseMe'>X</div>");
    closeMe.click(function () { vex.closeTop(); });

    if (contentClassName !== undefined && contentClassName.length > 0) {
        $("div.vex-content." + contentClassName).append(closeMe);
    } else {
        $("div.vex-content").append(closeMe);
    }
}


if (typeof vex !== 'undefined') {
    vex.defaultOptions.className = "vex-theme-flat-attack";
}



function AjaxCall(url, data, successCallback, errorCallback, buttonToDisable, hideWait) {

    //console.log(data);
    /*
    console.log("AjaxCall");
    console.log("Url:");
    console.log(url);

    console.log("Data:");
    console.log(data);

    console.log("successCallback:");
    console.log(successCallback);

    console.log("errorCallback:");
    console.log(errorCallback);

    console.log("buttonToDisable:");
    console.log(buttonToDisable);

    console.log("hideWait:");
    console.log(hideWait);
    */
    var params = ParseAjaxData(data);

    //console.log("params:");
    //console.log(params);

    AjaxCallDataRaw(url, params, successCallback, errorCallback, buttonToDisable, hideWait);
}


function ParseAjaxData(data) {
    var params = "";
    for (var key in data) {
        if (data.hasOwnProperty(key)) {
            if (params !== "") {
                params += ",";
            }
            params += "\"" + key + "\":\"" + data[key] + "\"";
        }
    }
    params = "{" + params + "}";

    return params;
}


function AjaxCallDataRaw(url, rawData, successCallback, errorCallback, buttonToDisable, hideWait) {
    //console.log("AjaxCallDataRaw");

    $.ajax({
        type: "POST",
        url: url,
        data: rawData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        //timeout: 1000,
        beforeSend: function (xhr) { BeforeAjaxSend(xhr, buttonToDisable, hideWait); },
        error: function (xhr, textStatus, errorThrown) { BeforeError(xhr, textStatus, errorThrown, buttonToDisable, errorCallback); },
        success: function (msg) { BeforeSuccess(msg, buttonToDisable, successCallback); }
    });
}


function AjaxCallEx(url, data, options, custom) {
    //var params = ParseAjaxData(data);

    var defaults = {
        type: 'POST',
        url: url,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        cache: false,
        beforeSend: function (xhr) {
            BeforeAjaxSend(xhr, custom.buttonToDisable, custom.HideWait);

            if (custom.basicAuth) {
                xhr.setRequestHeader("Authorization", "Basic " + custom.basicAuth);
            }
            if (custom.accessToken) {
                xhr.setRequestHeader("AccessToken", custom.accessToken);
            }
            $.each(custom.headers, function (key, value) {
                xhr.setRequestHeader(key, value);
            });
            if (custom.beforeSendCallback) {
                custom.beforeSendCallback(xhr);
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            BeforeError(xhr, textStatus, errorThrown, custom.buttonToDisable, custom.errorCallback);
        },
        success: function (msg) {
            BeforeSuccess(msg, custom.buttonToDisable, custom.successCallback);
        }
    };
    var ax = $.extend({}, defaults, options || {});

    $.ajax(ax);
}


function GetCall(url, callback) {
    SetWaitDialogTimeout();
    $.get(url, callback).always(HideWaitingDialog);
}


function BeforeAjaxSend(xhr, button, hideWait) {
    //console.log("BeforeAjaxSend");
    DisableButton(button);

    if (hideWait === true) {
        return;
    }

    SetWaitDialogTimeout();
}

function SetWaitDialogTimeout() {
    $("#PleaseWaitOverlay").show();
}



function HideWaitingDialog() {
    $("#PleaseWaitOverlay").hide();
}


function DisableButton(button) {

    if (button == null) {
        return;
    }

    button = $(button);

    if (button.text !== null) {
        button.data("data-org-text", button.text());
        button.text("Vent");

    } else if (button.val !== null) {
        button.data("data-org-text", button.val());
        button.val("Vent");
    }


    button.attr("disabled", true);
    button.addClass("DisabledButton");

}

function BeforeError(xhr, textStatus, errorThrown, buttonToDisable, handler) {
    //console.log("BeforeError");
    HideWaitingDialog();
    EnableButton(buttonToDisable);
    handler(xhr, textStatus, errorThrown);
}

function BeforeSuccess(msg, buttonToDisable, handler) {
    //console.log("BeforeSuccess");
    HideWaitingDialog();
    EnableButton(buttonToDisable);
    handler(msg, buttonToDisable);
}


function GreatSuccess(time) {
    if (time === undefined) {
        time = 800;
    }

    $("#SuccessOverlay").show();
    $("#SuccessOverlay").delay(time).fadeOut();
}



function EnableButton(button) {

    if (button == null) {
        return;
    }

    button = $(button);

    if (button.text !== null) {
        button.text(button.data("data-org-text"));
    } else if (button.val !== null) {
        button.val(button.data("data-org-text"));
    }


    button.removeAttr("disabled", "");
    button.removeClass("DisabledButton");

}


function HandleAjaxErrorVex(jqXhr, textStatus, errorThrown) {

    //console.log(jqXhr);

    var n = "\r\n";

    var error = eval("(" + jqXhr.responseText + ")");


    var message = error.Message + n + n;
    message += textStatus + n + n;
    message += errorThrown + n + n;
    if (error.ExceptionType !== undefined) {
        message += error.ExceptionType + n + n;
    }

    message += "StackTrace:" + n;

    var stackTrace = "-none-";
    if (error.StackTrace !== undefined && error.StackTrace !== null) {
        stackTrace = error.StackTrace.replace(/\r\n/g, "¤");
    }

    $.each(stackTrace.split('¤'), function (index, value) {
        message += "  " + value + n;
    });

    message = "<h1>Systemfeil</h1><pre>" + message + "</pre>";

    if (typeof vex === 'undefined') {
        alert(message);
        return;
    }

    CreateVexErrorDialog(message);
}


function CreateVexErrorDialog(message) {
    vex.dialog.alert({
        unsafeMessage: message,
        overlayClosesOnClick: false,
        contentClassName: 'vex-content fault'
    });
}

function HandleAjaxError(xhr, textStatus, errorThrown) {
    HandleAjaxErrorVex(xhr, textStatus, errorThrown);
}


function ConfirmVex(message, callback, okText, cancleText, contentClassName) {

    var index = "WideNice StandardNice".indexOf(contentClassName);
    var isNiceBox = index >= 0;
    var afterOpenFunc = isNiceBox ? function () { VexDialogAddNiceCloseButton(contentClassName) } : null;

    var okOrg = vex.dialog.buttons.YES.text;
    okText = (okText == null || okText === "" ? okOrg : okText);

    var cancleOrg = vex.dialog.buttons.NO.text;
    cancleText = (cancleText == null || cancleText === "" ? cancleOrg : cancleText);

    vex.dialog.buttons.YES.text = okText;
    vex.dialog.buttons.NO.text = cancleText;

    vex.dialog.confirm({
        unsafeMessage: message,
        contentClassName: 'vex-content ' + contentClassName,
        callback: function (value) {
            if (value) {
                return callback();
            }
            return false;
        },
        afterOpen: afterOpenFunc
    });

    vex.dialog.buttons.YES.text = okOrg;
    vex.dialog.buttons.NO.text = cancleOrg;

}


function ConfirmVexValidate(message, callback, okText, cancleText, overlayClosesOnClick, contentClassName, afterOpenCallback) {

    var okOrg = vex.dialog.buttons.YES.text;
    okText = (okText == null || okText === "" ? okOrg : okText);

    var cancleOrg = vex.dialog.buttons.NO.text;
    cancleText = (cancleText == null || cancleText === "" ? cancleOrg : cancleText);

    vex.dialog.buttons.YES.text = okText;
    vex.dialog.buttons.NO.text = cancleText;

    var options = {
        unsafeMessage: message,
        contentClassName: contentClassName,
        overlayClosesOnClick: overlayClosesOnClick,
        onSubmit: function (event) {
            event.preventDefault();
            event.stopPropagation();

            callback(function () {
                vex.closeTop();
            });
        },
        afterOpen: function () {
            if (afterOpenCallback !== undefined && afterOpenCallback !== null) {
                afterOpenCallback();
            }

            // Workaround for Firefox bugg
            $("body").css("position", "fixed");
            setTimeout(function () { $("body").css("position", ""); }, 500);
        },
        callback: function () { /* Required but not needed, see onSubmit */ }
    };


    vex.dialog.confirm(options);

    vex.dialog.buttons.YES.text = okOrg;
    vex.dialog.buttons.NO.text = cancleOrg;

}



function VexDialog(message, yesButton, noButton, callback, overlayClosesOnClick, contentClassName, unsafeMessage) {

    var afterOpenFunc = (contentClassName === "WideNice") ? VexDialogAddNiceCloseButton : null;

    var buttons = [];

    if (yesButton.length > 0) {
        buttons.push($.extend({}, vex.dialog.buttons.YES, { text: yesButton }));
    }

    if (noButton.length > 0) {
        buttons.push($.extend({}, vex.dialog.buttons.NO, { text: noButton }));
    }

    vex.dialog.open({
        message: message,
        unsafeMessage: unsafeMessage,
        buttons: buttons,
        contentClassName: contentClassName,
        overlayClosesOnClick: overlayClosesOnClick,
        afterOpen: afterOpenFunc,
        onSubmit: function (event) {
            event.preventDefault();
            event.stopPropagation();
            var vexContent = $(this).parent();

            callback(function () {
                vex.close(vexContent.data().vex.id);
            });

        }
    });

}


function PromptVex(message, value, placeholder, callback, contentClassName) {

    var afterOpenFunc = (contentClassName === "PromptNice") ? VexDialogAddNiceCloseButton : null;

    vex.dialog.prompt({
        unsafeMessage: message,
        placeholder: placeholder,
        value: value,
        callback: function (input) {
            if (input === false) {
                return;
            }
            callback(input);
        },
        afterOpen: afterOpenFunc,
        contentClassName: 'vex-content ' + contentClassName
    });
}


function AlertVex(message, contentClassName, callback) {

    var afterOpenFunc = null;

    if (contentClassName === "WideNice") {
        afterOpenFunc = function () {
            var closeMe = $("<div class='CloseMe'>X</div>");
            closeMe.click(function () { vex.closeTop(); });
            $("div.vex-content.WideNice").append(closeMe);
        }
    }


    if (contentClassName === "StandardNice") {
        afterOpenFunc = function () {
            var closeMe = $("<div class='CloseMe'>X</div>");
            closeMe.click(function () { vex.closeTop(); });
            $("div.vex-content.StandardNice").append(closeMe);
        }
    }

    var options = {
        unsafeMessage: message,
        overlayClosesOnClick: true,
        contentClassName: 'vex-content ' + contentClassName,
        afterOpen: afterOpenFunc
    };

    if (callback !== undefined && callback !== null) {
        options.callback = callback;
    }

    vex.dialog.alert(options);
}

