var Common = {

	passwordMeter: {

		passField : false,
		barContainer : false,
		barDiv : false,
		textDiv : false,
		width: 160,
		height: 15,

		initialize: function(passFieldName, barContainerName) 
		{
			this.passField = $(passFieldName);
			this.barContainer = $(barContainerName);

			this.barDiv = document.createElement('div');
			this.barContainer.appendChild(this.barDiv);	

			this.textDiv = document.createElement('div');
			this.barContainer.appendChild(this.textDiv);

			this.barContainer.style.backgroundColor = '#888';
			this.barContainer.style.border = '1px solid #ccc';
			this.barContainer.style.width = this.width + 'px';
			this.barContainer.style.height = this.height + 'px';
			this.barContainer.style.position = 'relative';

			this.barDiv.style.backgroundColor = '#cc0000';
			this.barDiv.style.width = '0px';
			this.barDiv.style.height = this.height + 'px';
			this.barDiv.style.position = 'absolute';
		
			this.textDiv.style.position = 'absolute';
			this.textDiv.style.color = '#fff';
			this.textDiv.style.lineHeight = this.height + 'px';
			this.textDiv.style.marginLeft = '5px';
			this.textDiv.style.fontSize = '10px';

			var _this = this;

			Event.observe(this.passField, 'keyup', function(event) {
				_this.check();
			});

			this.check();
		},
		
		check: function() 
		{
			var passwd = this.passField.value;

			if (typeof bar == 'undefined')
				bar = 'password_meter';
			
			var score = 0;
				
			if (passwd.length > 10)
				score += 10;
			else if (passwd.length > 7)
				score += 8;
			else if (passwd.length > 5)
				score += 5;

			//

			if (passwd.match(/[a-z]/))
				score += 5;
				
			if (passwd.match(/[A-Z]/))
				score += 5;
			
			if (passwd.match(/\d+/))
				score += 5;
		
			if (passwd.match(/\W/))
				score += 5;	
				
			var percent = Math.round((score / 30) * 100); 
			
			if (percent > 70)
				verdict = "bardzo mocne";
			else if (percent > 50)
				verdict = "mocne";
			else if (percent > 40)
				verdict = "średnie";
			else if (percent > 20)
				verdict = "słabe";
			else if (percent > 0)
				verdict = "bardzo słabe";
			else
				verdict = "proszę wpisać hasło";
				
			this.barDiv.style.width = Math.round((percent / 100) * this.width) + 'px';
			r = 155 + Math.round(100 - ((percent / 100) * 100));
			g = Math.round((percent / 100) * 220);
			this.barDiv.style.backgroundColor = 'rgb(' + r + ',' + g + ', 0)';
			this.textDiv.innerHTML = verdict;
		}
	},


	/**
	 * metoda zmienia podswietlenia wybranej zakladki
	 */
	highlightTab: function(obj, hlClass) 
	{
		obj = $(obj);
		var tabs = obj.up('ul').childElements();

		tabs.each(function(s) {
			var inner = s.firstDescendant();
			if (inner == obj) {
				inner.addClassName(hlClass);
			} else {
				inner.removeClassName(hlClass);
			}
		});
	},

	/**
	 * Toggluje klasę
	 */
	toggleClass: function(selector, className, obj) 
	{
		$$(selector).invoke('removeClassName', className);
		$(obj).addClassName(className);
	},
	
	/**
	 * Skacze do elementu
	 */
	jumpToElement: function(id, offset) 
	{
		if (id == '')
			return false;

		id = id.replace(/^#/, "");

		var element = $(id);

		if (!Object.isElement(element))
			return false;

		var yPos = 0;

		var oElement = element;
		while (oElement != null ) {
			yPos += oElement.offsetTop;
			oElement = oElement.offsetParent;
		}

		if (typeof offset != "undefined")
			yPos = yPos - offset;

		window.scrollTo(0, yPos);
	},

	/**
	 * Metoda ustawia display, sprawdzając czy element jest blokowy czy inline
	 */
	setDisplay: function(element, display)
	{
		if (element.tagName == 'SPAN')
			element.style.display = display ? 'inline' : 'none';
		else
			element.style.display = display ? 'block' : 'none';
	},

	Tip: {

		offset: 20,
		_image: null,

		text: function(event, message, offset)
		{
			if (message == '')
				return;

			var m = $('common_tip');

			var xy = [Event.pointerX(event), Event.pointerY(event)];
			Position.prepare();
			var x = xy[0] - Position.deltaX;
			var y = xy[1] - Position.deltaY;
			if (typeof offset == "undefined")
				var offset = Common.Tip.offset;
			var viewportDims = document.viewport.getDimensions();

			m.innerHTML = message;
			m.style.display = "block";

			x = (x < viewportDims.width / 2) ? x + offset : x - offset - m.offsetWidth;
			y = (y < viewportDims.height / 2) ? y + offset : y - offset - m.offsetHeight;
			
			m.style.left = x + Position.deltaX + "px";
			m.style.top = y + Position.deltaY + "px";

		},

		image: function(event, url, offset)
		{
			var m = $('common_tip');

			var xy = [Event.pointerX(event), Event.pointerY(event)];
			Position.prepare();
			var x = xy[0] - Position.deltaX;
			var y = xy[1] - Position.deltaY;
			if (typeof offset == "undefined")
				var offset = Common.Tip.offset;
			var viewportDims = document.viewport.getDimensions();

			//alert(viewportDims.height / 2 + ' y=' + y)

			var tmpX = (x < viewportDims.width / 2) ? x + offset : x - offset - 32;
			var tmpY = (y < viewportDims.height / 2) ? y + offset : y - offset - 32;

			loader = new Image();
			loader.src = 'http://tabelaofert.pl/images/to/other/loading.gif';

			m.innerHTML = '';
			m.style.left = tmpX + Position.deltaX + "px";
			m.style.top = tmpY + Position.deltaY + "px";
			m.appendChild(loader);
			m.style.display = 'block';

			Common.Tip._image = new Image();
			Common.Tip._image.src = url;

			m.onclick = function() { Common.Tip.hide(); };

			Common.Tip._image.onload = function() {
				yOffset = (Math.abs(viewportDims.height / 2 - y) < 120) ? Common.Tip._image.height / 2 : 0;
				tmpX = (x < viewportDims.width / 2) ? x + offset : x - offset - Common.Tip._image.width - 10;
				tmpY = (y < viewportDims.height / 2) ? y + offset - yOffset : y - offset + yOffset - Common.Tip._image.height - 10;
				m.style.left = tmpX + Position.deltaX + "px";
				m.style.top = tmpY + Position.deltaY + "px";
				m.innerHTML = '';
				setTimeout(function () { m.appendChild(Common.Tip._image); }, 50); // bypass na FF2
			};
		},
	
		hide: function() 
		{
			try {
				Common.Tip._image.onload = function() { return; };
			} catch (e) {};
			var m = $('common_tip');
			m.style.display = "none";
			m.innerHTML = '';
		}
	},

	truncate: function(string, options) 
	{
		var defaultOptions = {
			length: 80,
			etc: '...',
			breakWords: false,
			middle: false,
			pattern: /[\s,]+?(\S+)?$/,
			comma: false
		};

		var options = Object.extend(defaultOptions, options);

		if (options.length == 0)
			return '';

		if (options.comma && string.search(/,/) != -1) {
			return string.replace(/,.*/, '') + options.etc;
		}

		if (string.length > options.length) {
			
			options.length -= options.etc.length;

			if (!options.break_words && !options.middle) {
				string = string.substr(0, options.length + 1).replace(options.pattern, '');
			}

			if (!options.middle) {
				string = string.substr(0, options.length) + options.etc;
			} else {
				string = string.substr(0, options.length/2) + options.etc + string.substr(-options.length/2);
			}

			return string;
		} else {
			return string;
		}
	},

	Event: {
		
		fire: function(element, event) 
		{
			if (document.createEventObject) {
				// dispatch for IE
				var evt = document.createEventObject();
				return element.fireEvent('on'+event, evt)
			}
			else {
				// dispatch for firefox + others
				var evt = document.createEvent("HTMLEvents");
				evt.initEvent(event, true, true ); // event type,bubbling,cancelable
				return !element.dispatchEvent(evt);
			}
		}
	},

	Form: {
		
		Submit: function(form, ajax, objIdClass) 
		{
			var ajaxObj = new Ajax.Request(ajax,
			{
				method: 'post',
				parameters: Form.serialize(form, true),
				onSuccess: function(transport) {
					if (/^Exception:/.test(transport.responseText)) {
						alert(transport.responseText);
						return false;
					} else if (transport.responseText == 'true') {
						form.submit();
					} else {
						var response = transport.responseText.evalJSON();
						form.getElements().each(function(obj) {
							obj.removeClassName('errors');
						});
						$$('#' + objIdClass +' .errors').each(function(obj) {
							obj.remove()
						});
						for (objId in response) {
							obj = $(objId);
							obj.addClassName('errors');
							obj.insert({after: '<ul class="errors"><li>' + response[objId][0] + '</li></ul>'});
						}
					}
				},
				onError: function(transport){
					alert(Lang.generic_error);
				}
			});
		},
		
		clearSelect: function(obj, removeAll) 
		{
			if (typeof removeAll == 'undefined')
				removeAll = false;
			
			var value = $F(obj);
			var firstIndex = (removeAll) ? 0 : 1;
			for (var i = obj.childNodes.length - 1; i >= firstIndex; i--)
				obj.remove(i);
			
			return value;
		},


		/**
		 * Parametr selectOne powoduje wybranie pierwszego elementu, jezeli na liscie nie ma nic innego do wyboru 
		 */
		fillSelect: function(obj, options, value, selectOne) 
		{
			if (typeof selectOne == 'undefined') {
				selectOne = false;
			}

			count = 0;
			for (option in options) {
				if (typeof options[option] == 'function')
					continue;

				var oElement = document.createElement('option');
				oElement.value = option;
				oElement.text = options[option];
				// nie dotykać tego jak się nie wie dlaczego tak
				try { obj.add(oElement, null); } catch (e) { obj.add(oElement); }
			
				count ++;

				if (count == 1)
					var first = option;	
			}

			if (selectOne && (count == 1))
				value = first;

			if (typeof value != "undefined")
				obj.setValue(value);

			if (selectOne && (count == 1))
				Common.Event.fire(obj, 'change');
		},


		fillSelectOpt: function(obj, options) 
		{
			for (opt in options) {
				if (typeof options[opt] == 'function')
					continue;

				var optElement = document.createElement('optgroup');
				optElement.label = opt;	

				for (option in options[opt]) {
					if (typeof options[opt][option] == 'function')
						continue;

					var oElement = document.createElement('option');
					oElement.value = option;
					oElement.text = options[opt][option];
					oElement.innerText = options[opt][option]; // hack na IE6
					optElement.appendChild(oElement);	
				}
				
				obj.appendChild(optElement);
			}
		},


		filterInt: function(e, extra) 
		{
			var keys = [8, 9, 13, 37, 39, 46];
			if (typeof extra != 'undefined')
				keys = keys.concat(extra);
			var unicode = e.charCode ? e.charCode : e.keyCode;
			for (var i = 0, len = keys.length; i < len; ++i)
				if (unicode == keys[i])
					return;
			if (unicode < 48 || unicode > 57)
				return false
		},


		implode: function(elName, wholeSelect)
		{
			if (typeof wholeSelect == 'undefined')
				wholeSelect = false;

			var value = (wholeSelect) ? $(elName).options : $(elName).getValue();

			if (typeof value == 'string')
				return $value;

			if (!value || !value.length)
				return '';

			var last = value.length - 1;
			var out = '';
			for (i = 0; i <= last; i ++) {
				out += (wholeSelect) ? value[i]['value'] : value[i];
				if (i < last)
					out += ',';
			}

			return out;
		},
		
	
		ImgRadio: {
			_sets: Object(),
			_dict: Object(),
			
			init: function(set, options) 
			{
				this._sets[set] = options;
				var _this = this;
				
				for (i = 0, len = this._sets[set].radios.length; i < len; i ++) {
					// Powiązania: id => set, wartość
					this._dict[set + '[' + this._sets[set].radios[i] + ']'] = {
						set: set,
						value: this._sets[set].radios[i]
					};
	
					Event.observe($(set + '[' + this._sets[set].radios[i] + ']'), 'click', function(event) {
						var el = event.findElement();
						_this.setValue(_this._dict[el.id].set, _this._dict[el.id].value);
					});
					
					// Jeżeli label istnieje, to też go podpinamy.
					var label = $(set + '[' + this._sets[set].radios[i] + '][label]');
					if (Object.isElement(label)) {
						this._dict[set + '[' + this._sets[set].radios[i] + '][label]'] = {
							set: set,
							value: this._sets[set].radios[i]
						};
						
						Event.observe($(set + '[' + this._sets[set].radios[i] + '][label]'), 'click', function(event) {
							var el = event.findElement();
							_this.setValue(_this._dict[el.id].set, _this._dict[el.id].value);
						});
					}
				}
							
				this.render(set);
				
			},
			
			render: function(set)
			{
				for (i = 0, len = this._sets[set].radios.length; i < len; i ++) {
					val = this._sets[set].radios[i];
					checked = $(this._sets[set].hidden).getValue();
					$(set + '[' + val + ']').src = (val == checked) ? this._sets[set].img.checked : this._sets[set].img.unchecked; 
				}
			},
			
			setValue: function(set, value)
			{
				$(this._sets[set].hidden).setValue(value);
				Common.Event.fire($(this._sets[set].hidden), 'change');
				this.render(set);
			}
		}
	},

	Position: {

		center: function(element) 
		{
			var options = Object.extend({
				zIndex: 999,
				update: false
			}, arguments[1] || {});
 
			element = $(element);
 
			if(!element._centered){
				Element.setStyle(element, {position: Prototype.Browser.IE6 ? 'absolute' : 'fixed', zIndex: options.zIndex });
				element._centered = true;
			}
 
			var dims = Element.getDimensions(element);
			var viewportDims = document.viewport.getDimensions();

//			Position.prepare();

			var offLeft = /*Position.deltaX + */Math.floor((viewportDims.width - dims.width) / 2);
			var offTop = /*Position.deltaY + */Math.floor((viewportDims.height - dims.height) / 2);
			element.style.top = ((offTop != null && offTop > 0) ? offTop : '0') + 'px';
			element.style.left = ((offLeft != null && offLeft > 0) ? offLeft :'0') + 'px';

//			if (options.update) {
//				Event.observe(window, 'resize', function(evt) { Common.Position.center(element); }, false);
//				Event.observe(window, 'scroll', function(evt) { Common.Position.center(element); }, false);
//			}
		}
	},

	Loader: {
		// Licznik aktywnych ajaxów
		_ajax: 0,

		open: function(text) // text dla kompatybilności ze starym loaderem
		{
			var loader = $('common_loader');

			if (!Object.isElement(loader))
				return Common.Loader;

			if (loader.visible())
				return Common.Loader;

			Common.Position.center(loader, {update: true});

			Event.observe(loader, 'click', Common.Loader.destroy);
			
			loader.style.display = '';
			return Common.Loader;
		},

		destroy: function() 
		{
			var loader = $('common_loader');
			if (!Object.isElement(loader)) return;
			loader.style.display = 'none';
		},

		// Inkrementuje licznik aktywnych ajaxów, włącza w razie potrzeby loader
		startAjax: function()
		{
			if ((++ this._ajax) == 1)
				this.open();
		},

		// Dekrementuje licznik aktywnych ajaxów, wyłącza w razie potrzeby loader
		stopAjax: function()
		{
			if ((-- this._ajax) == 0)
				this.destroy();
		}
	},

	Debug: {

		dump: function(text, clear) 
		{
			var debugWindow = window.open('','CommonDebugWindow','resizable=1,scrollbars=1,width=800,height=600');

			if (debugWindow == null)
				return false;

			if (typeof debugWindow.document.body == 'undefined' || debugWindow.document.body.innerHTML == '' || clear) {
				debugWindow.document.writeln('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n<title>Common_Debug::dump</title>\n<style type="text/css">pre {overflow-x: auto; white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; }</style></head>\n<body><hr /></body>\n</html>');
				debugWindow.document.close();
				debugWindow = window.open('','CommonDebugWindow','resizable=1,scrollbars=1,width=800,height=600');
			}

			if (typeof debugWindow.document.body != 'undefined') {

				var div = debugWindow.document.createElement('div');
				div.innerHTML = (text);
				debugWindow.document.body.appendChild(div);

				hr = debugWindow.document.createElement('hr');
				debugWindow.document.body.appendChild(hr);
			}
				
			debugWindow.document.close();

			return false;
		}
	},

	Splash: {

		index: 1,
		count: null,
		splashes: [],
		links: [],
		pe: null,

		stop: function()
		{
			Common.Splash.pe.stop();
		},

		show: function(index) 
		{
			if (index == Common.Splash.index)
				return true;

			if (typeof Common.Splash.splashes[index-1] != 'undefined') {
				
				var queue = Effect.Queues.get('splash');
				queue.each(function(effect) { effect.cancel(); });

				var lastIndex = Common.Splash.index;
				var previousSplash = Common.Splash.splashes[lastIndex-1];
				var newSplash = Common.Splash.splashes[index-1];

				Effect.Fade(previousSplash, { duration: 1.0, queue: { scope: 'splash' } });
				Effect.Appear(newSplash, { duration: 1.0, queue: { scope: 'splash' } });

				Common.Splash.links[lastIndex-1].removeClassName('b');
				Common.Splash.links[index-1].addClassName('b');
	
				Common.Splash.index = index;

				// Po przejściu wygaszenie wszystkich pozostałych elementów
				for (var i = 1; i <= Common.Splash.count; ++i)
					if (i != index && i != lastIndex)
						Effect.Fade(Common.Splash.splashes[i-1], { duration: 1.0, queue: { scope: 'splash' } });
			} else {
				return false;
			}
		},

		previous: function() 
		{
			var newIndex = Common.Splash.index - 1;
			if (newIndex < 1) {
				newIndex = Common.Splash.count;
			}
			Common.Splash.show(newIndex);
		},

		next: function() 
		{
			var newIndex = Common.Splash.index + 1;
			if (newIndex > Common.Splash.count) {
				newIndex = 1;
			}
			Common.Splash.show(newIndex);
		},

		init: function() 
		{
			var splashElement = $('splash');
			Common.Splash.splashes = Common.$$(splashElement, 'div.splash');
			Common.Splash.count = Common.Splash.splashes.length;
			Common.Splash.links = Common.$$(splashElement, 'a.splash span');

			Common.Splash.pe = new PeriodicalExecuter(function(pe) {
				Common.Splash.next();
			}, 7);

		}

	},
	
	Login: {
		
		folded: false,
		loginFormDisplay: function() 
		{
			if (this.folded) {
				new Effect.Morph('login_container', {duration: 0.3, style: 'height: 0px', afterFinish: function() { Common.Login.folded = false; }});
			
			} else {
				new Effect.Morph('login_container', {duration: 0.3, style: 'height: 33px', afterFinish: function() { Common.Login.folded = true; }});
			}
		},


		przypomnienieShow: function() 
		{
			var pageSize = Lightbox.prototype.getPageSize();
			$('przypomnienie_hasla_back').style.width = pageSize[0] + 'px';
			$('przypomnienie_hasla_back').style.height = pageSize[1] + 'px';
			$('przypomnienie_hasla_ok').style.display = 'none';
			$('przypomnienie_hasla_form').style.display = '';
			$('przypomnienie_hasla_errors').innerHTML = '';
			$('przypomnienie_hasla_username').setValue('');

			Common.Position.center($('przypomnienie_hasla'), { update: true });		
			new Effect.Parallel([
				new Effect.Appear($('przypomnienie_hasla'), { sync: true, to: 1.0 }),
				new Effect.Appear($('przypomnienie_hasla_back'), { sync: true, to: 0.5 })
			], { duration: 0.7 });
		},


		przypomnienieHide: function() 
		{
			new Effect.Parallel([
				new Effect.Fade($('przypomnienie_hasla'), { sync: true }),
				new Effect.Fade($('przypomnienie_hasla_back'), { sync: true })
			], { duration: 0.5 });
		},


		przypomnienie: function() 
		{
			var ajaxObj = new Ajax.Request('/auth,przypomnienie-ajax',
			{
				method: 'post',
				parameters : { username: $F('przypomnienie_hasla_username') },
				onSuccess: function(transport){
					var json = transport.responseText.evalJSON();
					if (json != true && typeof json['username'] != 'undefined') {
						$('przypomnienie_hasla_errors').innerHTML = '<ul class="errors"><li>' + json['username'][0] + '</li></ul>';
					} else {
						$('przypomnienie_hasla_errors').innerHTML = '';
						$('przypomnienie_hasla_form').style.display = 'none';
						$('przypomnienie_hasla_ok').style.display = 'block';
					}
				},
					
				onError: function() {
					alert(Lang.generic_error);
				}
			});
				
		}
	},

	
	/**
	 * Otwarcie okna www klienta
	 *
	 */
	openWindow: function(params) 
	{
		var defaultOptions = {
			windowObj: 'externalWindow' + Math.ceil((Math.random()*100))
		};
		
		var options = Object.extend(defaultOptions, params);
			
		if (Object.isString(params.link)) {
			if (Object.isString(params.name)) {
				pageTracker._trackPageview(options.name);
			}
			window.open(options.link, options.windowObj); 
		}
	},

	Colorizer: {

		duration: 0.4,

		init: function(element)
		{
			var queue = Effect.Queues.get('colorizer_' + element.className);
			queue.each(function(effect) { effect.cancel(); });
		},

		enable: function(element)
		{
			this.init(element);
			new Effect.Opacity(element, {
				queue: {scope: 'colorizer_' + element.className},
				from: $(element).getStyle('opacity'),
				to: 0.0,
				duration: this.duration
			});
		},

		disable: function(element)
		{
			this.init(element);
			new Effect.Opacity(element, {
				queue: {scope: 'colorizer_' + element.className},
				from: $(element).getStyle('opacity'),
				to: 1.0,
				duration: this.duration
			});
		}
	},

	Interstitial: {
	
		init: function() 
		{
			e = $('interstitial');

			if (e.offsetWidth == 0)
				return;

			if (Prototype.Browser.IE6)
				e.style.position = 'absolute';

			Position.prepare();
			var x = Position.deltaX;
			var y = Position.deltaY;
			var viewportDims = document.viewport.getDimensions();

			x = (viewportDims.width / 2) - (e.offsetWidth / 2);
			y = (viewportDims.height / 2) - (e.offsetHeight / 2);

			e.style.left = x + Position.deltaX + "px";
			e.style.top = y + Position.deltaY + "px";
		},

		delayedClose: function()
		{
			window.setTimeout(function() {
				e = document.getElementById('interstitial');
				e.style.display = "none";
				e.innerHTML = '';
			}, 10000);
		},

		close: function() 
		{
			e = document.getElementById('interstitial');
			e.style.display = "none";
			e.innerHTML = '';
		}
	},

	DropMenu: {

		timeout: 100,
		dropmenu: null,
		timer: null,

		addObservers: function(element) 
		{
			var _this = this;
			var submenu = element.down('div.dropmenu');
			var anchor = element.down('a');

			if (typeof submenu != "undefined") {
				Event.observe(element, 'mouseover', function(event) {
					anchor.addClassName('hover');
					_this.show(submenu);
				});
				Event.observe(element, 'mouseout', function(event) {
					anchor.removeClassName('hover');
					_this.hide(submenu);
				});
				Event.observe(submenu, 'mouseover', function(event) {
					anchor.addClassName('hover');
					_this.cancel();
				});
				Event.observe(submenu, 'mouseout', function(event) {
					anchor.removeClassName('hover');
					_this.hide(submenu);
				});
			}
		},

		show: function(element) 
		{
			this.cancel();

			if (this.dropmenu) {
				this.dropmenu.style.display = 'none';
			}

			this.dropmenu = element;
			this.dropmenu.style.display = '';
		},

		_hide: function(element) 
		{
			if (element)
				element.style.display = 'none';
		},

		hide: function(element) 
		{
			_this = this;
			if (!this.timer)
				this.timer = window.setTimeout(function() {_this._hide(_this.dropmenu);}, this.timeout);
		},

		cancel: function() 
		{
			if (this.timer) {
				window.clearTimeout(this.timer);
				this.timer = null;
			}
		},

		init: function() 
		{
			elements = $$('li.dropmenu');
			for (var i = 0; i < elements.length; i++) {
				this.addObservers(elements[i]);
			}
		}
	},

	Tracker: {
		trackLink: function(anchor, id)
		{
			var ajaxObj = new Ajax.Request('/ajax-form,track-link',
			{
				method: 'post',
				parameters : {
					referer: window.location.href,
					link: anchor.href,
					title: (typeof anchor.title == 'undefined' || anchor.title == '') ? '-' : anchor.title,
					inner: (typeof anchor.innerHTML == 'undefined') ? '-' : anchor.innerHTML,
					id: (typeof id == 'undefined') ? '-' : id
				},

				onSuccess: function(transport) {
				},

				onError: function() {
					alert(Lang.generic_error);
				}
			});

			return false;
		}
	},

	Lightbox: {
		_lightbox: null,
		_gallery: null,
		_prev: null,
		_next: null,
		_area: null,
		_img: [],

		_style: {
			img:  {
				width: 80,
				height: 60,
				border: 4,
				padding: 1,
				margin: 5,
				borderWidth: 4,
				borderStyle: 'solid',
				borderColor: '#444'
			},

			gallery: {
				duration: 0.2,
				scroll: 575
			},

			prev: {
				backgroundImage: '/images/to/btn/galeria_prev.gif'
			},

			next: {
				backgroundImage: '/images/to/btn/galeria_next.gif'
			},

			button: {
				width: 30,
				height: 80
			},

			back: {
				backgroundColor: '#222',
				height: 80,
				zIndex: 1010
			},

			lightbox: {
				bottom: 140
			}
		},

		initialize: function(lightbox)
		{
			if (Prototype.Browser.IE6)
				return;

			this._lightbox = lightbox;

			this._back = Builder.node('div', {
				id: 'common_lightbox_back',
				style:
					'background-color: ' + this._style.back.backgroundColor + ';' +
					'z-index: ' + this._style.back.zIndex + ';' +
					'display: none; position: fixed; bottom: 0px; left: 0px; width: 100%; height: ' + this._style.back.height + 'px'
			});

			// Buttony
			this._prev = Builder.node('div', {
				id: 'common_lightbox_prev',
				style:
					'width: ' + this._style.button.width + 'px;' +
					'height: ' + this._style.button.height + 'px;' +
					'background-image: url(' + this._style.prev.backgroundImage + ');' +
					'float: left'
			});
			this._next = Builder.node('div', {
				id: 'common_lightbox_next',
				style:
					'width: ' + this._style.button.width + 'px;' +
					'height: ' + this._style.button.height + 'px;' +
					'background-image: url(' + this._style.next.backgroundImage + ');' +
					'float: right'
			});
			///

			this._area = Builder.node('div', {
				id: 'common_lightbox_area',
				style: 'float: left; width: 0px; overflow: hidden'
			});

			this._gallery = Builder.node('div', {
				id: 'common_lightbox_gallery',
				style: 'white-space: nowrap; position: relative; left: 0px; top: 0px'
			});

			this._area.appendChild(this._gallery);
			
			this._back.appendChild(this._prev);
			this._back.appendChild(this._area);
			this._back.appendChild(this._next);

			this._back.appendChild(Builder.node('div', { style: 'clear: both' }));

			//$('overlay').appendChild(this._back);
			$$('body')[0].appendChild(this._back);

		/*	$('lightbox').style.position = 'fixed';
			$('lightbox').style.bottom = this._style.lightbox.bottom + 'px';
			$('lightbox').style.left = '0px'; */

			var _this = this;

			this._prev.observe('click', (function(event) {
				event.stop();
				_this._scroll(_this._style.gallery.scroll);
			}).bindAsEventListener(this));

			this._next.observe('click', (function(event) {
				event.stop();
				_this._scroll(- _this._style.gallery.scroll);
			}).bindAsEventListener(this));

			Event.observe(document.onresize ? document : window, 'resize', function() { _this._resize(); });
		},

		_scroll: function(offset)
		{
			var last = parseInt(this._gallery.style.left.replace('px', ''));
			var left = last + offset;
			var min = - (this._gallery.offsetWidth - this._area.offsetWidth);

			if (left < min)
				left = min;

			if (left > 0)
				left = 0;

			if (left == last)
				return;

			var queue = Effect.Queues.get('lightbox_gallery');
			queue.each(function(effect) { effect.cancel(); });

			new Effect.Morph(this._gallery, { duration: this._style.gallery.duration, style: 'left: ' + left + 'px', queue: { scope: 'lightbox_gallery' } });
		},

		_resize: function()
		{
			this._area.style.width = (document.viewport.getWidth() - 60) + 'px';
		},

		_observer: function(obj, i)
		{
			this._img[i].observe('click', (function(event) {
				event.stop();
				if (this._lightbox.activeImage == i)
					return;
				this._lightbox.changeImage(i);
			}).bindAsEventListener(this));
		},

		_miniature: function(url)
		{
			return url.replace(/thumb_[0-9]+x[0-9]+/, 'thumb_' + this._style.img.width + 'x' + this._style.img.height);
		},

		start: function(imageNum)
		{
			if (this._lightbox == null)
				return;

			this._resize();
			this._gallery.innerHTML = '';
			this._img = [];

			for (var i = 0; i < this._lightbox.imageArray.length; i ++) {
				this._img[i] = Builder.node('img', {
					src: this._miniature(this._lightbox.imageArray[i][0]),
					style:
						'width: ' + this._style.img.width + 'px;' +
						'height: ' + this._style.img.height + 'px;' +
						'margin: ' + this._style.img.margin + 'px;' +
						'padding: ' + this._style.img.padding + 'px;' +
						'border: ' + this._style.img.borderWidth + 'px ' + this._style.img.borderStyle + ' ' + this._style.img.borderColor + ';' +
						'cursor: pointer'
				});

				this._observer(this._img[i], i);

				this._gallery.appendChild(this._img[i]);	
			}

			this._gallery.style.width = this._lightbox.imageArray.length * (
				this._style.img.width + 
				2 * (this._style.img.border + this._style.img.padding + this._style.img.margin)
			) + 'px';

			this._back.style.display = 'block';
		},

		end: function()
		{
			if (this._lightbox == null)
				return;
			
			this._back.style.display = 'none';
		}
	},

	Hint: {

		focus: function(element)
		{
			element = $(element);
			if (element.hasClassName('hint')) {
				element.writeAttribute('alt', $F(element));
				element.setValue('');
				element.removeClassName('hint');
			}
		},

		blur: function(element)
		{
			element = $(element);
			if (!element.hasClassName('hint') && $F(element) == '') {
				element.addClassName('hint');
				element.setValue(element.readAttribute('alt'));
			}
		},

		clear: function()
		{
			$$('.hint').each(function(element) {
				element.setValue('');
			});
		}
	},

	$$: function() 
	{
		var args = $A(arguments);
		var element = args.shift();
		return Selector.findChildElements(element, args);
	},

	getRadioValue: function(name)
	{
		return $$('input:checked[type="radio"][name="' + name + '"]').pluck('value');
	},

	randomString: function(length) {
		var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
		var result = '';
		for (var i = 0; i < length; i++) {
			var rnum = Math.floor(Math.random() * chars.length);
			result += chars.substring(rnum, rnum+1);
		}
		return result;
	},

	toggleChecked: function(element) {
		element.checked = element.checked ? false : true;
	}

};

//pads left
String.prototype.lpad = function(padString, length) {
	var str = this;
	while (str.length < length)
		str = padString + str;
	return str;
}

//pads right
String.prototype.rpad = function(padString, length) {
	var str = this;
	while (str.length < length)
		str = str + padString;
	return str;
}

Array.prototype.inArray = function(p_val) 
{
	for(var i = 0, l = this.length; i < l; i++) {
		if(this[i] == p_val) {
			return true;
		}
	}
	return false;
};

// mam dość IE6
Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6;

// IE7 sux as well
Prototype.Browser.IE7 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 7;

