
	(function($) {
		
//-----------------------------------------------------------------------------

		/*
		* Окно формы
		*/

		$.fn.mFormWindow = function(opt) {
			
			$.fn.mFormWindow.options = {
				title: 'Авторизация',
				form:  '#auth-form',
				width: 420
			};
			
			var opts = $.extend({}, $.fn.mFormWindow.options, opt);
			var w    = $(opts.form).parent();
			
			w.dialog({
				autoOpen: false,
				title: opts.title,
				modal: true,
				width: opts.width,
				resizable: false,
				buttons: {
					"Продолжить": function() {
						$(opts.form).submit();
					}, 
					"Отмена": function() {
						$(this).dialog('close');
					}
				}
			});
			
			return this.each(function() {
				$(this).click(function() {
					w.dialog('open');
					return false;
				});
			});
		}
		
//-----------------------------------------------------------------------------
		
		/*
		* Окно подтверждения действия
		*/
		
		$.fn.mConfirmWindow = function(opt) {
			
			$.fn.mConfirmWindow.options = {
				title: 'Подтверждение',
				form:  '#auth-form',
				width: 300,
				text:  'Вы действительно хотите продолжить?',
				ajax:  false,
				drop:  false
			};
			
			var opts = $.extend({}, $.fn.mConfirmWindow.options, opt);
			
			return this.each(function() {
				$(this).click(function() {
					
					var obj   = $(this);
					var link  = typeof($(this).attr('href')) != 'undefined' ? $(this).attr('href') : '#';
					var query = typeof($(this).attr('query')) != 'undefined' ?  $(this).attr('query') : link;
					
					$('<div>')
					.text(opts.text)
					.hide().appendTo('body')
					.dialog({
						title: opts.title,
						modal: true,
						width: opts.width,
						resizable: false,
						buttons: {
							'Продолжить': function() {
								
								$(this).dialog('close');
								$(this).remove();
								
								if (opts.drop) {
									obj.closest(opts.drop).remove();
								}
								
								if (opts.ajax) {
									$.get(query);
								}
								else
								{
									document.location = query;
								}
							},
							'Отмена': function() {
								$(this).dialog('close');
								$(this).remove();
							}
						}
					});
					
					return false;
				});
			});
		}
		
//-----------------------------------------------------------------------------
		
		/*
		* Отправка формы с заменой действия
		*/
		
		$.fn.mFormSubmit = function(opt) {
		
			var form   = $(this).closest('form');
			var action = typeof($(this).attr('action')) != 'undefined' ?  $(this).attr('action') : form.action;
			
			return this.each(function() {
				$(this).click(function() {
					
					form.attr('action', action);
					
				});
			});
			
		}
		
//-----------------------------------------------------------------------------
		
		/*
		* Загрузка форм при выборе категории	
		*/
		
		$.fn.mCategorySelector = function(opt)
		{
			$.fn.mCategorySelector.options = {
				domain: 'localhost',
				subCategories: {
					container: 'subCategoryList',
					url:       'form/getSubCategories',
					template:  'qbar-category'
				},
				qualities: {
					container: 'qualitySelector',
					url:       'form/getQualities',
					template:  'qbar-quality'
				},
				years: {
					container: 'yearSelector',
					url:       'form/getYears',
					template:  'qbar-year'
				},
				submit: false
			};
			
			var opts = $.extend({}, $.fn.mCategorySelector.options, opt);
			
			opts.subCategories = $.extend({}, $.fn.mCategorySelector.options.subCategories, opt.subCategories);
			opts.qualities     = $.extend({}, $.fn.mCategorySelector.options.qualities, opt.qualities);
			opts.years         = $.extend({}, $.fn.mCategorySelector.options.years, opt.years);
			opts.submit        = opts.submit ? $.extend({}, $.fn.mCategorySelector.options.submit, opt.submit) : false;
			
			var w  = $(this);
			var wS = $('.'+opts.subCategories.container);
			var qS = (opts.qualities.container && typeof(opts.qualities.container) != 'undefined') ? $('.'+opts.qualities.container) : false;
			var yS = (opts.years.container && typeof(opts.years.container) != 'undefined') ? $('.'+opts.years.container) : false;
			var s  = (opts.submit && typeof(opts.submit.container) != 'undefined') ? $('.'+opts.submit.container) : false;
			
			return this.each(function() {
				$(this).change(function() {
					
					var category         = $(this).attr('value');
					var qualitiesUrl     = opts.qualities.url+'/'+category+'/'+opts.qualities.template;
					var subCategoriesUrl = opts.subCategories.url+'/'+category+'/'+opts.subCategories.template;
					var yearsUrl         = opts.years.url+'/'+category+'/'+opts.years.template
					
					w.find('.toDelete').remove();
					
					wS.fadeOut('slow', function(){
						$(this).load(opts.domain+subCategoriesUrl, function(){
							$(this).fadeIn('slow');
						});
					});
					
					if (qS) {
						qS.fadeOut('slow', function(){
							$(this).load(opts.domain+qualitiesUrl, function(){
								$(this).fadeIn('slow');
							});
						});
					}
					
					if (yS) {
						yS.fadeOut('slow', function(){
							$(this).load(opts.domain+yearsUrl, function(){
								$(this).fadeIn('slow');
							});
						});
					}
					
					if (s) {
						s.fadeOut('slow', function(){
							s.empty();
							
							$('<input>')
							.attr('type', 'submit')
							.attr('value', opts.submit.title)
							.appendTo(s);
							
							s.fadeIn('slow');
						});
					}
				});
			});
		}
		
//-----------------------------------------------------------------------------
		
		$.fn.mPatternSelector = function(opt) {
			
			$.fn.mPatternSelector.options = {
				domain: 'localhost'
			};
			
			var w = $(this);
			
			var opts = $.extend({}, $.fn.mPatternSelector.options, opt);
			
			function updatePattern(data)
	 		{
	 			nicEditors.findEditor('preview_text').setContent(data.preview_text);
	 			nicEditors.findEditor('full_text').setContent(data.full_text);
	 		}
			
			return this.each(function() {
				
				$(this).change(function () {
					
					var pattern    = w.attr('value');
					var patternUrl = 'form/getNewsTemplate/'+pattern;
					
					w.find('.toDelete').remove();
					
					$.getJSON(opts.domain+patternUrl, updatePattern);
				});
			});
		}
		
//-----------------------------------------------------------------------------

		$.fn.mLoadTemplate = function(opt) {
			
			$.fn.mLoadTemplate.options = {
				domain:         'localhost',
				container:      'm-af-window',
				containerAdded: 'm-af-form',
				url:            'form/getTemplate',
				template:       'add-file',
				countFree:      1,
				callback:       false
			}
			
			var opts = $.extend({}, $.fn.mLoadTemplate.options, opt);
			
			var container = $('.'+opts.container);
			var url = opts.url + '/' + opts.template;
			
			return this.each(function() {
			
				$(this).click(function(){
					
					var count = $('.'+opts.containerAdded).length;
					
					if (opts.countFree >= count) {
						containerAdded = $('<div>').addClass(opts.containerAdded).appendTo(container).hide();
						containerAdded.load(opts.domain+url, function(){
							containerAdded.fadeIn('slow');
						});
					}
				});
			});
		}

//-----------------------------------------------------------------------------
		
		$.fn.mDelFileSelector = function() {
			
			return this.each(function() {
				
				$(this).click(function() {
				
					var container = $(this).parent();
					container.fadeOut('slow',function(){container.remove()});
					
				});
			});
		}
		
//-----------------------------------------------------------------------------
		
		$.fn.mRating = function(opt) {
			
			$.fn.mRating.options = {
				container: '.otziv',
				disable:   'otziv-disabled',
				over:      'otziv-over',
				light:     'otziv-over-over'
			};
				
			var opts  = $.extend({}, $.fn.mRating.options, opt);
			
			return this.each(function() {
				
				var cursor = $(this);
				var w = $(this).closest(opts.container);
				var stars    = w.children().find('a');
				var selector = stars.index(this);
				
				var disabled = false;
				var value    = typeof(w.attr('value')) != 'undefined' ? w.attr('value') : 0;
				var own      = typeof(w.attr('own')) != 'undefined' ? w.attr('own') : 0;
				
				function updateRating(data)
				{
					w.addClass(opts.disable);
				}
				
				stars.each(function() {
					
					if (stars.index(this) <= value - 1)
					{
						$(this).addClass(opts.over);
					}
					
					if (stars.index(this) <= own - 1)
					{
						$(this).addClass(opts.light);
					}
				});
				
				$(this).click(function() {
					
					if (!w.hasClass(opts.disable))
					{
						$.getJSON($(this).attr('href'), updateRating);
					}
					
					return false;
				});
				
				$(this).mouseover(function() {
					
					if (!w.hasClass(opts.disable))
					{
						stars.each(function() {
							
							if (stars.index(this) <= selector)
							{
								$(this).addClass(opts.light);
							}
						});
					}
				});
				
				$(this).mouseout(function() {
					
					if (!w.hasClass(opts.disable))
					{
						stars.each(function() {
							
							if (stars.index(this) > value - 1)
							{
								$(this).removeClass(opts.over);
							}
							
							$(this).removeClass(opts.light);
						});
					}
				});
			});
		}
		
//-----------------------------------------------------------------------------
	
		$.fn.mKarma = function(opt) {
			
			$.fn.mRating.options = {
				url:              'update/rating',
				barClass:         'container',
				barDisabledClass: 'container-disabled',
				pointerClass:     'pointer',
				position:         'left',
				both:             true,
				valueBar:         false,
				resultBar:        false,
				resultNClass:     'm-lr',
				resultPClass:     'm-hr',
				domain:           'localhost'
			};
			
			var opts  = $.extend({}, $.fn.mRating.options, opt);
			
			return this.each(function() {
				
				var url = opts.url;
				
				var percent   = typeof($(this).attr('percent')) != 'undefined' ? parseInt($(this).attr('percent')) : 0;
				var value     = typeof($(this).attr('value')) != 'undefined'   ? parseInt($(this).attr('value'))   : 0;
				
				var container = $('<div>').addClass(opts.barClass).css('-moz-user-select', 'none').appendTo($(this));
				var pointer   = $('<div>').addClass(opts.pointerClass).css('-moz-user-select', 'none').appendTo(container);
				
				var instance = false;
				var current  = 0;
				var last     = 0;
				
				var margin   = 0;
				var delimier = 1;
				
				var result = 0;
				
				if (!value) container.addClass(opts.barDisabledClass);
				
				if (opts.both)
				{
					percent = 50;
					
					if (opts.position == 'right')
					{
						opts.position = 'left';
						delimier      = -1;
					}
					
					if (opts.position == 'bottom')
					{
						opts.position = 'top';
						delimier      = -1;
					}
					
					if (opts.valueBar)
					{
						opts.valueBar.text(0+'/'+value);
					}
				}
				
				if (percent)
				{
					if (opts.position == 'left' || opts.position == 'right')
					{
						current = (container.width()-pointer.width())*(percent/100);
					}
					else
					{
						current = (container.height()-pointer.height())*(percent/100);
					}
					
					last   = current;
					margin = current;
					pointer.css('margin-'+opts.position, current);
				}
				
				pointer.mousedown(function (e) {
					if (opts.position == 'left' || opts.position == 'right')
					{
						instance = e.pageX;
					}
					else
					{
						instance = e.pageY;
					}
					
				});
				
				pointer.dblclick(function () {
					if (value >= Math.abs(result))
					{
						$.get(opts.domain+url+'/'+result);
						value = value - Math.abs(result);
						
						if (opts.position == 'left' || opts.position == 'right')
						{
							var animParam = {'marginLeft': margin};
						}
						else
						{
							var animParam = {'marginTop': margin};
						}
						
						$(this).animate(animParam, 1000);
						last = margin;
						
						if (!value) container.addClass(opts.barDisabledClass);
						
						if (opts.valueBar)
						{
							opts.valueBar.text(0+'/'+value);
						}
						
						if (opts.resultBar)
						{
							var rating = parseInt(opts.resultBar.text()) + result;
							opts.resultBar.text(rating);
							
							if (opts.both)
							{
								opts.resultBar.removeClass(opts.resultNClass);
								opts.resultBar.removeClass(opts.resultPClass);
								
								if (rating < 0)
								{
									opts.resultBar.addClass(opts.resultNClass)
								}
								else
								{
									opts.resultBar.addClass(opts.resultPClass)
								}
							}
						}
					}
				});
				
				$(window).mouseup(function (e) {
					if (instance)
					{
						last = current;
						instance = false;
					}
				});
				
				$(window).mousemove(function (e) {
					if (instance && value)
					{
						var calc = 0;
						
						if (opts.position == 'left' || opts.position == 'right')
						{
							calc = Math.round(last + e.pageX - instance);
							
							if (calc >= 0 && calc <= container.width() - pointer.width())
							{
								current = calc;
								pointer.css('margin-'+opts.position, current);
							}
							
							//Вычисления колличества
							if (opts.both)
							{
								result = 0;
								
								if (current < margin)
								{
									result = value * ((margin - current) / ((container.width() - pointer.width()) / 200) / 100);
									result = Math.round(result) * delimier * -1;
								}
								
								if (current > margin)
								{
									result = value * ((current - margin) / ((container.width() - pointer.width()) / 200) / 100);
									result = Math.round(result) * delimier * 1;
								}
								
								if (opts.valueBar)
								{
									opts.valueBar.text(result+'/'+value);
								}
							}
							else
							{
								//Пока не работает
							}
						}
						else
						{
							calc = Math.round(last + e.pageY - instance);
							
							if (calc >= 0 && calc <= container.height() - pointer.height())
							{
								current = calc;
								pointer.css('margin-'+opts.position, current);
							}
							
							//Вычисления колличества
							if (opts.both)
							{
								if (current < margin)
								{
									result = value * ((margin - current) / ((container.height() - pointer.height()) / 200) / 100);
									result = Math.round(result) * delimier * -1;
								}
								
								if (current > margin)
								{
									result = value * ((current - margin) / ((container.height() - pointer.height()) / 200) / 100);
									result = Math.round(result) * delimier * 1;
								}
								
								if (opts.valueBar)
								{
									opts.valueBar.text(result+'/'+value);
								}
							}
							else
							{
								//Пока не работает
							}
						}
					}
				});
			});
		}
		
//-----------------------------------------------------------------------------

		$.fn.mCommentRate = function(opt) {
			
			$.fn.mCommentRate.options = {
				rating: 'commentRating',
				button: 'commentRate',
				low:    'commentLow',
				hight:  'commentHight'
			};
			
			var opts  = $.extend({}, $.fn.mCommentRate.options, opt);
			
			return this.each(function() {
				
				var w = $(this).parent();
				var r = w.children('.'+opts.rating);
				
				function commentVoteButtons(data)
				{
					if (data < 1) {
						$('.'+opts.button).remove();
					}
				}
				
				$(this).click(function(){
					
					var value = typeof($(this).attr('value')) != 'undefined' ? parseInt($(this).attr('value')) : 0;
					
					if (value) {
					
						var link = typeof($(this).attr('href')) != 'undefined' ? $(this).attr('href') : 0;
						
						var current = parseInt(r.text());
						var changed = current + value;
						
						r.removeClass(opts.low);
						r.removeClass(opts.hight);
						
						r.addClass(changed >= 0 ? opts.hight : opts.low);
						r.text(changed);
						
						if (link) {
							$.getJSON(link, commentVoteButtons);
						}
					}
					
					w.find('.'+opts.button).remove();
					
					return false;
				});
				
			});
		};
		
//-----------------------------------------------------------------------------

		$.fn.mCommentQuote = function(opt) {
				
				$.fn.mCommentQuote.options = {
					tools: 'm-ctbox',
					range: 20,
					form:  'comment-form'
				};
				
				var opts = $.extend({}, $.fn.mCommentQuote.options, opt);
				
				var comment;
				var selection = '';
				var tools;
				
				var form   = $('.'+opts.form);
				var author = 'anonymous';
				
				var x = 0;
				var y = 0;
				
				function removeTools () {
					return function(){
						if (typeof(tools) != 'undefined') {
							tools.remove();
						}
					}
				}
				
				function getSelection()
				{
					if (window.getSelection) {
						return window.getSelection();
					} else if (document.getSelection) {
						return document.getSelection();
					} else if (document.selection) {
						return document.selection.createRange().text;
					}
				}
				
				function addQuote() {
					form.val(form.val() + "\n" + '[quote="' + author  + '"]' + selection + '[/quote]' + "\n\n");
				}
								
				return this.each(function() {
					
					$(this).mouseup(function(e){
					
						removeTools();
						
						selection = getSelection() + '';
						
						if (selection != '') {
						
							x = e.pageX;
							y = e.pageY;
							
							comment = $(this);
							author  = typeof(comment.attr('author')) != 'undefined' ? comment.attr('author') : author;
							
							tools =
							  $('<div>')
							  .css('position', 'absolute')
							  .css('left', x)
							  .css('top', y)
							  .addClass(opts.tools)
							  .hide()
							  .appendTo('body');
							  
							$('<span>')
							.text('Цитировать')
							.click(function(){
								addQuote();
								tools.remove();
							})
							.appendTo(tools);
							
							tools.fadeIn('slow');
						}
					
					});
					
					$(this).mousemove(function(e){
						
						if (typeof(tools) != 'undefined') {
						
							if ((e.pageX < (x - opts.range) || e.pageX > (x + opts.range + tools.width())) ||
								(e.pageY < (y - opts.range) || e.pageY > (y + opts.range + tools.height())))
							{
								tools.fadeOut('slow', removeTools());
							}
						}
					});
					
				});
		};
		
//-----------------------------------------------------------------------------

		$.fn.mCommentSubmit = function(opt) {
				
			$.fn.mCommentSubmit.options = {
				updateUrl:   'addition/newest_comments',
				ajaxUpdate:  true,
				form:        'add-comment',
				input:       'comment-form',
				container:   'comments-body',
				newestClass: 'newest-comments',
				domain:      'localhost'
			};
			
			var opts  = $.extend({}, $.fn.mCommentSubmit.options, opt);
			
			var container = $('.'+opts.container);
			var form      = $('.'+opts.form);
			var input     = $('.'+opts.input);
			
			var news = typeof(form.attr('news')) != 'undefined' ? form.attr('news') : 0;
			var last = typeof(form.attr('last')) != 'undefined' ? form.attr('last') : 0;
			
			return this.each(function() {
			
				var button = $(this);
				button.attr('disabled', 'disabled');
				
				input.keyup(function(){
					var val = input.val()+'';
					
					if (val.replace(new RegExp('^[\\s]+$', 'g'), '') != '') {
						button.removeAttr('disabled');
					}
					else
					{
						button.attr('disabled', 'disabled');
					}
				});
				
				form.submit(function(){
				
					if (opts.ajaxUpdate) {
					
						var content = {};
					
						$.each(input, function(i, data){
							
							var element = $(data);
							
							content[element.attr('name')] = element.val();
						});
						
						$.post(form.attr('action'), content, function(data){
							input.val('');
							button.attr('disabled', 'disabled');
							
							var link = opts.domain+opts.updateUrl+'/'+news+'/'+last;
							
							var newest = $('<div>').addClass(opts.newestClass).hide().prependTo(container).load(link, function(){
								last = data;
								newest.fadeIn('slow');
							});
						}, 'json');
						
						return false;
					}
				});
			});
		};
		
//-----------------------------------------------------------------------------

		$.fn.mValueToggle = function(opt) {
				
			var value = $(this).val();
			var orig  = $(this).val();
			
			return this.each(function() {
				$(this).click(function(){
					if (orig == value) {
						$(this).val('');
					}
				});
				$(this).blur(function(){
					$(this).val(value);
				});
				$(this).keyup(function(){
					if ($(this).val() != ''){
						value = $(this).val();
					}
				});
			});
		};
		
//-----------------------------------------------------------------------------
	
		$.fn.mCheck = function(opt) {
		
			$.fn.mCheck.options = {
				checker: 'checker'
			};
			
			var opts  = $.extend({}, $.fn.mCheck.options, opt);
			
			return this.each(function() {
				$(this).click(function () {
					if ($(this).attr('checked')) {
						$('.'+opts.checker).attr('checked', 'checked');	
					}
					else
					{
						$('.'+opts.checker).removeAttr('checked');
					}
				});
			});
		};
	
	})(jQuery);