﻿var __errorAlert = true;
var __blockUIBehavior = {
    "Active": true,
    "UpdatePanel": true,
    "WebService": true,
    "CascadingDropDown": false,
    "UpdatePanelIDExceptions": new Array(),
    "PostBackElementIDExceptions": new Array(),
    "WebServiceMethodNameExceptions": new Array()
};
var __blockUIByUser = false;
var __blockUITimeoutID;
var __messageTimeout = 0;
var __RadToolTipManager1RTMPanel = false;

function blockUI(type, text, force) {
    if (typeof (force) == "undefined") {
        force = false;
    }
    if (__blockUIByUser) {
        if (!force) {
            return;
        }
    }
    if (text == "OnPreRender" || text == "add_invokingRequest" || text == "ajaxSend") {
        text = "Cargando...";
    }
    var element = $("div.loading");
    element.find(".loadingText").html(text);
    if (type != "submit") {
        $.blockUI({ message: element });
    }
    else {
        clearTimeout(__blockUITimeoutID);
        __blockUITimeoutID = setTimeout("blockUIWithTimeout();", 750);
    }
}

function blockUIByUser(text) {
    __blockUIByUser = true;
    blockUI("user", text, true);
}

function blockUIWithTimeout() {
    $.blockUI({ message: $("div.loading") });
}

function collapseExpandLeftPanel(e) {
    var element = $(this);
    var left = $(".leftPanel");
    var right = $(".rightPanel");
    var firstClick = typeof (element.data("firstClick")) == "undefined" ? firstClick = true : firstClick = element.data("firstClick");
    if (firstClick) {
        element.data("firstClick", false);
        element.data("leftWidth", left.width());
        element.data("rightWidth", right.width());
    }
    var collapsed = typeof (element.data("collapsed")) == "undefined" ? collapsed = false : collapsed = element.data("collapsed");
    element.data("collapsed", !collapsed);
    if (!collapsed) {
        $(".leftPanelInnerWrap").fadeOut();
        left.css("width", "0");
        right.css("width", "100%");
        changeSrcFileName(element, "Expand.png");
    }
    else {
        right.css("width", "80%");
        left.css("width", "20%");
        $(".leftPanelInnerWrap").fadeIn("slow");
        changeSrcFileName(element, "Collapse.png");
    }
}

function configureAjaxUI() {
    try {
        configureBlockUI();
        configureJQueryAjax();
        configureASPNETAjax();
    }
    catch (e) {
        alert("configureAjaxUI error\n" + e.message);
    }
}

function configureASPNETAjax() {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    //prm.sender.abortPostBack()
    //prm.get_isInAsyncPostBack()

    //UpdatePanel
    prm.add_initializeRequest(function(sender, e) {
        //Se provoca antes de que se inicie el procesamiento de la solicitud asincrónica.
        //Puede utilizar este evento para cancelar una devolución de datos.
        //http://msdn.microsoft.com/es-es/library/bb311030(v=VS.90).aspx        
        //e.get_postBackelement()
        //e.get_request()
    });
    //UpdatePanel
    prm.add_beginRequest(function(sender, e) {
        //Se provoca antes de que empiece el procesamiento de una devolución de datos asincrónica y se envíe la devolución de datos al servidor. 
        //Puede utilizar este evento para establecer los encabezados de la solicitud o para iniciar una animación que indique que la página se está procesando.
        //http://msdn.microsoft.com/es-es/library/bb384003(v=VS.90).aspx
        //e.get_postBackelement()
        //e.get_request()   
    });
    //UpdatePanel, PageMethod, WebService
    Sys.Net.WebRequestManager.add_invokingRequest(function(sender, e) {
        //http://msdn.microsoft.com/es-es/library/bb397421(v=VS.90).aspx
        //get_cancel()
        //get_webRequest()
        //set_cancel()
        var body = e.get_webRequest().get_body();
        var url = e.get_webRequest().get_url();
        var webService = false;
        if (typeof (e.get_webRequest().get_headers()["X-MicrosoftAjax"]) == "undefined") {
            webService = true;
        }
        var postBackElementID = "";
        var updatePanelID = "";
        var eventTarget = "";
        var eventArgument = "";
        var methodName = "";
        var i, j;
        if (!webService) {
            var values = body.split("&");
            i = values[0].indexOf("%7C");
            j = values[0].indexOf("=");
            updatePanelID = values[0].substring(j + 1, i);
            updatePanelID = replace(updatePanelID, "%24", "_");
            postBackElementID = values[0].substring(i + "%7C".length);
            postBackElementID = replace(postBackElementID, "%24", "_");
            Array.forEach(values, function(element, index, array) {
                if (element.startsWith("__EVENTTARGET=")) {
                    i = element.indexOf("=");
                    if (i != -1 && i != element.length - 1) {
                        eventTarget = element.substring(i + 1);
                    }
                    return;
                }
                if (element.startsWith("__EVENTARGUMENT=")) {
                    i = element.indexOf("=");
                    if (i != -1 && i != element.length - 1) {
                        eventArgument = element.substring(i + 1);
                    }
                    return;
                }
            }, this);
        }
        else {
            i = url.indexOf(".asmx");
            methodName = url.substring(i + ".asmx".length + 1); //Quitar /
        }
        if (eventTarget.endsWith("RadToolTipManager1RTMPanel")) {
            __RadToolTipManager1RTMPanel = true;
        }
        //__blockUIBehavior
        if (!__blockUIBehavior.Active) {
            clearTimeout(__blockUITimeoutID);
            return;
        }
        if (!webService) {
            if (!__blockUIBehavior.UpdatePanel) {
                clearTimeout(__blockUITimeoutID);
                return;
            }
            else if (Array.contains(__blockUIBehavior.UpdatePanelIDExceptions, updatePanelID)) {
                clearTimeout(__blockUITimeoutID);
                return;
            }
            else if (Array.contains(__blockUIBehavior.PostBackElementIDExceptions, postBackElementID)) {
                clearTimeout(__blockUITimeoutID);
                return;
            }
        }
        else {
            if (body.startsWith("{\"knownCategoryValues\":")) {
                if (!__blockUIBehavior.CascadingDropDown) {
                    return;
                }
            }
            else {
                if (!__blockUIBehavior.WebService) {
                    return;
                }
                else if (Array.contains(__blockUIBehavior.WebServiceMethodNameExceptions, methodName)) {
                    return;
                }
            }
        }
        clearTimeout(__blockUITimeoutID);
        blockUI((webService ? "webService" : "updatePanel"), "add_invokingRequest", false);
    });
    //UpdatePanel, PageMethod, WebService
    Sys.Net.WebRequestManager.add_completedRequest(function(sender) {
        //http://msdn.microsoft.com/es-es/library/bb907038(v=VS.90).aspx
        if (sender.get_webRequest().get_body().startsWith("{\"knownCategoryValues\":")) {
        }
        else {
            unBlockUI(false);
        }
    });
    //UpdatePanel
    prm.add_pageLoading(function(sender, e) {
        //Se provoca después de recibir la respuesta del servidor a una devolución de datos asincrónica, pero antes de actualizar el contenido de la página. 
        //Puede utilizar este evento para proporcionar un efecto de transición personalizado para el contenido actualizado.
        //http://msdn.microsoft.com/es-es/library/bb310960(v=VS.90).aspx
        //e.get_cancel()
        //e.get_postBackelement()
        //e.get_request()
        //e.set_cancel()        
    });
    //UpdatePanel
    prm.add_pageLoaded(function(sender, e) {
        //Se provoca una vez actualizado todo el contenido de la página, como resultado de una devolución de datos sincrónica o asincrónica. 
        //Puede utilizar este evento para proporcionar un efecto de transición personalizado para el contenido actualizado.        
        //http://msdn.microsoft.com/es-es/library/bb397476(v=VS.90).aspx
        //e.get_dataItems()
        //e.get_panelsCreated()
        //e.get_panelsUpdated()    
    });
    //UpdatePanel
    Sys.Application.add_load(function(sender, e) {
        //Se provoca una vez cargados todos los scripts y una vez creados e inicializados los objetos en la aplicación.
        //http://msdn.microsoft.com/es-es/library/bb383829(v=VS.90).aspx
        //e.get_components()
        //e.get_isPartialLoad()        
    });
    //UpdatePanel
    prm.add_endRequest(function(sender, e) {
        //Se provoca después de que finalice una devolución de datos asincrónica y se haya devuelto el control al explorador. 
        //Puede utilizar este evento para proporcionar una notificación a los usuarios o para registrar los errores.
        //http://msdn.microsoft.com/es-es/library/bb397499(v=VS.90).aspx
        //e.get_dataItems()
        //e.get_error()
        //e.get_errorHandled()
        //e.get_response()
        if (e.get_error()) {
            alert(e.get_error().message);
            e.set_errorHandled(true);
        }
        __RadToolTipManager1RTMPanel = false;
        unBlockUI(false);
    });
    Sys.Application.add_unload(function(sender, e) {
        //http://msdn.microsoft.com/es-es/library/bb310821(v=VS.90).aspx
        //Se provoca antes de que se eliminen todos los objetos de la aplicación cliente, normalmente cuando se provoca el evento DOM window.unload        
    });
}

function configureBlockUI() {
    $.blockUI.defaults.baseZ = 9002;
    $.blockUI.defaults.css.border = "none";
    $.blockUI.defaults.css.height = "";
    var element = $("div.loading");
    //var left = ($(window).width() - element.width()) / 2 + 'px';
    $.blockUI.defaults.css.bottom = 0;
    $.blockUI.defaults.css.right = 0;
    $.blockUI.defaults.css.top = "";
    $.blockUI.defaults.css.left = "";
    $.blockUI.defaults.css.width = "";
    $.blockUI.defaults.fadeIn = 0;
    $.blockUI.defaults.fadeOut = 0;
    $.blockUI.defaults.overlayCSS.opacity = 0.3;
}

function configureJQueryAjax() {
    $(document).ajaxSend(function(event, XMLHttpRequest, ajaxOptions) {
        //this; // dom element listening
        //__blockUIBehavior
        if (!__blockUIBehavior.Active) {
            return;
        }
        else {
            var methodName = "";
            var url = ajaxOptions.url;
            i = url.indexOf(".asmx");
            if (i != -1) {
                methodName = url.substring(i + ".asmx".length + 1); //Quitar /
            }
            if (!__blockUIBehavior.WebService) {
                return;
            }
            else if (Array.contains(__blockUIBehavior.WebServiceMethodNameExceptions, methodName)) {
                return;
            }
        }
        blockUI("jQuery", "ajaxSend", false);
    });
    $(document).ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError) {
        // thrownError only passed if an error was caught
        //this; // dom element listening
        try {
            if (__errorAlert) {
                eval("var error = " + XMLHttpRequest.responseText);
                alert(error.Message);
            }
            __errorAlert = true;
        }
        catch (e) {
            alert("Unspecified error.\n" + e.message);
        }
    });
    $(document).ajaxStop(function() {
        //this; // dom element listening        
        unBlockUI(false);
    });
}

function growlUI(title, content, type, timeout) {
    var html = "<div class='growlUI growlUI_" + type + "'><h1>" + title + "</h1><p>" + content + "</p></div>";
    if (typeof (timeout) == "undefined") {
        timeout = 4000;
    }
    $.blockUI({
        message: html,
        fadeIn: 700,
        fadeOut: 700,
        timeout: timeout,
        onBlock: function() {
            var element = $(this).find("div.growlUI");
            window.scrollTo(element.position().top, element.position().left);
        },
        showOverlay: false,
        centerY: false,
        css: {
            width: '350px',
            top: '10px',
            left: '',
            bottom: '',
            right: '10px',
            border: 'none',
            padding: '5px',
            backgroundColor: '#000',
            '-webkit-border-radius': '10px',
            '-moz-border-radius': '10px',
            opacity: .8,
            color: '#fff'
        }
    });
}

function hideMessage() {
    __messageTimeout = 0;
    $("div.message").hide().remove();
}

function showMessage(text, close, type, timeout) {
    if (typeof (timeout) == "undefined") {
        timeout = 0;
    }
    var html = new Sys.StringBuilder();
    html.append("<div class='message'>");
    html.append("<table>");
    html.append("<tr>");
    if (typeof (type) != "undefined" && type > 0) {
        html.append("<td class='type'>");
        var image;
        switch (type) {
            case 1:
                image = "OK24.png";
                break;
            case 2:
                image = "Message24.png";
                break;
            case 3:
                image = "Question24.png";
                break;
            case 4:
                image = "Alert24.png";
                break;
            case 5:
                image = "Error24.png";
                break;
        }
        html.append("<img src='" + __ClientEnvironment.Path.WebSiteImages + "/Basic/" + image + "' />");
        html.append("</td>");
    }
    html.append("<td class='text'>");
    html.append(text);
    html.append("</td>");
    if (close) {
        html.append("<td class='close'>");
        html.append("<img src='" + __ClientEnvironment.Path.WebSiteImages + "/Basic/Close24.png' alt='Cerrar' />");
        html.append("</td>");
    }
    html.append("</tr>");
    html.append("</table>");
    html.append("</div>");
    parentElement = $("#Content");
    if (parentElement.size() == 0) {
        alert(text);
        return;
    }
    $("div.message").remove();
    parentElement.prepend(html.toString());
    var element = $("div.message");
    if (close) {
        element.find(".close").find("img").unbind("click").click(function(e) {
            hideMessage();
        });
    }
    element.show();
    window.scrollTo(element.position().top, element.position().left);
    if (__messageTimeout) {
        window.clearTimeout(__messageTimeout);
    }
    if (timeout) {
        __messageTimeout = window.setTimeout("hideMessage();", timeout);
    }
}

function unBlockUI(force) {
    if (!__blockUIByUser) {
        $.unblockUI();
    }
    else {
        if (!force) {
            return;
        }
        __blockUIByUser = false;
        $.unblockUI();
    }
}
