// Rätsel 0 = riddleArray[0]
// Titel    = riddleArray[0][0][0]
// Schwierigkeit    = riddleArray[0][0][1]
// Datum    = riddleArray[0][0][2]
// Autor    = riddleArray[0][0][3]
// Frage    = riddleArray[0][0][4]
// Hinweise = riddleArray[0][0][5 ... n]
// Antwortb = riddleArray[0][1][0 ... n]
// Antwort  = riddleArray[0][2][0 ... n]

    var MANA_PATH = './img/mana/';

    var NO_ANSWER_IMG = './img/various/no_answer.gif';
    var WRONG_ANSWER_IMG = './img/various/wrong_answer.gif';
    var RIGHT_ANSWER_IMG = './img/various/right_answer.gif';

    var currentRiddle = 0;
    var TITLE = 0;
    var QUESTION = 1;
    var HINTS = 2;
    var ANSWER_DESCS = 3;
    var ANSWERS = 4;
    var DIFFICULTY = 5;
    var DATE = 6;
    var AUTHOR = 7;

    var RIDDLE_LENGTH = riddleArray.length;
    var hintDepth = 0;

    var GERMAN = 0;
    var ENGLISH = 1;
    var language = GERMAN;

    var tries = 0;
    var hintsGiven = 0;

    thisDoc = location.href;
    if (thisDoc.indexOf('?') != -1)
        thisDoc = thisDoc.substring(0, thisDoc.indexOf('?'));

// Allgemeine Funktionen

    function setLanguage(lang)
    {
        if (lang == GERMAN || lang == ENGLISH)
            language = lang;
    }

    function setRiddleByInt(val)
    {
        currentRiddle = (val > -1 && val < RIDDLE_LENGTH) ? val : 0;
    }

    function getCurrentItem(itemID)
    {
        return (itemID == TITLE ? riddleArray[currentRiddle][0][0] :
                itemID == QUESTION ? riddleArray[currentRiddle][0][4] :
                itemID == HINTS ? riddleArray[currentRiddle][0].slice(5, riddleArray[currentRiddle][0].length) :
                itemID == ANSWER_DESCS ? riddleArray[currentRiddle][1] :
                itemID == ANSWERS ? riddleArray[currentRiddle][2] :
                itemID == DIFFICULTY ? riddleArray[currentRiddle][0][1] :
                itemID == DATE ? riddleArray[currentRiddle][0][2] :
                itemID == AUTHOR ? riddleArray[currentRiddle][0][3] :
                null)
    }

    function removeSpecialChars(str)
    {
        specialChars = new Array('\'', '\"', ' ', '\t', '-', '_');
        for (d = 0; d < specialChars.length; d++)
            while ((ind = str.indexOf(specialChars[d])) != -1)
            {
                str = str.substring(0, ind) + str.substring(ind + 1);
            }
        return str;
    }

    function removeAllChildren(parent)
    {
        while (parent.hasChildNodes())
        {
            parent.removeChild(parent.firstChild);
        }
    }

    function appendFormattedText(val, parent)
    {
        while (val.search(/\n/) != -1)
            val = val.replace(/\n/, '<BR>');
        while((c = val.indexOf('<')) != -1 && val.indexOf('>', val.indexOf('<')) != -1)
        {
            tagPos = -1;
            tagEnd = -1;
            tagContent = '';

            tagPos = val.indexOf('<');
            tagEnd = val.indexOf('>', tagPos);
            tagContent = val.substring(tagPos + 1, tagEnd).toUpperCase();

            parent.appendChild(document.createTextNode(val.substring(0, tagPos)));
            switch (tagContent)
            {
                case 'TAP':
                case 'T': appendImage('./img/various/tap.gif', parent); break;
                case 'BR': parent.appendChild(document.createElement('BR')); break;
                case 'HYP': parent.appendChild(document.createTextNode('\'')); break;
                default: appendImage(MANA_PATH + 'mana_' + tagContent + '.gif', parent);
            }

            val = val.substring(tagEnd + 1);
        }
        parent.appendChild(document.createTextNode(val));
    }

    function appendImage(imgsrc, parent)
    {
        i = new Image();
        i.src = imgsrc;
        i.width = '15';
        i.height = '13';
        parent.appendChild(i);
    }

// Aufbau Rätselindex

    function createRiddleIndex()
    {
        i = currentRiddle;
        for (c = 0; c < RIDDLE_LENGTH; c++)
        {
            setRiddleByInt(c);
            a = document.createElement('A');
            n = document.createElement('NOBR');
            a.appendChild(document.createTextNode(getCurrentItem(TITLE)));
            n.appendChild(a);
            a.href = thisDoc + '?' + c;

            n2 = document.createElement('NOBR');
            n2.appendChild(document.createTextNode('(' + getCurrentItem(DATE) + ')'));

            document.getElementById('riddle_index_date_' + getCurrentItem(DIFFICULTY)).appendChild(n2);
            document.getElementById('riddle_index_date_' + getCurrentItem(DIFFICULTY)).appendChild(document.createElement('BR'));
            document.getElementById('riddle_index_' + getCurrentItem(DIFFICULTY)).appendChild(n);
            document.getElementById('riddle_index_' + getCurrentItem(DIFFICULTY)).appendChild(document.createElement('BR'));
        }
        setRiddleByInt(i);
    }

// Verarbeitung von URL-Parametern

    function processURLParameters()
    {
        setRiddleByInt(parseInt(location.search.substring(1)));
        displayRiddle();
    }

    function showNoRiddle()
    {
        removeAllChildren(document.getElementById('answer_td'));
        removeAllChildren(document.getElementById('question_td'));
    }

// Rätselanzeige

    function displayRiddle()
    {
    //  question_area Titel / Rätsel / Hinweise

    // Titel

        document.getElementById('puzzle_title').appendChild(document.createTextNode(getCurrentItem(TITLE)));
        document.getElementById('puzzle_title').appendChild(document.createElement('BR'));
        document.getElementById('puzzle_title').appendChild(document.createTextNode('(c) ' + getCurrentItem(AUTHOR)));
        document.getElementById('puzzle_title').appendChild(document.createElement('BR'));
        document.getElementById('puzzle_title').appendChild(document.createTextNode(getCurrentItem(DATE)));

    // Frage
        question_p = document.createElement('P');
        appendFormattedText(getCurrentItem(QUESTION), question_p);
        question_p.align = 'justify';
        document.getElementById('question_area').appendChild(question_p);

    //  answer_area Antwortbeschreibung / Inputs(Formular)
        removeAllChildren(document.getElementById('answer_area'));
        answerDescArray = getCurrentItem(ANSWER_DESCS);

        answer_table = document.createElement('TABLE');
        answer_table.border = '0';
        answer_table.width = '100%';
        answer_desc_row = answer_table.insertRow(0);
        answer_row = answer_table.insertRow(1);
        result_row = answer_table.insertRow(2);

        for (c = 0; c < answerDescArray.length; c++)
        {
            if (c > 3 && c % 4 == 0)
            {
                newRow = parseInt('' + (3 * (c/4)));
                result_row = answer_table.insertRow(newRow);
                answer_row = answer_table.insertRow(newRow);
                answer_desc_row = answer_table.insertRow(newRow);
            }
            answer_desc_cell = answer_desc_row.insertCell(c%4);
            answer_desc_cell.appendChild(document.createTextNode(answerDescArray[c]));
            answer_desc_cell.align = 'center';

            answer_cell = answer_row.insertCell(c%4);
            answer_input = document.createElement('INPUT');
            answer_input.type = 'text';
            answer_cell.appendChild(answer_input);
            answer_cell.align = 'center';


            result_cell = result_row.insertCell(c%4);
            result_cell.align = 'center';
            result_img = document.createElement('IMG');
            result_img.src = NO_ANSWER_IMG;
            result_img.width = '30';
            result_img.height = '30'
            result_cell.appendChild(result_img);
        }
        document.getElementById('answer_area').appendChild(answer_table);
        checkHintAvailability();
    }


// Antwortauswertung

    function checkAnswers()
    {
        tries++;
        correctAnswerArray = getCurrentItem(ANSWERS);
        givenAnswersArray = getGivenAnswersArray();
        resultArray = getResultImageArray();
        allCorrect = true;
        for (c = 0; c < correctAnswerArray.length; c++)
        {
            correct = evaluateAnswer(correctAnswerArray[c], givenAnswersArray[c].value);
            resultArray[c].src = (correct ? RIGHT_ANSWER_IMG : (givenAnswersArray[c].value == '' ? NO_ANSWER_IMG : WRONG_ANSWER_IMG));
            allCorrect = allCorrect && correct;
            if (correct)
                givenAnswersArray[c].value = '--- '+ correctAnswerArray[c] + ' ---';
        }
        if (allCorrect)
            alert('Congratulations!\n\nYou have solved the puzzle \'' + getCurrentItem(TITLE) + '\'!\nYou needed ' + tries + (tries == 1 ? ' try' : ' tries') + ' and ' + hintsGiven + ' out of ' + getCurrentItem(HINTS).length + ' hints to solve this puzzle.');
    }

    function evaluateAnswer(val1, val2)
    {
       return removeSpecialChars(val1).toLowerCase() == removeSpecialChars(val2).toLowerCase();
    }

    function getGivenAnswersArray()
    {
        q_table = document.getElementById('answer_area').firstChild;
        a = new Array();
        for (c = 1; c < q_table.rows.length; c+=3)
        {
            for (d = 0; d < q_table.rows[c].cells.length; d++)
            {
                a.push(q_table.rows[c].cells[d].firstChild);
            }
        }
        return a;
    }

    function getResultImageArray()
    {

        q_table = document.getElementById('answer_area').firstChild;
        a = new Array();
        for (c = 2; c < q_table.rows.length; c+=3)
        {
            for (d = 0; d < q_table.rows[c].cells.length; d++)
            {
                a.push(q_table.rows[c].cells[d].firstChild);
            }
        }
        return a;
    }

// Hinweise

    function checkHintAvailability()
    {
        if (!(hintDepth < getCurrentItem(HINTS).length))
            removeAllChildren(document.getElementById('hint_button_area'));
    }

    function giveHint()
    {
        hintsGiven++;
        hintArray = getCurrentItem(HINTS);
        if (hintDepth < hintArray.length)
        {
            appendFormattedText(hintArray[hintDepth], document.getElementById('question_area'));
            document.getElementById('question_area').appendChild(document.createElement('BR'));
            hintDepth++;
            checkHintAvailability();
        }
        else
            alert('Es gibt keine weiteren Hinweise');

    }

// Nachverarbeitung
    function postLoad()
    {
    //Browserprüfung
        if((document.referrer.indexOf(thisDoc) == -1) && (!(navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') == -1)) && (navigator.userAgent.indexOf('Gecko') == -1)) // nur beim ersten Betreten
            alert(language == GERMAN ?  'WARNUNG\n\nDie Puzzlebox verwendet nur JavaScript-Befehle, die dem definierten Standard entsprechen. Dennoch ist er auf älteren Netscape-Browsern und auf Opera (selbst unter der aktuellsten Version) nicht lauffähig.\n\nBitte verwenden sie Microsoft Internet Explorer ab Version 5.5., eine aktuelle Mozilla-Version oder Netscape 6.2.' :
                                        'WARNING:\n\nThe Puzzlebox works only on JavaScript 1.5 compliant browsers. It does not run under Opera and under Netscape Communicator. Please use Microsoft Internet Explorer Version 5.5, the latest Mozilla releases or Netscape 6.2.'
            );
        createRiddleIndex();
        if (location.search != "")
            processURLParameters();
        else
            showNoRiddle();
    }

