var doc = window.document;

function addEventHandler(hHtml, sEvent, pfnHandler) {
	try {
		hHtml.addEventListener(sEvent, pfnHandler, false);
	} catch (e) {
		try {
			hHtml.detachEvent("on" + sEvent, pfnHandler);
			hHtml.attachEvent("on" + sEvent, pfnHandler);
		} catch (e) {
			hHtml["on" + sEvent] = pfnHandler;
		}
	}
}

function removeEventHandler(hHtml, sEvent, pfnHandler) {
	try {
		hHtml.removeEventListener(sEvent, pfnHandler, false);
	} catch (e) {
		try {
			hHtml.detachEvent("on" + sEvent, pfnHandler);
		} catch (e) {
			hHtml["on" + sEvent] = null;
		}
	}
}

function mousePageXY(e) {
 	var x = 0, y = 0;

 	if (e.pageX || e.pageY) {
   		x = e.pageX;
   		y = e.pageY;
 	} else if (e.clientX || e.clientY) {
   		x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
   		y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
 	}

 	return {"x":x, "y":y};
}
function getElementPosition(elem) {
    if(elem == null)
    	return null;

    var w = elem.offsetWidth;
    var h = elem.offsetHeight;

    var l = 0;
    var t = 0;

    while (elem) {
        l += elem.offsetLeft;
        t += elem.offsetTop;
        elem = elem.offsetParent;
    }

    return {"left":l, "top":t, "width": w, "height":h};
}

function isA(hNode, sName) {
	if(typeof(hNode) == 'object' && hNode != null)
		if(hNode.nodeName.toLowerCase() == sName.toLowerCase())
			return true;

	return false;
}

function getHexRGBColor(color) {
	color = color.replace(/\s/g,"");
	var aRGB = color.match(/^rgb\((\d{1,3}[%]?),(\d{1,3}[%]?),(\d{1,3}[%]?)\)$/i);
	if(aRGB)  {
		color = '';
		for (var i=1;  i<=3; i++)
			color += Math.round((aRGB[i][aRGB[i].length-1]=="%"?2.55:1)*parseInt(aRGB[i])).toString(16).replace(/^(.)$/,'0$1');
	}
	else color = color.replace(/^#?([\da-f])([\da-f])([\da-f])$/i, '$1$1$2$2$3$3');

	return color;
}

function getElementComputedStyle(elem, prop) {
 	if (typeof elem!="object")
 		elem = he(elem);

 	if (document.defaultView && document.defaultView.getComputedStyle) {
   		if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
   		return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
 	}

 	if (elem.currentStyle) {
   		var i;
   		while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
   		return elem.currentStyle[prop];
 	}

 	return "";
}

function getElementsByClass(el, tagName, className) {
   	var aFound = Array();
	var els = el.getElementsByTagName(tagName);
	for (var i = 0; i < els.length; i++) {
    	if ((new RegExp(className)).test(els[i].className)) {
			aFound[aFound.length] = els[i];
		}
	}

	return aFound;
}



function he(id) { return doc.all ? doc.all[id] : doc.getElementById(id); }

function setElementOpacity(elem, nOpacity)
{
    var opacityProp = getOpacityProperty();
    var elem = typeof(elem)=="string" ? he(elem) : elem;

     if (!elem || !opacityProp) return; // Если не существует элемент с указанным id или браузер не поддерживает ни один из известных функции способов управления прозрачностью
  
    if (opacityProp=="filter") { // Internet Exploder 5.5+
        nOpacity *= 100;
        // Если уже установлена прозрачность, то меняем её через коллекцию filters, иначе добавляем прозрачность через style.filter
        var oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha;
        if (oAlpha) oAlpha.opacity = nOpacity;
        else elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")"; // Для того чтобы не затереть другие фильтры используем "+="
    }
    else // Другие браузеры
        elem.style[opacityProp] = nOpacity;
}

function getOpacityProperty() {
    if (typeof doc.body.style.opacity == 'string') // CSS3 compliant (Moz 1.7+, Safari 1.2+, Opera 9)
        return 'opacity';
    else if (typeof doc.body.style.MozOpacity == 'string') // Mozilla 1.6 и младше, Firefox 0.8 
        return 'MozOpacity';
    else if (typeof doc.body.style.KhtmlOpacity == 'string') // Konqueror 3.1, Safari 1.1
        return 'KhtmlOpacity';
    else if (doc.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) // Internet Exploder 5.5+
        return 'filter';

  return false; //нет прозрачности
}