	function $(id)
	{
		return document.getElementById(id);
	}
	
	/**
	 * Dodaje funkcję f do wykonywania w windows.onload 
	 * @param {Object} f funkcja dodawana do wykonania po załadowaniu
	 */
	function addOnLoad(f){
		try {
			var old_f = windows.onload
			window.onload = function(){
				old_f();
				f();
			}
		} catch( e){
			window.onload = f
		}
	}
	
	function getRealHeight(obj)
	{
		paddingTop = getStyle(obj,'paddingTop','int');
		paddingBottom = getStyle(obj,'paddingBottom','int');
			
		if(navigator.userAgent.indexOf('MSIE') != -1){
			realHeight = obj.offsetHeight;

			//specjalnie dla IE trzeba odjac jeszcze szerokosc borderow..
			realHeight -= getStyle(obj,'borderTopWidth','int');
			realHeight -= getStyle(obj,'borderBottomWidth','int');
		}
		else if(navigator.userAgent.indexOf('Firefox') != -1) {
			realHeight = obj.offsetHeight;
		}
		else 
			realHeight = obj.clientHeight;
		
		return (realHeight-paddingTop-paddingBottom);
	}
	
	
	function getRealWidth(obj)
	{
		paddingLeft = getStyle(obj,'paddingLeft','int');
		paddingRight = getStyle(obj,'paddingRight','int');
			
		if(navigator.userAgent.indexOf('MSIE') != -1){
			realWidth = obj.offsetWidth;

			//specjalnie dla IE trzeba odjac jeszcze szerokosc borderow..
			realWidth -= getStyle(obj,'borderLeftWidth','int');
			realWidth -= getStyle(obj,'borderRightWidth','int');
		}
		else 
			realWidth = obj.clientWidth;
		
		return (realWidth-paddingLeft-paddingRight);
	}
	
	function getStyle(obj,s,type)
	{
		if(!not(obj.style[s]))
			r = obj.style[s];
		else
			r = false;
		
		if(!not(type)){
			if(type = 'int'){
				r = parseInt(r);
				if(isNaN(r)) {
					r = 0
				};
				
				return r;
			}
		}
		return r;
	}
	
	function not(v)
	{
		if(typeof v == 'undefined'){
			return true;
		}

		if(typeof v == 'null'){
			return true;
		}

		if(typeof v == null){
			return true;
		}

		return false;
	}
	
	function setStyle(obj,s,v,fix,debug)
	{
		if(not(debug)){
			var debug = false;
		}
		
		if(!not(fix)){
			v += fix;
		}
		
		if(navigator.userAgent.indexOf('MSIE') != -1){
			switch(s){		
				case 'opacity' : 
					v = 'alpha(opacity='+(v * 100)+')';
					s = 'filter';
					break;

				case 'cssFloat' :
					s = 'styleFloat';
					break;
				
				case 'minHeight' :
					//s = 'height';
					break;
			}
		}
		
		if(debug){
			alert(obj+" / "+s+" = "+v);
		}
		
		obj.style[s] = v;
		return obj.style[s];
	}
	
	function setClass(obj,tempClassName,add)
	{
		if(not(tempClassName)){
			return false;
		}
		
		//trim
		tempClassName = trim(tempClassName);
		
		if(not(obj.className)){
			return false;
		}
		
		if(not(add)){
			var add = false;
		}
		
		if(not(obj)){
			return false;
		}
		
		if(obtainClass(obj,tempClassName))
			return obj.className;
		
		if(add){
			obj.className += ' '+tempClassName;
		}
		else {
			obj.className = tempClassName;
		}
		
		return obj.className;
	}
	
	function unsetClass(obj,tempClassName)
	{
		if(not(tempClassName)){
			return false;
		}
		
		//trim
		tempClassName = trim(tempClassName);
		
		if(not(obj.className)){
			return false;
		}
		eval('var regs = /(^|\\s)'+tempClassName+'($|\\s)/i');
		obj.className = obj.className.replace(regs,'$1$2');
		obj.className = obj.className.replace(/\s\s/,' ')
	}
	
	function obtainClass(obj,tempClassName)
	{
		if(not(obj)){
			return false;
		}
		
		if(not(tempClassName)){
			var temp = new Array();
			temp = obj.className.split(' ');
			return temp;
		}
		else {
			eval('var regs = /(^|\\s)'+tempClassName+'($|\\s)/i');
			return regs.test(obj.className);
		}
	}
	
	function getAbsoluteTop (obiekt,zeroClass)
	{
		// zerujemy zmienne
		var pos = 0; 
		var oParent = obiekt;
		var rel = '';
		
		// nie ma
		if (!oParent) 
			return pos;
		// petla
		do
		{			
			// ustawiamy pozycje
			pos += oParent.offsetTop;
			// pobieramy parentka
			oParent = oParent.offsetParent;

			if(!not(zeroClass) && obtainClass(oParent,zeroClass)){
				return pos;
			}
		}
		while (oParent.tagName.toLowerCase() != 'body' && oParent.tagName.toLowerCase() != 'html');		
		
		pos += oParent.offsetTop;
		
		// zwracamy pos		
		return pos;
	}
	
	function getAbsoluteLeft (obiekt,zeroClass)
	{
		// zerujemy zmienne
		var pos = 0; 
		var oParent = obiekt;
		
		// nie ma
		if (!oParent) 
			return pos;
		// petla
		do
		{
			// ustawiamy pozycje
			pos += oParent.offsetLeft;
			// pobieramy parentka
			oParent = oParent.offsetParent;

			if(!not(zeroClass) && obtainClass(oParent,zeroClass)){
				return pos;
			}
		}
		while (oParent.tagName.toLowerCase() != 'body' && oParent.tagName.toLowerCase() != 'html');
		
		pos += oParent.offsetLeft;
		// zwracamy pos
		return pos;
	}
	
	function objectDebug(obj,field)
	{
		for(var i in obj){
			if(not(field)){
				if(!confirm(i+": "+obj[i])){
					return false;
				}
			}
			else {
				if(!confirm(i+": "+obj[i][field])){
					return false;
				}
			}
		}
	}
	
	function addListener(element, event, listener, bubble) 
	{
		if(element.addEventListener) {
			if(not(bubble)) {
				var bubble = false;
			}
			element.addEventListener(event, listener, bubble);
		}
		else if(this.attachEvent) {
			element.attachEvent("on" + event, listener);
		}
	}
	
	function removeListener(element, event)
	{
		eval('element.on'+event+' = null;');
		if(element.removeEventListener) {
			element.removeEventListener(event,function() {},false);
		}
		else if(element.detachEvent) {
			element.detachEvent("on"+event);
		}
	}
	
	function getCssRule(obj, rule)
	{
		alert('css1');
		var nodeName = obj.nodeName;
		var classes = obtainClass(obj);
		var ret = '';
		if(typeof classes == 'string'){
			var temp = new Array();
			temp[0] = classes;
			classes = temp;
		}
		alert('css2');
		if (document.styleSheets[0].cssRules){
			alert('css2.1');
			for(var i = 0; i < document.styleSheets.length; i++){
				theRules = document.styleSheets[i].cssRules;
			}
		}
		else if (document.styleSheets[0].rules){
			alert('css2.2');
			for(var i = 0; i < document.styleSheets.length; i++){
				theRules = document.styleSheets[i].rules;
			}
		}
		alert('css3');
		for(var i = 0; i < theRules.length; i++){
			eval('var regs = /'+nodeName+'($|,)/');
			if(regs.test(theRules[i].selectorText)){
				if(theRules[i].style[rule]){
					ret = theRules[i].style[rule];
				}
			}
			
			for(var j =0; j<classes.length; j++){
				eval('var regs = /\.'+classes[j]+'($|,)/');
				if(regs.test(theRules[i].selectorText)){
					if(theRules[i].style[rule]){
						ret = theRules[i].style[rule];
						alert(theRules[i].selectorText+" => "+theRules[i].style[rule]);
					}
				}
			}
		}
		
		return ret;
	}
	
	function cancelBubble(e)
	{
		if(!e){
			window.event.cancelBubble = true;
		}
		else {
			e.stopPropagation();
		}
	}
	
	function getParentElement(obj,element,className)
	{
		var temp = obj;
		
		if(not(className)){
			var className = '';
		}
		
		while(temp = temp.parentNode){
			if(temp.nodeName.toUpperCase() == element.toUpperCase()){
				if(!className){
					return temp;
				}
				
				if(temp.className.toUpperCase() == className.toUpperCase()){
					return temp;
				}
			}
		}
		return false;
	}
	
	/**
	 * usuwa wszystkich podomków
	 * 
	 * @param {Object} obj node dla którego należy usunąć potomków
	 */
	function removeChildren(obj){
		while(obj.childNodes.length) obj.removeChild(obj.childNodes[0]);
	}

	// skopiowane beszczelnie z django-admin	
	// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
	function quickElement() {
    var obj = document.createElement(arguments[0]);
    if (arguments[2] != '' && arguments[2] != null) {
        var textNode = document.createTextNode(arguments[2]);
        obj.appendChild(textNode);
    }
    var len = arguments.length;
    for (var i = 3; i < len; i += 2) {
		if(arguments[i]=='class'){
			obj.className = arguments[i+1]; 
		}else
        obj.setAttribute(arguments[i], arguments[i+1]);
		//obj[arguments[i]] =  arguments[i+1];
    }
    arguments[1].appendChild(obj);
    return obj;
}

function trim(str)
{
	return str.replace(/^\s+|\s+$/g, '');
}

/**
 * Pobiera target eventa niezależnie od przeglądarki
 * @param {Event} e
 */
function getTarget(e){
	if(e.target)
		return e.target;
	else	
		return e.srcElement;
}

/*
        javascript nie potrafi sam skopiowac obiektu, zawsze przekazuje go jako referencje, wiec dodaje do prototypu obiektu mozliwosc klonowania
*/
Object.prototype.clone = function() {
        var n = {};
        for (p in this) {
                n[p] = this[p];
        }
        return n;
}
