var serverAddress = "/ajaxResponder.php";
var xmlHttp = createXmlHttpRequestObject();


//--- tworzy obiekt XMLHttpRequest ---------------------------------
function createXmlHttpRequestObject() {
	var xmlHttp;
	try {
		xmlHttp = new XMLHttpRequest();
	}
	catch (e) {
		var XmlHttpVersions = new Array(
			"MSXML2.XMLHTTP.6.0",
			"MSXML2.XMLHTTP.5.0",
			"MSXML2.XMLHTTP.4.0",
			"MSXML2.XMLHTTP.3.0",
			"MSXML2.XMLHTTP",
			"Microsoft.XMLHTTP"
		);
		for (var i = 0; i < XmlHttpVersions.length && !xmlHttp; ++i) {
			try {
				xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
			catch (e) {
			}
		}
	}
	if (!xmlHttp) {
//		displayFatalError("Bląd podczas nawiązywania połączenia.<br />Spróbuj ponownie za chwilę.");
	}
	else {
		return xmlHttp;
	}
}


// --- pobiera tresc XML z odpowiedzi serwera -----------------------
function getResponse() {
	var xmlResponse = xmlHttp.responseXML;
	if (!xmlResponse || !xmlResponse.documentElement) {
		throw("Niepoprawny komunikat zwrotny.");
	}
	var rootNodeName = xmlResponse.documentElement.nodeName;
	if (rootNodeName == "parsererror") {
		throw("Niepoprawny komunikat zwrotny.");
	}
	return xmlResponse.documentElement;
}


// --- ustawia "focus" na obiekcie podanym jako parametr ------------ 
function setFocus(objName) {
	var obj = document.getElementById(objName);
	if (obj) {
		obj.focus();
	}
}


// --- ustawia "focus" na polu tekstowym, usuwajac tekst zachety ----
function textInputFocus(inputObj) {
	if (inputObj.value == inputObj.defaultValue) {
		inputObj.value = "";
	}
}


// --- zwalnia "focus" z pola tekstowego, przywracajac tekst zachety 
function textInputBlur(inputObj) {
	if (inputObj.value == "") {
		inputObj.value = inputObj.defaultValue;
	}
}


// --- sprawdza, czy wprowadzono dane w polu tekstowym formularza przed wyslaniem
function submitNonEmpty(inputId) {
	var inputObj = document.getElementById(inputId);
	var result;
	if ((inputObj.value == "") || (inputObj.value == inputObj.defaultValue)) {
		result = false;
		var message;
		if (inputObj.title) {
			message = "Nie podano danych w polu '" + inputObj.title + "'.";
		}
		else {
			message = "Nie podano danych do wysłania.";
		}
		alert(message);
	}
	else {
		result = true;
	}
	return result;
}


// --- modyfikuje nazwe klasy podanego obiektu ----------------------
function setClass(obj, className) {
	obj.setAttribute("class", className);
	obj.setAttribute("className", className);
}


// --- globalnie zaznacza/cofa zaznaczenie pol typu checkbox o zadanym prefiksie
function globalSelect(formId, prefix, ticked) {
	var formObj = document.getElementById(formId);
	var prefixLen = prefix.length;
	var inputObj;
	for (var i = 0; i < formObj.length; ++i) {
		inputObj = formObj.elements[i];
		if ((inputObj.type == "checkbox") && ((inputObj.name).substr(0, prefixLen) == prefix)) {
			inputObj.checked = ticked;			
		}
	}
}


// --- zlicza zaznaczone pola typu checkbox o zadanym prefiksie -----
function countSelected(formId, prefix) {
	var result = 0;
	var formObj = document.getElementById(formId);
	var prefixLen = prefix.length;
	var inputObj;
	for (var i = 0; i < formObj.length; ++i) {
		inputObj = formObj.elements[i];
		if ((inputObj.type == "checkbox") && ((inputObj.name).substr(0, prefixLen) == prefix) && (inputObj.checked)) {
			++result;			
		}
	}
	return result;
}


// --- wylacza wszystkie pola typu checkbox poza biezacym ----------- 
function exclusiveCheckbox(formId, prefix, currentObj) {
	var formObj = document.getElementById(formId);
	var prefixLen = prefix.length;
	var inputObj;
	for (var i = 0; i < formObj.length; ++i) {
		inputObj = formObj.elements[i];
		if ((inputObj.type == "checkbox") && ((inputObj.name).substr(0, prefixLen) == prefix) && (inputObj != currentObj)) {
			inputObj.checked = false;			
		}
	}
}


// --- zwraca wartosc brutto podanej kwoty przy danym opodatkowaniu -
function brutto(netto, tax) {
	netto = parseFloat((netto.toString()).replace(/,/, "."));
	var brutto = 0.01 * Math.round((100 + parseInt(tax)) * netto);
	var result;
	if (isNaN(brutto)) {
		result = "błąd";
	}
	else {
		result = formatMoney(brutto);
	}
	return result;
}


//--- zwraca wartosc netto podanej kwoty przy danym opodatkowaniu --
function netto(brutto, tax) {
	brutto = parseFloat((brutto.toString()).replace(/,/, "."));
	var netto = 0.01 * Math.round((10000 * brutto) / (100 + parseInt(tax)));
	var result;
	if (isNaN(netto)) {
		result = "błąd";
	}
	else {
		result = formatMoney(netto);
	}
	return result;
}


// --- zwraca liczbe w formacie liczby z dwoma miejscami po przecinku
function formatMoney(amount) {
	var result;
	if (amount) {
		result = parseFloat((amount.toString()).replace(/,/, "."));
		if (isNaN(result)) {
			result = "";
		}
		else {
			result = (Math.round(100 * result)).toString();
			var len = result.length;
			while (len < 3) {
				result = "0" + result;
				len++;
			}
			result = result.substr(0, len - 2) + "," + result.substr(len - 2, 2);
		}	
	}
	else {
		result = "";
	}
	return result;
}

function showHideObject(objId) {
	var obj = document.getElementById(objId);
	var display = obj.style.display;
	obj.style.display = (display == "none" ? "" : "none");
}

function getAbsoluteX(obj) {
	var result = 0;
	while (obj != null) {
		result += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return result;
}

function getAbsoluteY(obj) {
	var result = 0;
	while (obj != null) {
		result += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return result;
}


// --- wyswietla menu kontekstowe wywolane przez obiekt trigger,
//     rozszerzane przez obiekt o identyfikatorze divName
//     i uaktywnia obszar o identyfikatorze activeAreaName.

function showContextMenu(trigger, divName, activeAreaName) {
	var activeFrame = 100;
	var absX = getAbsoluteX(trigger);
	var absY = getAbsoluteY(trigger);
	
	divObj = document.getElementById(divName);
	divObj.style.top = absY + "px";
	divObj.style.left = absX + "px";
	divObj.style.display = "block";

	activeObj = document.getElementById(activeAreaName);
	activeObj.style.top = (absY - activeFrame) + "px";
	activeObj.style.left = (absX - activeFrame) + "px";
	activeObj.style.width = (divObj.offsetWidth + 2 * activeFrame) + "px";
	activeObj.style.height = (divObj.offsetHeight + 2 * activeFrame) + "px";
	activeObj.style.display = "block";
	
}


// --- chowa menu kontekstowe po najechaniu na obiekt activeObj,
//     contextMenus jest tablica identyfikatorow menu kontekstowych

function hideContextMenus(activeObj, contextMenus) {
	activeObj.style.display = 'none';
	var menuObj;
	
	for (i in contextMenus) {
		menuObj = document.getElementById(contextMenus[i]);
		menuObj.style.display = 'none';
	}
}


function wrapLongNames(str) {
	var result = "";
	for (var i = 0; i < str.length; ++i) {
		if (i != 0) {
			result += "<wbr />";
		}
		result += str.charAt(i);
	}
	return result;
}

