
/*
 * Вспомогательные функции
 * TimeZero <http://www.timezero.ru/>
 * 2007-12-01
 * Автор: Дмитрий Шкинёв <berkel@timezero.ru>
 */

/*******************************************************/

// Фикс для IE6, чтобы при наведении на элемент "A", установленный как блочный, не перезагружался фон.
if (document.uniqueID && document.compatMode && !window.XMLHttpRequest && document.execCommand){

	document.execCommand("BackgroundImageCache", false, true);
}

function $(id){

	if (arguments.length > 1){

		for (var i=0, elements=[], c=arguments.length; i<c; i++){

			elements.push($(arguments[i]));
		}

		return elements;

	} else {

		return document.getElementById(id);
	}
}

function var_dump(oElem){

	var str = "";

	if (cmnInArray(typeof(oElem), ["string", "number"])){

		str = oElem;

	} else {

		var value = null;

		for (var item in oElem){

			value = oElem[item];

			if (cmnInArray(item, ["innerHTML", "outerHTML"])){

				value = value.replace(/</g, "&lt;").replace(/>/g, "&gt;");
			}

			str += "obj." + item + " = " + value + "\n";
		}
	}

	return str;
}

function debug(data){

	if (document.body){

		var oItemId = "js-debug";

		var oItem = $(oItemId);

		if (!oItem){

			var oItem = document.createElement("DIV");
			oItem.setAttribute("id", oItemId);

			oItem.style.left = "0";
			oItem.style.top = "0";
			oItem.style.backgroundColor = "yellow";
			oItem.style.color = "#000";
			oItem.style.width = "100%";

			document.body.insertBefore(oItem, document.body.firstChild);
		}

		oItem.innerHTML = "<pre style='margin:0;'>" + var_dump(data) + "</pre>";

	} else {

		alert(var_dump(data));
	}
}

/*******************************************************/

/*********Стандартные вспомогательные функции***********/

var cmnInformation = function(){

	var sUser_agent = navigator.userAgent.toLowerCase();

	if (window.opera){

		this.bOpera = true;
	}

	if (sUser_agent.indexOf("safari") != -1){

		this.bSafari = true;

	} else if (!this.bOpera && sUser_agent.indexOf("msie") != -1){

		this.bIE = true;

	} else if (navigator.product == "Gecko"){

		this.bGecko = true;
		this.bMozilla = true;
	}

	if (sUser_agent.indexOf("mac") != -1){

		this.bMAC = true;
	}

	return this;
}

var cmn_oInformation = new cmnInformation();

function cmnInArray(sNeedle, aHaystack, bStrict){

	if (bStrict){

		function equals(a, b){

			return (a === b);
		}

	} else {

		function equals(a, b){

			return (a == b);
		}
	}

	for (var item in aHaystack){

		if (equals(aHaystack[item], sNeedle)){

			return true;
		}
	}

	return false;
}

function cmnRecursiveInArray(sNeedle, aHaystack, bStrict){

	for (var i=0, c=aHaystack.length; i<c; i++){

		var item = aHaystack[i];

		if (cmnInArray(typeof(item), ["array", "object"])){

			if (cmnRecursiveInArray(sNeedle, item, bStrict)){

				return true;
			}

		} else {

			if (cmnInArray(sNeedle, aHaystack, bStrict)){

				return true;
			}
		}
	}

	return false;
}

function cmnLocation(sUrl){

	window.location.href = sUrl;
}

function cmnGetRandom(iMin, iMax){

	return (Math.round(Math.random() * (iMax - iMin)) + iMin);
}

function cmnBetween(iNum, iMin, iMax, bInclusive){

	if (bInclusive){

		return (iNum >= iMin && iNum <= iMax);

	} else {

		return (iNum > iMin && iNum < iMax);
	}
}

function cmnGetScrollXY(){

	var _x = document.documentElement.scrollLeft || document.body.scrollLeft;
	var _y = document.documentElement.scrollTop || document.body.scrollTop;

	return {x: _x, y: _y};
}

function cmnGetElementsByClassName(oElem, strTagName, strClassName){

	var arrElements = (strTagName == "*" && oElem.all) ? oElem.all : oElem.getElementsByTagName(strTagName);

	var arrReturnElements = [];

	strClassName = strClassName.replace(/\-/g, "\\-");

	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");

	for (var i=0, oElement=null, c=arrElements.length; i<c; i++){

		oElement = arrElements[i];

		if (oRegExp.test(oElement.className)){

			if (arrReturnElements.push){

				arrReturnElements.push(oElement);
			}
		}
	}

	return arrReturnElements;
}

function cmnGetAbsolutePos(oElem){

	var _x=0, _y=0;

	if (oElem){

		do {
			_x += oElem.offsetLeft;
			_y += oElem.offsetTop;

		} while (oElem = oElem.offsetParent);
	}

	return {x: _x, y: _y};
}

function cmnPairs_string_get_value(sText, sName, sFrom, sBefore){

	var sValue = "";

	if (sText){

		if (!sFrom){

			sFrom = "=";
		}

		if (!sBefore){

			sBefore = ";";
		}

		sText = sText.replace(new RegExp("(" + sBefore + ")\\s+", "g"), "$1");

		var iStart = sText.indexOf(sBefore + sName + sFrom);

		if (iStart >= 0){

			iStart += (sBefore.length + sName.length + sFrom.length);

		} else {

			iStart = sText.indexOf(sName + sFrom);

			if (iStart == 0){

				iStart += (sName.length + sFrom.length);

			} else {

				iStart = -1;
			}
		}

		if (iStart >= 0){

			var iEnd = sText.indexOf(sBefore, iStart);

			if (iEnd < 0){

				iEnd = sText.length;
			}

			sValue = sText.substring(iStart, iEnd);
		}
	}

	return sValue;
}

/*******************************************************/

/*********Функции для работы с событиями****************/

function cmnAdd_events(eOn, asEvent_type, ptrFunction){

	for (var sName in asEvent_type){

		cmnAdd_event(eOn, asEvent_type[sName], ptrFunction);
	}
}

function cmnAdd_event(eOn, sEvent_type, ptrFunction){

	if (eOn.addEventListener){

		eOn.addEventListener(sEvent_type, ptrFunction, false);

	} else {

		if (!ptrFunction.$$guid){

			ptrFunction.$$guid = cmnAdd_event.guid++;
		}

		if (!eOn.events){

			eOn.events = {};
		}

		var aHandler = eOn.events[sEvent_type];

		if (!aHandler){

			aHandler = eOn.events[sEvent_type] = {};

			if (eOn["on" + sEvent_type]){

				aHandler[0] = eOn["on" + sEvent_type];
			}

			eOn["on" + sEvent_type] = cmnHandle_event;
		}

		aHandler[ptrFunction.$$guid] = ptrFunction;
	}
}

cmnAdd_event.guid = 1;

function cmnRemove_event(eOn, sEvent_type, ptrFunction){

	if (eOn.removeEventListener){

		eOn.removeEventListener(sEvent_type, ptrFunction, false);

	} else if (eOn.events && eOn.events[sEvent_type] && ptrFunction.$$guid){

		delete eOn.events[sEvent_type][ptrFunction.$$guid];
	}
}

function cmnHandle_event(event){

	event = event || cmnFix_event(window.event);

	var returnValue = true;

	var aHandler = this.events[event.type];

	for (var i in aHandler){

		if (!Object.prototype[i]){

			this.$$ptrFunction = aHandler[i];

			if (this.$$ptrFunction(event) === false){

				returnValue = false;
			}
		}
	}

	if (this.$$ptrFunction){

		this.$$ptrFunction = null;
	}

	return returnValue;
}

function cmnFix_event(event){

	event.preventDefault = cmnFix_event.preventDefault;
	event.stopPropagation = cmnFix_event.stopPropagation;

	return event;
}

cmnFix_event.preventDefault = function(){

	this.returnValue = false;
}

cmnFix_event.stopPropagation = function(){

	this.cancelBubble = true;
}

function checkEvent(oEvt){

	oEvt = (oEvt) ? oEvt : ((window.event) ? window.event : null);

	if (oEvt && oEvt.srcElement && !window.opera){

		oEvt.target = oEvt.srcElement;
	}

	return oEvt;
}

function cmnAdd_hover(eOn){

	cmnAdd_event(eOn, "mouseover",

		function(){

			cmnSet_class(eOn, "hover");
		}
	);

	cmnAdd_event(eOn, "mouseout",

		function(){

			cmnRemove_class(eOn, "hover");
		}
	);
}

function cmnAdd_button_events(eOn){

	cmnAdd_hover(eOn);

	cmnAdd_event(eOn, "mousedown",

		function(){

			cmnSet_class(eOn, "mousedown");
		}
	);

	cmnAdd_event(eOn, "mouseup",

		function(){

			cmnSwitch_class(eOn, "mousedown", "mouseup");
		}
	);
}

/*******************************************************/

/*********Фунции для работы с Cookie********************/

function cmnSet_cookie(sName, vValue, dExpires){

	document.cookie = sName + "=" + escape(vValue) + ((dExpires == null) ? "" : ("; expires=" + dExpires.toGMTString())) + "; path=/";
}

function cmnGet_cookie(sName){

	return cmnPairs_string_get_value(document.cookie, sName);
}

/*******************************************************/

/*********Функции для работы с классами*****************/

function cmnSwitch_class(eOn, sClass_name, sInstead){

	if (cmnMatch_class(eOn, sClass_name)){

		cmnSet_class(eOn, sInstead, sClass_name);

	} else {

		cmnSet_class(eOn, sClass_name, sInstead);
	}
}

function cmnRemove_class(eOn, sClass_name){

	cmnSet_class(eOn, "", sClass_name);
}

function cmnChange_class(eOn, sClass_name){

	if (eOn){

		sClass_name = (sClass_name.length) ? sClass_name.replace(/(^\s+|\s+$)/, "") : "";

		eOn.className = sClass_name;
	}
}

function cmnSet_class(eOn, sClass_name, sInstead){

	if (eOn){

		sClass_name = (sClass_name.length) ? sClass_name.replace(/(^\s+|\s+$)/, "") : "";

		if (eOn.className.length){

			var sOld = sClass_name;

			if (sInstead && sInstead.length){

				sInstead = sInstead.replace(/\s+(\S)/g, "|$1");

				if (sOld){

					sOld += "|";
				}

				sOld += sInstead;
			}

			eOn.className = eOn.className.replace(new RegExp("(^|\\s+)(" + sOld + ")($|\\s+)", "g"), "$1");
		}

		eOn.className += (eOn.className.length && sClass_name ? " " : "") + sClass_name;
	}
}

function cmnMatch_class(eOn, sClass_name){

	return (sClass_name && eOn.className && eOn.className.length && eOn.className.match(new RegExp("(^|\\s+)(" + sClass_name +")($|\\s+)")));
}

/*******************************************************/