var Y = YAHOO.util;

(function() {
    fitbit.namespace("fitbit.app.forums");
    fitbit.app.forums = {
        messageListDialog: null,

        sendButtonText: "&nbsp;&nbsp;&nbsp;&nbsp;" + fitbit.i18n.getResource('com.fitbit.app.forums.label.leave_message') + "&nbsp;&nbsp;&nbsp;&nbsp;",
        cancelButtonText: "&nbsp;&nbsp;&nbsp;&nbsp;" + fitbit.i18n.getResource('com.fitbit.app.forums.label.cancel') + "&nbsp;&nbsp;&nbsp;&nbsp;",

        init: function() {
            // Instantiate the Dialog
            fitbit.app.forums.messageListDialog = new YAHOO.widget.Dialog("messageListDialog",
            { width : "400px",
                fixedcenter : true,
                visible : false,
                constraintoviewport : true,
                draggable: true,
                buttons : [ { text:fitbit.app.forums.sendButtonText, handler:fitbit.app.forums.handleSubmit, id:"sendButton", isDefault:true },
                    { text:fitbit.app.forums.cancelButtonText, handler:fitbit.app.forums.handleCancel } ]
            });
        },

        handleSuccess: function(o) {
            fitbit.app.forums.messageListDialog.hide();
            fitbit.util.setContent(Y.Dom.get("messageList"), o.responseText);
            Y.Dom.addClass("messageListDialog", "invisible");
            fitbit.app.forums.init();

            //			var result = eval("(" + o.responseText + ")").result;
            //			if(result.status){
            // 				fitbit.app.forums.messageBox.show("Message posted", "You left your message successfully.");
            //				fitbit.app.forums.messageBoxDialog.hide();
            //                fitbit.util.setContent(Y.Dom.get("usermessagebox"), o.responseText);
            //			}else{
            //				fitbit.app.forums.showErrorMessages(result.errors);
            //				fitbit.app.forums.setSendButtonText(fitbit.app.forums.sendButtonText, false);
            //			}
        },

        showErrorMessages: function(errors) {
            var errorsHTML = fitbit.app.convertErrorsToList(errors);
            var errorsElement = Y.Dom.get("messageListDialogErrors");
            fitbit.util.setContent(errorsElement, errorsHTML);
        },

        clearErrorMessages: function() {
            var errorsElement = Y.Dom.get("messageListDialogErrors");
            fitbit.util.setContent(errorsElement, "");
        },

        handleFailure: function(o) {
            var errors = new Array();
            // var generalFatalError = {
            //	message: "We are experiencing technical difficulties, please try again later."
            //}

            // if validation failed then action bean produces 400 HTTP code with json array with error messages
            var result = eval("(" + o.responseText + ")").result;
            if (result.errors) {
                errors = result.errors;
            }
            //else{
            //	errors[0] = generalFatalError;
            //}
            fitbit.app.forums.showErrorMessages(errors);
            fitbit.app.forums.setSendButtonText(fitbit.app.forums.sendButtonText, false);
        },

        handleSubmit: function() {
            // we handle submission manually to be able to
            // display errors on the dialog without reopening.
            // otherwise this.submit() closes dialog immediatly
            // this.submit();

            fitbit.app.forums.setSendButtonText('<img src="/images/loadingf2f2f2.gif" alt="" width="12" height="12"/> ' + fitbit.i18n.getResource('com.fitbit.app.forums.message.js_sending'), true);
            fitbit.app.forums.clearErrorMessages();

            Y.Connect.setForm(this.form);

            var action = Y.Dom.get('actionName').getAttribute('value');
            Y.Connect.asyncRequest('POST', this.form.action + '?apiFormat=htmljson&' + action + '=on',
                    {
                        success:fitbit.app.forums.handleSuccess,
                        failure:fitbit.app.forums.handleFailure,
                        argument: []
                    },
                    null
                    );
        },

        handleAction: function(action, forumId, topicId, postId, forumType, goId, aoId, pageNum) {
            var actionURL = '/forums/messages?apiFormat=htmljson&forumId=' + forumId + '&topicId=' + topicId + '&postId=' + postId + '&' + action + '=on';
            actionURL += '&forumType=' + forumType + '&goId=' + goId + '&aoId=' + aoId;
            actionURL += '&pageNum=' + pageNum;
            
            var actionElement = Y.Dom.get("activate-" + postId);
            if (actionElement != null) {
                fitbit.util.setContent(actionElement, "activating");
            }
            Y.Connect.asyncRequest(
                    'GET',
                    actionURL,
                    {   success:fitbit.app.forums.handleSuccess,
                        failure:fitbit.app.forums.handleFailure,
                        argument: []
                    },
                    null
            );
        },

        handleStandaloneAction: function(action, forumId, topicId, postId, pageNum, pageSize, showNav) {
            var actionURL = '/forums/topic?apiFormat=htmljson&forumId=' + forumId + '&topicId=' + topicId + '&postId=' + postId + '&' + action + '=on';
            actionURL += '&pageNum=' + pageNum + '&pageSize=' + pageSize + '&showNav=' + showNav;

            var actionElement = Y.Dom.get("activate-" + postId);
            if (actionElement != null) {
                fitbit.util.setContent(actionElement, "activating");
            }
            Y.Connect.asyncRequest(
                    'GET',
                    actionURL,
                    {   success:fitbit.app.forums.handleSuccess,
                        failure:fitbit.app.forums.handleFailure,
                        argument: []
                    },
                    null
            );
        },

        /**
         * Executes the action on the given URL using the provided parameters as a GET. Replaces the given div with the HTML
         * segment returned.
         */
        handleEvent: function(actionURL, divToReplace, linkId, linkWaitMsg) {
            var linkEl = Y.Dom.get(linkId);
            if (linkEl != null) {
                fitbit.util.setContent(linkEl, linkWaitMsg);
            }

            Y.Connect.asyncRequest(
                    'GET',
                    actionURL,
                    {   success: function(o) {
                            fitbit.app.forums.handleEventSuccess(o, divToReplace);
                        },
                        failure: function(o) {
                            fitbit.app.forums.handleEventFailure(o, divToReplace);
                        },
                        argument: []
                    },
                    null
            );
        },

        /**
         * Executes the action on the given URL using the provided parameters as a POST. Replaces the given div with the HTML
         * segment returned.
         */
        handleFormEvent: function(divToReplace, btnWaitMsg) {
            fitbit.app.forums.setSendButtonText('<img src="/images/loadingf2f2f2.gif" alt="" width="12" height="12"/> ' + btnWaitMsg + '...', true);
            fitbit.app.forums.clearErrorMessages();

            var action = Y.Dom.get('actionName').getAttribute('value');
            Y.Connect.asyncRequest(
                    'POST',
                    this.form.action + '?apiFormat=htmljson&' + action + '=on',
                    {   success: function(o) {
                            fitbit.app.forums.handleEventSuccess(o, divToReplace);
                        },
                        failure: function(o) {
                            fitbit.app.forums.handleEventFailure(o, divToReplace);
                        },
                        argument: []
                    },
                    null
            );
        },

        handleEventSuccess: function(o, divName) {
            var divElement = Y.Dom.get(divName);
            fitbit.util.setContent(divElement, o.responseText);
        },

        handleEventFailure: function(o, divName) {
            var errors = new Array();
            // var generalFatalError = {
            //	message: "We are experiencing technical difficulties, please try again later."
            //}

            // if validation failed then action bean produces 400 HTTP code with json array with error messages
            var result = eval("(" + o.responseText + ")").result;
            if (result.errors) {
                errors = result.errors;
            }
            //else{
            //	errors[0] = generalFatalError;
            //}
            fitbit.app.forums.showEventErrors(errors, divName);
        },
        
        showEventErrors: function(errors, divName) {
            var errorsHTML = fitbit.app.convertErrorsToList(errors);
            var errorsElement = Y.Dom.get(divName);
            fitbit.util.setContent(errorsElement, errorsHTML);
        },
        
        setSendButtonText: function(buttonText, disable) {
            var sendButton = fitbit.app.forums.messageListDialog.getButtons()[0];
            sendButton.innerHTML = buttonText;
            sendButton.disabled = disable;
        },

        handleCancel: function() {
            this.cancel();
            fitbit.app.forums.clearErrorMessages();
        },

        showMessageBoxDialog : function(nextPage, showNav, sendButtonText, actionName) {
            if (fitbit.app.forums.messageListDialog == null) {
                fitbit.app.forums.init();
            }
            fitbit.app.forums.messageListDialog.render();
            Y.Dom.removeClass("messageListDialog", "invisible");
            fitbit.app.forums.setSendButtonText(sendButtonText, false);
            fitbit.app.forums.sendButtonText = sendButtonText;
            fitbit.util.setContent(Y.Dom.get('messageListDialogErrors'), '');
            fitbit.app.forums.setFormFieldValue('messageListForm', 'pageNum', nextPage);
            fitbit.app.forums.setFormFieldValue('messageListForm', 'showNav', showNav);
            fitbit.app.forums.setFormFieldValue('messageListForm', 'message', '');
            fitbit.app.forums.setFormFieldValue('messageListForm', 'actionName', actionName);
            fitbit.app.forums.messageListDialog.show();
        },

        setFormFieldValue: function(formName, name, value) {
            var form = Y.Dom.get(formName);
            var formFieldEl = Y.Dom.getFirstChildBy(form, function(el){return el.getAttribute('name') == name;});
            if (formFieldEl == null) {
                formFieldEl = Y.Dom.get(name);
            }
            if (formFieldEl != null) {
                formFieldEl.value = value;
            }
        },

        isMaxLength: function(fieldId, maxLength, errorFieldId, fieldName) {
            var formField = Y.Dom.get(fieldId);
            var length = formField.value.length;
            if (length > maxLength) {
                var errorField = Y.Dom.get(errorFieldId);
                fitbit.util.setContent(errorField, fitbit.i18n.getResource('com.fitbit.app.forums.error.limit_error1')
                        + ' ' + fieldName
                        + ' ' + fitbit.i18n.getResource('com.fitbit.app.forums.error.limit_error2')
                        + ' ' + maxLength
                        + ' ' + fitbit.i18n.getResource('com.fitbit.app.forums.error.limit_error3'));
                var t=setTimeout("fitbit.util.setContent(Y.Dom.get('" + errorFieldId + "'), '');", 1500);
                formField.value = formField.value.substring(0, maxLength);
                return false;
            } else {
                return true;
            }
        },

        showCreateItemForm: function() {
            Y.Dom.removeClass('createItemDiv', 'invisible');
            Y.Dom.addClass('createItemLink', 'invisible');
        },
        
        hideCreateItemForm: function() {
            Y.Dom.addClass('createItemDiv', 'invisible');
            Y.Dom.removeClass('createItemLink', 'invisible');
            fitbit.util.setContent(Y.Dom.get('createItemFormErrors'), '');
            fitbit.app.forums.setFormFieldValue('createItemForm', 'subject', '');
            fitbit.app.forums.setFormFieldValue('createItemForm', 'text', '');
        }
    };

})();

Y.Event.onDOMReady(fitbit.app.forums.init);
