var VGRett = function () {

    var accessKey = null;
    var maxiOpen = false;
    var typosFound = 0;
    var highlighted = false;

    /** Public functions */
    return {
        initialise : function () {
            accessKey = readCookie('VGRett');
            if( accessKey ) {
                //Refresh the cookie
                var date = new Date();
                date.setTime(date.getTime()+(1000*24*60*60*1000));
                document.cookie = 'VGRett='+accessKey+'; expires='+date.toGMTString()+'; path=/';
                document.cookie = 'VGRettProfil='+accessKey+'; expires='+date.toGMTString()+'; path=/vgrett';
                $("head").append('<link rel="stylesheet" type="text/css" href="/vgrett/css/vgrett.css?4" />');
                $("body").append('<div id="typoContainer"><h2>VG Rett</h2>\
                                    <div class="trControls">\
                                        <p id="trMessages" class="trMessages">Sjekker status..</p>\
                                        <div class="trMini">\
                                            <p id="trMessagesMini" class="trMessages"></p>\
                                            <input type="button" id="trStart" name="trStart" value="Rapporter skrivefeil" /></div>\
                                            \
                                        <div class="trMaxi">\
                                            <p id="trMessagesMaxi" class="trMessages"></p>\
                                            <label>Teksten du foresl&aring;r &aring; endre:</label>\
                                            <p title="Her vises originalteksten. Denne kan ikke endres." id="originalText"></p>\
                                            <label for="#comment">Foresl&aring;tt endring/eventuell kommentar</label><textarea title="Her skriver du inn ditt forslag til korrekt ord/tekst, eller en kommentar til forfatteren." id="comment" name="comment" ></textarea>\
                                            <div id="multipleTypos">\
                                                <p id="markCounter"></p>\
                                                <input type="checkbox" value="1" id="checkMultiple" /> <label for="checkMultiple">Alle forekomster er feil</label></div>\
                                            <div style="width:100%;clear:both;"/>\
                                            <input type="button" name="trAbort" id="trAbort" value="Avbryt" />\
                                            <input type="button" id="saveTypo" name="save" value="Send inn"/>\
                                        </div>\
                                        <p class="trMessages trHelpLink"><a target="_new" href="/vgrett/sprakmal">VG Netts spr&aring;kmal</a></p>\
                                    </div>\
                                    \
                                    <div id="debug" />\
                                  </div>');

                fetchTypos();

                //Attach event handlers
                $("#trStart").click(function() {
                    showMaxi();
                });
                $("#trAbort").click(function() {
                    showMini();
                });
                $('#saveTypo').click(function() {
                    saveTypo();
                });
                $('body').children().mouseup(function(){
                    var selection = getSelected();
                    if(maxiOpen && selection && (selection = new String(selection).replace(/^\s+|\s+$/g,''))) {
                        var threeWords = selection.search(/\s+[^\s]+\s+/);
                        if(this.getAttribute("id") == "typoContainer") {
                            //Ignore selections in the typorContainer itself
                           return;
                        }
                        if(selection.length < 5 || threeWords == -1) {
                            alert('Vennligst marker minst tre ord, inkludert ordene foran og bak ordet med skrivefeilen.');
                        }else{
                            //reset boxes
                            highlighted = true;
                            $("#checkMultiple").attr("checked",false);
                            resetHighlight();               
                            $("#originalText").html(selection);
                            $("#comment").val(selection);
                            $("#comment").focus();
                            var found = highLight(document.body,selection,false, true);
                            var ant = $("span.highlight");
                            if(ant.length > 1) {
                                $("#markCounter").html("Markert ord/tekst forekommer " + ant.length + " sted(er): ");
                                $("#multipleTypos").show();
                                $("#checkMultiple").attr("checked",false);
                            } else {
                                $("#checkMultiple").attr("checked",true);
                                $("#multipleTypos").hide();
                            }
                        }
                    }
                });
            }else{
                if(readCookie('VG-IP')){
                    $("head").append('<link rel="stylesheet" type="text/css" href="/vgrett/css/vgrett.css?3" />');
                    $("body").append('<div id="typoContainer"><h2>VG Rett</h2>\
                                        <div class="trControls">\
                                            <p id="trMessages" class="trMessages">Du er ikke logget inn.</p>\
                                            <div class="trMini">\
                                                <p id="trMessagesMini" class="trMessages"></p>\
                                                <input type="button" id="trStart" name="trStart" value="Logg inn" /></div>\
                                        </div>\
                                      </div>');
                    $("#trStart").click(function() {
                        document.location = 'http://www.vg.no/vgrett';
                    });
                }
            }
        }
    };
    
    /* Private functions */
    function showMaxi() {
        highlighted = false;
        maxiOpen = true;
        $(".trMini").hide();
        $("#typoContainer .trMessagesMaxi p.error").remove();
        $("#originalText").html('Bruk musen for &aring; markere ordet/teksten du mener har et forbedringspotensiale.');
        $("#comment").val('');
        $(".trMaxi").show();
    }
    
    function showMini() {
        maxiOpen = false;
        resetHighlight();
        $(".trMaxi").hide();
        $(".trMini").show();
    }
    
    function fetchTypos() {
        var currentTime = new Date(); 
        var data = {'action' : 'fetch', 'url': location.href, 'cb' : currentTime.getTime()};
        $.getJSON('/vgrett/ajax/handler.php', data, function(data) {
            $.each(data, function(i,item){
                if(item.originalText != undefined) {
                    processTypo(item.originalText);
                }
            });
            if (!typosFound) {
                $('#trMessages').html('Ingen kjente feil p&aring; siden.');
            }
        });
    }
    
    function processTypo(originalText) {
        if(highLight(document.body, originalText, true, true)) {
            typosFound++;
            if(typosFound==1){
                $('#trMessagesMaxi').append('<ol id="typosFound"/>');
            }
            $('#typosFound').append('<li>' + originalText +'</li>');
            $('#trMessages').html(typosFound + ' kjent(e) feil p&aring; siden');
        }else{
            reportFixed(originalText);
        }
    }

    function saveTypo() {
        if($("#checkMultiple:checked").val() != 1) {
            alert("Hvis den markerte teksten/ordet forekommer flere steder i artikkelen er det viktig at rapporten gjelder alle forekomstene. Marker dette ved avkrysning i sjekkboksen. Alternativt kan du markere flere ord/mer tekst slik at du ikke treffer for mange forekomster.");
            return;
        }
        if (!highlighted) {
            alert("Du kan ikke rapportere en feil uten at du har markert tekst som inneholder et forbedringspotensiale.");
        }
        var data = {'action' : 'new', 'url': location.href, 'originalText' : $('#originalText').text(), 'comment': $('#comment').val(), 'accessKey' : accessKey};
        $.post('/vgrett/ajax/handler.php', data, function(data) {
            var result = false;
            try{
                result = eval(data);
            }catch(e){
            }
            if(!result) {
                $('#trMessagesMaxi').append('<p class="error">En feil oppstod ved lagring av tilbakemeldingen din, vennligst fors&oslash;k igjen senere.</p>');
            }else{
                $("span.highlight").each(function() {
                    $(this).addClass('posTypo').removeClass('highlight');
                });
                $('#trMessagesMini').html('<p class="info">Takk for at du hjelper oss <br/>med &aring; gj&oslash;re VG Nett bedre!</p>');
                showMini();
                $('#originalText').val('');
                $('#comment').val('');
                processTypo($('#originalText').text());
            }
        });
    }

    function resetHighlight() {
        $("span.highlight").each(function() {
            var parent = $(this).parent();
            $(this).replaceWith($(this).text());
            $(parent).html($(parent).html());
        });
    }

    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') {
                c = c.substring(1,c.length);
            }
            if (c.indexOf(nameEQ) == 0) {
                return c.substring(nameEQ.length,c.length);
            }
        }
        return null;
    }

    
    function getSelected() {
        if(window.getSelection) { 
            return window.getSelection();
        }else if(document.getSelection) { 
            return document.getSelection(); 
        } else {
            var selection = document.selection && document.selection.createRange();
            if(selection.text) { 
                return selection.text; 
            }
            return false;
        }
        return false;
    }
    
    function reportFixed(originalText) {
        var data = {'action' : 'markAsFixed', 'url': location.href, 'originalText' : originalText, 'accessKey' : accessKey};
        $.post('/vgrett/ajax/handler.php', data, function(data) {
            //Silent when done.
        });
    }
    
    //Function to highlight the selected text
    function highLight(node, pat, isTypo, first) {
        if(first) {
            //static variable to return once the recursive calls are complete.
            highLight.found = 0;
        }
        if(node.getAttribute && node.getAttribute("id") == 'typoContainer'){
            return true;
        }
        
        var skip = 0;
        if (node.nodeType == 3) {
            var pos = node.data.indexOf(pat);
            if (pos >= 0) {
                var spannode = document.createElement('span');
                if(!isTypo) {
                    spannode.className = 'highlight';
                }else {
                    spannode.className = 'posTypo';
                }
                var middlebit = node.splitText(pos);
                var endbit = middlebit.splitText(pat.length);
                var middleclone = middlebit.cloneNode(true);
                spannode.appendChild(middleclone);
                middlebit.parentNode.replaceChild(spannode, middlebit);
                skip = 1;
                highLight.found++;
            }
        }else{
            if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
                for (var i = 0; i < node.childNodes.length; ++i) {
                    i += highLight(node.childNodes[i], pat, isTypo, false);
                }
            }
        }
        if(first == true) {
            return highLight.found;
        }
        return skip;
    }
}();

$(document).ready(function() {
    VGRett.initialise();
});
