Type.registerNamespace("Common");

Common.MessageControl = function() 
{
    this.lblCustomMessage = null;
    this.informationMessageUrl = null;
    this.informationMessageUrl2 = null;
    this.informationMessageUrl3 = null;

    this.updPanel = null;
    this.hdnMessageType = null;
    this.hdnMessageDisplayType = null;
    this.hdnMessageUrlType = null;
    this.hdnOnClientClose = null;
}

Common.MessageControl.prototype =
{
    _getMessage: function() {
        if (this.lblCustomMessage) {
            if (navigator.userAgent.toLowerCase().search(/msie\s(\d+(\.?\d)*)/) != -1) {
                return EncodeTextToUTF8($get(this.lblCustomMessage).innerHTML.trim());
            }
            else {
                return $get(this.lblCustomMessage).innerHTML.trim();
            }
        }
        else {
            return '';
        }
    },

    _setMessage: function(value) {
        $get(this.lblCustomMessage).innerHTML = value;
    },

    _getMessageType: function() {
        return parseInt($get(this.hdnMessageType).value);
    },

    _setMessageType: function(value) {
        $get(this.hdnMessageType).value = value.toString();
    },

    _getMessageUrlType: function() {
        return parseInt($get(this.hdnMessageUrlType).value);
    },

    _setMessageUrlType: function(value) {
        $get(this.hdnMessageUrlType).value = value.toString();
    },

    _getOnClientClose: function() {
        return $get(this.hdnOnClientClose).value;
    },

    _setOnClientClose: function(value) {
        $get(this.hdnOnClientClose).value = value;
    },

    _getMessageArguments: function() {

        var msgArgs = new Array();
        var updPanel = $get(this.updPanel);
        var msgArgElems = updPanel.getElementsByTagName('input');

        for (var i = 0; i < msgArgElems.length; i++) {
            var msgArgElem = msgArgElems[i];
            if ((msgArgElem.type == 'hidden') && (msgArgElem.id.indexOf('msgCtrlArg_') != -1)) {
                msgArgs.push(msgArgElem.value);
            }
        }

        return msgArgs;
    },

    _setMessageArguments: function(args) {

        this._removeOldArguments();

        var updPanel = $get(this.updPanel);

        // args is expected to be of type : Array        
        for (var i = 0; i < args.length; i++) {
            var input = document.createElement('input');
            input.setAttribute('id', 'msgCtrlArg_' + i);
            input.setAttribute('type', 'hidden');
            input.value = args[i];
            updPanel.appendChild(input);
        }
    },

    _removeOldArguments: function() {

        var updPanel = $get(this.updPanel);
        var inputElems = updPanel.getElementsByTagName('input');

        for (var i = 0; i < inputElems.length; i++) {
            var inputElem = inputElems[i];
            if ((inputElem.type == 'hidden') && (inputElem.id.indexOf('msgCtrlArg_') != -1)) {
                updPanel.removeChild(inputElem);
            }
        }
    },

    _buildArgsUrlParam: function() {
        var argsUrlParam = new Array();

        var msgArgs = this._getMessageArguments();

        for (var i = 0; i < msgArgs.length; i++) {
            msgArgs[i] = msgArgs[i].replace(/\\/g, '\\\\');
            msgArgs[i] = msgArgs[i].replace(/"/g, '\\"');
            msgArgs[i] = encodeURIComponent(msgArgs[i].replace(/\+/g, '%2B'));

            argsUrlParam.push('"' + msgArgs[i] + '"');
        }

        return argsUrlParam.join(',');
    },

    _getMessageTypeString: function() {
        var messageTypeString = null;

        switch (this._getMessageType()) {
            case MessageTypeEnum.ERROR:
                messageTypeString = 'Error';
                break;

            case MessageTypeEnum.WARNING:
                messageTypeString = 'Warning';
                break;

            case MessageTypeEnum.MESSAGE:
                messageTypeString = 'Message';
                break;

            default:
                alert("Unexpected MessageTypeEnum value.");
                break;
        }

        return messageTypeString;
    },

    _getInlineMessageClassName: function() {
        var className = null;

        switch (this._getMessageType()) {
            case MessageTypeEnum.ERROR:
                className = 'Error';
                break;

            case MessageTypeEnum.WARNING:
                className = 'Warning';
                break;

            case MessageTypeEnum.MESSAGE:
                className = 'Message';
                break;

            default:
                alert("Unexpected MessageTypeEnum value.");
                break;
        }

        return className;
    },

    _getMessageDisplayType: function() {
        return parseInt($get(this.hdnMessageDisplayType).value);
    },

    _setMessageDisplayType: function(value) {
        $get(this.hdnMessageDisplayType).value = value.toString();
    },

    _setMessageVisible: function(visible) {
        var lblCustomMessage = $get(this.lblCustomMessage);
        SetElementVisible(lblCustomMessage, visible);
    },

    _setMessageClassName: function(className) {
        var lblCustomMessage = $get(this.lblCustomMessage);
        lblCustomMessage.className = className;
    },

    showMessage: function() {
        switch (this._getMessageDisplayType()) {
            case MessageDisplayTypeEnum.INLINE:
                this.setUpdatePanelVisible(true);
                this._setMessageVisible(true);
                this._setMessageClassName(this._getInlineMessageClassName());

                break;

            case MessageDisplayTypeEnum.DIALOG:
                this.setUpdatePanelVisible(false);
                this._setMessageVisible(false);
                var messageTypeString = this._getMessageTypeString();
                if (messageTypeString != null) {
                    var message = this._getMessage();
                    var url = null;
                    switch (this._getMessageUrlType()) {
                        case MessageUrlTypeEnum.MESSAGE:
                            url = String.format(unescape(this.informationMessageUrl), message, messageTypeString);
                            break;

                        case MessageUrlTypeEnum.MESSAGE_KEY:
                            url = String.format(unescape(this.informationMessageUrl2), message, messageTypeString);
                            break;

                        case MessageUrlTypeEnum.MESSAGE_KEY_WITH_ARGS:
                            var argsUrlParam = this._buildArgsUrlParam();
                            url = String.format(unescape(this.informationMessageUrl3), message, messageTypeString, argsUrlParam);
                            break;
                    }

                    if (url != null) {
                        var manager = null;
                        try {
                            manager = windowManager.GetWindowManager();
                        }
                        catch (e) {
                            manager = GetRadWindowManager();
                        }

                        var infoDlg = manager.GetWindowByName('InformationDialog');

                        if (typeof (manager.UnCashRadWindow) != 'undefined') {
                            manager.UnCashRadWindow(infoDlg);
                        }
                        else if (typeof (windowManager) != 'undefined' && windowManager != null
                                && typeof (windowManager.UnCashRadWindow) != 'undefined' && infoDlg != null) {
                            windowManager.UnCashRadWindow(infoDlg);
                        }

                        infoDlg.SetModal(true);
                        infoDlg.SetUrl(url);
                        infoDlg.Show();
                        infoDlg.OnClientClose = this._getOnClientClose();

                        // the dialog is being shown
                        this.ClearMessage(); // the message is no longer needed - clear it
                        this._setOnClientClose(''); // so is OnClientClose method - clear it
                    }
                }

                break;

            default:
                alert('Unexpected MessageDisplayTypeEnum value.');
                break;
        }
    },

    SetErrorMessage: function(errorMessage, displayType, urlType, args) {
        this._setMessage(errorMessage);
        this._setMessageType(MessageTypeEnum.ERROR);

        this._setMessageDisplayType(MessageDisplayTypeEnum.DIALOG);
        if (displayType != null) {
            this._setMessageDisplayType(displayType);
        }

        this._setMessageUrlType(MessageUrlTypeEnum.MESSAGE);
        if (urlType != null) {
            this._setMessageUrlType(urlType);
        }

        if (args != null) // args is expected to be of type : Array
        {
            this._setMessageArguments(args);
        }
        else {
            this._setMessageArguments(new Array());
        }

        this.showMessage();
    },

    SetWarning: function(warningMessage, urlType, args) {
        this._setMessage(warningMessage);
        this._setMessageType(MessageTypeEnum.WARNING);
        this._setMessageDisplayType(MessageDisplayTypeEnum.DIALOG);

        this._setMessageUrlType(MessageUrlTypeEnum.MESSAGE);
        if (urlType != null) {
            this._setMessageUrlType(urlType);
        }

        if (args != null) // args is expected to be of type : Array
        {
            this._setMessageArguments(args);
        }
        else {
            this._setMessageArguments(new Array());
        }

        this.showMessage();
    },

    SetMessage: function(message, urlType, args) {
        this._setMessage(message);
        this._setMessageType(MessageTypeEnum.MESSAGE);
        this._setMessageDisplayType(MessageDisplayTypeEnum.DIALOG);

        this._setMessageUrlType(MessageUrlTypeEnum.MESSAGE);
        if (urlType != null) {
            this._setMessageUrlType(urlType);
        }

        if (args != null) // args is expected to be of type : Array
        {
            this._setMessageArguments(args);
        }
        else {
            this._setMessageArguments(new Array());
        }

        this.showMessage();
    },

    ClearMessage: function() {
        this._setMessage('');
        this._setMessageVisible(false);
    },

    setUpdatePanelVisible: function(visible) {
        if (this.updPanel) {
            var updPanel = $get(this.updPanel);
            SetElementVisible(updPanel, visible);
        }
    },

    setOnClientCloseHandler: function(value) {
        this._setOnClientClose(value);
    }
} 

Common.MessageControl.registerClass('Common.MessageControl', null, Sys.IDisposable);

var msgControl = new Common.MessageControl();

function MessageControl_endRequest(sender, args) 
{
    // Check to see if there's an error on this request.
    if (args.get_error() != undefined || args.get_error() != null) 
    {
        var httpStatusCode = args.get_error().httpStatusCode;
        if (httpStatusCode != undefined && httpStatusCode != null && httpStatusCode != 0)
        {
            var s = String.format(TR_CLIENT_MESSAGES["InternalError"], httpStatusCode);

            if (args.get_error().name == "Sys.WebForms.PageRequestManagerTimeoutException") {
                s = TR_CLIENT_MESSAGES["RequestTimeOut"];
            }

            msgControl.SetErrorMessage(s);
            // Let the framework know that the error is handled, 
            //  so it doesn't throw the JavaScript alert.
            args.set_errorHandled(true);
        }
    }
}

function MessageControl_beginRequest(sender, args) 
{
    msgControl.ClearMessage();
}

function MessageControl_applicationLoad(sender, args) {
    msgControl.setUpdatePanelVisible(false);
    
    var message = msgControl._getMessage();
    if (message != '') 
    {
        msgControl.showMessage();
    }
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();