(function($) {
	$.fn.spellCheck = function (options) {
		var defaults = {
				url: BASE_URL+'/spell/spell_checker.php',
				ignore: [],
				checkSpelling: function () {
					$.ajax({
						url: opts.url,
						type: 'post',
						data:{
							spellText: opts.editor.val(),
							ignore: opts.ignore.length?opts.ignore.toString():"",
							action: 'spellcheck'
						},
						success: function (txt) {
							opts.setCheckerText(txt);
							if (!opts.checker.find('span.sc_misspelled').length)
								opts.status.html('<span>No misspellings found.</span>');
							else opts.showChecker();
						}
					});
				},
				setCheckerText: function (txt) {
					opts.checker
						.html(txt.replace(/\n/gi, "<br>"))
						.find("span:not([class])")
							.addClass("sc_misspelled sc_unchecked")
							.click(function (e) {
								opts.currentSuggest=$(this);
								$.ajax({
									url: opts.url,
									type: 'post',
									data:{
										action: 'suggest',
										suggestionText: $(this).html()
									},
									success: function (html) {
										var span=opts.currentSuggest;
										span.removeClass('sc_unchecked');
										opts.suggest(span,html);
									}
								});
							});
				},
				suggest: function (span,html) {
					var pos = span.offset();  
					var height = span.height();
					opts.selectedSuggestion=span;

					$('body')
						.bind('click.close_box', function () {
							$('div.suggestionBox').remove();
							$('body').unbind('div.close_box');
						});

					$("<div class='suggestionBox'></div>")
						.html(html+'<div class="ignore">Ignore</div>')
						.find(".suggestion")
							.click(function () {
								opts.selectedSuggestion
									.html($(this).html())
									.addClass('corrected')
									.unbind('click');
								opts.checkResume();
							})
							.end()
						.find('.ignore')
							.click(function () {
								opts.selectedSuggestion
									.removeClass('sc_unchecked')
									.addClass('corrected');
								opts.ignore[opts.ignore.length]=opts.selectedSuggestion.html();
								opts.checkResume();
							})
							.end()
						.appendTo($('body'))
						.offset({top: pos.top+height-1, left: pos.left-1});
				},
				checkResume: function () {
					if (!opts.checker.find("span.sc_misspelled").not(".corrected").length)
						opts.resume();
				},
				resume: function () {
					opts.checker.find("span.sc_misspelled").each(function () {
						$(this).replaceWith($(this).html());
					});
					opts.editor.val(opts.checker.html().replace(/<br>/gi, "\n"));
					opts.showEditor();
				},
				showEditor: function () {
					opts.checker.css('display','none');
					opts.editor.css('display','');
					opts.panels.all
						.find(".spell_checker_cp_resume").hide().end()
						.find(".spell_checker_cp_check").show().end();
					opts.status.html('<span>Spell check complete.</span>');
				},
				showChecker: function () {
					opts.editor.css('display','none');
					opts.checker.css('display','');
					opts.panels.all
						.find(".spell_checker_cp_check").hide().end()
						.find(".spell_checker_cp_resume").show().end()
					opts.status.html('');
				}
			};
		var opts = $.extend(defaults, options);

/*
		var panelTop =	'<div class="spell_checker_cp">'+
							'<a class="spell_checker_cp_check" title="Check Spelling">&nbsp;&nbsp;&nbsp;</a>'+
							'<a class="spell_checker_cp_resume" title="Resume Typing" style="display: none;">&nbsp;&nbsp;&nbsp;</a>'+
							'<span class="spell_checker_status"></span>'+
						'</div>';
*/
		var panelBottom	='<div class="spell_checker_cp">'+
							'<input type="button" class="spell_checker_cp_check" value="Check Spelling"/>'+
							'<input type="button" class="spell_checker_cp_resume" value="Resume Typing" style="display:none"/>'+
							'<span class="spell_checker_status"></span>'+
						'</div>';
		var container = '<div class="spell_checker_container"></div>';
		var checker	= 	'<div class="spell_checker_cp_result" style="display:none;"></div>';

		opts.editor  = $(this);
		opts.container = $(container).insertAfter(opts.editor);
		opts.editor.appendTo(opts.container);
		opts.checker = $(checker)
			.appendTo(opts.container)
			.width(opts.editor.width())
			.height(opts.editor.height());
		
		opts.panels = {
			//top: $(panelTop).insertBefore(opts.container),
			bottom: $(panelBottom).insertAfter(opts.container)
		}

		//opts.panels.top.addClass("spell-cp-top");
		opts.panels.bottom.addClass("spell-cp-bottom");

		opts.panels.all = $(opts.panels.bottom); //$(opts.panels.top).add(opts.panels.bottom);
		opts.status = $(opts.panels.all.find('.spell_checker_status'));

		opts.panels.all
			.find(".spell_checker_cp_check")
				.click(function () {
					opts.checkSpelling();
				})
				.end()
			.find(".spell_checker_cp_resume")
				.click(function () {
					opts.resume();
				})
				.end()
			.end();

		opts.checker
			.dblclick(function () {
				opts.resume();
			});
		
		return this;
	}
})(jQuery);

