/* v 2.7.12		x.y.z		x: lefele kompatibilisek azon verziók ahol megegyezik		y: változott a paraméterezés, működés, funkcionalitás, de kompatibilis (elhagyható paraméterezés pl.)		z: csak a belső müködés változott

	2.0.0=>2.0.1	elgépelés javítva nem vette be a dl_google paramétert
	2.1.1			paraméterként már nem id hanem name tulajdonságot vár, emelett maga az objektum is megadható paraméterként nem csak szöveg
				dl_init 6. paraméterét 1-re kell állítani, hogy kompatibilis legyen (id használata name helyett)
	2.2.2			a hova paraméter lehet objektum is, valamint egy hiba javítva, ha a hova null értékre lett beállítva
	2.2.3			hiba javítva ha objektum jön paraméterként
	2.2.4			hiba javítva megvárás esetén
	2.2.5			az utan függvény a megjelenítés után fut le
	2.2.6			megvár javítva, nem futott le ha nem volt mit megvárni
	2.3.6			javascript fájl futtatási lehetőség, a futás eredményét NEM tölti be a célterületre(de megadható célterület, ha az a dl_hash_ki BEKERÜL A HASHBA), hanem az EVAL függvénnyel lefuttatja
				a dl 7. paraméterét 1-re kell állítani, hogy a fent említett módon étkelje ki a fájlt
				megjegyzés: nem vagyok benne biztos hogy ez nem okoz komoly biztonsági problémákat
				
				a dl 8. paraméterének 0-ra állításával az adott ajax műveletre kikapcsolható a dl_init-ben megadott előtt és után függvény lefutása
	2.3.7			hiba javaítva párhuzamos dl-ek esetén (hibás változó deklaráció miatt közösen használták a req változót, egy var szó kimaradt)
	2.3.8			ha egy konténer taget (pl div) kap paraméternek, rekurzívan átnézi rendesen ha további alkonténereket tartalmaz is
	2.3.9			előző hibája javítva...
	2.4.9			a dl 9. logikai paraméterének beállításával megadható hogy a dl_hash_ki beállítástól és a dl 2. paraméterében megadottól függetlenül a betöltött fájl megjelenjen-e a hash-ben
	2.4.10		a dl_elott csak közvetlenül az AJAX kérés elküldése elött fut le, és megkapja paraméterként a már összekészített adatobjektumot (mint a dl_utan)
	2.4.11		a hash változtatása az AJAX kérés eredményének megjelenítése/futtatása előtt történik (javascript futtatásánál lehet fontos, hogy a script már lássa a get változókat a hashben)
	2.5.11		a dl hova paraméterének true értéke esetén is a dl_initben megadott alapértelmezett helyre tölti, eddig csak elhagyás vagy undefined esetén tette ezt
	2.6.11		ha több elemet is talál a megadott NAME alapján mindet elpostolja (természetesen a nem kiválasztott checkboxokat vagy radiokat így sem postolja), akkor lehet fontos ha name="valami[]" módszerrel akasz tömböt postolni
	2.7.11		dl() visszaad egy azonosítót, a dl_cancel() függvény meghívása az azonosítóval megszakítja a kérést, az azonosító elhagyása esetén minden ajax kérést megszakít
	2.7.12		FONTOS JAVÍTÁS  form, div stb. id tulajdonságának küldése esetén firefox alatt nem működött, a getElemetsByName más böngészőkben visszaadta id alapján is a formot/divet
				valószínűleg ez egy firefox javítás AZ ELŐZŐ VERZIÓK VALÓSZÍNŰLEG HIBÁSAK ILYEN ESTEBEN FIREFOX ALATT, mostantól minden esetben először name tulajdonság alapján keres,
				ha nincs találat id-vel is próbálkozik
*/
var dl_hash_be=0; //ha 0 hash-ben lévő adatokat nem olvassa (nem foglalkozik a kézzel beírt hash-el)
var dl_hash_ki=null; //az elem aminek az ajaxos változásait kijelzi a hashben
var dl_google=0; //google analitics oldalmegtekintést generáljon e
var dl_elott=null; //minden dl töltés elött lefutó függvény
var dl_utan=null; //minden dl töltés után lefutó függvény
var dl_id=0; //ha az értéke 1 a paramétereket az id tulajdonság alapján keresi, különben a name tulajdonság alapján
var dl_requests=new Array();
var id=1;
if(window.attachEvent) window.attachEvent('onload',dl_tolt);
else window.addEventListener('load',dl_tolt,false);

function dl_init(_dl_hash_be,_dl_hash_ki,_dl_elott,_dl_utan,_dl_google,_dl_id){
	if(_dl_hash_be!=undefined) dl_hash_be=_dl_hash_be;
	if(_dl_hash_ki!=undefined) dl_hash_ki=_dl_hash_ki;
	if(_dl_elott!=undefined) dl_elott=_dl_elott;
	if(_dl_utan!=undefined) dl_utan=_dl_utan;
	if(_dl_google!=undefined) dl_google=_dl_google;
	if(_dl_id!=undefined) dl_id=_dl_id;
};

//onloadkor ez fut le
function dl_tolt(){
	//hidden iframe a vissza gombhoz
	i=document.createElement('iframe');
	i.id='historyiframe';
	i.style.position='absolute';
	i.style.top='0px';
	i.style.left='0px';
	i.style.width='0px';
	i.style.height='0px';
	i.style.visibility='hidden';
	document.body.appendChild(i);
	if(dl_hash_be){
		dl_oldalbe();
		setInterval("hashvalt();",1000);
	}
};

//a hash alapján betölti az oldalt a tartalomba
function dl_oldalbe(){
	if(dl_hash_ki!=null && location.hash!=''){
		h=location.hash.substring(1,location.hash.length);
		if(h.indexOf('*')!=-1) h+='&'; else h+='?';
		h +='nocache='+(new Date()).getTime();
		h=h.replace(/\*/,'?');
		dl(h,dl_hash_ki);
	}
};

function dl_cancel(_id){
	if(_id==undefined){
		for(var i=0;i<dl_requests.length;i++) dl_requests[i].req.abort();
		dl_requests=new Array();
	}else{
		for(var i=0;dl_requests[i].id!=_id && i<dl_requests.length;i++);
		if(i<dl_requests.length){
			var t=dl_requests[i];
			dl_requests[i].abort();
			dl_requests.splice(i,1);
			t.req.abort();
		}
	}
}

/*
az ajaxos töltés függvény
mit: a fájl a mit betölt
hova: az objektum id-je aminek az innerhtmljébe betölti VAGY egy függvény, ami a töltés végén meghívásra kerül és paraméterként megkapja az eredményt (szövegként),
method: POST/GET param=a POST/GET által küldött paraméterek tömbje 
param: tömb sztringeket tartalmazhat amik lehetnek akár vegyesen:
	-egy objektum id-je aminek a value-ját elküldje
	-'parameter=ertek' fomrátumú szöveg
	-egy div stb. id-je, ez esetben az összes a div-en található id-vel rendelkező objektum value-ját elküldi
megvar: ha értéke 1 akkor a végrehajtás megvárja az előző dl parancsok végrehajtódását, ha 0 akkor nem (vagy legalábbis a böngésző alapértelmezése és tudása szerint fut) (nem működik még)
az első paraméter kivételével mind elhagyható alapértelmezett értékek: hova=tartalom, method=get, param=nincs egy parméter sem, megvar=0
*/
function dl(mit,hova,method,param,utan,megvar,js,elottutan,hashbe){
	if(param==undefined) param='';
	if(method==undefined) method='GET';
	if(hova===undefined || hova===true) hova=dl_hash_ki;
	if(hova!=null && typeof(hova)=='string') hova=document.getElementById(hova);
	if(utan==undefined) utan=null;
	if(megvar==undefined) megvar=0;
	if(js==undefined) js=0;
	if(elottutan==undefined) elottutan=1;
	if(window.XMLHttpRequest) req = new XMLHttpRequest;
	else if(window.ActiveXObject){
	req=new ActiveXObject("Msxml2.XMLHTTP");
	if(!req) req=new ActiveXObject("Microsoft.XMLHTTP");
	}
	//paraméterek összeállítása (POST GET)
	var p='';
	if(js) p='dl_js=1';
	if(mit.indexOf('dl_js=1')>-1) js=1;
	function param_fuz2(_obj){
		var nev;
		if(dl_id) nev=_obj.id; else nev=_obj.name;
		if(nev!=null && nev!=undefined && nev!=''){
			if((_obj.type!='checkbox' && _obj.type!='radio') || _obj.checked==true){
				if(p!='') p=p+'&';
				p=p+nev+"="+encodeURIComponent(_obj.value);
			}
		}
	}
	function param_fuz(_obj){
		var tart;
		if(_obj.childNodes.length>0 && _obj.type==undefined){
				for(var j=0;j<_obj.childNodes.length;j++){
					param_fuz(_obj.childNodes[j]);
				}
		}
		//ha az objektumnak nincsenek alobjekumai, akkor maga az objektum kerül be a paramétereke közé
		else param_fuz2(_obj);
	}
	for(i=0;i<param.length;i++){
		//paméter_neve = paraméter értéke formula
		if((typeof(param[i])=='string') && (param[i].indexOf('=')!=-1)){
			if(p!='') p=p+'&';
			p=p+param[i].substr(0,param[i].indexOf('=')+1)+encodeURIComponent(param[i].substr(param[i].indexOf('=')+1,param[i].length-param[i].indexOf('=')-1));
		//egyéb esetben
		}else{
			//ha az objektumot kaptuk meg rögtön
			if(typeof(param[i])=='object') param_fuz(param[i]);
			//ha  az objektum id  tulajdonságát kaptuk meg szövegként
			else if(dl_id) param_fuz(document.getElementById(param[i]));
			//ha az objektum name  tulajdonságát kaptuk meg szövegként
			else{
				var n=document.getElementsByName(param[i]);
				if(n.length==0 && document.getElementById(param[i])!=null) n=Array(document.getElementById(param[i]));
				if(n.length==1) param_fuz(n[0]);
				else if (n.length>1){
					j=0;
					do{
						if(n[j].type!='radio' || n[j].checked){
							param_fuz(n[j]);
						}
						j++;
					}while(j<n.length);
				}
			}
		}
	}
	//nochache paraméter
	if(p!='') p=p+'&';
	p=p+'nocache='+(new Date()).getTime();
	//hova töltődjön be
	//alert(p);
	//p=encodeURIComponent(p);
	req.onreadystatechange=dl_out;
	//GEt esetén
	if(method.toUpperCase()=='GET'){
		if(p!=''){
			if(mit.indexOf('?')!=-1) mit=mit+'&'+p;
			else mit=mit+'?'+p;
		}
		req.open(method,mit);
		req.setRequestHeader("Content-Type", "text/plan");
		req.setRequestHeader("charset", "utf-8");
		//------------------------
		request=new Object();
		request.p=null;
	}
	//POST esetén
	else if(method.toUpperCase()=='POST'){
		req.open(method,mit);
		req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		req.setRequestHeader("charset", "utf-8");
		req.setRequestHeader("Content-length", p.length);
		req.setRequestHeader("Connection", "close");
		//------------------------
		request=new Object();
		request.p=p;
	}
	//------------------------
	request.hova=hova;
	request.utan=utan;
	request.mit=mit;
	request.req=req;
	request.megvar=megvar;
	request.js=js;
	request.elottutan=elottutan;
	request.hashbe=hashbe;
	request.id=id; id++;
	dl_requests.push(request);
	
	if(dl_elott!=null && elottutan) dl_elott(request);
	
	if(megvar==0 || dl_requests.length==1) req.send(request.p);
	return request.id;
};

//ez a rész gondoskodik róla, hogy ha kézel átírja valaki a hash-t betöltődjön az anank megfelelő tartalom
var hash=null;
function hashvalt(){
	if((hash!=null) && (hash!=location.hash)) {hash=location.hash;dl_oldalbe();}
};
//-----------

function strstr( haystack, needle, bool ) {
    var pos = 0;
    haystack += '';
    pos = haystack.indexOf( needle );
    if( pos == -1 ){
        return haystack;
    } else{
        if( bool ){
            return haystack.substr( 0, pos );
        } else{
            return haystack.slice( pos );
        }
    }
};

//ez a függvény hívódik meg ha kész a betöltés és megjeleníti az eredményt a megadott helyen többek közt
function dl_out(){
	for(var i=0;i<dl_requests.length;i++) if(dl_requests[i].req.readyState==4){
		var req=dl_requests[i];
		
		dl_requests.splice(i,1);
		if((dl_requests.length>i) && (dl_requests[i].megvar==1)){dl_requests[i].megvar=0;dl_requests[i].req.send(dl_requests[i].p);}
		//if(document.title!=(title='Improweb')) document.title=title;//az IE egy hülyeségének javítása mikor előre gomb nyomogatáskor átírja a titlet néha
		
		if(typeof(dl_hash_ki)=='string') var ki=document.getElementById(dl_hash_ki); else var ki=dl_hash_ki;
		if((req.hova==ki && ki!=null && req.hashbe==null) || (req.hashbe && req.hashbe!=null)){
			h=strstr(req.mit,'nocache',true);
			if(h.charAt(h.length-1)=='&' || h.charAt(h.length-1)=='?')h=h.substring(0,h.length-1);
			
			h=h.replace(/\?/,'*');
			hash='#'+h;
			if(location.hash!=hash){
				x=history.length;
				location.hash=h;
				if(dl_google) pageTracker._trackPageview(h);
				h=h.replace(/&/gi,'|');
				
				if(x==history.length) document.getElementById('historyiframe').src='dl_history.php?h='+h;
			}
		}
		
		if(req.hova!=null && (!req.js)) req.hova.innerHTML=req.req.responseText;
		if(req.js) eval(req.req.responseText);
		if(req.utan!=null) req.utan(req.req.responseText);
		if(dl_utan!=null && req.elottutan) dl_utan(req);
	}
};
//-------------------------
