function css(el, cmd) {
	actAdd = '+';
	actRemove = '-';
	myAction = cmd.charAt(0);
	myClass = cmd.slice(1);
	strEmpty = '';
	strWhite = ' ';
	if(myAction == actAdd && !el.className.match(new RegExp(myClass))) {
		el.className = el.className + strWhite + myClass; }
	if(myAction == actRemove) {
		el.className = el.className.replace(new RegExp(myClass, 'g'), strEmpty); }
	return(true); }

// nowa czesc kodu

function computer()
{
	this.memory = document.getElementById('calculator_memory');

	this.add = function add(value)
	{
		this.memory.firstChild.nodeValue = parseInt(this.memory.firstChild.nodeValue) + parseInt(value);
	}

	this.erase = function erase()
	{
		this.memory.firstChild.nodeValue = 0;
	}
}

/*
toggle = function(e)	// http://tinyurl.com/yaoap2
{
	this.record.extended == false ? this.record.extend() : this.record.unextend();
	(e = e||event).stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
}

function record(element)
{

	// UWAGA: parametry w javascript nie moga nazywac sie tak samo, jak wlasciwosci,
	// do ktorych maja trafic !! (nie, pomylka !!). element listy odpowiada za dane
	// konkretnego rekordu. sama lista odpowiada za kolekcje subrekordow rekordu

	this.element = element;
	this.element.onclick = toggle;
	this.list = this.element.getElementsByTagName('ul')[0];
	this.extended = true;

	this.extend = function extend()
	{
		if(this.list)
		{

			// internet explorer (i opera) nie pozwala na 'znullowanie' wartosci
			// stylow elementu. elementowi nalezy zapewnic inna zgodna z css wartosc.
			// nieoczekiwane, ale sluszne rozwiazanie!

			this.element.style.background = 'white';
			this.element.style.cursor = 'auto';
			this.list.style.display = 'block';
		}
		this.extended = true;
	}

	this.unextend = function unextend()
	{
		if(this.list)
		{
			this.element.style.background = 'url(\'/images/arrow_counter.gif\') no-repeat center right';
			this.element.style.cursor = 'pointer';
			this.list.style.display = 'none';
		}
		this.extended = false;
	}
}

*/

onload = function()
{
	var counter = document.getElementById('counter');
	if(counter)		// no tak; przeciez ten kod moze byc wywolywany bez licznika na ekranie
	{

	/*

	// lista (li) odpowiada za jeden rekord! sublista (ul) bedaca jego dzieckiem
	// opdowiada za tablice subrekordu!! tutaj: dla kazdego rekordu serwisu
	// tworz odpowiadajacy mu rekord!

	i = 0;
	while(element = counter.getElementsByTagName('li')[i++])
	{
		if(element.parentNode.nodeName == 'UL')
		{
			element.record = new record(element);
			if(element.parentNode.parentNode.nodeName == 'LI')
			{
				element.record.unextend();
			}
		}
	}

	*/

	// kalkulator:

	calculator = document.createElement('p');

	span = document.createElement('span');
		span.appendChild(document.createTextNode('Szybki kalkulator odwiedzin: '));
		calculator.appendChild(span);
	strong = document.createElement('strong');
		strong.appendChild(document.createTextNode('0'));
		strong.setAttribute('id', 'calculator_memory');
		calculator.appendChild(strong);
	em = document.createElement('em');
		em.appendChild(document.createTextNode(' (zeruj)'));
		em.setAttribute('id', 'calculator_trigger');
		calculator.appendChild(em);

	document.getElementById('article').insertBefore(calculator, counter);
	calculator.setAttribute('id', 'calculator');

	// kolejna ciekawostka - zdaje sie, ze nie mozna zadeklarowac
	// instancji klasy o nazwie, ktora juz posiada jakas zmienna ...

	calculator.logic = new computer();

	i = 0;
	while(strong = counter.getElementsByTagName('strong')[i++])
	{
		strong.onclick = strong.className != 'countable' || function(e)
		{
			calculator.logic.add(this.firstChild.nodeValue);
			(e = e||event).stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
		}
	}

	document.getElementById('calculator_trigger').onclick = function()
	{
		calculator.logic.erase();
	}

	}

	lists = document.getElementById('menu').getElementsByTagName('ul'); i = 0;
	while(list = lists[i++])
	{
		// dla kazdej listy produktow przeprowadzamy operacje:
		// zmuszamy jej rodzica	(element listy), aby pokazal
		// swoje dzieci po najechaniu mysza


		element = list.parentNode;
		element.list = list;
		element.onmouseover = function(e) {
			css(this, '+extender');
			css(this.list, '+extendee');
		}
		element.onmouseout = function(e) {
			css(this, '-extender');
			css(this.list, '-extendee');
			// (e = e||event).stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
		}
	}

if(document.getElementById('newsbox'))
{

// element to istniejacy element dokumentu. delay to odstep czasowy
// wyrazony w sekundach. step to roznica pomiedzy kolejnymi polozeniami
// bannera wyrazona w pikselach
function marquee(element, speed, step)
{
	// jedno okno moze miec tylko jeden marquee. to obejscie
	// odnoszenia sie do wybranego obiektu poprzez setTimeout
	// byc moze kiedys uda sie rozwiazac ten problem

	window.marquee					= this;

	// laczymy banner z elementem oraz element z bannerem.
	// zakladamy, ze styl elementu jest zgrany ze skryptem

	this.element					= element;
	this.element.style.left			= 150 + 'px';
	this.element.marquee			= this;

	this.speed						= speed * 1000;
	this.step						= step;

	this.start	= function() { this.running = setInterval(this.run, this.speed); }
	this.stop	= function() { clearInterval(this.running); }

	// this wewnatrz tej funkcji odnosi sie juz do Window

	this.run = function() {
		shift_old = parseInt(this.marquee.element.style.left);
		shift_new = shift_old - this.marquee.step;
		length_child = parseInt(this.marquee.element.clientWidth);
		length_parent = parseInt(this.marquee.element.parentNode.clientWidth);

		this.marquee.element.style.left = ((shift_new == -length_child) ? length_parent : shift_new) + 'px';
	}

	this.element.onmouseover	= function() { this.marquee.stop(); }
	this.element.onmouseout		= function() { this.marquee.start(); }

	this.start();
}

// jako nazwy zmiennej nie mozna uzyc identyfikatora elementu ...
banner = new marquee(document.getElementById('newsbox').childNodes[0], 0.01, 1);

}
}
