/**
 * XMLHttpRequest objektiin liittyvät jutut
 */

/**
 * Luo uuden XMLHttpRequest-objektin. (Ensisijaisesti käyttää native objektia, muuten IE:n ActiveX versiota)
 *
 * @return Palauttaa objektin tai null jos epäonnistui.
 */
function createXMLHttpRequest() {

	var xmlHttp = null;

	if (window.XMLHttpRequest) {
		// If IE7, Mozilla, Safari, and so on: Use native object
		xmlHttp = new XMLHttpRequest();
	} else {
		if (window.ActiveXObject) {
			// ...otherwise, use the ActiveX control for IE5.x and IE6
			try {
				xmlHttp = new ActiveXObject('MSXML2.XMLHTTP.3.0');
			} catch (E) {
				xmlHttp = null;
			}
		}
	}

	return xmlHttp;
}

/**
 * Hakee annetusta datasta tietyn nimisen kommenttiblokin. Jos blokkia ei löydy
 * palauttaa tyhjän.
 *
 * @param name Blokin nimi. Jos false, niin hakee "virheet".
 *             Eli tekstin ennen ja jälkeen blokkeja. Jos ei yhtään blokkia,
 *             palauttaa koko datan.
 * @param data Tutkittava data.
 */
function getBlockFromData(name, data) {
	var regString;
	if(name) {
		regString = "<!-- " + name + " -->(([\\n\\r]|.)*)<!-- \\/" + name + " -->";
	} else {
		regString = "^(([\\n\\r]|.)*?)<!-- (?:[\\n\\r]|.)* -->(([\\n\\r]|.)*?)$";
	}
	var rx = new RegExp(regString, "i");
	var ar = data.match(rx);
	var ret = "";
	if(name) {
		// normaalisti palautetaan haettu blokki jos löytyi, tai tyhjä
		if(ar != null) {
			ret = ar[1];
		}
	} else {
		// virhehaussa palautetaan virheilmoitukset (ennen ja jälkeen blokkeja)
		if(ar != null) {
			ret = ar[1];
			if(ar[1] && ar[3]) {
				ret = ret + "\n";
			}
			ret = ret + ar[3];
		} else {
			// tai jos datassa ei ole yhtään blokkia, koko paluudata
			ret = data;
		}
	}
	return ret;
}

/**
 * Lähettää XMLHttpRequestin palvelimelle.
 *
 * @param method Metodi: POST tai GET.
 * @param href Urli.
 * @param funcname Funktio joka suoritetaan kun request on valmis.
 * @param param Parametri funktiolle funcname.
 */
function sendXMLHttp(method, href, funcname, param) {
	var xmlhttp = createXMLHttpRequest();
	var postData = null;
	var contentType = null;

	if(method == "POST") {
		postData = href.replace(/^.*?\?/, "");
		href = href.replace(/\?.*/, "");
		contentType = 'application/x-www-form-urlencoded';
	}
	//alert('postData:' + postData + "\nhref:" + href);

	if(method == "FORM") {
		// href on formin id, etsitään se ja lähetetään se POSTna
		var formElement = document.getElementById(href);
		method = "POST";
		href = "index.php";
		contentType = 'application/x-www-form-data'; //CHECK mikä tämä pitää olla?
		if(formElement) {
			alert("Form found");
		} else {
			return false;
		}
	}

	// Avataan objecti
	xmlhttp.open(method, href, true);

	if(funcname) {
		// Kutsutaan annettua funktiota kun valmista
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				if (xmlhttp.status == 200) {
					funcname(xmlhttp, param);
				}
			}
		}
	}

	// vältetään cachetus
	xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");

	if(contentType) {
		xmlhttp.setRequestHeader('Content-Type', contentType);
	}

	// Lähetetään data
	xmlhttp.send(postData);

	return true;
}

// Vakiofunktioita paluufunktioiksi

/**
 * Sijoittaa parametrissä määritellyt blokit datasta dokumenttiin.
 * Blokin nimi ja elementin id täytyy olla samat.
 *
 * @param param Pilkulla erotettu lista blokkien nimistä.
 */
function system_blocks(xmlhttp, param) {
	// Virheet alerttiin
	var errorText = getBlockFromData(false, xmlhttp.responseText);
	if(errorText) alert(errorText);

	var parts = param.split(',');
	var i;
	var elem;
	for(i in parts) {
		elem = document.getElementById(parts[i]);
		if(elem) {
			// Jos elementti löytyi
			elem.innerHTML = getBlockFromData(parts[i], xmlhttp.responseText);
		}
	}
}

