// Funkcje pomocnicze
var $ = function(ID) {
	return document.getElementById(ID);
}

// Dwie funkcje sortujące alfabetycznie, kolejno po autorach i tytułach.
// Podobne można znaleźć dosłownie wszędzie.

function fun_alf_autor(a,b) {
	if(a[0].toLowerCase() > b[0].toLowerCase())
		return 1;
	if(a[0].toLowerCase() < b[0].toLowerCase())
		return -1;
	return 0;
}

function fun_alf_tytul(a,b) {
	if(a[1].toLowerCase() > b[1].toLowerCase())
		return 1;
	if(a[1].toLowerCase() < b[1].toLowerCase())
		return -1;
	return 0;
}

// stolen from http://www.kryogenix.org/code/browser/sorttable/
// by Stuart Langridge

function handleEvent(event) {
	  var returnValue = true;
	  // grab the event object (IE uses a global event object)
	  event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
	  // get a reference to the hash table of event handlers
	  var handlers = this.events[event.type];
	  // execute each event handler
	  for (var i in handlers) {
				 this.$$handleEvent = handlers[i];
				 if (this.$$handleEvent(event) === false) {
							returnValue = false;
				 }
	  }
	  return returnValue;
};

function fixEvent(event) {
	  // add W3C standard event methods
	  event.preventDefault = fixEvent.preventDefault;
	  event.stopPropagation = fixEvent.stopPropagation;
	  return event;
};

fixEvent.preventDefault = function() {
        this.returnValue = false;
};

fixEvent.stopPropagation = function() {
  this.cancelBubble = true;
}

// written by Dean Edwards, 2005
// with input from Tino Zijdel, Matthias Miller, Diego Perini

// http://dean.edwards.name/weblog/2005/10/add-event/

function dean_addEvent(element, type, handler) {
	if (element.addEventListener) {
		element.addEventListener(type, handler, false);
	} else {
		// assign each event handler a unique ID
		if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
		// create a hash table of event types for the element
		if (!element.events) element.events = {};
		// create a hash table of event handlers for each element/event pair
		var handlers = element.events[type];
		if (!handlers) {
			handlers = element.events[type] = {};
			// store the existing event handler (if there is one)
			if (element["on" + type]) {
				handlers[0] = element["on" + type];
			}
		}
		// store the event handler in the hash table
		handlers[handler.$$guid] = handler;
		// assign a global event handler to do all the work
		element["on" + type] = handleEvent;
	}
};
// a counter used to create unique IDs
dean_addEvent.guid = 1;

// Slightly modified function stolen from
// http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
// Written by Mark "Tarquin" Wilton-Jones

function windowSize() {
	var Width = 0, Height = 0;
	if (typeof( window.innerWidth ) == 'number') {
		//Non-IE
		Width = window.innerWidth;
		Height = window.innerHeight;
	} else if (document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight )) {
		//IE 6+ in 'standards compliant mode'
		Width = document.documentElement.clientWidth;
		Height = document.documentElement.clientHeight;
	} else if (document.body && ( document.body.clientWidth || document.body.clientHeight )) {
		//IE 4 compatible
		Width = document.body.clientWidth;
		Height = document.body.clientHeight;
	}

	return [Width, Height];
}

// set-, get- and removeValue functions partly written by
// Piotr "Riddle" Petrus
// http://perfectionorvanity.com/2007/05/23/zapisywanie-danych-w-userjs/

var namespace = 'globalstorage.test' + '.';
var setValue, getValue, remValue;
setCookie = function(name, value, span) {
	if (!name) { return; }
	document.cookie = escape(namespace + name) + '=' + escape(value) +
	';expires=' + (new Date((new Date()).getTime() + (1000 * span))).toGMTString() + ';path=/';
};

setValue = function(key, value) {
	setCookie(key, value, 31536000);
};

getValue = function(key) {
	var cookie = document.cookie;
	var first = cookie.indexOf(key + "=");
	if (first >= 0) {
		var str = cookie.substring(first, cookie.length);
		var last = str.indexOf(";");

		if (last < 0) last = str.length;

		str = str.substring(0, last).split('=');
		return str[1];
	} else {
		return null;
	}
};

remValue = function(key) {
	setCookie(key, '', -10);
}

var nazwa_miesiaca = {
	'0': 'stycznia',
	'1': 'lutego',
	'2': 'marca',
	'3': 'kwietnia',
	'4': 'maja',
	'5': 'czerwca',
	'6': 'lipca',
	'7': 'sierpnia',
	'8': 'września',
	'9': 'paźdzernika',
	'10': 'listopada',
	'11': 'grudnia'
};

// Funkcje właściwe

var quote_width = function() {
	$('quote').style.width = Number($('header').offsetWidth - 207 - 300 - 86) + 'px'; // right-header, dlugopis, left-header
}

var rand_quote = function() {
	var x = new Array(
			/*
				new Array(
					'tekst',
					'autor'
					),
			*/
				new Array(
					'Zapraszacie sobie świadka, ilekroć dobrze o sobie mówić pragniecie; a gdybyście go już podeszli i zwiedli ku temu, że dobrze o was sądzi, mniemacie i wy dobrze o samych sobie.',
					'O miłości bliźniego, 9'
					),
				new Array(
					'A niejeden, co się z życia wycofał, wycofał się tylko od hołoty: nie chciał z nią wspólności przy studni, ogniskach i owocach.',
					'O hołocie, 7'
					),
				new Array(
					'Ziemia (...) ma skórę; na skórze tej są choroby. Jedna z tych chorób zwie się, na przykład, „człowiek”.',
					'O wielkich zdarzeniach, 7'
					),
				new Array(
					'Niewybredność, co wszystko smakować potrafi, to nie jest smak najwykwintniejszy!',
					'O duchu ciężkości, 2, 20'
					),
				new Array(
					'Powiadacie mi, przyjaciele, że o gusty i smaki spierać się niepodobna? Ależ wszelkie życie jest waśnią o gusty i smaki!',
					'O ludziach wzniosłych, 9'
					),
				new Array(
					'Na górze róże, na dole życie.',
					'Kremlowskie Kuranty'
					),
				new Array(
					'To jest blog non-profit.',
					'Fatyg'
					),
				new Array(
					'Dobro nie podoba się nam, jeśli do niego nie dorastamy.',
					'§391, WC I'
					),
				new Array(
					'Książka mierna i zła jest właśnie dlatego mierna i zła, że stara się podobać i podoba się wielu.',
					'§158, WC I'
					),
				new Array(
					'Można mówić wcale nieźle, a przecież tak, iż cały świat woła, że jest przeciwnie: mianowicie wtedy, kiedy nie przemawia się do całego świata.',
					'§295, LA'
					),
				new Array(
					'Owady kąsają nie ze złośliwości, lecz ponieważ także chcą żyć: podobnie nasi krytycy; chodzi im o naszą krew, nie zaś o ból.',
					'§164, WC I'
					),
				new Array(
					'Jeśli to prawda, że mówi przeze mnie szatan, Bóg się zlituje i wyrwie mi język.',
					'Marcin Świetlicki'
					),
				new Array(
					'Uczyniliśmy refleksję i poznanie zagrożeniami, a ratunek przed nimi oraz uspokojenie znajdujemy w życiu.',
					'§154, J'
					)
			)


	var rand = Math.round(Math.random() * (x.length - 1));
	$('quote').getElementsByTagName('p')[0].firstChild.nodeValue = x[rand][0];
	$('quote').getElementsByTagName('p')[1].getElementsByTagName('cite')[0].firstChild.nodeValue = x[rand][1];
}

var arch_width = function() {
	var tmp = windowSize();
	var Width = tmp[0];

	var archiveWidth = Number( Math.round( ( (Width - $('header').offsetWidth) / 2) + ( $('sidebar').offsetWidth * (29/100) ) ) );
	$('archive').style.width = (archiveWidth < 200) ? 200 + 'px' : archiveWidth + 'px';
}

var advisory = function() {
	if (navigator.cookieEnabled) {
		//--------------------------------------------------
		// remValue('agreed');
		//-------------------------------------------------- 
		var agreed = getValue('agreed');
		if (! agreed) {
			var tmp = windowSize();
			var Width = tmp[0];
			var Height = tmp[1];

			// how much is 1em?
			var divem = document.createElement('div');
			divem.setAttribute('id', 'em');
			document.body.insertBefore(divem, $('header'));
			var em = divem.offsetHeight;
			// let's see if we have IE or normal browser
			var filter, opacity;
			if (window.getComputedStyle) {
				opacity = window.getComputedStyle(divem, null).opacity;
			} else if (divem.currentStyle) {
				filter = divem.currentStyle.filter;
			}
			document.body.removeChild(divem);

			// tworzenie parental advisory
			var parental = document.createElement('div');
			parental.setAttribute('id', 'parental');
			parental.style.width = Width + 'px';
			parental.style.height = document.body.offsetHeight + 'px';

			var advisory = document.createElement('div');
			advisory.setAttribute('id', 'advisory');

			var img = document.createElement('img');
			img.src = '/files/parental.jpg';

			var opts = document.createElement('div');
			opts.setAttribute('id', 'opts');

			var yup = document.createElement('p');
			yup.setAttribute('id', 'yup');
			yup.setAttribute('title', 'Wypadałoby to kliknąć');
			yup.appendChild(document.createTextNode('Yeah, whatever'));

			var nope = document.createElement('p');
			nope.setAttribute('id', 'nope');
			nope.appendChild(document.createTextNode('Myślę że to może negatywnie wpłynąć na moją wrażliwą psychikę'));

			var background = document.createElement('div');
			background.setAttribute('id', 'background');
			background.style.width = Width + 'px';
			background.style.height = document.body.offsetHeight + 'px';

			// funkcje 

			showImg = function() {
				var advWidth = Number(advisory.style.width.replace(/px/, ''));
				advWidth += 10;

				if (advWidth < 640) {
					advisory.style.width = advWidth + 'px';
					setTimeout("showImg()", 10);
				} else {
					advisory.style.width = '640px';
					var advHeight = Number(advisory.style.height.replace(/px/, ''));
					advHeight += 10;

					var advMarginTop = Number(advisory.style.marginTop.replace(/px/, ''));
					advMarginTop -= 5;

					if (advHeight < 427) {
						advisory.style.height = advHeight + 'px';
						if (advMarginTop > Number(2 * em)) advisory.style.marginTop = advMarginTop + 'px';
						setTimeout("showImg()", 10);
					} else {
						advisory.style.height = '427px';
						// fade in obrazka
						if (img.opac != 1) {
							setTimeout(function() {
								fadeIn(img, '1');
							}, 200);
						}
						setTimeout("slideDown()", 1300);

						return;
					}
				}
			}

			if (opacity) {
				fadeIn = function(elem, end) {
					if (!elem.style.visibility || elem.style.visibility == 'hidden') elem.style.visibility = 'visible';
					if (!elem.style.display || elem.style.display == 'none') elem.style.display = 'block';
					elem.opac = elem.style.opacity ? Number(elem.style.opacity) : Number(0);
					
					if (elem.opac < end) {
						elem.opac = Number(elem.opac + 0.1);
						elem.style.opacity = elem.opac;
						setTimeout(function() {
								fadeIn(elem, end);
							}, 100);
					} else {
						return;
					}
				}

				fadeOut = function(elem, end) {
					elem.opac = elem.style.opacity ? Number(elem.style.opacity) : Number(1);
					if (!end) end = 0;
					
					if (elem.opac > end) {
						elem.opac = Number(elem.opac - 0.1);
						elem.style.opacity = elem.opac;
						setTimeout(function() {
								fadeOut(elem, end);
							}, 100);
					} else {
						if (end == 0) elem.style.display = 'none';
						return;
					}
				}
			} else if (filter) {
				fadeIn = function(elem, end) {
					if (!elem.style.visibility || elem.style.visibility == 'hidden') elem.style.visibility = 'visible';
					if (!elem.style.display || elem.style.display == 'none') elem.style.display = 'block';
					elem.opac = elem.style.filter ? Number(elem.style.filter.replace(/.*=(.*)\)/i,"$1") / 100) : Number(0);
					
					if (elem.opac < end) {
						elem.opac = Number((elem.opac + 0.1) * 100);
						elem.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + elem.opac + ")";
						setTimeout(function() {
								fadeIn(elem, end);
							}, 100);
					} else {
						return;
					}
				}

				fadeOut = function(elem, end) {
					elem.opac = elem.style.filter ? Number(elem.style.filter.replace(/.*=(.*)\)/i,"$1") / 100) : Number(1);
					if (!end) end = 0;
					
					if (elem.opac > end) {
						elem.opac = Number((elem.opac - 0.1) * 100);
						elem.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + elem.opac + ")";
						setTimeout(function() {
								fadeOut(elem, end);
							}, 100);
					} else {
						if (end == 0) elem.style.display = 'none';
						return;
					}
				}
			}

			slideDown = function() {
				if (!$('opts').style.visibility || $('opts').style.visibility == 'hidden') $('opts').style.visibility = 'visible';
				var mtop = Number($('opts').style.marginTop.replace(/px/, ''));
				mtop += 10;

				if (mtop < 0) {
					$('opts').style.marginTop = mtop + 'px';
					setTimeout("slideDown()", 50);
				} else {
					$('opts').style.marginTop = 0;
					return;
				}
			}

			// podpinanie zdarzeń
			dean_addEvent(nope, 'click', function() {
					window.location = 'http://google.pl';
				});

			dean_addEvent(yup, 'click', function() {
					setValue('agreed', 'yes');
					fadeOut($('parental'));
					fadeOut($('background'));
				});

			// Wstawianie do dokumentu
			opts.appendChild(yup);
			opts.appendChild(nope);

			advisory.appendChild(img);
			advisory.appendChild(opts);
			parental.appendChild(advisory);

			document.body.insertBefore(background, $('header'));
			document.body.insertBefore(parental, $('header'));

			opts.style.left = Number(advisory.offsetLeft + 2) + 'px';
			opts.style.top = Number(advisory.offsetTop + 427) + 'px';
			opts.style.marginTop = Number(-em * 11) + 'px';

			var imgOffsetTop = advisory.offsetTop;

			advisory.style.width = '10px';
			advisory.style.height = '10px';
			advisory.style.marginTop = Number((427 - 10) / 2) + 'px';

			setTimeout(function() {
					fadeOut(background, 0.8);
				}, 200);
			setTimeout("showImg()", 500);
		}
	}
}

//--------------------------------------------------
// Next two functions are mostly copied from
// http://perfectionorvanity.com/files/vanity.js
// written by Piotr "Riddle" Petrus
//-------------------------------------------------- 

var mkMarkdown = function() {
	if (!$('markdown')) return;

	dean_addEvent($('commbody'), 'keyup', function() {
			reloadPreviewDiv();
		});

	var buttons = $('markdown').getElementsByTagName('li');

	for (var i=0; i<buttons.length;i++) {
		var t = buttons[i];
		var id = t.getAttribute('id');
		switch (id) {
			case 'link': { t.isLink = true; break; }
			case 'strong': { t.tagStart = '**'; t.tagEnd = '**'; break; }
			case 'italic': { t.tagStart = '_'; t.tagEnd = '_'; break; }
			case 'blockquote': { t.tagStart = '> '; break; }
			case 'pre': { t.tagStart = '    '; break; }
		}

		t.style.cursor = 'pointer';

	/*@cc_on @*/
	/*@if (@_win32)
		// Coming to IE, I don't care about standards that much
		t.innerHTML = '<a href="#markdown">' + t.innerHTML + '</a>';
	/*@end @*/

		dean_addEvent(t, 'click', function(e) {
				insertTag(this);
				e.preventDefault();
				return false;
		});
	}
}

var insertTag = function(elem) {
	var canvas = $('commbody');
	var link = false;
	if (typeof elem.isLink != 'undefined') { link = true; }

	var tagStart = '', tagEnd = '';

	tagStart = (typeof elem.tagStart == "undefined") ? '' : elem.tagStart;
	tagEnd = (typeof elem.tagEnd == "undefined") ? '' : elem.tagEnd;

	function anchor(text) {
		if (!link) {
			return text ? text : '';
		}

	 	var url = prompt('Podaj link', 'http://');
		if (url) {
			if (text) {
				tagStart = '[' + text + '](' + url + ')';
				return tagStart;
			} else {
				var desc = prompt('Podaj opis', '');
				if (desc) {
					tagStart = '[' + desc + '](' + url + ')';
					return tagStart;
				} else {
					tagStart = '<'+ url +'>';
					return tagStart;
				}
			}
		} else {
			if (text) return text;
		}
	}

	if (document.selection) {
		canvas.focus();
		var sel = document.selection.createRange();
		if (sel.text.length > 0) { 
			sel.text = tagStart + anchor(sel.text) + tagEnd;
		} else {
			if (tagEnd == '') {
				if (link) (anchor());
				sel.text = tagStart;
			} else {
				sel.text = tagEnd;
			}
		}
		canvas.focus();
	} else if (canvas.selectionStart || canvas.selectionStart == '0') {
		var startPos = canvas.selectionStart;
		var endPos = canvas.selectionEnd;
		var cursorPos = endPos;
		var scrollTop = canvas.scrollTop;
		if (startPos != endPos) {
			canvas.value = canvas.value.substring(0, startPos)
			+ tagStart + anchor(canvas.value.substring(startPos, endPos))
			+ tagEnd + canvas.value.substring(endPos, canvas.value.length);
			cursorPos += tagStart.length + tagEnd.length;
		} else {
			if (tagEnd == '') {
				if (link) anchor();
				canvas.value = canvas.value.substring(0, startPos) + tagStart
				+ canvas.value.substring(endPos, canvas.value.length);
				cursorPos = startPos + tagStart.length;
			} else {
				canvas.value = canvas.value.substring(0, startPos) + tagEnd
				+ canvas.value.substring(endPos, canvas.value.length);
				cursorPos = startPos + tagEnd.length;
			}
		}
		canvas.focus();
		canvas.selectionStart = cursorPos;
		canvas.selectionEnd = cursorPos;
		canvas.scrollTop = scrollTop;
	} else {
		if (tagEnd == '') {
			canvas.value += tagStart;
		} else {
			canvas.value += tagEnd;
		}
		canvas.focus();
	}

	reloadPreviewDiv();
}

function mkPreviewBlock() {
	var prev = document.createElement('p');
	prev.setAttribute('id', 'comm-preview');
	prev.appendChild(document.createTextNode('Poniżej znajduje się podgląd Twojego komentarza. Zostanie on zapisany dopiero po jego wysłaniu.'));

	var ul_comm = document.createElement('ul');
	ul_comm.setAttribute('id', 'comments');

	var li = document.createElement('li');
	li.setAttribute('class', 'guest');

	var div1 = document.createElement('div');
	div1.setAttribute('class', 'author-info');

	var div2 = document.createElement('div');
	div2.setAttribute('class', 'comment-content');

	var ul = document.createElement('ul');

	for (var i = 0; i < 4; i++) {
		var tmp_li = document.createElement('li');
		if (i == 0) {
			var img = document.createElement('img');
			img.setAttribute('class', 'favicon');
			img.setAttribute('src', '/files/unknown.jpg');
			tmp_li.appendChild(img);
		}

		if (i == 1) {
			tmp_li.setAttribute('class', 'author');
			tmp_li.appendChild(document.createTextNode($('commnickid').value));
		}

		if (i == 2) {
			var data = new Date();

			tmp_li.setAttribute('class', 'date');
			tmp_li.appendChild(document.createTextNode( data.getDate() + " " + nazwa_miesiaca[data.getMonth()] + " " + data.getFullYear() + " o " +
						data.getHours() + ":" + data.getMinutes() + ":" + data.getSeconds() ) );
		}

		if (i == 3) {
			var img = document.createElement('img');
			img.setAttribute('class', 'curl');
			img.setAttribute('src', '/files/curl.jpg');
			tmp_li.appendChild(img);
		}

		ul.appendChild(tmp_li);
	}

	div1.appendChild(ul);
	li.appendChild(div1);
	li.appendChild(div2);
	ul_comm.appendChild(li);
	//--------------------------------------------------
	// document.body.insertBefore(prev, $('footer'));
	// document.body.insertBefore(ul_comm, $('footer'));
	//-------------------------------------------------- 
	$('comments-info').appendChild(prev);
	$('comments-info').appendChild(ul_comm);

	if ($('preview')) {
		$('preview').style.display = 'none';
		$('preview').nextSibling.nextSibling.style.display = 'none';
	}

/*@cc_on @*/
/*@if (@_win32)
	$('comments-info').removeChild(ul_comm);
	var di = document.createElement('div');
	di.setAttribute('id', 'comm-preview-body');
	$('comments-info').appendChild(di);
/*@end @*/
}

function reloadPreviewDiv() { 
	if (!$('comm-preview')) mkPreviewBlock();
   var conv = new Showdown.converter();

/*@cc_on @*/
/*@if (@_win32)
	$('comm-preview-body').innerHTML = conv.makeHtml($('commbody').value);
	return;
/*@end @*/
   $('comm-preview').nextSibling.getElementsByTagName('div')[1].innerHTML = conv.makeHtml($('commbody').value);
}

function fillPreviewDiv() {
	if (! $('preview')) return;
	var data = new Date();
	var lis = $('preview').nextSibling.nextSibling.getElementsByTagName('div')[0].getElementsByTagName('li');
	if ($('commnickid').value != '')
		lis[1].firstChild.nodeValue = $('commnickid').value;
	lis[2].firstChild.appendChild(document.createTextNode( data.getDate() + " " + nazwa_miesiaca[data.getMonth()] + " " + data.getFullYear() + " o " +
				data.getHours() + ":" + data.getMinutes() + ":" + data.getSeconds() ) );
}

var Lista = function(ID) {
	var tresc = new Array();

	this.id = ID;

	this.elem = document.getElementById(this.id);

	var arr_elem_listy = this.elem.getElementsByTagName('li');

	this.tresc = function() {
		for (var i = 0; i < arr_elem_listy.length; i++) {
			tresc[i] = arr_elem_listy[i].lastChild.firstChild.nodeValue.split(' — ');
			tresc[i][3] = arr_elem_listy[i].lastChild.getAttribute("href");
			tresc[i][4] = arr_elem_listy[i].lastChild.getAttribute("title");
		}
		return tresc;
	}

	this.po_wykonawcach = function() {

		// Jeżeli lista została już posortowana, po prostu ją odwraca.
		if (this.elem.className.match(/(^|\s)sorted_author(\s|$)/)) {
			this.reverse();

			return;
		}

		this.tresc();
		
		if (this.id == "ksiazki") {
			for (i=0; i< tresc.length; i++) {
				if (tresc[i][0].match(/.*\s.*/)) {
					tresc[i][0] = tresc[i][0].replace(/(.*)\s(.*)/, "$2 $1");
				}
			}
		}

		tresc.sort(fun_alf_autor);

		for (var i = 0; i <arr_elem_listy.length; i++) {
			if (this.id == "ksiazki") {
				if (tresc[i][0].match(/.*\s.*/)) {
					tresc[i][0] = tresc[i][0].replace(/(.*?)\s(.*)/, "$2 $1");
				}
			}
			arr_elem_listy[i].lastChild.firstChild.nodeValue = tresc[i][0] + " — " + tresc[i][1];
			arr_elem_listy[i].lastChild.setAttribute('href', tresc[i][3]);
			arr_elem_listy[i].lastChild.setAttribute('title', tresc[i][4]);
		}

		// Jeżeli lista była już posortowana po tytułach, get rid of it.
		// ----
		// NOTATKA:
		// Funkcja .replace pracuje na obiekcie, ale *nie zmienia* go, a zwraca 
		// zmienioną wartość. Dlatego należy przypisać ją innej zmiennej.
		// ----
		if (this.elem.className.match(/(^|\s)sorted_title(\s|$)/)) this.elem.className = this.elem.className.replace(/(^|\s)sorted_title(\s|$)/, '');

		// Dodaje klasę stwierdzającą, że lista została posortowana po autorach.
		this.elem.className += ' sorted_author';
	}

	this.po_tytulach = function () {

		// Funkcja analogiczna do this.po_wykonawcach, tylko dla tytułów.
		
		if (this.elem.className.match(/(^|\s)sorted_title(\s|$)/)) {
			this.reverse();

			return;
		}

		this.tresc();

		tresc.sort(fun_alf_tytul);

		for (var i = 0; i <arr_elem_listy.length; i++) {
			arr_elem_listy[i].lastChild.firstChild.nodeValue = tresc[i][0] + " — " + tresc[i][1];
			arr_elem_listy[i].lastChild.setAttribute('href', tresc[i][3]);
			arr_elem_listy[i].lastChild.setAttribute('title', tresc[i][4]);
		}

		if (this.elem.className.match(/(^|\s)sorted_author(\s|$)/)) this.elem.className = this.elem.className.replace(/(^|\s)sorted_author(\s|$)/, '');
		this.elem.className += ' sorted_title';
	}

	// Funckja odwracająca. Bezczelnie ukradziona z
	// http://www.kryogenix.org/code/browser/sorttable/
	// thanks to Stuart Langridge

	this.reverse = function () {
		newrows = [];
		for (var i=0; i<arr_elem_listy.length; i++) {
		  newrows[newrows.length] = arr_elem_listy[i];
		}
		for (var i=newrows.length-1; i>=0; i--) {
			document.getElementById(this.id).appendChild(newrows[i]);
		}
		delete newrows;
	}
}

var mkSortable = function() {
	listy = document.getElementById("content").getElementsByTagName('ul');
	for (var i=0; i < listy.length; i++) {

		if (!listy[i].className.match(/(^|\s)sortable(\s|$)/)) continue;

		// It's all about DOM

		document.getElementById("content").insertBefore(document.createElement('p'), listy[i]);
		listy[i].previousSibling.appendChild(document.createTextNode('Uporządkuj wg '));
		var par = listy[i].previousSibling;
		var po_autorach = document.createElement('button');
		var po_tytulach = document.createElement('button');

		po_autorach.appendChild(document.createTextNode('autorów'));
		po_tytulach.appendChild(document.createTextNode('tytułów'));
		po_autorach.setAttribute('class', 'guzik');
		po_tytulach.setAttribute('class', 'guzik');

		// Taka magia.
		// http://forum.4programmers.net/viewtopic.php?id=131542

		po_autorach.i = i;
		po_tytulach.i = i;

		po_autorach.onclick = function() {
			var lista = new Lista(listy[this.i].getAttribute('id'));
			return lista.po_wykonawcach();
		}

		po_tytulach.onclick = function() {
			var lista = new Lista(listy[this.i].getAttribute('id'));
			return lista.po_tytulach();
		}

		par.appendChild(po_autorach);
		par.appendChild(document.createTextNode(' '));
		par.appendChild(po_tytulach);
	}
}

var init = function() {
	if (_timer) clearInterval(_timer);

	var formText = "Wyszukiwana fraza...";

	advisory();

	quote_width();

	arch_width();

	rand_quote();

	mkMarkdown();

	mkSortable();

	fillPreviewDiv();

	$('search').value = formText;
	$('search').className = "unfocused";

	dean_addEvent($('search'), 'focus', function() {
			if (this.value == formText) {
				this.value='';
				this.className = '';
			}
		});

	dean_addEvent($('search'), 'blur', function() {
			if (this.value == '') {
				this.value = formText;
				this.className = 'unfocused';
			}
		});

	dean_addEvent(window, 'resize', function(){
			quote_width();
			arch_width();
		});


/*@cc_on @*/
/*@if (@_win32)
	var mkHoverable = function() {
		var hasClassName = new RegExp("(^|\s)hoverable(\s|$)");

		var allElements = (document.all) ? document.all : document.getElementsByTagName("*");
		for (var i = 0; i < allElements.length; i++) {
			element = allElements[i];

			if (element.className && element.className.indexOf('hoverable') != -1 && element.className.match(/(^|\s)hoverable(\s|$)/)) {
				element.onmouseover=function() {
					this.className += " hover";
				}

				element.onmouseout=function() {
					this.className = this.className.replace(new RegExp(" hover\\b"), "");
				}
			}
		}
	}

	mkHoverable();
/*@end @*/
}

// Podpinanie zdarzenia.
//
// stolen from http://www.kryogenix.org/code/browser/sorttable/
// by Stuart Langridge

/* for Mozilla/Opera9 */
if (document.addEventListener) {
    document.addEventListener("DOMContentLoaded", init, false);
	 document.eventsadd = true;
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
    var script = document.getElementById("__ie_onload");
    script.onreadystatechange = function() {
        if (this.readyState == "complete") {
            init(); // call the onload handler
        }
    };
	 document.eventsadd = true;
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
    var _timer = setInterval(function() {
        if (/loaded|complete/.test(document.readyState)) {
            init(); // call the onload handler
        }
    }, 10);
	 document.eventsadd = true;
}

/* for other browsers */
if (!document.eventsadd) window.onload = init;

