/**
 * Library.
 *
 * @author Frantisek Fialka <info@ide.cz>
 * @copyright 2005-2006 IDE.cz
 * @version 1.2.0
 */

var library = {

	/**
	 * Initializates library.
	 */
	init : function() {
		// add push method to Array object for IE 5.0
		if (typeof Array.prototype.push != "function") {
			Array.prototype.push = ArrayPush;
			function ArrayPush(value) {
				this[this.length] = value;
			}
		}	
	},

	/**
	 * Gets elements by class name.
	 *
	 * @return array
	 */
	getElementsByClassName : function(objElement, strTagName, strClassName) {
		var arrElements = (strTagName == "*" && objElement.all) ? objElement.all : objElement.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var objRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var objElement;

		for (var i = 0; i < arrElements.length; i++) {
			objElement = arrElements[i];
			if (objRegExp.test(objElement.className)) {
				arrReturnElements.push(objElement);
			}
		}

		return (arrReturnElements);
	},

	/**
	 * Gets data attribute by tag name.
	 *
	 * @return string
	 */
	getDataByTagName : function(objElement, strTagName) {
		try {
			return objElement.getElementsByTagName(strTagName)[0].firstChild.data;
		}
		catch (e) {
			return null;
		}
	},

	/**
	 * Sends XmlHttp request.
	 *
	 * @param objCallback Function for handling returned XmlHttp object.
	 * @param strMethod GET, POST,...
	 * @param strUrl URL request.
	 * @param strContent Message body.
	 * @param arrHeaders Associative array of headers.
	 * @return boolean
	 */
	sendXmlHttpRequest : function(objCallback, strMethod, strUrl, strContent, arrHeaders) {
		var objXmlHttp = (window.XMLHttpRequest) ? new XMLHttpRequest : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false);
		if (!objXmlHttp) {
			alert("Internal error: sending xmlHttpRequest failed!");
			return false;
		}

		objXmlHttp.open(strMethod, strUrl);
		objXmlHttp.onreadystatechange = function() {
			switch (objXmlHttp.readyState) {
				case 1:
					break;

				case 4:
					if (200 == objXmlHttp.status) {
						if (objXmlHttp.responseXML != null) {
							objCallback(objXmlHttp);
							objXmlHttp = null;
						}
						else {
							alert("Internal error: unable to get XML response!");
						}
					}
					else {
						alert("Internal error: error while retrieving the XML data!\n" + objXmlHttp.statusText)
					}
					break;
			}
		}

		if (arrHeaders) {
			for (var key in arrHeaders) {
				objXmlHttp.setRequestHeader(key, arrHeaders[key]);
			}
		}

		objXmlHttp.send(strContent);
		return true;
	}
}