/**
 * $Id: moderation.js 34302 2009-01-28 15:23:31Z jahn.tore.skaaland $
 *
 */

var moderation = new Moderation();


/**
 * This class contains functions to support moderation and reporting
 * of user generated content.
 */
function Moderation() {

    /**
     * This sets up the moderation functionality.
     */
    jQuery(document).ready(
        function() {
	        //jQuery(".moderation.report .link").click(getModerateForm);
	        
	        // Administration
	        jQuery(".administration.moderation form.naughty-point").each(setupNaughtyPoints);
	        jQuery(".administration.moderation form.forgive-point").each(setupForgivePoints);
	        jQuery(".administration.moderation form.element-status").each(setupElementStatus);
	        jQuery("#user-ban form").each(setupUserBan);
	        jQuery("#user-unban form").each(setupUserUnban);
	        jQuery(".administration.moderation .link.show-reports").click(showElementReports);
	        jQuery(".administration.moderation .link.show-content").click(showElementContent);
	        jQuery("#moderation-report-container").hide();
	        jQuery("#moderation-report-overlay").hide();
	        
	        if (is_moderator) {
	            loadModerationOutlines();
	        }
        }
    );
    
    
    /**
     * This function will fetch a list of reports for a given element.
     */
    function showElementReports() {
        var link        = this;
        var url         = jQuery(link).attr('href');
        var element_row = jQuery(link).parents('tr');
        
        jQuery(link).parent("span").hide();
        
        jQuery.get(url, function(data) {
            var td_count    = element_row.children('td').length;
            jQuery(element_row).addClass('view-reports');
            
            var container   = jQuery(
                "<tr class='element-reports'><td colspan='"+td_count+"'>"
                +data
                +"<p class='hide-element-reports'><a href=''>Skjul rapporter</a></p>"
                +"</td></tr>"
            );
            
            jQuery(element_row).after(container);
            
            jQuery("form.status", container).each(setupModerationStatus);
            jQuery("p.hide-element-reports a", container).click(
                function() {
                    container.remove();
                    jQuery(link).parent("span").show();
                    jQuery(element_row).removeClass('view-reports');
                    return false;
                }
            );
        });
        
        return false;
    }
    
    
    /**
     * This function will fetch the content of a given element.
     */
    function showElementContent() {
        var anchor      = this;
        var url         = jQuery(anchor).attr('href');
        var element_row = jQuery(anchor).parents('tr');
        
        jQuery.get(url, function(data) {
            var td_count    = element_row.children('td').length;
            jQuery(element_row).addClass('view-content');
            
            var container   = jQuery(
                "<tr class='element-content'><td colspan='"+td_count+"'>"+data+"</td></tr>"
            );
            
            jQuery(anchor).hide();
            jQuery(element_row).after(container);
            
            jQuery("a.hide", container).click(function() {
                jQuery(element_row).removeClass('view-content');
                jQuery(container).remove();
                jQuery(anchor).show();
            });
        });
        
        return false;
    }
    
    
    /**
     * This function ajaxifies the form to remove ban status on a user.
     */
    function setupUserUnban(idx, form) {
        var message_elm = document.createElement('p');
        jQuery(message_elm).addClass("message error");
        jQuery(form).before(message_elm);
        
        // Ajaxifing HTML form
        jQuery(form).ajaxForm(
            {
                dataType:   "json",
                success:    function(resp) {
                    if (resp['code'] == 400) {
                        jQuery(message_elm).text(resp['message']);
                    }
                    else if (resp['code'] == 200) {
                        var message = resp['message'];
                        if (!message) {
                            message = "Brukeren er tilgitt og kan logge inn";
                        }
                        jQuery(form).parent().text(message);
                    }
                    else {
                        jQuery(message_elm).text(resp['message']);
                    }
                }
            }
        );
    }
    
    
    /**
     * This function ajaxifies the form to ban a user.
     */
    function setupUserBan(idx, form) {
        var message_elm = document.createElement('p');
        jQuery(message_elm).addClass("message error");
        jQuery(form).before(message_elm);
        
        // Ajaxifing HTML form
        jQuery(form).ajaxForm(
            {
                dataType:   "json",
                success:    function(resp) {
                    if (resp['code'] == 400) {
                        jQuery(message_elm).text(resp['message']);
                    }
                    else if (resp['code'] == 200) {
                        var message = resp['message'];
                        if (!message) {
                            message = "Brukeren er nå utestengt";
                        }
                        jQuery(form).parent().text(message);
                    }
                    else {
                        jQuery(message_elm).text(resp['message']);
                    }
                }
            }
        );
    }
    
    
    /**
     * This function ajaxifies the form to forgive naughty points.
     */
    function setupForgivePoints(idx, form) {
        var message_elm = document.createElement('p');
        jQuery(message_elm).addClass("message error");
        jQuery(form).parent('td').prepend(message_elm);
        
        // Ajaxifing HTML form
        jQuery(form).ajaxForm(
            {
                dataType:   "json",
                success:    function(resp) {
                    if (resp['code'] == 400) {
                        jQuery(message_elm).text(resp['message']);
                    }
                    else if (resp['code'] == 200) {
                        var message = resp['message'];
                        if (!message) {
                            message = "Tilgitt";
                        }
                        jQuery(form).parents('tr').addClass('forgiven');
                        jQuery(form).replaceWith(message);
                    }
                    else {
                        jQuery(message_elm).text(resp['message']);
                    }
                }
            }
        );
    }
    
    
    /**
     * This function sets up functionality for adding naughty points to a user.
     * It uses AJAX to update the status.
     */
    function setupNaughtyPoints(idx, form) {
        var message_elm = document.createElement('p');
        
        jQuery(message_elm).addClass("message error");
        var tr = jQuery(form).parents("tr.element");
        jQuery(form).parent('td').prepend(message_elm);
        
        jQuery(form).hide();
        
        var toggle_link = document.createElement('span');
        jQuery(toggle_link).text("Prikk bruker");
        jQuery(toggle_link).addClass("link");
        jQuery(toggle_link).click(
            function() {
                jQuery(this).hide();
                jQuery(form).show("slow");
            }
        );
        
        jQuery(form).after(toggle_link);
        
        
        // Ajaxifing HTML form
        jQuery(form).ajaxForm(
            {
                dataType:   "json",
                success:    function(resp) {
                    if (resp['code'] == 200) {
                        jQuery(form).replaceWith(resp['message']);
                        jQuery(tr).addClass('updated');
                    }
                    else if (resp['code'] == 400) {
                        jQuery(message_elm).text(resp['message']);
                    }
                    else {
                        jQuery(message_elm).text(resp['message']);
                    }
                }
            }
        );
    }
    
    
    /**
     * This function sets up functionality for changing the status of a
     * moderation report. It uses AJAX to update the status.
     */
    function setupModerationStatus(idx, form) {
        var message_elm = document.createElement('p');
        
        jQuery(message_elm).addClass("message error");
        jQuery(form).parent('td').prepend(message_elm);

        // Ajaxifing HTML form
        jQuery(form).ajaxForm(
            {
                dataType:   "json",
                success:    function(resp) {
                    if (resp['code'] == 400) {
                        jQuery(message_elm).text(resp['message']);
                    }
                    else if (resp['code'] == 200) {
                        jQuery(form).parents("tr.element-report").addClass('updated');
                        jQuery(form).after("OK");
                        jQuery(form).hide();
                        //jQuery(form).parents("tr.element-report").fadeOut("slow");
                    }
                    else {
                        jQuery(message_elm).text(resp['message']);
                    }
                }
            }
        );
    
        // Replacing the regular submit button with a clickable span
        jQuery("input[type=submit]", form).each(
            function(idx, element) {
                var text = jQuery(element).val();
                var link = document.createElement('span');

                jQuery(link).addClass("link");
                jQuery(link).text(text);
                jQuery(link).click(function() {
                    element.click();
                    return false;
                });

                jQuery(element).hide();
                jQuery(form).append(link);
            }
        );
    }
    
    
    
    /**
     * This function sets up functionality for changing the status of all
     * moderation reports for an element. It uses AJAX to update the status.
     */
    function setupElementStatus(idx, form) {
        var message_elm = document.createElement('p');
        
        jQuery(message_elm).addClass("message error");
        jQuery(form).parent('td').prepend(message_elm);

        // Ajaxifing HTML form
        jQuery(form).ajaxForm(
            {
                dataType:   "json",
                success:    function(resp) {
                    if (resp['code'] == 400) {
                        jQuery(message_elm).text(resp['message']);
                    }
                    else if (resp['code'] == 200) {
                        var tr = jQuery(form).parents("tr.element");
                        
                        jQuery(tr).addClass('updated');
                        jQuery(form).after("OK");
                        jQuery(form).hide();
                        
                        // ugh, ugly, but it works ;)
                        jQuery('.link.show-reports', tr).parent().hide();
                    }
                    else {
                        jQuery(message_elm).text(resp['message']);
                    }
                }
            }
        );

        // Replacing the regular submit button with a clickable span
        jQuery("input[type=submit]", form).each(
            function(idx, element) {
                var text = jQuery(element).val();
                var link = document.createElement('span');

                jQuery(link).addClass("link");
                jQuery(link).text(text);
                jQuery(link).click(function() {
                    element.click();
                    return false;
                });

                jQuery(element).hide();
                jQuery(form).append(link);
            }
        );
    }
    
    
    /**
     * This function returns either the object context of the page or the
     * URL of the page.
     */
    function getResourceContext() {
        try {
            if (typeof(objectcontext) != "undefined") {
                return objectcontext;
            }
        }
        catch (ex) {}
        
        return window.location;
    }
    
    
    /**
     * This function uses AJAX to retrieve a HTML form for entering a moderation
     * report. It will ajaxify the HTML form to make it possible to handle
     * errors and missing input.
     */
    this.getModerateForm = function(link) {
        var url             = "/" + nrk_site + "/" + modulename + "/moderation/report_form";
        var moderation      = jQuery(link).parent();
        var formContainer   = jQuery('#moderation-report-container');
        var overlay         = jQuery('#moderation-report-overlay');
        var element         = moderation.find('.element');
        
        var element_id      = jQuery(element).text();
        var ugc_content     = '';
        var resourceContext = getResourceContext();
        
        if (element_id) {
            ugc_content = document.getElementById(element_id).innerHTML;
        }
        else {
            // FIXME maybe use: jQuery(moderation).parent().text()
            ugc_content = '';
        }
        
        // Hide the link
        jQuery(link).hide();

        jQuery.get(url, function(data) {
            formContainer.html(data);
            
            // Show the content the user wants to report
            var elmContent = jQuery(document.getElementById(element_id)).clone();
            var elmWrapper = jQuery("<div class='ugc_content'></div>");
            elmWrapper.append(elmContent);
            elmWrapper.append("<div style='clear: both;'></div>");
            elmWrapper.innerHTML = elmWrapper.innerHTML;
            jQuery("form", formContainer).before(elmWrapper);
            
            jQuery("form", formContainer).prepend("<input type='hidden' value='" + resourceContext + "' name='objectContext' />");
            jQuery("form", formContainer).prepend("<input type='hidden' value='" + element_id + "' name='elementID' />");
            jQuery("form", formContainer).prepend("<input type='hidden' value='" + encodeURIComponent(ugc_content) + "' name='elementContent' />");
            
            // Hide the element for displaying error messages
            var message_elm = jQuery('p.message.error', 'form', formContainer);
            message_elm.hide();
            
            jQuery("form", formContainer).ajaxForm(
                {
                    dataType:   "json",
                    success:    function(resp) {
                        if (resp['code'] == 400) {
                            message_elm.text(resp['message']);
                            message_elm.show();
                        }
                        else {
                            jQuery('form', formContainer).css('background', '#e88');
                            jQuery('form', formContainer).html(resp['message']);
                            jQuery(".ugc_content", formContainer).hide();
                            
                            var ourInterval = null;
                            ourInterval = setInterval(function() {
                                clearInterval(ourInterval);
                                
                                hideContainer();
                                
	                            jQuery(moderation).html(resp['message']);
	                            jQuery(moderation).addClass('thank-you');
                            }, 1000);
                            
                        }
                    }
                }
            );
            jQuery("button.abort", formContainer).click(
                function() {
                    hideContainer();
                    return false;
                }
            );
            
            showContainer();
        });
        
        
        function hideContainer() {
            formContainer.hide('slow');
            
            overlay.hide();
            overlay.fadeTo('slow', 0);
            
            jQuery('object, embed').css('visibility', 'visible');
            
            jQuery(".link", moderation).show();
        }
        
        function showContainer() {
            jQuery('object, embed').css('visibility', 'hidden');
            var height = jQuery(window).height();
            if (height < 1000) height = 1000;
            
            overlay.animate(
                {
                    'opacity'   : '0.8',
                    'height'    : height + 'px'
                },
                1000
            );
            
            overlay.show('slow');
            
            jQuery.scrollTo(0, 0);
            
            formContainer.show('slow');
            
            overlay.click(hideContainer);
        }
    }


    /**
     * This function adds some style around reported content which is visible
     * for moderators.
     */
    function loadModerationOutlines() {
        jQuery(moderation_reports).each(
            function(index, value) {
                var elm = document.getElementById(value);
                jQuery(elm).addClass("moderation reported");
            }
        );
    }
    
};


function roleHelper(data){
    var myObject = eval('(' + data + ')');
    
    if (myObject.code == '200') {
        jQuery('#access-user-role-msg').addClass('updated');
        jQuery('#access-user-role-msg').removeClass('error');
        jQuery('#access-user-role-msg').text("Endret rolle");
    }
    else {
        jQuery('#access-user-role-msg').addClass('error');
        jQuery('#access-user-role-msg').removeClass('updated');
        jQuery('#access-user-role-msg').text(myObject.message);
    }
}