var ExpaticaFrontend = {

	start : function() {
		var s = document.body.id;

		this.enhanceNav();
		this.fadeMessages();
		if (s == 'dashboard') {
			this.enhanceDashboard();
		}
		if ((s == 'entry-add') || (s == 'entry-edit') || (s == 'draft-edit')) {
			this.enhanceTarea('entry');
			this.enhanceLabels();
			this.enhancePreview();
			this.quickTags();
		}
		if (s == 'templates-edit') {
			this.enhanceTarea('template');
			this.fscreenTarea();
		}
		if (s == 'comment-edit') {
			this.enhanceTarea('comment');
		}
		if ((s == 'templates-upload') || (s == 'templates-upload-files')) {
			this.enhanceFileUpload();
		}
		if ((s == 'templates-upload-files') || (s == 'options-emoticons') || (s == 'options-links') || (s == 'entries-categories') || (s == 'entries-levels') || (s == 'users-readers') || (s == 'subscription-comments') || (s == 'subscription-following') || (s == 'subscription-followers')) {
			this.enhanceDataTable();
		}
		if (s == 'options-links') {
			this.enhanceNewLink();
		}
		if (s == 'settings-panel') {
			this.qtCreateForm();
		}
		if (s == 'settings-pass') {
			this.passwordSwitch();
		}
		if (s == 'templates-import') {
			this.enhanceBricks();
		}
		if (window.opera) {
			//cicho, padding sie sypie i tabele CSS wygladaja jakby je walec przejechal :P
			var styles = '.grid, .block, .list, .indent { padding-bottom: 5px; }';
			newSS = document.createElement('link');
			newSS.rel = 'stylesheet';
			newSS.href = 'data:text/css,' + escape(styles);
			$('head').eq(0).append(newSS);
		}
	},

	enhanceDashboard: function() {
		$('h3[@id]').each(function() {
			$(this).addClass('toggleSpace').css('margin-bottom', '0');
			var toggle = document.createElement('div');
			$(toggle).addClass('toggle').bind('click', this.id, function(e) {
				var self = this;
				if (this.className == 'toggle') {
					$(this.parentNode).next().slideUp('normal', function() {
						$(self).addClass('disabled').text('on');
						$.cookie('dashboard' + e.data, 'true', {expires: 365});
					})
				} else {
					$(this.parentNode).next().slideDown('normal', function() {
						$(self).removeClass('disabled').text('off');
						$.cookie('dashboard' + e.data, '');
					})
				}
			}).appendTo(this);
			var cookie = $.cookie('dashboard' + this.id);
			if (cookie) {
				$(toggle).addClass('disabled').text('on');
				$(this).next().hide();
			} else {
				$(toggle).text('off')
			}
		})
	},

	enhanceNav: function() {
		var ruleName = '#nav li:hover ul';
		if($.browser.safari) { return } //i'm so sorry! will fix it asap
		if (document.styleSheets) {
			allStylesheets = document.styleSheets;
			for (var i = 0; i < allStylesheets.length; i++) {
				 var styleSheet = allStylesheets[i];
				 var j = 0;
				 var cssRule = false;
				 do {
					if (styleSheet.cssRules) cssRule = styleSheet.cssRules[j];
					else if (styleSheet.rules) cssRule = styleSheet.rules[j];
					if (cssRule)  {
						 if (cssRule.selectorText.toLowerCase() == ruleName) {
							 if (styleSheet.cssRules) styleSheet.deleteRule(j);
							 else styleSheet.removeRule(j);
						 }
					}
					j++;
				 } while (cssRule)
			}
			var nav = $('#nav');
			var navli = nav.children('li').not('[@id]');
			navli.addClass('js').children('a').bind('click', function(e) {
				navli.removeClass('active');
				$(this).parent().addClass('active');
				e.preventDefault();
			});
		}
	},

	enhanceLabels: function() {
		$('div.list input')
			.filter('[@checked]').parent().addClass('selected').end().end()
			.filter('[@type=checkbox]').bind('click', function() {
				if (this.checked) {
					$(this).parent().addClass('selected');
				} else {
					$(this).parent().removeClass('selected');
				}
			})
	},

	enhancePreview: function() {
		var p = document.getElementById('entry-preview');
		if (p) {
			$(p).before('<div class="switcher alt"><a id="entryPreviewSwitch" href=""></a></div>');
			$('#entryPreviewSwitch').text(l18n.entryPreviewSwitch).toggle(function() {
				var self = this;
				$(this).text(l18n.entryPreviewSwitchOff).parent().next().next().hide();
			}, function() {
				var self = this;
				$(this).text(l18n.entryPreviewSwitch).parent().next().next().show();
			})
		}
	},

	enhanceTarea: function(s) {
		var resizer = document.createElement('div');
		$(resizer).attr({ id: 'areaResizer', title: l18n.areaResize });

		var auto = '';
		switch (s) {
			case 'comment': auto = '150px'; break;
			case 'entry': auto = '300px'; break;
			case 'template': auto = '450px'; break;
		}

		var txtHeight = $.cookie('txtHeight' + s);
		if (txtHeight == null) txtHeight = auto;
		else txtHeight += 'px';

		$('#entryBody').eq(0).after(resizer).EnableTabs()
			.css({ position: 'relative', left: 0, top: 0, height: txtHeight })
			.Resizable({
				minHeight: 150,
				maxHeight: 750,
				handlers: { s: resizer },
				onStop: function() {
					var txtWidth = $(this).parent().width();
					if (window.opera) { txtWidth -= 2; }
					$(this).css('width', txtWidth);
					$.cookie('txtHeight' + s, $(this).height(), {expires: 365});
				}
			});
	},

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

	fscreenTarea: function() {
		var h = this.windowSize().height;
		$('#overlay').css('height', h);
		$(window).bind('resize', this, function(e) {
			$('#overlay').css('height', e.data.windowSize().height);
		});
	},

	htmlSpecialChars: function(s) {
		s = s.replace(/&/g, "&amp;");
		s = s.replace(/</g, "&lt;");
		s = s.replace(/>/g, "&gt;");
		s = s.replace(/"/g, "&quot;");
		s = s.replace(/'/g, "&apos;");
		return s;
	},

	qtCanvas: null,
	qtSecondaryStart: 0,
	qtButtons: [],
	qtOpenTags: [],

	qtInsButton: function(qt, i) {
		var input = document.createElement('input');

		$(input).attr({ type: 'button', id: qt.id, value: qt.display });
		if ((qt.access) && (qt.access != '')) $(input).attr('accesskey', qt.access);
		if ((qt.title) && (qt.title != '')) $(input).attr('title', qt.title);

		var pass = { t: this, i: i }

		//bind('event', pass, fn) - w pass jest zla wartosc zmiennej "i" (bug?), stad onclick'i.
		if (typeof qt.attr != 'undefined') {
			input.onclick = function() { pass.t.qtAttribute(pass); }
		} else {
			if (qt.id == 'qtTag-special-decode') {
				$(input).addClass('function');
				input.onclick = function() { pass.t.qtActDecode(pass); }
			}	else {
				input.onclick = function() { pass.t.qtActInsTag(pass); }
			}
		}

		return input
	},

	qtAddTag: function(button) {
		if (typeof this.qtButtons[button].tagEnd == 'undefined') { tagEnd = ''; }
		else { tagEnd = this.qtButtons[button].tagEnd; }
		if (tagEnd != '') {
			this.qtOpenTags[this.qtOpenTags.length] = button;
			var but = document.getElementById(this.qtButtons[button].id);
			$(but).addClass('open').val('/' + $(but).val());
		}
	},

	qtRemoveTag: function(button) {
		for (i = 0; i < this.qtOpenTags.length; i++) {
			if (this.qtOpenTags[i] == button) {
				this.qtOpenTags.splice(i, 1);
				var but = document.getElementById(this.qtButtons[button].id);
				$(but).removeClass('open').val($(but).val().replace('/', ''));
			}
		}
	},

	qtCheckOpenTags: function(button) {
		var tag = 0;
		for (i = 0; i < this.qtOpenTags.length; i++) {
			if (this.qtOpenTags[i] == button) { tag++; }
		}
		if (tag > 0) { return true; }
		else { return false; }
	},

	qtCloseAllTags: function() {
		var count = this.qtOpenTags.length;
		for (j = 0; j < count; j++) {
			var pass = { t: this, i: this.qtOpenTags[this.qtOpenTags.length - 1] };
			this.qtActInsTag(pass);
		}
	},

	qtActInsTag: function(pass) {
		var that = pass.t;
		var canvas = that.qtCanvas;
		var i = pass.i;

		if (typeof that.qtButtons[i].tagStart == 'undefined') { tagStart = ''; }
		else { tagStart = that.qtButtons[i].tagStart;	}
		if (typeof that.qtButtons[i].tagEnd == 'undefined') { tagEnd = ''; }
		else { tagEnd = that.qtButtons[i].tagEnd;	}

		if (typeof pass.attr != 'undefined') {
			tagStart = pass.attr;
		}

		if (document.selection) {
			canvas.focus();
			sel = document.selection.createRange();
			if (sel.text.length > 0) { sel.text = tagStart + sel.text + tagEnd; }
			else {
				if (!that.qtCheckOpenTags(i) || tagEnd == '') {
					sel.text = tagStart;
					that.qtAddTag(i);
				} else {
					sel.text = tagEnd;
					that.qtRemoveTag(i);
				}
			}
			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 + canvas.value.substring(startPos, endPos)
				+ tagEnd + canvas.value.substring(endPos, canvas.value.length);
				cursorPos += tagStart.length + tagEnd.length;
			} else {
				if (!that.qtCheckOpenTags(i) || tagEnd == '') {
					canvas.value = canvas.value.substring(0, startPos) + tagStart
					+ canvas.value.substring(endPos, canvas.value.length);
					that.qtAddTag(i);
					cursorPos = startPos + tagStart.length;
				} else {
					canvas.value = canvas.value.substring(0, startPos) + tagEnd + canvas.value.substring(endPos, canvas.value.length);
					that.qtRemoveTag(i);
					cursorPos = startPos + tagEnd.length;
				}
			}
			canvas.focus();
			canvas.selectionStart = cursorPos;
			canvas.selectionEnd = cursorPos;
			canvas.scrollTop = scrollTop;
		} else {
			if (!that.qtCheckOpenTags(i) || tagEnd == '') {
				canvas.value += tagStart;
				that.qtAddTag(i);
			} else {
				canvas.value += tagEnd;
				that.qtRemoveTag(i);
			}
			canvas.focus();
		}
	},

	qtAttribute: function(pass) {
		var that = pass.t; var i = pass.i;
		var br = false;
		if (!that.qtCheckOpenTags(i)) {
			var attr = that.qtButtons[i].attr;
			var output = '';
			var userInput = '';
			for (var j = 0; j < attr.length; j++) {
				br = false;
				if (typeof attr[j].val == 'undefined') attr[j].val = '';
				userInput = prompt('Podaj ' + attr[j].name, attr[j].val);
				if (!userInput) {
					if (attr[j].req) { br = true; }
				} else {
					output = output + ' ' + attr[j].name + '="' + that.htmlSpecialChars(userInput) + '"';
				}
				if (br) break;
			}
			if (!br) {
				var tag = that.qtButtons[i].tagStart;
				var begin = /\<[a-zA-Z]+/.exec(tag);
				if (begin != null) {
					pass.attr = begin[0] + output + tag.substring(begin[0].length, tag.length);
					that.qtActInsTag(pass);
				}
			}
		} else {
			that.qtActInsTag(pass);
		}
	},

	qtActDecode: function(pass) {
		var that = pass.t; var canvas = that.qtCanvas; var i = pass.i;
		strSelection = "";
		if (document.selection) {
			strSelection = document.selection.createRange().text;
			strSelection = that.htmlSpecialChars(strSelection);
			document.selection.createRange().text = strSelection;
		} else if (canvas.selectionStart || canvas.selectionStart == '0') {
			canvas.focus();
			var startPos = canvas.selectionStart;
			var endPos = canvas.selectionEnd;
			strSelection = canvas.value.substring(startPos, endPos);
			strSelection = that.htmlSpecialChars(strSelection);
			canvas.value = canvas.value.substring(0, startPos) + strSelection + canvas.value.substring(endPos, canvas.value.length);
		}
	},

	qtActShowSec: function() {
		$('#qtShow').hide();
		$('#qtHide').show();
		$('#qtSecondary').show('normal');
		$.cookie('qtSecondary', 'true', {expires: 365});
	},

	qtActHideSec: function() {
		$('#qtHide').hide();
		$('#qtSecondary').hide('normal');
		$('#qtShow').show();
		$.cookie('qtSecondary', 'false', {expires: 365});
	},

	quickTags: function() {
		this.qtCanvas = $('textarea.quicktags').get(0);
		if (this.qtCanvas) {
			Quicktags.qtCreateButtons();

			var qtToolbar = document.createElement('div');
			var qtPrimary = document.createElement('div');
			var qtSecondary = document.createElement('div');

			qtToolbar.className = 'quicktags';
			qtPrimary.id = 'qtPrimary';
			qtSecondary.id = 'qtSecondary';

			for (var i = 0; i < this.qtSecondaryStart; i++) {
				$(this.qtInsButton(this.qtButtons[i], i)).appendTo(qtPrimary);
			}

			var inpClose = document.createElement('input');
			var inpShow = document.createElement('input');
			var inpHide = document.createElement('input');

			$(inpClose)
				.attr({ id: 'qtClose', title: l18n.qtCloseTags, type: 'button', value: '\u2026/>' })
				.appendTo(qtPrimary).add(inpShow).add(inpHide).addClass('function');
			$(inpShow)
				.attr({ id: 'qtShow', title: l18n.qtShowMore, type: 'button', value: '\u00BB' })
				.bind('click', this.qtActShowSec).appendTo(qtPrimary);
			$(inpHide)
				.attr({ id: 'qtHide', title: l18n.qtShowLess, type: 'button', value: '\u00AB' })
				.bind('click', this.qtActHideSec).appendTo(qtPrimary);

			var that = this;
			inpClose.onclick = function() { that.qtCloseAllTags() };

			for (var i = this.qtSecondaryStart; i < this.qtButtons.length; i++) {
				$(this.qtInsButton(this.qtButtons[i], i)).appendTo(qtSecondary);
			}

			$(qtToolbar).append(qtPrimary);
			$(qtToolbar).append(qtSecondary);

			var state = $.cookie('qtSecondary');
			if (state == 'true') {
				$(inpShow).hide();
				$(inpHide).show();
			} else {
				$(qtSecondary).hide();
				$(inpHide).hide();
				$(inpShow).show();
			}

			$(this.qtCanvas).before(qtToolbar);
		}
	},


	numberOfFiles: 1,
	remoteChange: false,

	enhanceFileUpload: function() {
		var that = this;
		$('#fileupload')
			.find('.grid').wrap('<div id="uploadFields"></div>').end()
			.parent().next().append('<h3>' + l18n.uploadOptions + '</h3><div id="uploadOptions" class="slider"><div class="indicator"></div></div><div id="uploadCountWrap"><div id="uploadCount"></div></div>');

		var slider = $('#uploadOptions');
		slider.Slider({
			accept: '.indicator',
			fractions: 25,
			onSlide : function(cordx, cordy, x , y)	{
				var number = cordx / 4;
				if (number == 0) number++;
				$('#uploadCount').html(number);
				if (that.remoteChange) {
					that.remoteChange = false;
				} else {
					that.numberOfFiles = number;
					that.createInpFiles();
				}
			},
			values: [[15, 0]]
		});
	},

	createInpFiles: function() {
		var files = $('#uploadFields input');
		var oldNumber = files.length;
		var newNumber = this.numberOfFiles;
		if (oldNumber != newNumber) {
			if (newNumber > oldNumber) {
				var times = newNumber - oldNumber;
				for (var i = 0; i < times; i++) {
					var nameNr = oldNumber + i + 1;
					$('#uploadFields')
						.append('<div class="grid"><label>' + l18n.chooseFile + '</label><div class="fields"><input name="fileUpload' + nameNr + '" type="file" size="35" /> <span class="annote function"><a class="cancel" href="">' + l18n.uploadDelete + '</span></span></div></div>')
						.find('a:last').bind('click', this, function(e) {
							var that = e.data;
							var current = $('#uploadFields a').index(this) + 1;
							$(this.parentNode.parentNode.parentNode).remove();
							var last = $('#uploadFields input').size();
							if (current != last) {
								for (var j = current; j < last; j++) {
									var modified = j + 1;
									$('#uploadFields .grid').eq(j).find('input').attr('name', 'fileUpload' + modified)
								}
							}
							that.numberOfFiles -= 1;
							that.remoteChange = true;
							$('#uploadOptions').SliderSetValues([[-10, 0]]);
							e.preventDefault();
						});
				}
			} else {
				var erase = oldNumber - newNumber;
				for (var i = 0; i < erase; i++) {
					$('#uploadFields').find('.grid:last').remove()
				}
			}
		}
	},

	enhanceDataTable: function() {
		var table = $('table.listing');
		var checks = table.find('input[@type="checkbox"]');
		checks.bind('click', function() {
			if (this.checked) {
				$(this).parents('tr').addClass('selected');
			} else {
				$(this).parents('tr').removeClass('selected');
			}
		});
		table.not('.unsortable')
			.tableSorter({
				sortColumn: l18n.fileType,
				sortClassAsc: 'headerSortUp',
				sortClassDesc: 'headerSortDown',
				headerClass: 'header'
			})
			.find('th.function').unbind('click').end().end().not('.unselectable')
			.find('th:first').addClass('select').attr('scope', 'col')
				.append('<label for="filesSelectAll"><input id="filesSelectAll" type="checkbox" /></label>')
				.find('#filesSelectAll').bind('click', function() {
					if (this.checked) {
						checks.attr('checked', 'checked').parents('tr').addClass('selected');
					} else {
						checks.removeAttr('checked').parents('tr').removeClass('selected');
					}
				})
	},

	enhanceNewLink: function() {
		var form = $('form.new-link');
		var xfn = $('form div.xfn');
		var xfninputs = xfn.find('input');

		xfninputs.filter(':first').bind('click', function() {
			if (this.checked) {
				xfninputs.not(this).attr('disabled', 'disabled').parent().addClass('disabled');
				$(this).parent().next().val('true');
			} else {
				xfninputs.not(this).removeAttr('disabled').parent().removeClass('disabled');
				$(this).parent().next().val('false');
			}
		}).each(function() {
			if (this.checked) {
				xfninputs.not(this).attr('disabled', 'disabled').parent().addClass('disabled');
			}
		});

		if (form.get(0)) {

			var desc = form.find('div.grid').eq(1);

			var show = { form: true, desc: true, xfn: true };

			if (!$.cookie('addNewLink')) { show.form = false; }
			if (!$.cookie('addNewLinkDesc')) { show.desc = false; }
			if (!$.cookie('addNewLinkXFN')) { show.xfn = false; }

			$('ul.actions:first').prepend('<li><a id="addNewLink" href=""></a></li>');

			xfn.filter(':last').after('<div class="indent"><div class="fields switcher"><a id="addNewLinkDesc" href=""></a> <span class="function"><a id="addNewLinkXFN" href=""></a></span></div></div>');
			form.find('input:last').after('<span class="annote function"><a id="addNewLinkNot" class="cancel" href=""></a></span>');

			$('#addNewLink').text(l18n.addNewLink).bind('click', function(e) {
				var self = $(this);
				form.prev().fadeIn('normal').end().fadeIn('normal', function() { $(this).find('input:first').focus(); self.hide() });
				$.cookie('addNewLink', 'true', {expires: 365});
				e.preventDefault();
			});

			$('#addNewLinkNot').text(l18n.addNewLinkNot).bind('click', function(e) {
				form.prev().fadeOut('normal').end().fadeOut('normal', function() { $('#addNewLink').show() })
				$.cookie('addNewLink', '');
				e.preventDefault();
			});

			$('#addNewLinkXFN').text(l18n.addNewLinkXFN).bind('click', function(e) {
				if (show.xfn) {
					$(this).text(l18n.addNewLinkXFN).removeClass('cancel');
					xfninputs
						.filter('[@disabled]').removeAttr('disabled')
						.parent().removeClass('disabled').end().end()
						.filter('[@checked]').removeAttr('checked');
					xfn.hide();
					$.cookie('addNewLinkXFN', '');
					show.xfn = false;
				} else {
					$(this).text(l18n.addNewLinkXFNNot).addClass('cancel');
					xfn.show();
					$.cookie('addNewLinkXFN', 'true', {expires: 365});
					show.xfn = true;
				}
				e.preventDefault();
			});

			$('#addNewLinkDesc').text(l18n.addNewLinkDesc).bind('click', function(e) {
				if (show.desc) {
					$(this).text(l18n.addNewLinkDesc).removeClass('cancel')
					desc.hide().find('textarea').eq(0).val('');
					$.cookie('addNewLinkDesc', '');
					show.desc = false;
				} else {
					desc.show().find('textarea').eq(0).focus();
					$(this).text(l18n.addNewLinkDescNot).addClass('cancel');
					$.cookie('addNewLinkDesc', 'true', {expires: 365});
					show.desc = true;
				}
				e.preventDefault();
			});

			if (show.form) {
				$('#addNewLink').hide();
				desc.prev().find('input:first').focus()
			} else {
				form.prev().hide().end().hide();
			}

			if (show.desc) {
				$('#addNewLinkDesc').text(l18n.addNewLinkDescNot).addClass('cancel');
			} else {
				desc.hide()
			}

			if (show.xfn) {
				$('#addNewLinkXFN').text(l18n.addNewLinkXFNNot).addClass('cancel');
			} else {
				xfn.hide()
			}

		}

	},

	qtCreateForm: function() {
		var form = $('form:first');
		Quicktags.qtCreateButtons();

		var qtH3 = $(document.createElement('h3'));
		qtH3.text(l18n.qtH3title);
		form.prepend('<div id="quicktagsArea"></div>');
		$('#quicktagsArea').append(qtH3).append('<ul class="actions"><li><a id="qtSortTags" href=""></a></li><li><a id="qtSortTagsOff" href=""></a></li></ul>').append('<div id="qtFieldsets"></div>');

		var count = this.qtButtons.length - 1;
		var start = this.qtSecondaryStart;
		var turn = 0;
		var dec = false;

		for (var i = 0; i < count; i++) {
			var is2nd = false;
			if (i >= start) is2nd = true;
			$('#qtFieldsets').append(this.qtCreateFieldset(i + 1, this.qtButtons[i], is2nd))
		}

		$('#qtFieldsets').append('<fieldset class="entity" id="qtCreateFieldset"><div class="indent"><div class="fields switcher"><a id="qtCreateFieldsetLink" href=""></a></div></div></fieldset>');
		$('#qtCreateFieldsetLink').text(l18n.qtAddNew).bind('click', this, function(e) {
			var container = $(this.parentNode.parentNode.parentNode.parentNode);
			var number = container.children('fieldset').not(':last').length + 1;
			$('#qtCreateFieldset').before(e.data.qtCreateFieldset(number, { title: '', display: '', tagStart: '', tagEnd: '' }, false));
			container.children('fieldset').not(':last').filter(':last').find('input:first').focus();
			e.preventDefault();
		});

		var changed = false;

		/*
		$('#qtCompactForm').text(l18n.qtCompactForm).toggle(function() {
				var that = this;
				$('#qtFieldsets').find('fieldset div.quicktagsCompact').fadeOut('normal', function() {
					$(this).parent().removeClass('divide')
					$(that).text(l18n.qtCompactFormOff)
				})
			}, function() {
				var that = this;
				$('#qtFieldsets').find('fieldset div.quicktagsCompact').parent().addClass('divide').end().fadeIn('normal', function() {
					$(that).text(l18n.qtCompactForm)
				})
			});
		*/

		$('#qtSortTags').text(l18n.qtSortTags).bind('click', function(e) {
			$('#qtFieldsets').children('fieldset').not(':last')
				.addClass('sortable').find('input:first').addClass('visible').attr('readonly', 'readonly').end().end()
				.filter(':last').hide().end().end()
				.Sortable({
					accept: 'sortable',
					axis:	'vertically',
					revert:	true,
					onchange: function() {
						changed = true;
					}
				});
			$(this).hide();
			$('#qtSortTagsOff').show();
			e.preventDefault();
		});
		$('#qtSortTagsOff').hide().text(l18n.qtSortTagsOff).bind('click', this, function(e) {
			var f = $('#qtFieldsets').children('fieldset').not(':last');
			if (changed) {
				e.data.qtRefreshNames(f, /\d+/);
				changed = false;
			}
			$('#qtFieldsets').SortableDestroy()
			f.removeClass('sortable')
				.find('input:first').removeClass('visible').removeAttr('readonly').end().end()
				.filter(':last').show();
			$(this).hide();
			$('#qtSortTags').show();
			e.preventDefault();
		});

	},

	qtCreateFieldset: function(turn, tagJSON, is2nd) {

		var fieldset = document.createElement('fieldset');
		fieldset.className = 'entity divide';
		fieldset.id = 'tag' + turn;

		var divInfo = document.createElement('div');
		var divCompact = document.createElement('div');
		var divTags = document.createElement('div');
		var divTagsInner = document.createElement('div');
		var divDelTag = document.createElement('div');
		var linkDelTag = document.createElement('a');

		$(linkDelTag).text(l18n.qtDelTag).attr('href', '').addClass('cancel').bind('click', this, function(e) {
			var current = this.parentNode.parentNode.parentNode.parentNode.parentNode;
			var fieldsets = $(current.parentNode).children('fieldset').not(':last');
			if (fieldsets.eq(fieldsets.length - 1).get(0) !== current) {
				e.data.qtRefreshNames(fieldsets.not(current), /\d+/);
			}
			$(current).remove();
			e.preventDefault();
		});
		divDelTag.className = 'qtDelTag'
		divDelTag.appendChild(linkDelTag);

		var print2nd = '';
		var printKey = '';
		var printSingle = '';
		var isSingle = false;
		var attrExist = false;

		if (typeof tagJSON.tagEnd == 'undefined') isSingle = true;
		if (typeof tagJSON.attr != 'undefined') attrExist = true;
		if (typeof tagJSON.access != 'undefined') printKey = tagJSON.access;
		if (is2nd) print2nd = ' checked="checked"';
		if (isSingle) printSingle = 'checked';

		$(divInfo).addClass('grid').append('<label>' + l18n.qtInfoTitle + '</label><div class="fields multi"><input name="tagDesc' + turn + '" class="edit" size="10" value="' + tagJSON.display + '" type="text" /> <input name="tagTitle' + turn + '" class="edit" size="20" value="' + tagJSON.title + '" type="text" /> <input name="tagKey' + turn + '" class="edit" size="5" type="text" value="' + printKey + '" /> <label for="tagSecondary' + turn + '"><input name="tagSecondary' + turn + '" id="tagSecondary' + turn + '" type="checkbox"' + print2nd + ' /> ' + l18n.qtInfoExtra + '</label></div');

		var labelTags = document.createElement('label');
		var inputTagOpen = document.createElement('input');
		var inputTagClose = document.createElement('input');
		var labelTag1 = document.createElement('label');
		var inputTag1Check = document.createElement('input');
		var inputTag1Hidden = document.createElement('input');

		labelTags.appendChild(document.createTextNode(l18n.qtTagsInfo));
		$(inputTagOpen).addClass('edit').attr({ type: 'text', name: 'tagOpen' + turn, size: 10, title: l18n.qtTagsOpen, value: tagJSON.tagStart });
		$(inputTagClose).addClass('edit').attr({ type: 'text', name: 'tagClose' + turn, size: 10, title: l18n.qtTagsClose, value: tagJSON.tagEnd, disabled: isSingle });
		$(labelTag1).attr('for', 'tagSingle' + turn);
		$(inputTag1Check).attr({ name: 'tagSingle' + turn, id: 'tagSingle' + turn, type: 'checkbox', checked: printSingle })
			.bind('click', function() {
				if (this.checked) {
					$(this)
						.parent().prev().attr('disabled', 'disabled').end()
						.find('input[@type="hidden"]').attr('value', 'true');
				} else {
					$(this)
						.parent().prev().removeAttr('disabled').end()
						.find('input[@type="hidden"]').attr('value', 'false');
				}
			});
		$(inputTag1Hidden).attr({ name: 'TagssSingle' + turn, value: isSingle.toString(), type: 'hidden' });

		divTagsInner.appendChild(inputTagOpen);
		divTagsInner.appendChild(document.createTextNode(' '));
		divTagsInner.appendChild(inputTagClose);
		divTagsInner.appendChild(document.createTextNode(' '));

		labelTag1.appendChild(inputTag1Check);
		labelTag1.appendChild(inputTag1Hidden);
		labelTag1.appendChild(document.createTextNode(' '));
		labelTag1.appendChild(document.createTextNode(l18n.qtTagsSingle));

		divTagsInner.appendChild(labelTag1);
		divTagsInner.className = 'fields multi';
		divTags.className = 'grid';
		divCompact.className = 'quicktagsCompact';

		divTags.appendChild(labelTags);
		divTags.appendChild(divTagsInner);

		divCompact.appendChild(divTags);

		var divAttrs = document.createElement('div');
		divAttrs.className = 'indent';

		var divAttrAdd = document.createElement('div');
		var divAttrAddInner = document.createElement('div');
		divAttrAdd.className = 'indent';
		divAttrAddInner.className = 'fields switcher';

		function attrCreate(tagNr, attrNr, attrJSON, self) {
			var divAttrs = document.createElement('div');

			var divAttrsInner = document.createElement('div');
			divAttrsInner.className = 'fields multi';

			if (attrNr == 1) {
				var labelAttrs = document.createElement('label');
				labelAttrs.appendChild(document.createTextNode(l18n.qtAttrsRow));
				divAttrs.className = 'grid';
				divAttrs.appendChild(labelAttrs);
			} else {
				divAttrs.className = 'indent';
			}

			var attrName = document.createElement('input');
			var attrDefault = document.createElement('input');
			var labelAttrRequired = document.createElement('label');
			var attrRequired = document.createElement('input');
			var spanAttrDel = document.createElement('span');
			var linkAttrDel = document.createElement('a');

			$(attrName).addClass('edit').attr({
				type: 'text',
				name: 'tagAttr' + tagNr + 'Name' + attrNr,
				size: 10,
				title: l18n.qtAttrsName,
				value: attrJSON.name
			});
			$(attrDefault).addClass('edit').attr({
				type: 'text',
				name: 'tagAttr' + tagNr + 'Default' + attrNr,
				size: 10,
				title: l18n.qtAttrsDefault,
				value: attrJSON.val
			});
			$(attrRequired).attr({
				name: 'tagAttr' + tagNr + 'Req' + attrNr,
				id: 'tagAttr' + tagNr + 'Req' + attrNr,
				type: 'checkbox',
				checked: attrJSON.req
			});
			$(labelAttrRequired).attr('for', 'tagAttr' + tagNr + 'Req' + attrNr);
			$(linkAttrDel).addClass('cancel').attr('href', '').text(l18n.qtAttrsDel).bind('click', self, function(e) {
				var current = this.parentNode.parentNode.parentNode;
				var attrs = $(current.parentNode).children('div').not(':first');
				var collection = attrs.not(current);
				$(current).remove();
				if (current === attrs.eq(0).get(0)) {
					collection.get(0).className = 'grid';
					collection.eq(0).prepend('<label>' + l18n.qtAttrsRow + '</label>')
				}
				if (current !== attrs.eq(attrs.length - 2).get(0)) {
					e.data.qtRefreshNames(collection.not(':last'), /\d+$/);
				}
				e.preventDefault();
			});
			spanAttrDel.className = 'annote function';

			spanAttrDel.appendChild(linkAttrDel);
			labelAttrRequired.appendChild(attrRequired);
			labelAttrRequired.appendChild(document.createTextNode(' '));
			labelAttrRequired.appendChild(document.createTextNode(l18n.qtAttrsReq));

			divAttrsInner.appendChild(attrName);
			divAttrsInner.appendChild(document.createTextNode(' '));
			divAttrsInner.appendChild(attrDefault);
			divAttrsInner.appendChild(document.createTextNode(' '));
			divAttrsInner.appendChild(labelAttrRequired);
			divAttrsInner.appendChild(document.createTextNode(' '));
			divAttrsInner.appendChild(spanAttrDel);

			divAttrs.appendChild(divAttrsInner);
			return divAttrs;
		}

		if (attrExist) {
			attrLength = tagJSON.attr.length;
			for (var j = 0; j < attrLength; j++) {
				var createdAttr = attrCreate(turn, j + 1, tagJSON.attr[j], this);
				divCompact.appendChild(createdAttr);
			}
			divAttrAdd.appendChild(divAttrAddInner);
			divCompact.appendChild(divAttrAdd);
		} else {
			divAttrs.className = 'grid';
			var labelAttrsRow = document.createElement('label');
			labelAttrsRow.appendChild(document.createTextNode(l18n.qtAttrsRow));
			divAttrs.appendChild(labelAttrsRow);
			divAttrs.appendChild(divAttrAddInner);
			divCompact.appendChild(divAttrs);
		}

		var linkAttrAdd = document.createElement('a');
		$(linkAttrAdd).text(l18n.qtAttrsNew).attr('href', '').bind('click', this, function(e) {
			var currentDiv = this.parentNode.parentNode;
			var number = /\d+$/.exec(currentDiv.parentNode.parentNode.id)[0];
			//console.log(number);
			var attrLength = $(currentDiv.parentNode).children('div').size() - 2
			var newAttr = attrCreate(number, attrLength + 1, { name: '', val: '', req: false }, e.data);
			if (attrLength == 0) {
				var newAttrLabel = document.createElement('label');
				$(currentDiv).attr('class', 'indent').find('label:first').remove().end().before(newAttr)
			} else {
				$(currentDiv).before(newAttr)
			}
			e.preventDefault();
		});
		divAttrAddInner.appendChild(divDelTag);
		divAttrAddInner.appendChild(linkAttrAdd);

		fieldset.appendChild(divInfo);
		fieldset.appendChild(divCompact);
		return fieldset;
	},

	qtRefreshNames: function(collection, method) {
		$.each(collection, function(i) {
			function updateNum(string, nr, regexp) {
				return string.replace(regexp, nr)
			}

			var inputs = $(this).find('input[@name]');
			var inputsIds = inputs.filter('[@id]');
			var labels = $(this).find('label[@for]');

			if (this.id.match(/^tag\d+$/)) { this.id = updateNum(this.id, i + 1, method); }

			inputs.each(function() { this.name = updateNum(this.name, i + 1, method); })
			inputsIds.each(function() { this.id = updateNum(this.id, i + 1, method) })
			labels.each(function() { $(this).attr('for', updateNum($(this).attr('for'), i + 1, method));})
		});
	},

	passwordSwitch: function() {
		var fields = $('#settings-password');
		if (fields.get(0)) {
			fields.children('div').filter(':last').before('<div class="indent"><div class="fields"><label for="passwordShowHide"><input id="passwordShowHide" type="checkbox" /> ' + l18n.passwordShowHide + '</label></div></div>');
			$('#passwordShowHide').bind('click', function() {
				if (this.checked) {
					fields.find('input[@type="password"]').addClass('password').attr('type', 'text');
				} else {
					fields.find('input.password').attr('type', 'password');
				}
			});
		}
	},

	fadeMessages: function() {
		var time = { interval: 2000, animation: 1500 };
		var interval = time.interval;
		$('div.flash').each(function() {
			var self = this;
			var timer = setInterval(function() {
				$(self).fadeOut(time.animation, function() { $(this).remove(); });
				clearInterval(timer);
			}, interval);
			interval += time.interval + time.animation;
		});
	},

	enhanceBricks: function() {
		var cont = $('div.bricks').eq(0);
		var bricks = cont.children('div');
		cont.before('<ul class="actions alt"><li><a id="bricksMini" href=""></a></ul>');
		$('#bricksMini').text(l18n.bricksMini).toggle(function() {
			bricks.removeClass('mini');
			$(this).text(l18n.bricksMiniOff);
		}, function() {
			bricks.addClass('mini');
			$(this).text(l18n.bricksMini);
		});
		bricks.addClass('mini');
	}

}