--- loncom/html/adm/spellcheck/js/jquery.spellchecker.min.js 2012/08/28 10:18:44 1.1 +++ loncom/html/adm/spellcheck/js/jquery.spellchecker.min.js 2012/09/04 10:44:13 1.2 @@ -1,8 +1,9 @@ -/* - * jquery.spellchecker.js - a simple jQuery Spell Checker - * Copyright (c) 2009 Richard Willis - * MIT license : http://www.opensource.org/licenses/mit-license.php - * Project : http://jquery-spellchecker.googlecode.com - * Contact : willis.rh@gmail.com - */ -(function(b){b.Z.extend({ga:function(a,c){return this.k(function(){if(b(this).data("spellchecker")&&b(this).data("spellchecker")[a])b(this).data("spellchecker")[a](c);else{b(this).data("spellchecker",new h(this,a&&a.constructor===Object&&a||null));a&&a.constructor==String&&b(this).data("spellchecker")[a](c)}})}});function h(a,c){this.options=b.extend({url:"checkspelling.php",lang:"en",o:"pspell",n:false,B:{action:"after",element:a},w:"below",p:false},c||{});this.b=b(a);this.elements={};this.P()}h.prototype= {P:function(){this.J();this.b.m("spellcheck-container")},I:function(a){var c=this,d=this.b.$(0).nodeName;if(d=="TEXTAREA"||d=="INPUT"){this.type="textarea";d=b.z(this.b.A().replace(new RegExp("<[^>]+>","g"),"").replace(new RegExp("^[^a-zA-Z\\u00A1-\\uFFFF]|[^a-zA-Z\\u00A1-\\uFFFF]+[^a-zA-Z\\u00A1-\\uFFFF]|[^a-zA-Z\\u00A1-\\uFFFF]$|\\n|\\t|\\s{2,}","g")," "))}else{this.type="html";d=b.z(this.b.text().replace(new RegExp("^[^a-zA-Z\\u00A1-\\uFFFF]|[^a-zA-Z\\u00A1-\\uFFFF]+[^a-zA-Z\\u00A1-\\uFFFF]|[^a-zA-Z\\u00A1-\\uFFFF]$|\\n|\\t|\\s{2,}", "g")," "))}this.q(this.options.url,{text:encodeURIComponent(d).replace(/%20/g,"+")},function(e){c.type=="html"&&c.options.p?c.N(e,a):c.G(e,a)})},N:function(a,c){if(a.length){var d=this,e=this.b.h();b.k(a,function(f,g){e=e.replace(new RegExp("([^a-zA-Z\\u00A1-\\uFFFF])("+g+")([^a-zA-Z\\u00A1-\\uFFFF])","g"),'$1$2$3')});this.b.h(e).find(".spellcheck-word-highlight").click(function(){d.r(this)});c&&c()}else c(true)},G:function(a,c){if(a.length){var d=this, e=[];if(b("#spellcheck-badwords").length)this.elements.d=b("#spellcheck-badwords");else b(this.options.B.element)[this.options.B.action](this.elements.d);this.elements.d.empty();b.k(a,function(f,g){if(b.ba(g,e)===-1){b(''+g+"").click(function(){d.r(this)}).V(d.elements.d).j(', ');e.push(g)}});b(".spellcheck-sep:last",d.elements.d).m("spellcheck-sep-last");c&&c()}else c(true)},r:function(a){var c=this;a=b(a);var d=a.da(); this.a=a;if(this.options.p){this.elements.c=this.elements.e.find("#spellcheck-suggestbox");this.elements.f=this.elements.e.find("#spellcheck-suggestbox-words");this.elements.i=this.elements.e.find("#spellcheck-suggestbox-foot")}this.elements.i.M();this.elements.c.stop().M().K({opacity:1,width:"auto",left:d.left+"px",top:this.options.w=="above"?d.top-(a.outerHeight()+10)+"px":d.top+a.outerHeight()+"px"}).X(200);this.elements.g.focus();this.elements.f.h("Loading..");this.q(this.options.url, {r:encodeURIComponent(b.z(a.text()))},function(e){c.H(e,d)})},H:function(a,c){var d=this,e=this.a;this.elements.f.empty();for(var f=0;f<(a.length<5?a.length:5);f++)this.elements.f.append(b(''+a[f]+"").m(!f?"first":"").ca(function(g){g.preventDefault();d.replace(this.innerHTML);d.elements.g.s("blur")}));!f&&this.elements.f.append("(no suggestions)");a=window.innerHeight?window.innerHeight:b(window).height();this.elements.i.show();d.elements.c.K({top:this.options.w=="above"|| c.top+e.outerHeight()+this.elements.c.outerHeight()>a+10?c.top-(this.elements.c.height()+5)+"px":c.top+e.outerHeight()+"px",width:"auto",left:this.elements.c.outerWidth()+c.left>b("body").width()?c.left-this.elements.c.width()+e.outerWidth()+"px":c.left+"px"})},t:function(a){this.elements.c.Y(250,function(){a&&a()})},replace:function(a){switch(this.type){case "textarea":this.S(a);break;case "html":this.R(a);break}},v:function(a,c){return a.replace(new RegExp("([^a-zA-Z\\u00A1-\\uFFFF])("+this.a.text()+ ")([^a-zA-Z\\u00A1-\\uFFFF])","g"),"$1"+c+"$3").replace(new RegExp("^("+this.a.text()+")([^a-zA-Z\\u00A1-\\uFFFF])","g"),c+"$2").replace(new RegExp("([^a-zA-Z\\u00A1-\\uFFFF])("+this.a.text()+")$","g"),"$1"+c)},S:function(a){this.l(this.a);this.b.A(this.v(this.b.A(),a))},R:function(a){var c=this.b.find(".spellcheck-word-highlight:contains("+this.a.text()+")");if(c.length)c.j(a).remove();else{b(this.b).h(this.v(b(this.b).h(),a));this.l(this.a)}},O:function(){this.type=="textarea"?this.l(this.a):this.a.j(this.a.h()).remove()}, u:function(){var a=this;this.type=="textarea"?this.l(this.a):b(".spellcheck-word-highlight",this.b).k(function(){(new RegExp(a.a.text(),"i")).test(this.innerHTML)&&b(this).j(this.innerHTML).remove()})},l:function(a){a.next().aa("spellcheck-sep")&&a.next().remove();a.remove();b(".spellcheck-sep",this.elements.d).length?b(".spellcheck-sep:last",this.elements.d).m("spellcheck-sep-last"):this.remove()},n:function(){var a=this;this.t(function(){confirm('Are you sure you want to add the word "'+a.a.text()+ '" to the dictionary?')&&a.q(a.options.url,{T:a.a.text()},function(){a.u();a.I()})})},remove:function(a){a=a||true;this.elements.e.find(".spellcheck-word-highlight").k(function(){b(this).j(this.innerHTML).remove()});this.elements.e.find("#spellcheck-badwords, #spellcheck-suggestbox-words, #spellcheck-suggestbox-foot, #spellcheck-suggestbox, #spellcheck-focus-helper").remove();b(this.L).fa("spellcheck-container");a&&b(this.L).data("spellchecker",null)},q:function(a,c,d){return b.U({type:"POST",url:a, data:b.extend(c,{o:this.options.o,lang:this.options.lang}),dataType:"json",W:false,error:function(){alert("Sorry, there was an error processing the request.")},ha:function(e){d&&d(e)}})},J:function(){var a=this;this.elements.e=this.options.p?this.b.ea().filter("html:first").find("body"):b("body");this.remove(false);this.elements.g=b('').blur(function(){a.t()}).Q(this.elements.e);this.elements.f=b('
');this.elements.D= b('Ignore Word').click(function(c){c.preventDefault();a.O();a.elements.g.s("blur")});this.elements.C=b('Ignore all').click(function(c){c.preventDefault();a.u();a.elements.g.s("blur")});this.elements.F=b('Ignore forever').click(function(c){c.preventDefault();a.n();a.elements.g.s("blur")});this.elements.i=b('').append(this.elements.D).append(this.elements.C).append(this.options.o== "pspell"&&a.options.n?this.elements.F:false);this.elements.d=b('');this.elements.c=b('').append(this.elements.f).append(this.elements.i).Q(this.elements.e)}}})(jQuery); + +(function($){$.fn.extend({spellchecker:function(options,callback){return this.each(function(){var obj=$(this).data('spellchecker');if(obj&&String===options.constructor&&obj[options]){obj[options](callback);}else if(obj){obj.init();}else{$(this).data('spellchecker',new SpellChecker(this,(Object===options.constructor?options:null)));(String===options.constructor)&&$(this).data('spellchecker')[options](callback);}});}});var SpellChecker=function(domObj,options){this.options=$.extend({url:'checkspelling.php',lang:'en',engine:'pspell',addToDictionary:false,wordlist:{action:'after',element:domObj},suggestBoxPosition:'below',innerDocument:false},options||{});this.$domObj=$(domObj);this.elements={};this.init();};SpellChecker.prototype={init:function(){var self=this;this.createElements();this.$domObj.addClass('spellcheck-container');$(document).bind('click',function(e){(!$(e.target).hasClass('spellcheck-word-highlight')&&!$(e.target).parents().filter('.spellcheck-suggestbox').length)&&self.hideBox();});},check:function(callback){var self=this,node=this.$domObj.get(0).nodeName,tagExp='<[^>]+>',puncExp='^[^a-zA-Z\\u00A1-\\uFFFF]|[^a-zA-Z\\u00A1-\\uFFFF]+[^a-zA-Z\\u00A1-\\uFFFF]|[^a-zA-Z\\u00A1-\\uFFFF]$|\\n|\\t|\\s{2,}';if(node=='TEXTAREA'||node=='INPUT'){this.type='textarea';var text=$.trim(this.$domObj.val().replace(new RegExp(tagExp,'g'),'').replace(new RegExp(puncExp,'g'),' '));}else{this.type='html';var text=$.trim(this.$domObj.text().replace(new RegExp(puncExp,'g')," "));} +this.postJson(this.options.url,{text:encodeURIComponent(text).replace(/%20/g,'+')},function(json){self.type=='html'&&self.options.innerDocument?self.highlightWords(json,callback):self.buildBadwordsBox(json,callback);});},highlightWords:function(json,callback){if(!json.length){callback.call(this.$domObj,true);return;} +var self=this,html=this.$domObj.html();$.each(json,function(key,replaceWord){html=html.replace(new RegExp('([^a-zA-Z\\u00A1-\\uFFFF])('+replaceWord+')([^a-zA-Z\\u00A1-\\uFFFF])','g'),'$1$2$3');});this.$domObj.html(html).find('.spellcheck-word-highlight').each(function(){self.elements.highlightWords.push($(this).click(function(){self.suggest(this);}));});(callback)&&callback();},buildBadwordsBox:function(json,callback){if(!json.length){callback.call(this.$domObj,true);return;} +var self=this,words=[];$(this.options.wordlist.element)[this.options.wordlist.action](this.elements.$badwords);this.elements.$badwords.empty() +$.each(json,function(key,badword){if($.inArray(badword,words)===-1){self.elements.highlightWords.push($(''+badword+'').click(function(){self.suggest(this);}).appendTo(self.elements.$badwords).after(', '));words.push(badword);}});$('.spellcheck-sep:last',self.elements.$badwords).addClass('spellcheck-sep-last');(callback)&&callback();},suggest:function(word){var self=this,$word=$(word),offset=$word.offset();this.$curWord=$word;if(this.options.innerDocument){this.elements.$suggestBox=this.elements.$body.find('.spellcheck-suggestbox');this.elements.$suggestWords=this.elements.$body.find('.spellcheck-suggestbox-words');this.elements.$suggestFoot=this.elements.$body.find('.spellcheck-suggestbox-foot');} +this.elements.$suggestFoot.hide();this.elements.$suggestBox.stop().hide().css({opacity:1,width:"auto",left:offset.left+"px",top:(this.options.suggestBoxPosition=="above"?(offset.top-($word.outerHeight()+10))+"px":(offset.top+$word.outerHeight())+"px")}).fadeIn(200);this.elements.$suggestWords.html('Loading..');this.postJson(this.options.url,{suggest:encodeURIComponent($.trim($word.text()))},function(json){self.buildSuggestBox(json,offset);});},buildSuggestBox:function(json,offset){var self=this,$word=this.$curWord;this.elements.$suggestWords.empty();for(var i=0;i<(json.length<5?json.length:5);i++){this.elements.$suggestWords.append($(''+json[i]+'').addClass((!i?'first':'')).click(function(){return false;}).mousedown(function(e){e.preventDefault();self.replace(this.innerHTML);self.hideBox();}));} +(!i)&&this.elements.$suggestWords.append('(no suggestions)');var viewportHeight=window.innerHeight?window.innerHeight:$(window).height();this.elements.$suggestFoot.show();self.elements.$suggestBox.css({top:(this.options.suggestBoxPosition=='above')||(offset.top+$word.outerHeight()+this.elements.$suggestBox.outerHeight()>viewportHeight+10)?(offset.top-(this.elements.$suggestBox.height()+5))+"px":(offset.top+$word.outerHeight()+"px"),width:'auto',left:(this.elements.$suggestBox.outerWidth()+offset.left>$('body').width()?(offset.left-this.elements.$suggestBox.width())+$word.outerWidth()+'px':offset.left+'px')});},hideBox:function(callback){this.elements.$suggestBox.fadeOut(250,function(){(callback)&&callback();});},replace:function(replace){switch(this.type){case'textarea':this.replaceTextbox(replace);break;case'html':this.replaceHtml(replace);break;}},replaceWord:function(text,replace){return text.replace(new RegExp("([^a-zA-Z\\u00A1-\\uFFFF]?)("+this.$curWord.text()+")([^a-zA-Z\\u00A1-\\uFFFF]?)","g"),'$1'+replace+'$3').replace(new RegExp("^("+this.$curWord.text()+")([^a-zA-Z\\u00A1-\\uFFFF])","g"),replace+'$2').replace(new RegExp("([^a-zA-Z\\u00A1-\\uFFFF])("+this.$curWord.text()+")$","g"),'$1'+replace);},replaceTextbox:function(replace){this.removeBadword(this.$curWord);this.$domObj.val(this.replaceWord(this.$domObj.val(),replace));},replaceHtml:function(replace){var words=this.$domObj.find('.spellcheck-word-highlight:contains('+this.$curWord.text()+')') +if(words.length){words.after(replace).remove();}else{$(this.$domObj).html(this.replaceWord($(this.$domObj).html(),replace));this.removeBadword(this.$curWord);}},ignore:function(){if(this.type=='textarea'){this.removeBadword(this.$curWord);}else{this.$curWord.after(this.$curWord.html()).remove();}},ignoreAll:function(){var self=this;if(this.type=='textarea'){this.removeBadword(this.$curWord);}else{$('.spellcheck-word-highlight',this.$domObj).each(function(){(new RegExp(self.$curWord.text(),'i').test(this.innerHTML))&&$(this).after(this.innerHTML).remove();});}},removeBadword:function($domObj){($domObj.next().hasClass('spellcheck-sep'))&&$domObj.next().remove();$domObj.remove();if(!$('.spellcheck-sep',this.elements.$badwords).length){this.elements.$badwords.remove();}else{$('.spellcheck-sep:last',this.elements.$badwords).addClass('spellcheck-sep-last');}},addToDictionary:function(){var self=this;this.hideBox(function(){confirm('Are you sure you want to add the word "'+self.$curWord.text()+'" to the dictionary?')&&self.postJson(self.options.url,{addtodictionary:self.$curWord.text()},function(){self.ignoreAll();self.check();});});},remove:function(destroy){destroy=destroy||true;$.each(this.elements.highlightWords,function(val){this.after(this.innerHTML).remove()});this.elements.$badwords.remove();this.elements.$suggestBox.remove();$(this.domObj).removeClass('spellcheck-container');(destroy)&&$(this.domObj).data('spellchecker',null);},postJson:function(url,data,callback){var xhr=$.ajax({type:'POST',url:url,data:$.extend(data,{engine:this.options.engine,lang:this.options.lang}),dataType:'json',cache:false,error:function(XHR,status,error){alert('Sorry, there was an error processing the request.');},success:function(json){(callback)&&callback(json);}});return xhr;},createElements:function(){var self=this;this.elements.$body=this.options.innerDocument?this.$domObj.parents().filter('html:first').find("body"):$('body');this.elements.highlightWords=[];this.elements.$suggestWords=this.elements.$suggestWords||$('').addClass('spellcheck-suggestbox-words');this.elements.$ignoreWord=this.elements.$ignoreWord||$('Ignore Word').click(function(e){e.preventDefault();self.ignore();self.hideBox();});this.elements.$ignoreAllWords=this.elements.$ignoreAllWords||$('Ignore all').click(function(e){e.preventDefault();self.ignoreAll();self.hideBox();});this.elements.$ignoreWordsForever=this.elements.$ignoreWordsForever||$('Ignore forever').click(function(e){e.preventDefault();self.addToDictionary();self.hideBox();});this.elements.$suggestFoot=this.elements.$suggestFoot||$('').addClass('spellcheck-suggestbox-foot').append(this.elements.$ignoreWord).append(this.elements.$ignoreAllWords).append(this.options.engine=="pspell"&&self.options.addToDictionary?this.elements.$ignoreWordsForever:false);this.elements.$badwords=this.elements.$badwords||$('').addClass('spellcheck-badwords');this.elements.$suggestBox=this.elements.$suggestBox||$('').addClass('spellcheck-suggestbox').append(this.elements.$suggestWords).append(this.elements.$suggestFoot).prependTo(this.elements.$body);}};})(jQuery); \ No newline at end of file