<!--
// Obecná funkce pro provádení AJAX požadavku.
// Ocekává jeden argument, což je objekt obsahující sadu nastavení.
// Všechna jsou popsána v komentárích níže.
function ajax( nastaveni ) {

    // Nacteme nastavení nebo uložíme výchozí.
    nastaveni = {
        // Typ HTTP požadavku
        typ: nastaveni.typ || "POST",

        // URL, na kterou bude požadavek proveden
        url: nastaveni.url || "ajax.php",

        // Casový limit dokoncení požadavku
        timeout: nastaveni.timeout || 30000,

        // Funkce, které se zavolají pri selhání ci úspechu požadavku
        // nebo pri jeho dokoncení (at už úspešném ci neúspešném)
        onComplete: nastaveni.onComplete || function(){},
        onError: nastaveni.onError || function(){},
        onSuccess: nastaveni.onSuccess || function(){},

        // Typ dat, který bude vrácen ze serveru.
        // Výchozí  nastavení znamená, že typ bude urcen podle serveru
        // a podle toho se dále zachováme.
        typData: nastaveni.typData || "html",

        // data požadavku
        data: nastaveni.data || ""
	};

	// Vytvoríme objekt požadavku.
    var xml = new XMLHttpRequest();

	if(nastaveni.typ=='GET') {
		// Otevreme asynchronní požadavek typu POST.
		xml.open(nastaveni.typ, nastaveni.url+'?'+script.serialize(nastaveni.data), true);
	}
	else {
		// Otevreme asynchronní požadavek typu POST.
		xml.open(nastaveni.typ, nastaveni.url, true);

		xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

		// Zabezpecíme, aby prohlížec poslal správnou délku serializovaných dat -
		// prohlížecum rodiny Mozilla to obcas delá problém.
		if ( xml.overrideMimeType ) xml.setRequestHeader("Connection", "close");
	}

    // Pockáme na požadavek pet sekund, potom to vzdáme.
    var timeoutLength = 30000;

    // Pamatujeme si, jestli byl požadavek úspešne dokoncen.
    var pozadavekDokoncen = false;

    // Inicializujeme callback funkci, která se spustí za pet sekund
    // a zruší požadavek (pokud se tak již nestalo).
    setTimeout(function(){
         pozadavekDokoncen = true;
    }, timeoutLength);

    // Hlídáme zmeny stavu požadavku.
    xml.onreadystatechange = function(){
        // Cekáme na kompletní nactení dat,
        // a ujistíme se, že casový limit požadavku ješte nevypršel.
        if ( xml.readyState == 4 && !pozadavekDokoncen ) {

            // Zkontrolujeme, zda byl požadavek úspešný
            if ( httpSuccess( xml ) ) {

                // Zavoláme callback funkci pro úspešné provedení požadavku
                // s daty vrácenými ze serveru.
                nastaveni.onSuccess( httpData( xml, nastaveni.typData ) );

            // Jinak nastala chyba, zavoláme tedy callback funkci pro chybový stav.
            } else {
                nastaveni.onError();
            }

            // Zavoláme callback funkci pro dokoncení požadavku.
            nastaveni.onComplete();

            // Uklidíme po sobe, abychom predešli úniku pameti.
            xml = null;
        }
    };

	if(nastaveni.typ=='GET') {
		// Navážeme spojení se serverem.
		xml.send();
	}
	else {
		// Navážeme spojení se serverem.
		xml.send(script.serialize(nastaveni.data));
	}

    
    // Zjistíme, zda HTTP požadavek uspel.
    function httpSuccess(r) {
        try {
            // Pokud nebyl vrácen žádný stav a žádáme o místní soubor,
            // pak byl požadavek úspešný.
            return !r.status && location.protocol == "file:" ||
    
                // Jakýkoliv status od 200 do 299 je dobrý.
                ( r.status >= 200 && r.status < 300 ) ||
    
                // Úspešne dokonceno, pokud dokument nebyl zmenen.
                r.status == 304 ||
    
                // Prohlížec Safari vrací prázdný satus, pokud soubor nebyl zmenen.
                navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined";
        } catch(e){}
    
        // Pokud kontrola stavu vyhodila výjimku, predpokládáme, že požadavek také neuspel.
        return false;
    }

    // Získáme správná data z HTTP odpovedi.
    function httpData(r,typ) {
        // Získáme hlavicku Content-Type.
        var ct = r.getResponseHeader("Content-Type");
    
        // Pokud nebyl urcen výchozí typ, zjistíme, zda server vrátil
        // nejaký druh XML.
        var data = !typ && ct && ct.indexOf("xml") >= 0;
    
        // Pokud bylo ze serveru vráceno XML, získáme XML dokument;
        // jinak vrátíme textový obsah, který server poslal.
        data = typ == "xml" || data ? r.responseXML : r.responseText;
    
        // Pokud je udán typ "script", provedeme vrácený text jako JavaScript.
        if ( typ == "script" )
            eval.call( window, data );
    
        // Vrátíme data z odpovedi (bud XML dokument, nebo textový retezec).
        return data;
    }

}
//-->