

function creXHR() {
	var O_XHR = null;
	if (window.XMLHttpRequest) {
		try {
			O_XHR = new XMLHttpRequest();
		} catch(e) {
			O_XHR = null;
		}
	} else if (window.ActiveXObject) {
		try {		
			O_XHR = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				O_XHR = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				O_XHR = null;
			}
		}
	}
	return O_XHR;
}

// Wysyła żądanie XHR na podstawie obiektu AEH
function sendXHR(O_XHR, URL) {
	O_XHR.open('GET', URL, true);
	O_XHR.send(null);
}

function EvtCntr(maxNEvts) {
	if ( !window.GM_evtsCntrs) {
		GM_evtsCntrs =new Array();
	}

	GM_evtsCntrs.push(this);
	this.maxNEvts =maxNEvts;
	this.evtsCnt =0;
	// Czy maksymalna wartość licznika zostąła osiągnięta
	this.isMaxAchvd =function() {
		if (this.evtsCnt < this.maxNEvts)  return false;
		else  return true;
	}
	// Increase
	this.inc =function() {
		this.evtsCnt++;
	}
	// Decrease
	this.dcr =function() {
		this.evtsCnt--;
	}
}

	
// Konstruktor obiektu AEH
/*
evtType		- typ zdarzenia AJAX
hndrFunc	- funkcja obsługi
O_cntr		- obiekt licznika zdarzeń AJAX
*/
function AEH(evtType, hndrFunc, O_cntr) {
	if ( !window.GM_AEHs) {
		GM_AEHs =new Array();
	}
	GM_AEHs[evtType] =this;
	this.hndrFunc =hndrFunc;
	this.O_cntr =O_cntr;

}


function hndAE(evtType, URL, v_dat) {
	if ( !window.GM_AEHs)  return null;
	var O_AEH =GM_AEHs[evtType];
	if ( !O_AEH)  return null;
	var O_XHR;
	if (O_AEH.O_cntr.isMaxAchvd()) {
		return null;
	} else {
		O_XHR =creXHR();
		if ( !O_XHR) {
			return null;
		}
		O_AEH.O_cntr.inc();
	}
	
	// Funkcja obsługująca zdarzenie zmiany stanu gotowości
	O_XHR.onreadystatechange = function() {
		if (O_XHR.readyState==4) {
			try {
				if (O_XHR.status==200) {
					var txt =O_XHR.responseText;
					var valdtnCode ='[ib-validtnCode]';
					if (txt.substr(txt.length-valdtnCode.length)==valdtnCode) {
						txt =txt.substring(0, txt.length-valdtnCode.length);
						O_AEH.hndrFunc(txt, v_dat);
					} else {
						// O_AEH.hndrFunc(txt, v_dat);	// Przy debugowaniu pokazuje błąd
						throw  new Error('brak kodu walidacji');
					}
				} else  throw new Error('nieprawidłowy status http');
			} catch (e) {
				alert('Wystąpiły problemy podczas łączenia się z serwerem.');
				O_AEH.hndrFunc(false, v_dat);	// Usunięcie ikony ładowania
				//alert(e.toString());
			} finally {
				delete O_XHR;
			}
			O_AEH.O_cntr.dcr();
		}		
	}
	
	sendXHR(O_XHR, URL);
	return true;
}


// Inicjacja AJAXa
function initAJAX() {
	var O_evtCntr =new EvtCntr(1);
	
	// Tworzenie obiektów obsługi zdarzeń AJAX
	new AEH('addToCart', AEH_addToCart, O_evtCntr);
	new AEH('addToWishLst', AEH_addToWishLst, O_evtCntr);

}


// Obsługa dodawania do koszyka/przechowalni po odebraniu danych
function AEH_addToWishLst(h_ctnt, O_dat) {
	//alert(h_ctnt);
	if ( !h_ctnt) {	// Niepowodzenie - usuwa ikonkę ładowania
		//re =/<img[^>]+>/;
		//re =/<div class='loadngIco'><[^>]+><\/div>/;
		//re =RegExp("<div class='loadngIco'>.+?</div>", 'i');
		//alert(O_dat.E_ctainr.innerHTML);
		re =RegExp("<span [^>]*('|\")loadngIco('|\")[^>]*>.+?</span>", 'i');
		O_dat.E_ctainr.innerHTML = O_dat.E_ctainr.innerHTML.replace(re, '');
		return;
	}
	var E_cartInfo =document.getElementById('cartInfo');
	E_cartInfo.innerHTML =h_ctnt;
	O_dat.E_ctainr.innerHTML ="<div class='msg'>Dodano do przechowalni" + hImg('chkIco') + "</div>";
}


// Obsługa dodawania do koszyka/przechowalni po odebraniu danych
function AEH_addToCart(h_ctnt, O_dat) {
	if ( !h_ctnt) {	// Niepowodzenie - usuwa ikonkę ładowania
		//re =/<img[^>]+>/;
		//re =/<div class='loadngIco'><[^>]+><\/div>/;
		re =RegExp("<span [^>]*('|\")loadngIco('|\")[^>]*>.+?</span>", 'i');
		O_dat.E_ctainr.innerHTML = O_dat.E_ctainr.innerHTML.replace(re, '');
		return;
	}
	
	var E_cartInfo =document.getElementById('cartInfo');
	E_cartInfo.innerHTML =h_ctnt;
	O_dat.E_ctainr.innerHTML ="<div class='msg'>Dodano do koszyka" + hImg('chkIco') + "</div>";
}


// Obsługa kliknięcia "dodaj do koszyka"
function EH_addToCart(prodId, ctainrId) {
	var E_ctainr =document.getElementById(ctainrId);
	var O_dat =new Object();
	O_dat.E_ctainr =E_ctainr;

	if (hndAE('addToCart', '/AJAX/addToSL.php?prodId=' + prodId, O_dat)) {
		// E_ctainr.innerHTML =hImg('loadngIco') + '&nbsp;' + E_ctainr.innerHTML;
		
		// Note: zmiany poniższego wyrażenia wymagają zmian w AEH_addToCart
		E_ctainr.innerHTML ="<span class='loadngIco'>" + hImg('loadngIco') + '</span>' + E_ctainr.innerHTML;
	}

	return;
}

// Obsługa kliknięcia "dodaj do przechowalni"
function EH_addToWishLst(prodId, ctainrId) {
	var E_ctainr =document.getElementById(ctainrId);
	var O_dat =new Object();
	O_dat.E_ctainr =E_ctainr;

	if (hndAE('addToWishLst', '/AJAX/addToSL.php?WL&prodId=' + prodId, O_dat)) {
		// E_ctainr.innerHTML ="<div class='loadngIco'>" + hImg('loadngIco') + '</div>' + E_ctainr.innerHTML;
		
		// Note: zmiany poniższego wyrażenia wymagają zmian w AEH_addToWishLst
		E_ctainr.innerHTML ="<span class='loadngIco'>" + hImg('loadngIco') + '</span>' + E_ctainr.innerHTML;

	}
	return;
}


// Preload image
var GM_imgs =new Array();
function prldImg(key, src) {
	GM_imgs[key] =new Image();
	GM_imgs[key].src =src;
}

// Zwraca kod HTML obrazka
function hImg(key) {
	return "<img src='" + GM_imgs[key].src + "'/>";
}

// Add to cart - over (onmouseover event)
function EH_ATCOver(E_img) {
	E_img.src =GM_imgs['addToCartBtnOver'].src;
}
// Add to cart - out (onmouseout event)
function EH_ATCOut(E_img) {
	E_img.src =GM_imgs['addToCartBtn'].src;
}
// Add to cart - over (onmouseover event)
function EH_ATWLOver(E_img) {
	E_img.src =GM_imgs['addToWishLstBtnOver'].src;
}
// Add to cart - out (onmouseout event)
function EH_ATWLOut(E_img) {
	E_img.src =GM_imgs['addToWishLstBtn'].src;
}

var GM_AEHs, GM_evtsCntrs;


