(function($) {

	$.fn.notifySpelling = function(options) {

		options = $.extend({
			serverUrl: '/data/notify-spelling',
			offset: 20,
			messageTimeout: 1000
		}, options);

		var SelectionWindow = {

			_options: null,

			init: function(options) {
				this._options = options;
			},

			_createForm: function()	{

				var form = $('<form method="post"></form>');
				form.attr('action', this._options.serverUrl);

				form.append('Url:<br />');

				var url = $('<input type="text" name="url"/>');
				url.attr('value', location.href);
				url.attr('readonly', 'true');

				form.append(url);

				form.append('<br />');
				form.append('Текст:<br />');
				
				var errorText = $('<textarea name="error" rows="6" cols="50"></textarea>');
				errorText.append(this._getError());
				errorText.attr('readonly', 'true');

				form.append(errorText);

				form.append('<br />');
				form.append('Ваш комментарий (Необязательно):<br />');

				form.append($('<textarea name="comment" rows="2" cols="50"></textarea>'));

				form.append('<br />');
				form.append('<input type="submit" value="Сообщить об ошибке" />');

				return form;
			},

			_createCloseLink: function() {

				var closeLink = $('<div>[<a href="#">Закрыть</a>]</div>');

				closeLink.find('a').click(function() {
					$(this).parent().parent().remove();
					return false;
				});

				closeLink.css({
					position: 'absolute',
					top: '10px',
					right: '5px'
				})

				return closeLink;
			},

			_createDiv: function() {

				var div = $('<div id="errorNotifier"></div>');

				div.css({
					top: ($(window).scrollTop() + 100).toString() + 'px',
					left: '50%',
					position: 'absolute',
					'z-index': 10000,
					background: '#eee',
					border: '1px black solid',
					padding: '5px',
					width: '420px',
					'margin-left': '-210px'
				});

				return div;

			},


			show: function() {

				if (this._getError().length == 0) {
					return;
				}

				var div = this._createDiv();
				var form = this._createForm();

				var self = this;

				form.submit(function() {

					$.post(self._options.serverUrl, {
						errorUrl:	$(this).find("input[name=url]").val(),
						errorText:	$(this).find("textarea[name=error]").val(),
						comment:	$(this).find("textarea[name=comment]").val()
					}, function() {}, 'json');

					var resultMessage = $('<h1>Спасибо!</h1>').css({
						'margin-top': '15px',
						'text-align': 'center'
					});

					div.html(resultMessage);

					setTimeout(function() {
						div.remove();
					}, self._options.messageTimeout);

					return false;
				});

				div.append(form);
				div.append(this._createCloseLink());

				$('html body').append(div);

			},

			_getError: function() {

				var selection = '';
				var nextText = '';
				var prevText = '';

				if (window.getSelection) {

					selection = window.getSelection();

					if(selection.getRangeAt) {

						var range = selection.getRangeAt(0);

						var prevRange = (window.opera) ? selection.getRangeAt(0) : document.createRange();

						prevRange.setStartBefore(range.startContainer);
						prevRange.setEnd(range.startContainer, range.startOffset);
						prevText = prevRange.toString();

						prevText = prevText.substring(Math.max(prevText.length - (this._options.offset + 10), 0), prevText.length)
							.replace(/^\S{1,10}\s+/, "");

						var nextRange = (window.opera) ? selection.getRangeAt(0) : document.createRange();

						nextRange.setStart(range.endContainer, range.endOffset);
						nextRange.setEndAfter(range.endContainer);
						nextText = nextRange.toString();
						
						nextText = nextText.substring(0, this._options.offset + 10).replace(/\s+\S{1,10}$/, "");

					}

				} else if (window.document.selection.createRange) {

					selection = window.document.selection.createRange();

					selection.expand("word");

					var prevRange = window.document.selection.createRange();
					prevRange.moveStart("character", -this._options.offset);
					prevRange.setEndPoint('EndToStart', selection);
					prevRange.expand("word");
					prevText = prevRange.text;

					var nextRange = window.document.selection.createRange();
					nextRange.moveEnd("character", this._options.offset);
					nextRange.setEndPoint('StartToEnd', selection);
					nextRange.expand("word");
					nextText = nextRange.text;

					selection = selection.text;
				}

				return prevText + '['  + selection + ']' + nextText;
			}

		}

		SelectionWindow.init(options);

		$(this).each(function() {
			$(document).keypress(function(evn) {
				var enterCharCode = 13;
				var chromeEnterCharCode = 10;

				if (evn.ctrlKey && (evn.keyCode == enterCharCode || evn.keyCode == chromeEnterCharCode)) {
					SelectionWindow.show();
				}
			})

		});

	}

})(jQuery);




