﻿/**
*Javascript klasse til at lave ordbogs funktion til AP Pension
*
* @param klasseNavn Klassens navn. Dette benyttes til de links der sættes ind i html-en skal kalde klassen
*/
function ordbogsKlasse(klasseNavn) {
    //constructor kode - start
    if (klasseNavn==null) throw (new Error("ERROR: Der er ikke angivet noget klaseNavn"));

    //constructor kode - slut

    var doTest = false;

    var valgtKnapSrc = "images/ordbog_knap_selected.png";
    var buttonIds = new Array("ordbogsKnap");   
    var rootFolder = "/";
    var contentTextAreas = new Array("contentTextArea");
    var ordBogFil = "ordbog/ordliste.txt";
    var cookieName = "showOrdbogCookie";

    var ordbogsOrd, ordbogsTestOrd;
    var ordbogsIder;
    var markUpDone = false;
    var loadingOrd;

    var forklaringsType = 0;

    /**
    * Default "ordbog/ordliste.txt". Stien er ekslusiv rootFolderen
    */
    this.setOrdBogFil = function (newOBS) {
        ordBogFil = newOBS;
    }

    /**
    * Sti til den billedefil der skal benyttes som valgt knap. Stien er ekslusiv rootFolderen
    */
    this.setValgtKnapSrc = function (newSRC) {
        valgtKnapSrc = newSRC;
    }
    
    /**
    * ID for det element der indeholder teksten
    */
    this.setContentTextArea = function (newCTA) {
        contentTextAreas = new Array(newCTA);
    }

    /**
    * Tilføjer ID for et element der indeholder teksten
    */
    this.addContentTextArea = function (newCTA) {
        contentTextAreas.push(newCTA);
    }

    /**
    * ID for det element der indeholder teksten
    */
    this.setButton = function (newBID) {
        buttonIds = new Array(newBID);
    }

    /**
    * Tilføjer ID for et element der indeholder teksten
    */
    this.addButton = function (newBID) {
        buttonIds.push(newBID);
    }

    /**
    * Sti til roden for alle de filer der benyttes som billeder og ordbogsfiler
    */
    this.setRootFolder = function (newRF) {
        rootFolder = newRF;
    }

    /**
    * Tjekker om der er sat en cookie som angiver at ordbogen skal være på fra start
    */
    this.init = function () {
        if (doTest) alert("initOrdbog");
        var allCookies = document.cookie.split(";");
        for (var i = 0; i < allCookies.length; i++) {
            var cookieParts = allCookies[i].split("=");
            if (cookieParts[0].replace(/ /g, "") == cookieName && cookieParts[1] == "true") {
                this.toggleOrdbog(false);
            }
        }
        //alert(document.cookie)
        //	startOrdbog()
    }

    /**
    * Lægger tags ind på alle de ord i teksten som findes i ordbogen
    */
    var doMarkUp = function (elementID) {
        var now = new Date();
        if (doTest) alert("doMarkUp");
        var htmlTagFlag = false;
        var linkFlag = false;

        if (doTest) alert(elementID);
        var tekst = document.getElementById(elementID).innerHTML.replace(/  /g, " ").replace(/[\t|\n|\r]/g, "").replace(/<p>\&nbsp;<\/p>/gi, "tempbreak").replace(/\&nbsp;/g, " ").replace(/tempbreak/g, "<p>\&nbsp;<\/p>") + " ";

        var tekstSplit = splitHtmlTekst(tekst);
        var matchId, matchEndIndex, matchOrd;

        var ordbogsOrdDele = new Array();
        var ordbogsLength = ordbogsOrd.length
        var delOrdExtraIndex;
        var numbersOfWords = tekstSplit.tekst.length;
        var testOrd = "";

        for (var tekstIndex = 0; tekstIndex < numbersOfWords; tekstIndex++) {

            if (!htmlTagFlag && !linkFlag) {
                matchId = null;
                matchEndIndex = 0;
                testOrd = tekstSplit.testTekst[tekstIndex];

                if (testOrd.length >= 2) {
                    for (var ordbogsIndex = 0; ordbogsIndex < ordbogsLength; ordbogsIndex++) {

                        ordbogsOrdDele = ordbogsTestOrd[ordbogsIndex];

                        delOrdExtraIndex = 0;

                        var ordbogsDelLength = ordbogsOrdDele.length;

                        if (numbersOfWords >= tekstIndex + ordbogsDelLength) {
                            while (delOrdExtraIndex < ordbogsDelLength && tekstSplit.testTekst[tekstIndex + delOrdExtraIndex] == ordbogsOrdDele[delOrdExtraIndex]) {
                                delOrdExtraIndex++;
                            }
                        }

                        if (delOrdExtraIndex == ordbogsDelLength) {
                            matchId = ordbogsIder[ordbogsIndex];
                            matchEndIndex = delOrdExtraIndex - 1;
                            matchOrd = ordbogsOrd[ordbogsIndex];
                            ordbogsIndex += matchEndIndex;
                            break;
                        }

                    }
                }

                if (matchId != null) {
                    forklaringsType = 2;
                    tekstSplit.tekst[tekstIndex] = "<span class='ordbogsOrd' onmouseout='" + klasseNavn + ".fjernOpslag()' onmouseover='" + klasseNavn + ".visOpslag(\"" + matchId + "\",\"" + matchOrd + "\")'>" + tekstSplit.tekst[tekstIndex];
                    tekstSplit.tekst[tekstIndex + matchEndIndex] = tekstSplit.tekst[tekstIndex + matchEndIndex] + "</span>";
                }
            }

            if (tekstSplit.characters[tekstIndex] == "<") htmlTagFlag = true;
            else if (tekstSplit.characters[tekstIndex] == ">") htmlTagFlag = false;

            if (tekstSplit.tekst.length > tekstIndex + 2) {
                if (tekstSplit.characters[tekstIndex] == "<" && tekstSplit.tekst[tekstIndex + 1].toLowerCase().indexOf("a") == 0) linkFlag = true;
                else if (tekstSplit.characters[tekstIndex] == "<" && tekstSplit.tekst[tekstIndex + 1].toLowerCase().indexOf("/a") == 0) linkFlag = false;
            }
        }

        document.getElementById(elementID).innerHTML = joinTekst(tekstSplit);


        if (forklaringsType > 0) {
            document.getElementById("ordbogsForklaring").style.display = "block";
            if (forklaringsType == 1) document.getElementById("ordbogsForklaring").innerHTML += " - der er dog ikke ordbogsord p&aring; denne side.";
        }
    }

    /**
    * Splitter teksten op i de enkelte ord
    */
    function splitHtmlTekst(tekst) {
        if (doTest) alert("splitHtmlTekst");
        var lastPos = -1;
        var splitTekst = new Array();
        var splitTestTekst = new Array();
        var splitCharacters = new Array();
        var characters = new Array(" ", ",", ".", "(", ")", "<", ">");
        for (var i = 0; i < tekst.length; i++) {
            for (var j = 0; j < characters.length; j++) {
                if (characters[j] == tekst.charAt(i)) {
                    splitTekst.push(tekst.substring(lastPos + 1, i));
                    splitTestTekst.push(tekst.substring(lastPos + 1, i).toLowerCase());
                    lastPos = i;
                    splitCharacters.push(characters[j]);
                    break;
                }
            }
        }

        var splitObj = { "tekst": splitTekst, "testTekst": splitTestTekst, "characters": splitCharacters }
        return splitObj;
    }

    /**
    * Splitter teksten op i de enkelte ord
    */
    function joinTekst(tekstObj) {
        if (doTest) alert("joinTekst");
        var splitTekst = tekstObj.tekst;
        var splitCharacters = tekstObj.characters;
        var joinTekst = "";
        for (var i = 0; i < splitTekst.length; i++) {
            joinTekst += splitTekst[i] + splitCharacters[i];
        }

        return joinTekst;
    }

    /**
    * Lægger tags ind på alle de ord i teksten som findes i ordbogen
    */
    this.visOpslag = function(ordID, ord) {
        if (document.onmousemove == null) {
            loadingOrd = ord.substr(0, 1).toUpperCase() + ord.substr(1);
            getFile(rootFolder + "ordbog/" + ordID + ".txt", forklaringLoadet);
            //document.getElementById("ordbogsForklaring").style.display= "none";
        } else {
            fjernOpslag();
        }
    }

    /**
    * Lægger tags ind på alle de ord i teksten som findes i ordbogen
    */
    this.fjernOpslag = function () {
        document.onmousemove = null;
        document.getElementById("ordForklaring").style.visibility = "hidden";

    }

    /**
    * Viser forklaringen når den er loadet
    */
    function forklaringLoadet() {
        document.getElementById("ordForklaringsTekst").innerHTML = "<b>" + loadingOrd + "</b><br/>" + xmlHttp.responseText.toString();
        document.onmousemove = opdaterForklaringsPlacering;
    }

    function opdaterForklaringsPlacering(e) {
        var tempX = 0;
        var tempY = 0;
        var IE = document.all ? true : false;
        if (!IE) document.captureEvents(Event.MOUSEMOVE)
        if (IE) { // grab the x-y pos.s if browser is IE
            tempX = event.clientX;
            tempY = event.clientY;
            tempX += findVandretScroll();
            tempY += findLodretScroll();
        }
        else {  // grab the x-y pos.s if browser is NS
            tempX = e.pageX;
            tempY = e.pageY;
        }


        if (tempX < 0) tempX = 0;
        if (tempY < 0) tempY = 0;

        var forklaringsElement = document.getElementById("ordForklaring");
        forklaringsElement.style.top = tempY - (forklaringsElement.offsetHeight / 2) + 'px';
        forklaringsElement.style.left = tempX + 10 + 'px';
        forklaringsElement.style.visibility = "visible";
    }

    function findLodretScroll() {
        var scrollPos = 0;

        if (document.pageYOffset) {
            scrollPos = document.pageYOffset;
        }
        else if (document.documentElement && document.documentElement.scrollTop) {
            scrollPos = document.documentElement.scrollTop;
        }
        else if (document.body) {
            scrollPos = document.body.scrollTop;
        }
        return scrollPos;
    }

    function findVandretScroll() {
        var scrollPos = 0;

        if (document.pageXOffset) {
            scrollPos = document.pageXOffset;
        }
        else if (document.documentElement && document.documentElement.scrollLeft) {
            scrollPos = document.documentElement.scrollLeft;
        }
        else if (document.body) {
            scrollPos = document.body.scrollLeft;
        }
        return scrollPos;
    }

    this.toggleOrdbog = function (visForklaring) {
        if (markUpDone) {
            document.cookie = cookieName + "=false; path=/;";
            window.location.reload();
            return;
        }
        markUpDone = true;
        document.cookie = cookieName + "=true; path=/;";

        getFile(rootFolder + ordBogFil, ordListeLoadet);



        for (i = 0; i < buttonIds.length; i++) {
            if (document.getElementById(buttonIds[i])) document.getElementById(buttonIds[i]).src = rootFolder + valgtKnapSrc;
        }
       

        //vis forklaring	
        if (visForklaring) forklaringsType = 1;
    }

    function ordListeLoadet() {
        if (doTest) alert("ordListeLoadet");
        var linjer = xmlHttp.responseText.toString().split("\n");
        ordbogsTestOrd = new Array();
        ordbogsOrd = linjer[0].split(",");
        ordbogsIder = linjer[1].split(",");
        for (var j = 0; j < ordbogsOrd.length; j++) {
            ordbogsTestOrd[j] = ordbogsOrd[j].toLowerCase().split(" ");
        }

        for (i = 0; i < contentTextAreas.length; i++) {
            if (document.getElementById(contentTextAreas[i])) doMarkUp(contentTextAreas[i]);
        }
    }

    //AJAX stuff ////////////////////////////////
    var ajaxCallbackFuntion;
    var xmlHttp;
    /**
    *Henter indholdet af en given fil
    */
    function getFile(url, callBackFunction) {
        ajaxCallbackFuntion = callBackFunction;
        xmlHttp = GetXmlHttpObject();

        if (xmlHttp == null) {
            return
        }
        xmlHttp.onreadystatechange = stateChanged
        xmlHttp.open("GET", url, true);
        xmlHttp.send(null);
    }

    function stateChanged() {

        if (xmlHttp.readyState != 4) return
        if (xmlHttp.responseText == null) return;


        if (ajaxCallbackFuntion != null) ajaxCallbackFuntion();
    }

    /**
    *Finder det http object som den aktuelle browser understøtter
    */
    function GetXmlHttpObject() {
        var objXMLHttp = null
        if (window.XMLHttpRequest) {
            objXMLHttp = new XMLHttpRequest()
        }

        else if (window.ActiveXObject) {
            objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP")
        }
        return objXMLHttp
    }

}

