// SHADOWBOX
Shadowbox.init({
	adapter: 'mootools',
	language: 'pl',
	players: ['img', 'iframe'],
	animate: false
});

window.addEvent('domready', function(){

	$(document.body).addEvents({
		'click':function(event){

			event.target = $(event.target);

			// HIDE DIALOGS
			$$('.dialogHolder').hide();

			// INITIALIZE
			if (!this.initialized) {
				this.slider = $('loginSlider');
				if (this.slider) this.slider.hidden = true;

				dialog = new Element('div',{'class':'dialogHolder hidden'});
				dialog.show = function(target){this.position({relativeTo: target,position: 'topRight',edge: 'topLeft'}).set('html','<div class="loading">wczytywanie...</div>').removeClass('hidden')};
				dialog.hide = function(){this.set('html','').addClass('hidden')};
				this.adopt(dialog);
				this.initialized = true;
			}

			// ASYNC FORMS
			if (Browser.Engine.trident && event.target.getParent('.async') && event.target.nodeName.toUpperCase() == 'BUTTON'){
				event.stop();
				var form = event.target.getParent('form');
				if (!$chk(form.initialized)) form = new Forms(form);
				if ($chk(Callbacks[form.name])) callback = new Callbacks[form.name]
				else callback = new Callbacks['default'];
				form.set('send',callback);
				form.send();
			}

			// ASYNC LINKS
			if (event.target.hasClass('async') && (event.target.nodeName.toUpperCase() == 'A' || event.target.nodeName.toUpperCase() == 'IMG')){
				event.stop();
				link = event.target;
				parent = link.getParent('a.dialog');
				if (parent) link = parent;
				if (!link.initialized){
					link = new Link(link);
					if (link.hasClass('dialog')){
						link.dialog = dialog;
					}
					link.initialized = true;
				}
				if (link.hasClass('dialog')){
					link.dialog.show(link);
				}
				link.callback = new Callbacks[$chk(link.get('rel'))?link.get('rel'):'default'];
				link.callback.url = link.get('href');
				link.set('send',link.callback);
				link.send();
			}

			// LOGIN SLIDER
			if (event.target.hasClass('loginTrigger')){
				if (!event.target.initialized){
					event.target.showFx = new Fx.Tween(this.slider,{duration: 300,transition: Fx.Transitions.Back.easeOut});
					event.target.hideFx = new Fx.Tween(this.slider,{duration: 300,transition: Fx.Transitions.Back.easeIn});
					event.target.initialized = true;
				}

				if (this.slider.hidden){
					event.target.showFx.start('top',-20);
					this.slider.hidden = false;
				} else {
					event.target.hideFx.start('top',-this.slider.getDimensions().height);
					this.slider.hidden = true;
				}
			}

			// LOGIN SWITCHER
			if (event.target.hasClass('loginSwitcher')){
				if (!event.target.rel) return false;
				this.formSwitcher = event.target.getParent('div.loginPane');
				this.formSwitcher.getElements('form').each(function(form){
					if (form.name == event.target.rel){
						form.removeClass('hidden');
					} else {
						form.addClass('hidden');
					}
				});
			}


			// COMMENT REPLY
			if (event.target.hasClass('commentAnswerButton')) {
				event.target.getParent('li.commentHolder').getElements('div.commentReplies form, div.commentReplies div.info').toggleClass('hidden');
			}

			// TOGGLER
			if (event.target.hasClass('togglerTrigger')){
				event.stop();
				if (!event.target.togglerInitialized){
					event.target.element = event.target.getNext('.togglerTarget');
					event.target.togglerInitialized = true;
				}
				event.target.element.toggleClass('hidden');
			}

			// TABS
			if (event.target.hasClass('trigger')){
				event.stop();
				var parent = event.target.getParent('div.tabs');
				if (!event.target.initialized){
					event.target.index = parent.getElements('ul.triggers>li>a').indexOf(event.target);
					event.target.trigger = parent.triggers[event.target.index];
					event.target.element = parent.elements[event.target.index];
					event.target.activate = function(){
						parent.triggers.removeClass('active');
						this.trigger.addClass('active');
						parent.elements.addClass('hidden');
						this.element.removeClass('hidden');
						parent.index = event.target.index;
						if (parent.hasClass('form')){
							parent.elements.getElements('input,select,textarea').each(function(el){el.setProperty('disabled', 'disabled')});
							this.element.getElements('input,select,textarea').each(function(el){el.removeProperty('disabled', 'disabled')});
						}
						if (parent.get('id')) Cookie.write('tabs-'+parent.get('id'),parent.index);
					}
					event.target.initialized = true;
				}
				event.target.activate();
			}

			// RFALSE
			if (event.target.hasClass('rfalse')) event.stop();


			//CLOSE MESSAGE NOTIFICATION
			if (event.target.hasClass('sliderClose') && event.target.nodeName.toUpperCase() == 'A') {
				var holder = event.target.getParent('div.slider');
				if(!holder) return false;
				new Fx.Tween(holder,{duration: 300,transition: Fx.Transitions.Back.easeIn}).start('top',-holder.getDimensions().height);
				if (event.target.get('rel')){
					Cookie.write('message-notification',event.target.get('rel').toInt());
				}


			}
		},
		'submit': Browser.Engine.trident?$empty:function(event){
			event.target = $(event.target);
			// ASYNC FORMS
			if (event.target.hasClass('async')){
				event.stop();
				if (!$chk(event.target.initialized)) event.target = new Forms(event.target);
				if ($chk(Callbacks[event.target.name])) callback = new Callbacks[event.target.name]
				else callback = new Callbacks['default'];
				event.target.set('send',callback);
				event.target.send();
			}
		},
		'change': Browser.Engine.trident?$empty:function(event){
			event.target = $(event.target);
			// ASYNC FORMS >> INLINE
			form = event.target.getParent('form.async.initialize.inline');
			if (form) form.send();
		},
		'keydown': Browser.Engine.trident?$empty:function(event){
			event.target = $(event.target);
			// ASYNC FORMS >> INLINE
			form = event.target.getParent('form.async.initialize.inline');
			if (form && event.key == 'enter') event.target.blur();
		},
		'mouseover': function(event){
			event.target = $(event.target);
			if (event.target.hasClass('star')){
				finished = false;
				event.target.getParent('ul.answerActionHolder').getElements('a.star').each(function(star){
					if (!finished && star != event.target) star.addClass('hover');
					else finished = true;
				});
			}
			if (element = event.target.getParent('.tabs.periodical')){
				element.addClass('pause');
			}
		},
		'mouseout': function(event){
			event.target = $(event.target);
			if (event.target.hasClass('star')){
				event.target.getParent('ul.answerActionHolder').getElements('a.star').removeClass('hover');
			}
			if (element = event.target.getParent('.tabs.periodical')){
				element.removeClass('pause');
			}
		}
	});

	// IE ONLY: ASYNC FORMS >> INLINE
	!Browser.Engine.trident?$empty:$$('form.async.initialize.inline').each(function(form){
		form.getElements('input,select,textarea').each(function(element){
			element.addEvents({
				'change': function(event){
					form.send();
				},
				'keydown': function(event){
					if (event.key == 'enter') event.target.blur();
				}
			});
		});
	});

	// TABS
	$$('div.tabs').each(function(parent){
		var index = Cookie.read('tabs-'+parent.get('id'));
		if(window.location.hash){
			index = window.location.hash.substr(1);
			window.location.hash = '#';
		}
		if (!parent.get('id') || !$chk(index)) index = 0;
		parent.index = index.toInt();
		parent.triggers = parent.getElements('ul.triggers>li');
		parent.triggers.each(function(trigger,i){if (trigger.hasClass('active')) parent.index = i});
		parent.elements = parent.getElements('ul.elements>li');
		parent.triggers.removeClass('active');
		parent.triggers[parent.index].addClass('active');
		parent.elements.addClass('hidden');
		parent.elements[parent.index].removeClass('hidden');
		if (parent.hasClass('periodical')){
			periodical = function(){
				if (!parent.hasClass('pause')){
					if (parent.triggers[index+1]) index = index+1;
					else index = 0;
					parent.triggers.removeClass('active');
					parent.triggers[index].addClass('active');
					parent.elements.addClass('hidden');
					parent.elements[index].removeClass('hidden');
				}
			}.periodical(5000);
		}
	});

	// ASYNC FORMS >> INITIALIZE | PERIODICAL
	$$('form.async.initialize').each(function(form){
		form.set('send',new Callbacks[$chk(form.name)?form.name:'default']);
		form = new Forms(form);
		if (form.hasClass('periodical')) {
			custom_interval = form.getElements('input.interval')[0];
			var interval = 1000;
			if (custom_interval && custom_interval.value.toInt() > 0){
				interval = custom_interval.value.toInt();
			}
			periodical = function(){form.send()}.periodical(interval);
		}
	});

	// MENU
	$$('ul.menu').each(function(menu){
		menu.submenus = menu.getElements('li>ul');
		menu.getChildren('li').each(function(parent){
			parent.submenu = parent.getChildren('ul');
			if (parent.submenu){
				parent.addEvents({
					'mouseenter': function(event){
						if (!$chk(menu.hasClass('click'))){
							parent.over = true;
							menu.submenus.addClass('hidden');
							setTimeout(function(){
								if (parent.over){
									parent.submenu.removeClass('hidden');
								}
							},100);
						}
					},
					'mouseleave': function(event){
						parent.over = false;
						setTimeout(function(){
							parent.submenu.addClass('hidden');
						},300);
					},
					'click': function(event){
						if ($chk(menu.hasClass('click'))){
							if (event.target.parentNode == parent) {
								event.stop();
							}
							parent.submenu.removeClass('hidden');
						}
					}
				});
			}
		});
	});

	//SELECT ALL CHECKBOXES
	var checkboxList;
	if(checkboxList = $$('.formList .type ul, .formList .categories ul')){
		checkboxList.each(function(el) {
			var checkboxes = el.getElements('input[type=checkbox]');
			var allOptions = checkboxes.shift();
			var checkedCount = 0;

			allOptions.addEvent('click', function(event) {
				if(allOptions.get('checked'))
					$each(checkboxes, function (input, index) {
						input.set('checked', '');
					});
				if(!allOptions.get('checked')) allOptions.set('checked', 'checked');
			});

			checkboxes.each(function(checkbox){
				checkbox.addEvent('click', function(event){
					$each(checkboxes, function (input, index) {
						if(input.get('checked')) checkedCount++;
					});
					if(checkedCount > 0) allOptions.set('checked', '');
					else allOptions.set('checked', 'checked');
					checkedCount = 0;
				});
			});
		});
	}

	//CHAR COUNTER
	var limit = 500, limitElem, result;
	if((limitElem = $('id_content')) && (result = $('contentCount'))){
  		result.set('html', limit-limitElem.get('value').length);
		limitElem.addEvent('keyup', function(){
			if (limitElem.get('value').length > limit) {
				limitElem.value = substr(limitElem.get('value'),0,limit);
				return;
			}
			result.set('html', limit-limitElem.get('value').length);
		});
	}
});

var Callbacks = {}

// CALLBACKS
Callbacks['default'] = new Class({
	notifyOnStart: 'wysyłanie...',
	link: 'chain',
	onRequest: function(){
		if (this.options.data.hasClass('clearOnStart')){
			this.options.data.clear();
		}
		this.options.data.notify(this.options.notifyOnStart);
	},
	onSuccess: function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}
		if (json.status) {
			if (this.options.data.hasClass('redirectOnJsonSuccess')){
				if (json.next){
					window.location = json.next;
				} else {
					location.reload(true);
				}
			} else {
				if (this.options.data.hasClass('clearOnJsonSuccess')){
					this.options.data.clear();
				}
				this.options.data.notify(json.response);
			}
		} else {
			if (this.options.data.hasClass('clearOnSuccess')){
				this.options.data.clear();
			}
			this.options.data.notify(json.response,'error');
		}
	},
	onFailure: function(xhr){
		this.options.data.notify('<span>Wystąpił błąd:</span> '+xhr.status+' '+xhr.statusText,'error'); 
	}
});

Callbacks['shoutbox'] = new Class({
	Extends: Callbacks['default'],
	onRequest: function(){
	},
	onSuccess: function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}
		if (json.status){
			shouts = this.options.data.getElements('ul.shouts');
			shouts.set('html',json.response+shouts.get('html'));
			this.options.data.getElements('ul.shouts li').each(function(shout,index){
				if (index >= 20) shout.dispose();
			});
			this.options.data.last.value = json.last;
		}
	}
});

Callbacks['messageNotification'] = new Class({
	Extends: Callbacks['default'],
	onRequest: function(){
	},
	onSuccess: function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}


		if (json.status && json.response.toInt() > 0){
			var holder = this.options.data.getParent('div.slider');
			if(!holder) return false;
			var cookie = Cookie.read('message-notification');
			if(!cookie) cookie = 0;
			holder.hidden = true;


			if (holder.hidden && cookie.toInt() < json.response.toInt()){
				new Fx.Tween(holder,{duration: 300,transition: Fx.Transitions.Back.easeOut}).start('top',-20);
				var closeLink = holder.getElements('a.sliderClose')[0]
				if (closeLink) closeLink.set('rel', json.response);
				holder.hidden = false;
			}
		}
	}
});

Callbacks['more'] = new Class({
	Extends: Callbacks['default'],
	onRequest: function(){
		this.options.data.notify('wczytywanie...');
	},
	onSuccess: function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}
		this.options.data.notify('');
		if (json.status) {
			this.options.data.set('href', json.next);
			var linkHolder 	= this.options.data.getParent('li.more');
			var holder 		= this.options.data.getParent('ul.moreHolder');
			if (!holder || !linkHolder) return false;
			linkHolder.dispose();
			holder.set('html', holder.get('html') + json.response);
			if (json.next) linkHolder.inject(holder);
			if (this.options.data.id) {
				var cookie = Cookie.read(this.options.data.id);
				if (cookie == null) { cookie = 2 }
				else { cookie = cookie.toInt() + 1 }
				Cookie.write(this.options.data.id, cookie);
			}
		}
	}
});

Callbacks['dialog'] = new Class({
	Extends: Callbacks['default'],
	onRequest: $empty,
	onSuccess: function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}
		this.options.data.dialog.set('html',json.response);
	}
});

Callbacks['newQuestion']  = new Class({
	Extends: Callbacks['default'],
	'onSuccess': function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}
		if (json.status) {
			this.options.data.submit();
		} else {
			this.options.data.notify(json.response,'error');
		}
	}
});

Callbacks['message']  = new Class({
	Extends: Callbacks['default'],
	onRequest: function(){
		this.options.data.addClass('read');
		this.options.data.removeClass('async');
	},
	onSuccess: $empty
});

Callbacks['rate'] = new Class({
	Extends: Callbacks['default'],
	onRequest: function(){
		this.options.data.getParent('ul.links').getElements('li.ratecounter span')[0].addClass('loading').set('html', '');
	},
	onSuccess: function(text){
		try {
			json = JSON.decode(text);
		}
		catch (error) {
			this.options.data.notify('<span>Wystąpił błąd:</span> '+error,'error');
			return false;
		}
		if (!json.status) return false;
		var holder = this.options.data.getParent('ul.links');
		var thumbs = holder.getElements('li.thumbsup a.thumbsup, li.thumbsdown a.thumbsdown');
		var counter = holder.getElements('li.ratecounter span')[0];
		counter.removeClass('loading')
		if (this.options.data.hasClass('active')){
			thumbs.removeClass('active');
		} else {
			thumbs.removeClass('active');
			this.options.data.addClass('active');
		}
		counter.set('text',json.rate);
		counter.removeClass('minus').removeClass('plus').addClass(json.rate>0?'plus':json.rate<0?'minus':'');
	}
});

Callbacks['answer'] = new Class({
	Extends: Callbacks['default'],
	notifyOnStart: null,
	onRequest: function(){
		var answer = this.options.data.getParent('.answer');
		answer.getChildren('.answerActionHolder').addClass('hidden');
		answer.getChildren('.answerLoading').removeClass('hidden');
		answer.getChildren('.answerError').addClass('hidden');
	},
	onSuccess: function(text){
		try {json = JSON.decode(text);}
		catch (error) {return false;}
		this.options.data.getParent('.answer').getChildren('.answerLoading').addClass('hidden');
		if (!json.status) {
			this.options.data.getParent('.answer').getChildren('.answerError').removeClass('hidden').set('html',json.response);
			this.options.data.getParent('.answerActionHolder').removeClass('hidden');
			return false;
		}
		this.options.data.getParent('.answer').getChildren('.answerError').empty();
		new Element('div',{'html':json.response}).getChildren('.answerActionHolder')[0].replaces(this.options.data.getParent('.answerActionHolder'))
	}
});

// ASYNC FORM CLASS
var Forms = new Class({
	initialize: function(form){
		this.form = form;
		this.form.notify = this.notify;
		this.form.clear = this.clear;
		this.form.initialized = true;
		return this.form;
	},
	notify: function(message,type){
		var output = '';
		if (!type) type = 'info';
		if ($type(message) == 'string'){
			output = '<li class="'+type+'">'+message+'</li>';
		} else if($type(message) == 'array'){
			message.each(function(message){output += '<li class="'+type+'">'+message+'</li>';});
		}
		this.getElements('.notifications').set('html',output);
	},
	clear: function(){
		this.getElements('input,select,textarea').each(function(element){
			if (element.get('type').toUpperCase() != 'HIDDEN') element.set('value','');
		})
	}
});

// ASYNC LINK CLASS
var Link = new Class({
	initialize: function(link){
		this.link = link;
		this.link.notifications = this.link.getNext('.notifications');
		this.link.notify = this.notify;
		this.link.initialized = true;
		return this.link;
	},
	notify: function(message,type){
		var output = '';
		if (!type) type = 'info';
		if ($type(message) == 'string'){
			output = '<li class="'+type+'">'+message+'</li>';
		} else if($type(message) == 'array'){
			message.each(function(message){output += '<li class="'+type+'">'+message+'</li>';});
		}
		if (this.notifications) this.notifications.set('html',output);
	}
});

/*var _userAgent = navigator.userAgent.toLowerCase();
if (/mozilla/.test(_userAgent) && !/(compatible|webkit)/.test(_userAgent)) {
	document.addEventListener( "DOMContentLoaded", function() {
		var sNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
		var xml = document.createElementNS(sNS , 'window');
		var label = document.createElementNS(sNS, 'description');
		label.setAttribute('crop','end');
		xml.appendChild(label);
		var ellipsis = $$('.ellipsis');
		ellipsis.each(function(el){
			var xml2 = xml.cloneNode(true);
			xml2.firstChild.setAttribute('value',el.textContent);
			el.set('html', '');
			el.appendChild(xml2);
		});
	}, false );
}*/
