/*jsl:option explicit*/
/**
 * @fileoverview
 * Hilfsfunktionen für den Zugriff auf Notes-Daten via AJAX. Wird von allen Edikstdatei-Anwendungen benutzt,
 * die AJAX einsetzten.
 * <br>&nbsp;<br>
 * Changes:<br>
 * 200711   LeMa    Lint'ed, comments<br>
 * 200802   LeMa    HTML_SEARCH_DELIM, & und | Operatoren, & Unterstützung
 * 200802   MaSu    DOCLINKKENNUNG variabel, Unterstützung für Mehrfachtreffer (Gegenstände)
 *                  posid zur Identifizierung der betroffenen Zeile
 * 200807   MaSu    subOpenXML - "waiting = true" vor http.Open gesetzt
 * 200809   LeMa    Dojo-Unterstützung (Back-Button) eingebaut, Fake-Linkfarben eingebaut, 
 *                  XMLHTTPRequest Fehlerbehandlung eingebaut
 * 200811   LeMa    Dojo-Unterstützung an feedi8 und ivliste angepasst
 * 200811   LeMa    Dojo-Unterstützung: "this.changeUrl = true"  damit Blättern auch mit doppelt besuchten Edikten funktioniert
 * 200811   LeMa    Dojo-Unterstützung: "this.changeUrl = true"  damit Blättern auch mit doppelt besuchten Edikten funktioniert
 *  20090624 MaSu checkSession - Abfrage elem['Hits'] hinzugefügt
 *
 * @author Gerhard Schuster, 2006
 * @author LeMa (Martin Leyrer), 2007, 2008
 * @author MaSu (Susanne Mauritz), 2008
 * @version 1.7
 */
/* Constants */
var XMLHTTP_DEBUG = true;
var DOCLINKKENNUNG = '0/';  // Woran erkennt der Code, dass es sich um einen Link zu einem Edikt handelt?
var DOCIDLENGTH = 32;
var HTML_DELIM = "!";
var HTML_SEARCH_DELIM = "?";
/* global variables */
var dynDoc = top.document;
var docLinks;   // Array mit allen UnIDs der gefundenen Dokumente
var dynDoctitle = "";   // Zwischenspeicher für den Namen des Suchdokuments
var ediktid;
var posid = ''; // Zeilennummer für Highlight
var httpreq = false;
var useHttp = true;
var waiting = false;        // Globale Variable bezfgl. des Status des Ajax-Requests
var bittewar = 'Bitte warten, Edikt wird geladen!';
var msgbookmark = 'Diese Funktion ist hier nicht verfügbar!';
var title2src, thisdocnum;
/*native (bookmarked) edi doc w/o search:*/
/* Vorab Funktionsdeklarationen */
function subOpen() {alert(msgbookmark);}
function toSearch() {alert(msgbookmark);}
// Globale Variable für Back/Forward-Button Navigation (Dojo)
IDDojoState = function(id) {
    this.stateData = id;
    this.changeUrl = true;
};
dojo.extend(IDDojoState, {
    handle: function(handle) {
        if( this.stateData !== false ) {
            subOpenXML(this.stateData);
        } else {
            toSearchXML("XXX");
        }
    }
});
dojo.addOnLoad(function(){
    var appState = new IDDojoState(false);
    dojo.back.setInitialState (appState);
});
// Ende Dojo-Vorbereitungen
/**
 * entry point, called by initForm, suche31.js
 *
 * @param doc {document}    JavaScript Document object, das aktuelle Browser-Dokument
 * @param doclinkkennung {string}    String mit Viewnamen (wenn Zugriff nicht über 0/unid)
 *
 * @return Nix
 * 
 * @author Gerhard Schuster, 2006
 * @author Martin Leyrer, 2008
 * @version 1.1
 */
function checkSession(doc, doclinkkennung) {
    var elem = doc.forms['Main'].elements;
    var printall = doc.forms['_pqsform'];
    var previousdocLink;
    var docLink;
    if (doclinkkennung !== undefined && doclinkkennung !== '') { // 2008-02-08 SM Viewname mitgegeben
       DOCLINKKENNUNG = doclinkkennung;
    }
    var sel;
    if (elem['Hits']) {
        sel = elem['Hits'].value;
    } else {
        // Wenn ich keine "Hits" finde, bin ich ev. in einer kategorisierten View
        // Dann habe ich im Span "treffer" die Anzahl der Links stehen
        if( document.getElementById('treffer')) {
            var x = document.getElementById('treffer').innerHTML;
            var pos = x.indexOf(" ");
            if( pos > 0 ) {
                sel = x.substring(0,pos);
            } else {
                sel = "";
            }
        } else {
            sel = "";
        }
    }
    if ( (sel === '') || (sel == '0') ) {  /*before search|0 found*/
        return;
    }
    if (useHttp) {
        subOpen = subOpenXML;
        toSearch = toSearchXML;
        initXML(doc);
    }
    docLinks = '';
    // Aus der Such-Ergebnisliste die Dokument-IDs auslesen und ins Array schreiben
    var j = 0;
    for (var i=0; i < doc.links.length; i++) {
        var href = doc.links[i].href.toLowerCase();
        var ix = href.indexOf(DOCLINKKENNUNG);
        var dx = href.indexOf('!opendocument');
        if (ix > 0) {
            if (j === 0) {
                j++;
                doc.links[i].focus();
            } // 2008-02-08 SM Mehrfachdoclinks eliminieren
            docLink = href.substr(0,dx).substr(ix + DOCLINKKENNUNG.length);
            if (docLink !== previousdocLink) {
                docLinks += (docLinks !== '' ? '-' : '') + href.substring(ix + DOCLINKKENNUNG.length,dx);
                previousdocLink=docLink;
            } /* docLink != previousdocLink */
        }
    }
    // Felder für "PrintAll" befüllen (20090624 MaSu  && elem['Hits'] hinzugefügt
    if( printall.elements['Hits'] && elem['Hits'] && elem['Hits'].value )  {
        printall.elements['Hits'].value = elem['Hits'].value;
        printall.elements['expQuery'].value = elem['Query'].value;
    }
    //Link-Liste in ein Array konvertieren 
    docLinks = docLinks.split('-');
    // Falls wir mehr als 32KB Links haben, müssen wir diese 
    // für "alles drucken" auf mehrere Fehler aufteilen.
    var ende = docLinks.length;
    var feldname = 'foundUnids';
    var fieldcounter = 0;
    for( link=0; link < ende; link++ ) {
        if( printall.elements[feldname].value !== "" ) {
            printall.elements[feldname].value = printall.elements[feldname].value + "-";
        }
        printall.elements[feldname].value = printall.elements[feldname].value + docLinks[link];
        if( ((printall.elements[feldname].value.length + 33) / 32000) >= 1 ) {
            fieldcounter++;
            feldname = 'foundUnids_' + fieldcounter;
            if( ! printall.elements[feldname] ) {
                setValidationError( 'Druck-Fehler!','Es werden mehr Ergebnisse angezeigt, als gedruckt werden können. Bitte kontaktieren Sie <postmaster@bmf.justiz.gv.at>.');
                link = ende+1;
            }
        }
    }
    //Mehrfachtreffer
    if(sel != docLinks.length) {
        if( document.getElementById('treffer') !== null) {
            var treffer = elem['Hits'].value + ' Treffer</strong> in <strong>' + docLinks.length + ((docLinks.length==1)?' Eintrag':' Einträgen');
            document.getElementById('treffer').innerHTML=treffer;
          }
    }
    hideId( 'divedikt', dynDoc);
    showId( 'spansuche', dynDoc);
    dynDoctitle = dynDoc.title;    // Titel der akt. Seite zwischenspeichern
}/*checkSession*/
/*xmlhttp functions*/
/**
 * Erzeugt ein XMLHTTPRequest Objekt unabhängig vom verwendeten Browser
 *
 * @param doc {document}    JavaScript Document object, das aktuelle Browser-Dokument
 *
 * @return true im Erfolgsfall, sonst false
 * @type Boolean
 *
 * @TODO: Check, ob "new" erfolgreich war, error-handling & logging
 * 
 * @author Gerhard Schuster, 2006
 * @version 1.0
 */
function initXML(doc) {
    if (self.XMLHttpRequest) { // native object: Mozilla,Safari
        httpreq = new XMLHttpRequest();
    } else {
        if (self.ActiveXObject) { // IE
            httpreq = new ActiveXObject("Msxml2.XMLHTTP");   //Msxml2.XMLHTTP
        } else {  // no xmlhttp
            alert('Old browser, XMLHTTP not available');
            return false;
        }
    }
    return true;
}
/**
 * Verarbeitet die Rückmeldung des AJAX-Calls zu einer Dokumentanzeige
 *
 * @return nothing
 * 
 * @TODO: wstate global hinaus ziehen
 * 
 * @author Gerhard Schuster, 2006
 * @author Martin Leyrer, 2008
 * @version 1.1
 */
function onreadystatechange(response) {
 if (httpreq.readyState!=4) {
        return true;
    }
    waiting = false;
    if( httpreq.status !== 200) {
        var errtxt = "";
        if( httpreq.status !== 0 ) {
            errtxt = "<strong>Serverfehler!</strong> Das gewünschte Dokument konnte nicht geladen werden. Bitte probieren sie es etwas später nocheinmal!<br/>";
            errtxt = errtxt + "Details: Fehlernummer " + httpreq.status + ": " + httpreq.statusText;
        } else {
            errtxt = "<strong>Serverfehler!</strong> Das gewünschte Dokument konnte nicht geladen werden. Bitte probieren sie es etwas später nocheinmal!";
        }
        // Errortext schreiben und die Suchergebnisseite wieder anzeigen, damit die Fehlermeldung sichtbar wird
        setValidationError( 'ValidationError', errtxt);
        hideId( 'divedikt', dynDoc);
        showId( 'spansuche', dynDoc);
        /*set second title bar text*/
        firstTextChild(dynDoc.getElementById('title2')).nodeValue = dynDoctitle;
        // Titel setzen
        dynDoc.title = dynDoctitle;
        return false;
   } else {
        // Ajax-geladene Links pseudomäßig als "besucht" markieren
        if (ediktid !== '') {
            // handle multiple entries in searchresult (feedi)
            var idstr = "link" + ediktid;
            var classstr = "class" + ediktid;
            var linkarray = getElementsByClassName(dynDoc, "a", classstr);
            if( linkarray.length > 0 ) {
                for(var i=0; i<linkarray.length; i++){
                    var idstrc = linkarray[i].id;
                    if( dynDoc.getElementById(idstrc) ) {
                        changeStyles(idstrc,"visitedlink");
                    }
                }
            } else {
                // single entry in searchresult (normal)
                if( dynDoc.getElementById(idstr) ) {
                    changeStyles(idstr,"visitedlink");
                }
            }
        }
   }
    var trc = 'readyState=' + httpreq.readyState + '\nstatus=' + httpreq.status +
              '\nstatusText=' + httpreq.statusText;
    var resp = httpreq.responseText;
    // Titel aus dem Ergebnis heraussuchen
    var ix1 = resp.search(/\<title\>/i,'');
    var ix2 = resp.search(/\<\/title\>/i,'');
    if( ix1 == -1 || ix2 == -1) {
        /*jsl:ignore*/;/*jsl:end*/
    } else {
        var title2edi = resp.substring(ix1+7,ix2);
    }
    // Relevante Ergebnisteile herausschneiden
    ix1 = resp.search(/\<div id\=\"eintrag\"/i);
    ix2 = resp.search(/\<\/div\>\<\!\-\-\s*navigation/i);
    if( ix1 == -1 || ix2 == -1) {
        return false;
    } else {
        resp = resp.substring(ix1-1,ix2+6);
    }
    // wenn posid gefunden, entsprechende Position markieren
    if (posid !== '') {
        var source = resp;
        var suche = new RegExp("<tr id=\"?" + posid + "\"?>", "i");
        var replace = "<tr id=\"" + posid + "\" class=\"newval\">";
        resp = resp.replace(suche, replace);
    }
    posid = '';
    // Eintrag in den DIV "divedikt" hinein schreiben
    var xmldiv = dynDoc.getElementById('divedikt');
    xmldiv.innerHTML = resp;
    ix1 = docLinks.length;
    for (var aktindex = 0; aktindex < docLinks.length; aktindex++) {
        if (ediktid.toLowerCase() == docLinks[aktindex] ) {
            break;
        }
    }
    // Ajax-Navigation mit den korrekten Links versorgen und zeichnen
    paintAJAXnav( dynDoc.getElementById('linkstop'),   -1, ix1, aktindex );
    paintAJAXnav( dynDoc.getElementById('rechtstop'),   1, ix1, aktindex );
    paintAJAXnav( dynDoc.getElementById('linksbot'),   -1, ix1, aktindex );
    paintAJAXnav( dynDoc.getElementById('rechtsbot'),   1, ix1, aktindex );
    // Dokument (dyndoc) anzeigen
    hideId( 'spansuche', dynDoc);
    showId( 'divedikt', dynDoc);
    document.getElementById('linkstop').className='links';
    document.getElementById('linksbot').className='links';
    document.getElementById('rechtstop').className='rechts';
    document.getElementById('rechtsbot').className='rechts';
    if( document.getElementById('ajaxnavi') !== null) {
        document.getElementById('ajaxnavi').className='';
    }
    if( document.getElementById('mittetop') !== null) { /* Fall oben Mitte: zum Sucherg */
        document.getElementById('mittetop').className='';
    }
    changeStyles("contentfooter","mitnav");
    changeStyles("footer","fixed_bottom");
    /*set second title bar text*/
    firstTextChild(dynDoc.getElementById('title2')).nodeValue = unescapeHtml(title2edi);
    // Titel setzen
    dynDoc.title = unescapeHtml(title2edi);
    window.scrollTo(0,0);
    // dynDoc.getElementById('tosearchh').focus(); /*set focus for FF*/
    return false;
}
/**
 * Liefert alle HTML-Elemente eines HTML-Tags zurück, die zu einer Klasse gehören
 * @param oElm {document}       JavaScript Document object, das aktuelle Browser-Dokument
 * @param strTagName {string}   Tag (z.B. "a") der gesucht werden soll
 * @param strClassName{string}  Klasse (z.B. "hidden") die gesucht werden soll
 *
 * @return Array
 * 
 * @author Martin Leyrer, 2008
 * @version 1.0
 */
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && document.all) ? document.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)","i");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements);
}
/**
 * Erstelle anhang der übergebenen DocumentUniqueID eine URL und schicke diesen AJAX-Request ab
 *
 * @param unid {String} Documentschlüssel, welcher das zu ladende Notes-Dokument eindeutig bezeichnet
 * @param pos {String} Zeilennummer innerhalb des Dokuments (z.B. FEX)
 *
 * @return nothing
 * 
 * @author Gerhard Schuster, 2006
 * @version 1.0
 */
function subOpenXML(unid,pos) {
    if (waiting) return alert(bittewar);   // Es ist bereits eine Abfrage am Laufen
    ediktid = unid;
    var url = DOCLINKKENNUNG + unid + HTML_DELIM + 'OpenDocument';
    if (pos !== '' && pos !== undefined) {
        posid=pos;
        url = url + '&pos=' + posid;
    }
    // globalen Request-Status setzen
    waiting = true;
    httpreq.open('GET', url, true);
    httpreq.onreadystatechange=onreadystatechange;
    httpreq.send(null);
    return false;
}
/**
 * Erstelle anhang der übergebenen DocumentUniqueID eine URL und schicke diesen AJAX-Request ab
 * Im Gegensatz zu subOpenXML wird hier aber auch noch ein Eintrag für den Back/Forward Button 
 * geschrieben. 
 *
 * @param unid {String} Documentschlüssel, welcher das zu ladende Notes-Dokument eindeutig bezeichnet
 * @param pos {String} Zeilennummer innerhalb des Dokuments (z.B. FEX)
 *
 * @return nothing
 * 
 * @author Martin Leyrer, 2008
 * @version 1.0
 */
function subOpenXMLWithHistory(unid,pos) {
    // Zusätzlich Dojo Magic für Back/Forward-Button ausführen
    var appState = new IDDojoState(unid);
    dojo.back.addToHistory (appState);
    subOpenXML(unid,pos);   // Normalen SubOpenXML Code ausführen
    return false;
}
/**
 * Zeichnet, so vorhanden, die Blätter-"Buttons" für die AJAX-Navigation auf den Schirm
 *
 * @param {Object} Das DOM-Objekt, in welches der Navigationstext geschrieben werden soll
 * @param {Integer} Offset ist -1 wenn es ein zurück-Button ist, ansonsten +1
 * @param {Integer} Maximale Anzahl der Links im Sucheregbnis. Notwendig, damit ich nicht über den letzten Link hinaus navigieren kann.
 *
 * @author LeMa, Martin Leyrer
 * @version 1.0
 */
function paintAJAXnav( element, offset, maxlinks, aktindex ) {
    var url = "";
    if( offset === -1 ) {  // navlinks
        if( aktindex > 0 ) {
            url =  DOCLINKKENNUNG + docLinks[aktindex-1] + HTML_DELIM + 'OpenDocument';
            element.innerHTML = "[ <a href=\"" + url + "\" onClick=\"subOpenXMLWithHistory('" + docLinks[aktindex-1] + "');return false;\">&lt;&lt; " + aktindex + " von " + maxlinks + "</a> ]";
        } else {
            element.innerHTML = "&nbsp;";
        }
    } else if (offset === 1) { // navrechts
        if( aktindex < (maxlinks-1) ) {
            url =  DOCLINKKENNUNG + docLinks[1+aktindex] + HTML_DELIM + 'OpenDocument';
            element.innerHTML = "[ <a href=\"" + url + "\" onClick=\"subOpenXMLWithHistory('" + docLinks[aktindex+1] + "');return false;\">" + (aktindex+2) + " von " + maxlinks + " &gt;&gt;</a> ]";
        } else {
            element.innerHTML = "&nbsp;";
        }
    }
}
/**
 * Versteckt die Vollanzeige des Dokuments (Edikts) und 
 * zeigt wieder die Suchmaske
 *
 * @param myid {String} Notes DocumentUniqueID, welche das aktuelle Notes-Dokument eindeutig bezeichnet
 *
 * @return nothing
 * 
 * @author Gerhard Schuster, 2006
 * @author Martin Leyrer, 2007
 * @version 1.1
 */
function toSearchXML(myid) {
    hideId( 'divedikt', dynDoc);
    showId( 'spansuche', dynDoc);
    /*set second title bar text*/
    firstTextChild(dynDoc.getElementById('title2')).nodeValue = dynDoctitle;
    // Titel setzen
    dynDoc.title = dynDoctitle;
    setFocus2myLink(dynDoc, myid);
    // Zusätzlich Dojo Magic für Back/Forward-Button ausführen
    var appState = new IDDojoState(false);
    dojo.back.addToHistory (appState);
}
/**
 * Markiert im Suchergebnis das zuletzt angesehene Dokument.
 *
 * @param doc   {document} JavaScript Document object, das aktuelle Browser-Dokument
 * @param myid {String} Notes DocumentUniqueID, welche das aktuelle Notes-Dokument eindeutig bezeichnet
 *
 * @return nothing
 * 
 * @author Gerhard Schuster, 2006
 * @author Martin Leyrer, 2007
 * @version 1.1
 */
function setFocus2myLink(doc, myid) {
    var temp = myid;
    var offset = 10;
    var maxlinks = doc.links.length;
    temp = temp.toLowerCase();
    for (var i=0;i < maxlinks; i++) {
        var href = doc.links[i].href.toLowerCase();
        var ix = href.indexOf(temp);
        if (ix > 0) {
            // Wir springen zunächst ans Ende der Ergebnistabelle,
            // damit man auf jeden Fall auch das letzte Suchergebnis sieht
            for(var backloop = maxlinks-1; backloop >= 0; backloop--) {
                var xxx = doc.links[backloop];
                if( doc.links[backloop].name === "bottomergebnisliste") {
                    // FF only: doc.links['bottomergebnisliste'].focus();
                    // IE only: doc.links.item('bottomergebnisliste').focus();
                    doc.links[backloop].focus();
                    break;
                }
            }
            // Dann setzten wir den Focus VOR den tatsächlichen Eintrag,
            // damit man ihn auch sieht, wenn er ganz am Anfang ist
            var y = i - 5;
            if( y >= 0 ) {
                doc.links[y].focus();
            }
            // Endlich den Fokus auf den "richtigen" Eintrag
            doc.links[i].focus();
            return true;
        }
    }
    return false;
}
/**
 * Sucht nach dem ersten Text-Child-Element eines DOM-Elementes
 *
 * @param {object} DOM:element
 *
 * @return Das erste Child-Element des übergebenen DOM-Elementes, das vom Typ Text ist oder null
 * @type DOM:element
 * 
 * @author Gerhard Schuster, 2006
 * @version 1.0
 */
function firstTextChild(node) {
    if (node === null) return null;
    var child1 = node.firstChild;
    while (child1 !== null) {
        if (child1.nodeType ==3 ) return child1;
        child1 = child1.nextSibling;
    }
    return null;
}
/**
 * Ändert die CSS-Klasse eines per idname definierten HTML-Elements auf den neuen Wert
 *
 * @param {String} Name (ID) des HTML-Elements
 * @param {String} Name der neuen KLasse
 * 
 * @author LeMa, Martin Leyrer
 * @version 1.0
 */
function changeStyles (idname, newstyle) {
    if(document.getElementById && document.createTextNode) {
        if(document.getElementById(idname))  {
            document.getElementById(idname).className=newstyle;
        }
    }
}
/**
 * Submitted das versteckte Form "_pqsform", um die "Alles Drucken" Seite anzuzeigen
 *
 * @author LeMa, Martin Leyrer
 * @version 1.0
 */
function printAll() {
    var printall = dynDoc.forms['_pqsform'];
    var elem = printall.elements;
    printall.submit();
}
/**
 * Macht aus HTML-Entities "normalen" Text, da sonst die HTML-Entities
 * im Browser angezeigt werden.
 *
 * @param {String} Der Text, welcher HTML-Entities enthalten kann
 *
 * @return String mit dem kompletten Text, HTML-Entities aufgelöst
 * @type String
 * 
 * @author LeMa, Martin Leyrer
 * @version 1.0
 */
function unescapeHtml(html) {
    var htmlNode = document.createElement("DIV");
    htmlNode.innerHTML = html;
    if (htmlNode.innerText) {
        return htmlNode.innerText; // IE
    }
    return htmlNode.textContent; // FF
}
