| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663 | /*!* Simditor v2.3.13* http://simditor.tower.im/* 2018-03-09*/(function (root, factory) {  if (typeof define === 'function' && define.amd) {    // AMD. Register as an anonymous module unless amdModuleId is set    define('simditor', ["jquery","simple-module","simple-hotkeys","simple-uploader"], function ($, SimpleModule, simpleHotkeys, simpleUploader) {      return (root['Simditor'] = factory($, SimpleModule, simpleHotkeys, simpleUploader));    });  } else if (typeof exports === 'object') {    // Node. Does not work with strict CommonJS, but    // only CommonJS-like environments that support module.exports,    // like Node.    module.exports = factory(require("jquery"),require("simple-module"),require("simple-hotkeys"),require("simple-uploader"));  } else {    root['Simditor'] = factory(jQuery,SimpleModule,simple.hotkeys,simple.uploader);  }}(this, function ($, SimpleModule, simpleHotkeys, simpleUploader) {var AlignmentButton, BlockquoteButton, BoldButton, Button, Clipboard, CodeButton, CodePopover, ColorButton, FontScaleButton, Formatter, HrButton, ImageButton, ImagePopover, IndentButton, Indentation, InputManager, ItalicButton, Keystroke, LinkButton, LinkPopover, ListButton, OrderListButton, OutdentButton, Popover, Selection, Simditor, StrikethroughButton, TableButton, TitleButton, Toolbar, UnderlineButton, UndoManager, UnorderListButton, Util,  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },  hasProp = {}.hasOwnProperty,  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },  slice = [].slice;Selection = (function(superClass) {  extend(Selection, superClass);  function Selection() {    return Selection.__super__.constructor.apply(this, arguments);  }  Selection.pluginName = 'Selection';  Selection.prototype._range = null;  Selection.prototype._startNodes = null;  Selection.prototype._endNodes = null;  Selection.prototype._containerNode = null;  Selection.prototype._nodes = null;  Selection.prototype._blockNodes = null;  Selection.prototype._rootNodes = null;  Selection.prototype._init = function() {    this.editor = this._module;    this._selection = document.getSelection();    this.editor.on('selectionchanged', (function(_this) {      return function(e) {        _this.reset();        return _this._range = _this._selection.getRangeAt(0);      };    })(this));    this.editor.on('blur', (function(_this) {      return function(e) {        return _this.reset();      };    })(this));    return this.editor.on('focus', (function(_this) {      return function(e) {        _this.reset();        return _this._range = _this._selection.getRangeAt(0);      };    })(this));  };  Selection.prototype.reset = function() {    this._range = null;    this._startNodes = null;    this._endNodes = null;    this._containerNode = null;    this._nodes = null;    this._blockNodes = null;    return this._rootNodes = null;  };  Selection.prototype.clear = function() {    var e;    try {      this._selection.removeAllRanges();    } catch (_error) {      e = _error;    }    return this.reset();  };  Selection.prototype.range = function(range) {    var ffOrIE;    if (range) {      this.clear();      this._selection.addRange(range);      this._range = range;      ffOrIE = this.editor.util.browser.firefox || this.editor.util.browser.msie;      if (!this.editor.inputManager.focused && ffOrIE) {        this.editor.body.focus();      }    } else if (!this._range && this.editor.inputManager.focused && this._selection.rangeCount) {      this._range = this._selection.getRangeAt(0);    }    return this._range;  };  Selection.prototype.startNodes = function() {    if (this._range) {      this._startNodes || (this._startNodes = (function(_this) {        return function() {          var startNodes;          startNodes = $(_this._range.startContainer).parentsUntil(_this.editor.body).get();          startNodes.unshift(_this._range.startContainer);          return $(startNodes);        };      })(this)());    }    return this._startNodes;  };  Selection.prototype.endNodes = function() {    var endNodes;    if (this._range) {      this._endNodes || (this._endNodes = this._range.collapsed ? this.startNodes() : (endNodes = $(this._range.endContainer).parentsUntil(this.editor.body).get(), endNodes.unshift(this._range.endContainer), $(endNodes)));    }    return this._endNodes;  };  Selection.prototype.containerNode = function() {    if (this._range) {      this._containerNode || (this._containerNode = $(this._range.commonAncestorContainer));    }    return this._containerNode;  };  Selection.prototype.nodes = function() {    if (this._range) {      this._nodes || (this._nodes = (function(_this) {        return function() {          var nodes;          nodes = [];          if (_this.startNodes().first().is(_this.endNodes().first())) {            nodes = _this.startNodes().get();          } else {            _this.startNodes().each(function(i, node) {              var $endNode, $node, $nodes, endIndex, index, sharedIndex, startIndex;              $node = $(node);              if (_this.endNodes().index($node) > -1) {                return nodes.push(node);              } else if ($node.parent().is(_this.editor.body) || (sharedIndex = _this.endNodes().index($node.parent())) > -1) {                if (sharedIndex && sharedIndex > -1) {                  $endNode = _this.endNodes().eq(sharedIndex - 1);                } else {                  $endNode = _this.endNodes().last();                }                $nodes = $node.parent().contents();                startIndex = $nodes.index($node);                endIndex = $nodes.index($endNode);                return $.merge(nodes, $nodes.slice(startIndex, endIndex).get());              } else {                $nodes = $node.parent().contents();                index = $nodes.index($node);                return $.merge(nodes, $nodes.slice(index).get());              }            });            _this.endNodes().each(function(i, node) {              var $node, $nodes, index;              $node = $(node);              if ($node.parent().is(_this.editor.body) || _this.startNodes().index($node.parent()) > -1) {                nodes.push(node);                return false;              } else {                $nodes = $node.parent().contents();                index = $nodes.index($node);                return $.merge(nodes, $nodes.slice(0, index + 1));              }            });          }          return $($.unique(nodes));        };      })(this)());    }    return this._nodes;  };  Selection.prototype.blockNodes = function() {    if (!this._range) {      return;    }    this._blockNodes || (this._blockNodes = (function(_this) {      return function() {        return _this.nodes().filter(function(i, node) {          return _this.editor.util.isBlockNode(node);        });      };    })(this)());    return this._blockNodes;  };  Selection.prototype.rootNodes = function() {    if (!this._range) {      return;    }    this._rootNodes || (this._rootNodes = (function(_this) {      return function() {        return _this.nodes().filter(function(i, node) {          var $parent;          $parent = $(node).parent();          return $parent.is(_this.editor.body) || $parent.is('blockquote');        });      };    })(this)());    return this._rootNodes;  };  Selection.prototype.rangeAtEndOf = function(node, range) {    var afterLastNode, beforeLastNode, endNode, endNodeLength, lastNodeIsBr, result;    if (range == null) {      range = this.range();    }    if (!(range && range.collapsed)) {      return;    }    node = $(node)[0];    endNode = range.endContainer;    endNodeLength = this.editor.util.getNodeLength(endNode);    beforeLastNode = range.endOffset === endNodeLength - 1;    lastNodeIsBr = $(endNode).contents().last().is('br');    afterLastNode = range.endOffset === endNodeLength;    if (!((beforeLastNode && lastNodeIsBr) || afterLastNode)) {      return false;    }    if (node === endNode) {      return true;    } else if (!$.contains(node, endNode)) {      return false;    }    result = true;    $(endNode).parentsUntil(node).addBack().each(function(i, n) {      var $lastChild, beforeLastbr, isLastNode, nodes;      nodes = $(n).parent().contents().filter(function() {        return !(this !== n && this.nodeType === 3 && !this.nodeValue);      });      $lastChild = nodes.last();      isLastNode = $lastChild.get(0) === n;      beforeLastbr = $lastChild.is('br') && $lastChild.prev().get(0) === n;      if (!(isLastNode || beforeLastbr)) {        result = false;        return false;      }    });    return result;  };  Selection.prototype.rangeAtStartOf = function(node, range) {    var result, startNode;    if (range == null) {      range = this.range();    }    if (!(range && range.collapsed)) {      return;    }    node = $(node)[0];    startNode = range.startContainer;    if (range.startOffset !== 0) {      return false;    }    if (node === startNode) {      return true;    } else if (!$.contains(node, startNode)) {      return false;    }    result = true;    $(startNode).parentsUntil(node).addBack().each(function(i, n) {      var nodes;      nodes = $(n).parent().contents().filter(function() {        return !(this !== n && this.nodeType === 3 && !this.nodeValue);      });      if (nodes.first().get(0) !== n) {        return result = false;      }    });    return result;  };  Selection.prototype.insertNode = function(node, range) {    if (range == null) {      range = this.range();    }    if (!range) {      return;    }    node = $(node)[0];    range.insertNode(node);    return this.setRangeAfter(node, range);  };  Selection.prototype.setRangeAfter = function(node, range) {    if (range == null) {      range = this.range();    }    if (range == null) {      return;    }    node = $(node)[0];    range.setEndAfter(node);    range.collapse(false);    return this.range(range);  };  Selection.prototype.setRangeBefore = function(node, range) {    if (range == null) {      range = this.range();    }    if (range == null) {      return;    }    node = $(node)[0];    range.setEndBefore(node);    range.collapse(false);    return this.range(range);  };  Selection.prototype.setRangeAtStartOf = function(node, range) {    if (range == null) {      range = this.range();    }    node = $(node).get(0);    range.setEnd(node, 0);    range.collapse(false);    return this.range(range);  };  Selection.prototype.setRangeAtEndOf = function(node, range) {    var $lastNode, $node, contents, lastChild, lastChildLength, lastText, nodeLength;    if (range == null) {      range = this.range();    }    $node = $(node);    node = $node[0];    if (!node) {      return;    }    if ($node.is('pre')) {      contents = $node.contents();      if (contents.length > 0) {        lastChild = contents.last();        lastText = lastChild.text();        lastChildLength = this.editor.util.getNodeLength(lastChild[0]);        if (lastText.charAt(lastText.length - 1) === '\n') {          range.setEnd(lastChild[0], lastChildLength - 1);        } else {          range.setEnd(lastChild[0], lastChildLength);        }      } else {        range.setEnd(node, 0);      }    } else {      nodeLength = this.editor.util.getNodeLength(node);      if (node.nodeType !== 3 && nodeLength > 0) {        $lastNode = $(node).contents().last();        if ($lastNode.is('br')) {          nodeLength -= 1;        } else if ($lastNode[0].nodeType !== 3 && this.editor.util.isEmptyNode($lastNode)) {          $lastNode.append(this.editor.util.phBr);          node = $lastNode[0];          nodeLength = 0;        }      }      range.setEnd(node, nodeLength);    }    range.collapse(false);    return this.range(range);  };  Selection.prototype.deleteRangeContents = function(range) {    var atEndOfBody, atStartOfBody, endRange, startRange;    if (range == null) {      range = this.range();    }    startRange = range.cloneRange();    endRange = range.cloneRange();    startRange.collapse(true);    endRange.collapse(false);    atStartOfBody = this.rangeAtStartOf(this.editor.body, startRange);    atEndOfBody = this.rangeAtEndOf(this.editor.body, endRange);    if (!range.collapsed && atStartOfBody && atEndOfBody) {      this.editor.body.empty();      range.setStart(this.editor.body[0], 0);      range.collapse(true);      this.range(range);    } else {      range.deleteContents();    }    return range;  };  Selection.prototype.breakBlockEl = function(el, range) {    var $el;    if (range == null) {      range = this.range();    }    $el = $(el);    if (!range.collapsed) {      return $el;    }    range.setStartBefore($el.get(0));    if (range.collapsed) {      return $el;    }    return $el.before(range.extractContents());  };  Selection.prototype.save = function(range) {    var endCaret, endRange, startCaret;    if (range == null) {      range = this.range();    }    if (this._selectionSaved) {      return;    }    endRange = range.cloneRange();    endRange.collapse(false);    startCaret = $('<span/>').addClass('simditor-caret-start');    endCaret = $('<span/>').addClass('simditor-caret-end');    endRange.insertNode(endCaret[0]);    range.insertNode(startCaret[0]);    this.clear();    return this._selectionSaved = true;  };  Selection.prototype.restore = function() {    var endCaret, endContainer, endOffset, range, startCaret, startContainer, startOffset;    if (!this._selectionSaved) {      return false;    }    startCaret = this.editor.body.find('.simditor-caret-start');    endCaret = this.editor.body.find('.simditor-caret-end');    if (startCaret.length && endCaret.length) {      startContainer = startCaret.parent();      startOffset = startContainer.contents().index(startCaret);      endContainer = endCaret.parent();      endOffset = endContainer.contents().index(endCaret);      if (startContainer[0] === endContainer[0]) {        endOffset -= 1;      }      range = document.createRange();      range.setStart(startContainer.get(0), startOffset);      range.setEnd(endContainer.get(0), endOffset);      startCaret.remove();      endCaret.remove();      this.range(range);    } else {      startCaret.remove();      endCaret.remove();    }    this._selectionSaved = false;    return range;  };  return Selection;})(SimpleModule);Formatter = (function(superClass) {  extend(Formatter, superClass);  function Formatter() {    return Formatter.__super__.constructor.apply(this, arguments);  }  Formatter.pluginName = 'Formatter';  Formatter.prototype.opts = {    allowedTags: [],    allowedAttributes: {},    allowedStyles: {}  };  Formatter.prototype._init = function() {    this.editor = this._module;    this._allowedTags = $.merge(['br', 'span', 'a', 'img', 'b', 'strong', 'i', 'strike', 'u', 'font', 'p', 'ul', 'ol', 'li', 'blockquote', 'pre', 'code', 'h1', 'h2', 'h3', 'h4', 'hr'], this.opts.allowedTags);    this._allowedAttributes = $.extend({      img: ['src', 'alt', 'width', 'height', 'data-non-image'],      a: ['href', 'target'],      font: ['color'],      code: ['class']    }, this.opts.allowedAttributes);    this._allowedStyles = $.extend({      span: ['color', 'font-size'],      b: ['color'],      i: ['color'],      strong: ['color'],      strike: ['color'],      u: ['color'],      p: ['margin-left', 'text-align'],      h1: ['margin-left', 'text-align'],      h2: ['margin-left', 'text-align'],      h3: ['margin-left', 'text-align'],      h4: ['margin-left', 'text-align']    }, this.opts.allowedStyles);    return this.editor.body.on('click', 'a', function(e) {      return false;    });  };  Formatter.prototype.decorate = function($el) {    if ($el == null) {      $el = this.editor.body;    }    this.editor.trigger('decorate', [$el]);    return $el;  };  Formatter.prototype.undecorate = function($el) {    if ($el == null) {      $el = this.editor.body.clone();    }    this.editor.trigger('undecorate', [$el]);    return $el;  };  Formatter.prototype.autolink = function($el) {    var $link, $node, findLinkNode, k, lastIndex, len, linkNodes, match, re, replaceEls, subStr, text, uri;    if ($el == null) {      $el = this.editor.body;    }    linkNodes = [];    findLinkNode = function($parentNode) {      return $parentNode.contents().each(function(i, node) {        var $node, text;        $node = $(node);        if ($node.is('a') || $node.closest('a, pre', $el).length) {          return;        }        if (!$node.is('iframe') && $node.contents().length) {          return findLinkNode($node);        } else if ((text = $node.text()) && /https?:\/\/|www\./ig.test(text)) {          return linkNodes.push($node);        }      });    };    findLinkNode($el);    re = /(https?:\/\/|www\.)[\w\-\.\?&=\/#%:,@\!\+]+/ig;    for (k = 0, len = linkNodes.length; k < len; k++) {      $node = linkNodes[k];      text = $node.text();      replaceEls = [];      match = null;      lastIndex = 0;      while ((match = re.exec(text)) !== null) {        subStr = text.substring(lastIndex, match.index);        replaceEls.push(document.createTextNode(subStr));        lastIndex = re.lastIndex;        uri = /^(http(s)?:\/\/|\/)/.test(match[0]) ? match[0] : 'http://' + match[0];        $link = $("<a href=\"" + uri + "\" rel=\"nofollow\"></a>").text(match[0]);        replaceEls.push($link[0]);      }      replaceEls.push(document.createTextNode(text.substring(lastIndex)));      $node.replaceWith($(replaceEls));    }    return $el;  };  Formatter.prototype.format = function($el) {    var $node, blockNode, k, l, len, len1, n, node, ref, ref1;    if ($el == null) {      $el = this.editor.body;    }    if ($el.is(':empty')) {      $el.append('<p>' + this.editor.util.phBr + '</p>');      return $el;    }    ref = $el.contents();    for (k = 0, len = ref.length; k < len; k++) {      n = ref[k];      this.cleanNode(n, true);    }    ref1 = $el.contents();    for (l = 0, len1 = ref1.length; l < len1; l++) {      node = ref1[l];      $node = $(node);      if ($node.is('br')) {        if (typeof blockNode !== "undefined" && blockNode !== null) {          blockNode = null;        }        $node.remove();      } else if (this.editor.util.isBlockNode(node)) {        if ($node.is('li')) {          if (blockNode && blockNode.is('ul, ol')) {            blockNode.append(node);          } else {            blockNode = $('<ul/>').insertBefore(node);            blockNode.append(node);          }        } else {          blockNode = null;        }      } else {        if (!blockNode || blockNode.is('ul, ol')) {          blockNode = $('<p/>').insertBefore(node);        }        blockNode.append(node);        if (this.editor.util.isEmptyNode(blockNode)) {          blockNode.append(this.editor.util.phBr);        }      }    }    return $el;  };  Formatter.prototype.cleanNode = function(node, recursive) {    var $blockEls, $childImg, $node, $p, $td, allowedAttributes, attr, contents, isDecoration, k, l, len, len1, n, ref, ref1, text, textNode;    $node = $(node);    if (!($node.length > 0)) {      return;    }    if ($node[0].nodeType === 3) {      text = $node.text().replace(/(\r\n|\n|\r)/gm, '');      if (text) {        textNode = document.createTextNode(text);        $node.replaceWith(textNode);      } else {        $node.remove();      }      return;    }    contents = $node.is('iframe') ? null : $node.contents();    isDecoration = this.editor.util.isDecoratedNode($node);    if ($node.is(this._allowedTags.join(',')) || isDecoration) {      if ($node.is('a') && ($childImg = $node.find('img')).length > 0) {        $node.replaceWith($childImg);        $node = $childImg;        contents = null;      }      if ($node.is('td') && ($blockEls = $node.find(this.editor.util.blockNodes.join(','))).length > 0) {        $blockEls.each((function(_this) {          return function(i, blockEl) {            return $(blockEl).contents().unwrap();          };        })(this));        contents = $node.contents();      }      if ($node.is('img') && $node.hasClass('uploading')) {        $node.remove();      }      if (!isDecoration) {        allowedAttributes = this._allowedAttributes[$node[0].tagName.toLowerCase()];        ref = $.makeArray($node[0].attributes);        for (k = 0, len = ref.length; k < len; k++) {          attr = ref[k];          if (attr.name === 'style') {            continue;          }          if (!((allowedAttributes != null) && (ref1 = attr.name, indexOf.call(allowedAttributes, ref1) >= 0))) {            $node.removeAttr(attr.name);          }        }        this._cleanNodeStyles($node);        if ($node.is('span')) {          if ($node[0].attributes.length === 0) {            $node.contents().first().unwrap();          }          if ($node[0].style.length === 2 && $node[0].style.color === 'rgb(51, 51, 51)' && $node[0].style.fontSize === '16px') {            $node.contents().unwrap();          }        }      }    } else if ($node[0].nodeType === 1 && !$node.is(':empty')) {      if ($node.is('div, article, dl, header, footer, tr')) {        $node.append('<br/>');        contents.first().unwrap();      } else if ($node.is('table')) {        $p = $('<p/>');        $node.find('tr').each(function(i, tr) {          return $p.append($(tr).text() + '<br/>');        });        $node.replaceWith($p);        contents = null;      } else if ($node.is('thead, tfoot')) {        $node.remove();        contents = null;      } else if ($node.is('th')) {        $td = $('<td/>').append($node.contents());        $node.replaceWith($td);      } else {        contents.first().unwrap();      }    } else {      $node.remove();      contents = null;    }    if (recursive && (contents != null) && !$node.is('pre')) {      for (l = 0, len1 = contents.length; l < len1; l++) {        n = contents[l];        this.cleanNode(n, true);      }    }    return null;  };  Formatter.prototype._cleanNodeStyles = function($node) {    var allowedStyles, k, len, pair, ref, ref1, style, styleStr, styles;    styleStr = $node.attr('style');    if (!styleStr) {      return;    }    $node.removeAttr('style');    allowedStyles = this._allowedStyles[$node[0].tagName.toLowerCase()];    if (!(allowedStyles && allowedStyles.length > 0)) {      return $node;    }    styles = {};    ref = styleStr.split(';');    for (k = 0, len = ref.length; k < len; k++) {      style = ref[k];      style = $.trim(style);      pair = style.split(':');      if (pair.length !== 2) {        continue;      }      if (pair[0] === 'font-size' && pair[1].indexOf('px') > 0) {        if (parseInt(pair[1], 10) < 12) {          continue;        }      }      if (ref1 = pair[0], indexOf.call(allowedStyles, ref1) >= 0) {        styles[$.trim(pair[0])] = $.trim(pair[1]);      }    }    if (Object.keys(styles).length > 0) {      $node.css(styles);    }    return $node;  };  Formatter.prototype.clearHtml = function(html, lineBreak) {    var container, contents, result;    if (lineBreak == null) {      lineBreak = true;    }    container = $('<div/>').append(html);    contents = container.contents();    result = '';    contents.each((function(_this) {      return function(i, node) {        var $node, children;        if (node.nodeType === 3) {          return result += node.nodeValue;        } else if (node.nodeType === 1) {          $node = $(node);          children = $node.is('iframe') ? null : $node.contents();          if (children && children.length > 0) {            result += _this.clearHtml(children);          }          if (lineBreak && i < contents.length - 1 && $node.is('br, p, div, li,tr, pre, address, artticle, aside, dl, figcaption, footer, h1, h2,h3, h4, header')) {            return result += '\n';          }        }      };    })(this));    return result;  };  Formatter.prototype.beautify = function($contents) {    var uselessP;    uselessP = function($el) {      return !!($el.is('p') && !$el.text() && $el.children(':not(br)').length < 1);    };    return $contents.each(function(i, el) {      var $el, invalid;      $el = $(el);      invalid = $el.is(':not(img, br, col, td, hr, [class^="simditor-"]):empty');      if (invalid || uselessP($el)) {        $el.remove();      }      return $el.find(':not(img, br, col, td, hr, [class^="simditor-"]):empty').remove();    });  };  return Formatter;})(SimpleModule);InputManager = (function(superClass) {  extend(InputManager, superClass);  function InputManager() {    return InputManager.__super__.constructor.apply(this, arguments);  }  InputManager.pluginName = 'InputManager';  InputManager.prototype._modifierKeys = [16, 17, 18, 91, 93, 224];  InputManager.prototype._arrowKeys = [37, 38, 39, 40];  InputManager.prototype._init = function() {    var selectAllKey, submitKey;    this.editor = this._module;    this.throttledValueChanged = this.editor.util.throttle((function(_this) {      return function(params) {        return setTimeout(function() {          return _this.editor.trigger('valuechanged', params);        }, 10);      };    })(this), 300);    this.throttledSelectionChanged = this.editor.util.throttle((function(_this) {      return function() {        return _this.editor.trigger('selectionchanged');      };    })(this), 50);    $(document).on('selectionchange.simditor' + this.editor.id, (function(_this) {      return function(e) {        var triggerEvent;        if (!(_this.focused && !_this.editor.clipboard.pasting)) {          return;        }        triggerEvent = function() {          if (_this._selectionTimer) {            clearTimeout(_this._selectionTimer);            _this._selectionTimer = null;          }          if (_this.editor.selection._selection.rangeCount > 0) {            return _this.throttledSelectionChanged();          } else {            return _this._selectionTimer = setTimeout(function() {              _this._selectionTimer = null;              if (_this.focused) {                return triggerEvent();              }            }, 10);          }        };        return triggerEvent();      };    })(this));    this.editor.on('valuechanged', (function(_this) {      return function() {        var $rootBlocks;        _this.lastCaretPosition = null;        $rootBlocks = _this.editor.body.children().filter(function(i, node) {          return _this.editor.util.isBlockNode(node);        });        if (_this.focused && $rootBlocks.length === 0) {          _this.editor.selection.save();          _this.editor.formatter.format();          _this.editor.selection.restore();        }        _this.editor.body.find('hr, pre, .simditor-table').each(function(i, el) {          var $el, formatted;          $el = $(el);          if ($el.parent().is('blockquote') || $el.parent()[0] === _this.editor.body[0]) {            formatted = false;            if ($el.next().length === 0) {              $('<p/>').append(_this.editor.util.phBr).insertAfter($el);              formatted = true;            }            if ($el.prev().length === 0) {              $('<p/>').append(_this.editor.util.phBr).insertBefore($el);              formatted = true;            }            if (formatted) {              return _this.throttledValueChanged();            }          }        });        _this.editor.body.find('pre:empty').append(_this.editor.util.phBr);        if (!_this.editor.util.support.onselectionchange && _this.focused) {          return _this.throttledSelectionChanged();        }      };    })(this));    this.editor.body.on('keydown', $.proxy(this._onKeyDown, this)).on('keypress', $.proxy(this._onKeyPress, this)).on('keyup', $.proxy(this._onKeyUp, this)).on('mouseup', $.proxy(this._onMouseUp, this)).on('focus', $.proxy(this._onFocus, this)).on('blur', $.proxy(this._onBlur, this)).on('drop', $.proxy(this._onDrop, this)).on('input', $.proxy(this._onInput, this));    if (this.editor.util.browser.firefox) {      this.editor.hotkeys.add('cmd+left', (function(_this) {        return function(e) {          e.preventDefault();          _this.editor.selection._selection.modify('move', 'backward', 'lineboundary');          return false;        };      })(this));      this.editor.hotkeys.add('cmd+right', (function(_this) {        return function(e) {          e.preventDefault();          _this.editor.selection._selection.modify('move', 'forward', 'lineboundary');          return false;        };      })(this));      selectAllKey = this.editor.util.os.mac ? 'cmd+a' : 'ctrl+a';      this.editor.hotkeys.add(selectAllKey, (function(_this) {        return function(e) {          var $children, firstBlock, lastBlock, range;          $children = _this.editor.body.children();          if (!($children.length > 0)) {            return;          }          firstBlock = $children.first().get(0);          lastBlock = $children.last().get(0);          range = document.createRange();          range.setStart(firstBlock, 0);          range.setEnd(lastBlock, _this.editor.util.getNodeLength(lastBlock));          _this.editor.selection.range(range);          return false;        };      })(this));    }    submitKey = this.editor.util.os.mac ? 'cmd+enter' : 'ctrl+enter';    return this.editor.hotkeys.add(submitKey, (function(_this) {      return function(e) {        _this.editor.el.closest('form').find('button:submit').click();        return false;      };    })(this));  };  InputManager.prototype._onFocus = function(e) {    if (this.editor.clipboard.pasting) {      return;    }    this.editor.el.addClass('focus').removeClass('error');    this.focused = true;    return setTimeout((function(_this) {      return function() {        var $blockEl, range;        range = _this.editor.selection._selection.getRangeAt(0);        if (range.startContainer === _this.editor.body[0]) {          if (_this.lastCaretPosition) {            _this.editor.undoManager.caretPosition(_this.lastCaretPosition);          } else {            $blockEl = _this.editor.body.children().first();            range = document.createRange();            _this.editor.selection.setRangeAtStartOf($blockEl, range);          }        }        _this.lastCaretPosition = null;        _this.editor.triggerHandler('focus');        if (!_this.editor.util.support.onselectionchange) {          return _this.throttledSelectionChanged();        }      };    })(this), 0);  };  InputManager.prototype._onBlur = function(e) {    var ref;    if (this.editor.clipboard.pasting) {      return;    }    this.editor.el.removeClass('focus');    this.editor.sync();    this.focused = false;    this.lastCaretPosition = (ref = this.editor.undoManager.currentState()) != null ? ref.caret : void 0;    return this.editor.triggerHandler('blur');  };  InputManager.prototype._onMouseUp = function(e) {    if (!this.editor.util.support.onselectionchange) {      return this.throttledSelectionChanged();    }  };  InputManager.prototype._onKeyDown = function(e) {    var ref, ref1;    if (this.editor.triggerHandler(e) === false) {      return false;    }    if (this.editor.hotkeys.respondTo(e)) {      return;    }    if (this.editor.keystroke.respondTo(e)) {      this.throttledValueChanged();      return false;    }    if ((ref = e.which, indexOf.call(this._modifierKeys, ref) >= 0) || (ref1 = e.which, indexOf.call(this._arrowKeys, ref1) >= 0)) {      return;    }    if (this.editor.util.metaKey(e) && e.which === 86) {      return;    }    if (!this.editor.util.support.oninput) {      this.throttledValueChanged(['typing']);    }    return null;  };  InputManager.prototype._onKeyPress = function(e) {    if (this.editor.triggerHandler(e) === false) {      return false;    }  };  InputManager.prototype._onKeyUp = function(e) {    var p, ref;    if (this.editor.triggerHandler(e) === false) {      return false;    }    if (!this.editor.util.support.onselectionchange && (ref = e.which, indexOf.call(this._arrowKeys, ref) >= 0)) {      this.throttledValueChanged();      return;    }    if ((e.which === 8 || e.which === 46) && this.editor.util.isEmptyNode(this.editor.body)) {      this.editor.body.empty();      p = $('<p/>').append(this.editor.util.phBr).appendTo(this.editor.body);      this.editor.selection.setRangeAtStartOf(p);    }  };  InputManager.prototype._onDrop = function(e) {    if (this.editor.triggerHandler(e) === false) {      return false;    }    return this.throttledValueChanged();  };  InputManager.prototype._onInput = function(e) {    return this.throttledValueChanged(['oninput']);  };  return InputManager;})(SimpleModule);Keystroke = (function(superClass) {  extend(Keystroke, superClass);  function Keystroke() {    return Keystroke.__super__.constructor.apply(this, arguments);  }  Keystroke.pluginName = 'Keystroke';  Keystroke.prototype._init = function() {    this.editor = this._module;    this._keystrokeHandlers = {};    return this._initKeystrokeHandlers();  };  Keystroke.prototype.add = function(key, node, handler) {    key = key.toLowerCase();    key = this.editor.hotkeys.constructor.aliases[key] || key;    if (!this._keystrokeHandlers[key]) {      this._keystrokeHandlers[key] = {};    }    return this._keystrokeHandlers[key][node] = handler;  };  Keystroke.prototype.respondTo = function(e) {    var base, key, ref, result;    key = (ref = this.editor.hotkeys.constructor.keyNameMap[e.which]) != null ? ref.toLowerCase() : void 0;    if (!key) {      return;    }    if (key in this._keystrokeHandlers) {      result = typeof (base = this._keystrokeHandlers[key])['*'] === "function" ? base['*'](e) : void 0;      if (!result) {        this.editor.selection.startNodes().each((function(_this) {          return function(i, node) {            var handler, ref1;            if (node.nodeType !== Node.ELEMENT_NODE) {              return;            }            handler = (ref1 = _this._keystrokeHandlers[key]) != null ? ref1[node.tagName.toLowerCase()] : void 0;            result = typeof handler === "function" ? handler(e, $(node)) : void 0;            if (result === true || result === false) {              return false;            }          };        })(this));      }      if (result) {        return true;      }    }  };  Keystroke.prototype._initKeystrokeHandlers = function() {    var titleEnterHandler;    if (this.editor.util.browser.safari) {      this.add('enter', '*', (function(_this) {        return function(e) {          var $blockEl, $br;          if (!e.shiftKey) {            return;          }          $blockEl = _this.editor.selection.blockNodes().last();          if ($blockEl.is('pre')) {            return;          }          $br = $('<br/>');          if (_this.editor.selection.rangeAtEndOf($blockEl)) {            _this.editor.selection.insertNode($br);            _this.editor.selection.insertNode($('<br/>'));            _this.editor.selection.setRangeBefore($br);          } else {            _this.editor.selection.insertNode($br);          }          return true;        };      })(this));    }    if (this.editor.util.browser.webkit || this.editor.util.browser.msie) {      titleEnterHandler = (function(_this) {        return function(e, $node) {          var $p;          if (!_this.editor.selection.rangeAtEndOf($node)) {            return;          }          $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);          _this.editor.selection.setRangeAtStartOf($p);          return true;        };      })(this);      this.add('enter', 'h1', titleEnterHandler);      this.add('enter', 'h2', titleEnterHandler);      this.add('enter', 'h3', titleEnterHandler);      this.add('enter', 'h4', titleEnterHandler);      this.add('enter', 'h5', titleEnterHandler);      this.add('enter', 'h6', titleEnterHandler);    }    this.add('backspace', '*', (function(_this) {      return function(e) {        var $blockEl, $prevBlockEl, $rootBlock, isWebkit;        $rootBlock = _this.editor.selection.rootNodes().first();        $prevBlockEl = $rootBlock.prev();        if ($prevBlockEl.is('hr') && _this.editor.selection.rangeAtStartOf($rootBlock)) {          _this.editor.selection.save();          $prevBlockEl.remove();          _this.editor.selection.restore();          return true;        }        $blockEl = _this.editor.selection.blockNodes().last();        if ($blockEl.is('.simditor-resize-handle') && $rootBlock.is('.simditor-table')) {          e.preventDefault();          $rootBlock.remove();          _this.editor.selection.setRangeAtEndOf($prevBlockEl);        }        if ($prevBlockEl.is('.simditor-table') && !$blockEl.is('table') && _this.editor.util.isEmptyNode($blockEl)) {          e.preventDefault();          $blockEl.remove();          _this.editor.selection.setRangeAtEndOf($prevBlockEl);        }        isWebkit = _this.editor.util.browser.webkit;        if (isWebkit && _this.editor.selection.rangeAtStartOf($blockEl)) {          _this.editor.selection.save();          _this.editor.formatter.cleanNode($blockEl, true);          _this.editor.selection.restore();          return null;        }      };    })(this));    this.add('enter', 'div', (function(_this) {      return function(e, $node) {        var $blockEl, $p;        if ($node.is('.simditor-table')) {          $blockEl = _this.editor.selection.blockNodes().last();          if ($blockEl.is('.simditor-resize-handle')) {            e.preventDefault();            $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);            return _this.editor.selection.setRangeAtStartOf($p);          }        }      };    })(this));    this.add('enter', 'li', (function(_this) {      return function(e, $node) {        var $cloneNode, listEl, newBlockEl, newListEl;        $cloneNode = $node.clone();        $cloneNode.find('ul, ol').remove();        if (!(_this.editor.util.isEmptyNode($cloneNode) && $node.is(_this.editor.selection.blockNodes().last()))) {          return;        }        listEl = $node.parent();        if ($node.next('li').length > 0) {          if (!_this.editor.util.isEmptyNode($node)) {            return;          }          if (listEl.parent('li').length > 0) {            newBlockEl = $('<li/>').append(_this.editor.util.phBr).insertAfter(listEl.parent('li'));            newListEl = $('<' + listEl[0].tagName + '/>').append($node.nextAll('li'));            newBlockEl.append(newListEl);          } else {            newBlockEl = $('<p/>').append(_this.editor.util.phBr).insertAfter(listEl);            newListEl = $('<' + listEl[0].tagName + '/>').append($node.nextAll('li'));            newBlockEl.after(newListEl);          }        } else {          if (listEl.parent('li').length > 0) {            newBlockEl = $('<li/>').insertAfter(listEl.parent('li'));            if ($node.contents().length > 0) {              newBlockEl.append($node.contents());            } else {              newBlockEl.append(_this.editor.util.phBr);            }          } else {            newBlockEl = $('<p/>').append(_this.editor.util.phBr).insertAfter(listEl);            if ($node.children('ul, ol').length > 0) {              newBlockEl.after($node.children('ul, ol'));            }          }        }        if ($node.prev('li').length) {          $node.remove();        } else {          if ($node.prev('ul').length || $node.prev('ol').length) {            $node.remove();          } else {            listEl.remove();          }        }        _this.editor.selection.setRangeAtStartOf(newBlockEl);        return true;      };    })(this));    this.add('enter', 'pre', (function(_this) {      return function(e, $node) {        var $p, breakNode, range;        e.preventDefault();        if (e.shiftKey) {          $p = $('<p/>').append(_this.editor.util.phBr).insertAfter($node);          _this.editor.selection.setRangeAtStartOf($p);          return true;        }        range = _this.editor.selection.range();        breakNode = null;        range.deleteContents();        if (!_this.editor.util.browser.msie && _this.editor.selection.rangeAtEndOf($node)) {          breakNode = document.createTextNode('\n\n');          range.insertNode(breakNode);          range.setEnd(breakNode, 1);        } else {          breakNode = document.createTextNode('\n');          range.insertNode(breakNode);          range.setStartAfter(breakNode);        }        range.collapse(false);        _this.editor.selection.range(range);        return true;      };    })(this));    this.add('enter', 'blockquote', (function(_this) {      return function(e, $node) {        var $closestBlock, range;        $closestBlock = _this.editor.selection.blockNodes().last();        if (!($closestBlock.is('p') && !$closestBlock.next().length && _this.editor.util.isEmptyNode($closestBlock))) {          return;        }        $node.after($closestBlock);        range = document.createRange();        _this.editor.selection.setRangeAtStartOf($closestBlock, range);        return true;      };    })(this));    this.add('backspace', 'li', (function(_this) {      return function(e, $node) {        var $br, $childList, $newLi, $prevChildList, $prevNode, $textNode, isFF, range, text;        $childList = $node.children('ul, ol');        $prevNode = $node.prev('li');        if (!($childList.length > 0 && $prevNode.length > 0)) {          return false;        }        text = '';        $textNode = null;        $node.contents().each(function(i, n) {          if (n.nodeType === 1 && /UL|OL/.test(n.nodeName)) {            return false;          }          if (n.nodeType === 1 && /BR/.test(n.nodeName)) {            return;          }          if (n.nodeType === 3 && n.nodeValue) {            text += n.nodeValue;          } else if (n.nodeType === 1) {            text += $(n).text();          }          return $textNode = $(n);        });        isFF = _this.editor.util.browser.firefox && !$textNode.next('br').length;        if ($textNode && text.length === 1 && isFF) {          $br = $(_this.editor.util.phBr).insertAfter($textNode);          $textNode.remove();          _this.editor.selection.setRangeBefore($br);          return true;        } else if (text.length > 0) {          return false;        }        range = document.createRange();        $prevChildList = $prevNode.children('ul, ol');        if ($prevChildList.length > 0) {          $newLi = $('<li/>').append(_this.editor.util.phBr).appendTo($prevChildList);          $prevChildList.append($childList.children('li'));          $node.remove();          _this.editor.selection.setRangeAtEndOf($newLi, range);        } else {          _this.editor.selection.setRangeAtEndOf($prevNode, range);          $prevNode.append($childList);          $node.remove();          _this.editor.selection.range(range);        }        return true;      };    })(this));    this.add('backspace', 'pre', (function(_this) {      return function(e, $node) {        var $newNode, codeStr, range;        if (!_this.editor.selection.rangeAtStartOf($node)) {          return;        }        codeStr = $node.html().replace('\n', '<br/>') || _this.editor.util.phBr;        $newNode = $('<p/>').append(codeStr).insertAfter($node);        $node.remove();        range = document.createRange();        _this.editor.selection.setRangeAtStartOf($newNode, range);        return true;      };    })(this));    return this.add('backspace', 'blockquote', (function(_this) {      return function(e, $node) {        var $firstChild, range;        if (!_this.editor.selection.rangeAtStartOf($node)) {          return;        }        $firstChild = $node.children().first().unwrap();        range = document.createRange();        _this.editor.selection.setRangeAtStartOf($firstChild, range);        return true;      };    })(this));  };  return Keystroke;})(SimpleModule);UndoManager = (function(superClass) {  extend(UndoManager, superClass);  function UndoManager() {    return UndoManager.__super__.constructor.apply(this, arguments);  }  UndoManager.pluginName = 'UndoManager';  UndoManager.prototype._index = -1;  UndoManager.prototype._capacity = 20;  UndoManager.prototype._startPosition = null;  UndoManager.prototype._endPosition = null;  UndoManager.prototype._init = function() {    var redoShortcut, undoShortcut;    this.editor = this._module;    this._stack = [];    if (this.editor.util.os.mac) {      undoShortcut = 'cmd+z';      redoShortcut = 'shift+cmd+z';    } else if (this.editor.util.os.win) {      undoShortcut = 'ctrl+z';      redoShortcut = 'ctrl+y';    } else {      undoShortcut = 'ctrl+z';      redoShortcut = 'shift+ctrl+z';    }    this.editor.hotkeys.add(undoShortcut, (function(_this) {      return function(e) {        e.preventDefault();        _this.undo();        return false;      };    })(this));    this.editor.hotkeys.add(redoShortcut, (function(_this) {      return function(e) {        e.preventDefault();        _this.redo();        return false;      };    })(this));    this.throttledPushState = this.editor.util.throttle((function(_this) {      return function() {        return _this._pushUndoState();      };    })(this), 2000);    this.editor.on('valuechanged', (function(_this) {      return function(e, src) {        if (src === 'undo' || src === 'redo') {          return;        }        return _this.throttledPushState();      };    })(this));    this.editor.on('selectionchanged', (function(_this) {      return function(e) {        _this.resetCaretPosition();        return _this.update();      };    })(this));    this.editor.on('focus', (function(_this) {      return function(e) {        if (_this._stack.length === 0) {          return _this._pushUndoState();        }      };    })(this));    return this.editor.on('blur', (function(_this) {      return function(e) {        return _this.resetCaretPosition();      };    })(this));  };  UndoManager.prototype.resetCaretPosition = function() {    this._startPosition = null;    return this._endPosition = null;  };  UndoManager.prototype.startPosition = function() {    if (this.editor.selection._range) {      this._startPosition || (this._startPosition = this._getPosition('start'));    }    return this._startPosition;  };  UndoManager.prototype.endPosition = function() {    if (this.editor.selection._range) {      this._endPosition || (this._endPosition = (function(_this) {        return function() {          var range;          range = _this.editor.selection.range();          if (range.collapsed) {            return _this._startPosition;          }          return _this._getPosition('end');        };      })(this)());    }    return this._endPosition;  };  UndoManager.prototype._pushUndoState = function() {    var caret;    if (this.editor.triggerHandler('pushundostate') === false) {      return;    }    caret = this.caretPosition();    if (!caret.start) {      return;    }    this._index += 1;    this._stack.length = this._index;    this._stack.push({      html: this.editor.body.html(),      caret: this.caretPosition()    });    if (this._stack.length > this._capacity) {      this._stack.shift();      return this._index -= 1;    }  };  UndoManager.prototype.currentState = function() {    if (this._stack.length && this._index > -1) {      return this._stack[this._index];    } else {      return null;    }  };  UndoManager.prototype.undo = function() {    var state;    if (this._index < 1 || this._stack.length < 2) {      return;    }    this.editor.hidePopover();    this._index -= 1;    state = this._stack[this._index];    this.editor.body.get(0).innerHTML = state.html;    this.caretPosition(state.caret);    this.editor.body.find('.selected').removeClass('selected');    this.editor.sync();    return this.editor.trigger('valuechanged', ['undo']);  };  UndoManager.prototype.redo = function() {    var state;    if (this._index < 0 || this._stack.length < this._index + 2) {      return;    }    this.editor.hidePopover();    this._index += 1;    state = this._stack[this._index];    this.editor.body.get(0).innerHTML = state.html;    this.caretPosition(state.caret);    this.editor.body.find('.selected').removeClass('selected');    this.editor.sync();    return this.editor.trigger('valuechanged', ['redo']);  };  UndoManager.prototype.update = function() {    var currentState;    currentState = this.currentState();    if (!currentState) {      return;    }    currentState.html = this.editor.body.html();    return currentState.caret = this.caretPosition();  };  UndoManager.prototype._getNodeOffset = function(node, index) {    var $parent, merging, offset;    if ($.isNumeric(index)) {      $parent = $(node);    } else {      $parent = $(node).parent();    }    offset = 0;    merging = false;    $parent.contents().each(function(i, child) {      if (node === child || (index === i && i === 0)) {        return false;      }      if (child.nodeType === Node.TEXT_NODE) {        if (!merging && child.nodeValue.length > 0) {          offset += 1;          merging = true;        }      } else {        offset += 1;        merging = false;      }      if (index - 1 === i) {        return false;      }      return null;    });    return offset;  };  UndoManager.prototype._getPosition = function(type) {    var $nodes, node, nodes, offset, position, prevNode, range;    if (type == null) {      type = 'start';    }    range = this.editor.selection.range();    offset = range[type + "Offset"];    $nodes = this.editor.selection[type + "Nodes"]();    node = $nodes.first()[0];    if (node.nodeType === Node.TEXT_NODE) {      prevNode = node.previousSibling;      while (prevNode && prevNode.nodeType === Node.TEXT_NODE) {        node = prevNode;        offset += this.editor.util.getNodeLength(prevNode);        prevNode = prevNode.previousSibling;      }      nodes = $nodes.get();      nodes[0] = node;      $nodes = $(nodes);    } else {      offset = this._getNodeOffset(node, offset);    }    position = [offset];    $nodes.each((function(_this) {      return function(i, node) {        return position.unshift(_this._getNodeOffset(node));      };    })(this));    return position;  };  UndoManager.prototype._getNodeByPosition = function(position) {    var child, childNodes, i, k, len, node, offset, ref;    node = this.editor.body[0];    ref = position.slice(0, position.length - 1);    for (i = k = 0, len = ref.length; k < len; i = ++k) {      offset = ref[i];      childNodes = node.childNodes;      if (offset > childNodes.length - 1) {        if (i === position.length - 2 && $(node).is('pre:empty')) {          child = document.createTextNode('');          node.appendChild(child);          childNodes = node.childNodes;        } else {          node = null;          break;        }      }      node = childNodes[offset];    }    return node;  };  UndoManager.prototype.caretPosition = function(caret) {    var endContainer, endOffset, range, startContainer, startOffset;    if (!caret) {      range = this.editor.selection.range();      caret = this.editor.inputManager.focused && (range != null) ? {        start: this.startPosition(),        end: this.endPosition(),        collapsed: range.collapsed      } : {};      return caret;    } else {      if (!caret.start) {        return;      }      startContainer = this._getNodeByPosition(caret.start);      startOffset = caret.start[caret.start.length - 1];      if (caret.collapsed) {        endContainer = startContainer;        endOffset = startOffset;      } else {        endContainer = this._getNodeByPosition(caret.end);        endOffset = caret.start[caret.start.length - 1];      }      if (!startContainer || !endContainer) {        if (typeof console !== "undefined" && console !== null) {          if (typeof console.warn === "function") {            console.warn('simditor: invalid caret state');          }        }        return;      }      range = document.createRange();      range.setStart(startContainer, startOffset);      range.setEnd(endContainer, endOffset);      return this.editor.selection.range(range);    }  };  return UndoManager;})(SimpleModule);Util = (function(superClass) {  extend(Util, superClass);  function Util() {    return Util.__super__.constructor.apply(this, arguments);  }  Util.pluginName = 'Util';  Util.prototype._init = function() {    this.editor = this._module;    if (this.browser.msie && this.browser.version < 11) {      return this.phBr = '';    }  };  Util.prototype.phBr = '<br/>';  Util.prototype.os = (function() {    var os;    os = {};    if (/Mac/.test(navigator.appVersion)) {      os.mac = true;    } else if (/Linux/.test(navigator.appVersion)) {      os.linux = true;    } else if (/Win/.test(navigator.appVersion)) {      os.win = true;    } else if (/X11/.test(navigator.appVersion)) {      os.unix = true;    }    if (/Mobi/.test(navigator.appVersion)) {      os.mobile = true;    }    return os;  })();  Util.prototype.browser = (function() {    var chrome, edge, firefox, ie, ref, ref1, ref2, ref3, ref4, safari, ua;    ua = navigator.userAgent;    ie = /(msie|trident)/i.test(ua);    chrome = /chrome|crios/i.test(ua);    safari = /safari/i.test(ua) && !chrome;    firefox = /firefox/i.test(ua);    edge = /edge/i.test(ua);    if (ie) {      return {        msie: true,        version: ((ref = ua.match(/(msie |rv:)(\d+(\.\d+)?)/i)) != null ? ref[2] : void 0) * 1      };    } else if (edge) {      return {        edge: true,        webkit: true,        version: ((ref1 = ua.match(/edge\/(\d+(\.\d+)?)/i)) != null ? ref1[1] : void 0) * 1      };    } else if (chrome) {      return {        webkit: true,        chrome: true,        version: ((ref2 = ua.match(/(?:chrome|crios)\/(\d+(\.\d+)?)/i)) != null ? ref2[1] : void 0) * 1      };    } else if (safari) {      return {        webkit: true,        safari: true,        version: ((ref3 = ua.match(/version\/(\d+(\.\d+)?)/i)) != null ? ref3[1] : void 0) * 1      };    } else if (firefox) {      return {        mozilla: true,        firefox: true,        version: ((ref4 = ua.match(/firefox\/(\d+(\.\d+)?)/i)) != null ? ref4[1] : void 0) * 1      };    } else {      return {};    }  })();  Util.prototype.support = (function() {    return {      onselectionchange: (function() {        var e, onselectionchange;        onselectionchange = document.onselectionchange;        if (onselectionchange !== void 0) {          try {            document.onselectionchange = 0;            return document.onselectionchange === null;          } catch (_error) {            e = _error;          } finally {            document.onselectionchange = onselectionchange;          }        }        return false;      })(),      oninput: (function() {        return !/(msie|trident)/i.test(navigator.userAgent);      })()    };  })();  Util.prototype.reflow = function(el) {    if (el == null) {      el = document;    }    return $(el)[0].offsetHeight;  };  Util.prototype.metaKey = function(e) {    var isMac;    isMac = /Mac/.test(navigator.userAgent);    if (isMac) {      return e.metaKey;    } else {      return e.ctrlKey;    }  };  Util.prototype.isEmptyNode = function(node) {    var $node;    $node = $(node);    return $node.is(':empty') || (!$node.text() && !$node.find(':not(br, span, div)').length);  };  Util.prototype.isDecoratedNode = function(node) {    return $(node).is('[class^="simditor-"]');  };  Util.prototype.blockNodes = ["div", "p", "ul", "ol", "li", "blockquote", "hr", "pre", "h1", "h2", "h3", "h4", "h5", "table"];  Util.prototype.isBlockNode = function(node) {    node = $(node)[0];    if (!node || node.nodeType === 3) {      return false;    }    return new RegExp("^(" + (this.blockNodes.join('|')) + ")$").test(node.nodeName.toLowerCase());  };  Util.prototype.getNodeLength = function(node) {    node = $(node)[0];    switch (node.nodeType) {      case 7:      case 10:        return 0;      case 3:      case 8:        return node.length;      default:        return node.childNodes.length;    }  };  Util.prototype.dataURLtoBlob = function(dataURL) {    var BlobBuilder, arrayBuffer, bb, blobArray, byteString, hasArrayBufferViewSupport, hasBlobConstructor, i, intArray, k, mimeString, ref, supportBlob;    hasBlobConstructor = window.Blob && (function() {      var e;      try {        return Boolean(new Blob());      } catch (_error) {        e = _error;        return false;      }    })();    hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && (function() {      var e;      try {        return new Blob([new Uint8Array(100)]).size === 100;      } catch (_error) {        e = _error;        return false;      }    })();    BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;    supportBlob = hasBlobConstructor || BlobBuilder;    if (!(supportBlob && window.atob && window.ArrayBuffer && window.Uint8Array)) {      return false;    }    if (dataURL.split(',')[0].indexOf('base64') >= 0) {      byteString = atob(dataURL.split(',')[1]);    } else {      byteString = decodeURIComponent(dataURL.split(',')[1]);    }    arrayBuffer = new ArrayBuffer(byteString.length);    intArray = new Uint8Array(arrayBuffer);    for (i = k = 0, ref = byteString.length; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {      intArray[i] = byteString.charCodeAt(i);    }    mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0];    if (hasBlobConstructor) {      blobArray = hasArrayBufferViewSupport ? intArray : arrayBuffer;      return new Blob([blobArray], {        type: mimeString      });    }    bb = new BlobBuilder();    bb.append(arrayBuffer);    return bb.getBlob(mimeString);  };  Util.prototype.throttle = function(func, wait) {    var args, call, ctx, last, rtn, throttled, timeoutID;    last = 0;    timeoutID = 0;    ctx = args = rtn = null;    call = function() {      timeoutID = 0;      last = +new Date();      rtn = func.apply(ctx, args);      ctx = null;      return args = null;    };    throttled = function() {      var delta;      ctx = this;      args = arguments;      delta = new Date() - last;      if (!timeoutID) {        if (delta >= wait) {          call();        } else {          timeoutID = setTimeout(call, wait - delta);        }      }      return rtn;    };    throttled.clear = function() {      if (!timeoutID) {        return;      }      clearTimeout(timeoutID);      return call();    };    return throttled;  };  Util.prototype.formatHTML = function(html) {    var cursor, indentString, lastMatch, level, match, re, repeatString, result, str;    re = /<(\/?)(.+?)(\/?)>/g;    result = '';    level = 0;    lastMatch = null;    indentString = '  ';    repeatString = function(str, n) {      return new Array(n + 1).join(str);    };    while ((match = re.exec(html)) !== null) {      match.isBlockNode = $.inArray(match[2], this.blockNodes) > -1;      match.isStartTag = match[1] !== '/' && match[3] !== '/';      match.isEndTag = match[1] === '/' || match[3] === '/';      cursor = lastMatch ? lastMatch.index + lastMatch[0].length : 0;      if ((str = html.substring(cursor, match.index)).length > 0 && $.trim(str)) {        result += str;      }      if (match.isBlockNode && match.isEndTag && !match.isStartTag) {        level -= 1;      }      if (match.isBlockNode && match.isStartTag) {        if (!(lastMatch && lastMatch.isBlockNode && lastMatch.isEndTag)) {          result += '\n';        }        result += repeatString(indentString, level);      }      result += match[0];      if (match.isBlockNode && match.isEndTag) {        result += '\n';      }      if (match.isBlockNode && match.isStartTag) {        level += 1;      }      lastMatch = match;    }    return $.trim(result);  };  return Util;})(SimpleModule);Toolbar = (function(superClass) {  extend(Toolbar, superClass);  function Toolbar() {    return Toolbar.__super__.constructor.apply(this, arguments);  }  Toolbar.pluginName = 'Toolbar';  Toolbar.prototype.opts = {    toolbar: true,    toolbarFloat: true,    toolbarHidden: false,    toolbarFloatOffset: 0  };  Toolbar.prototype._tpl = {    wrapper: '<div class="simditor-toolbar"><ul></ul></div>',    separator: '<li><span class="separator"></span></li>'  };  Toolbar.prototype._init = function() {    var floatInitialized, initToolbarFloat, toolbarHeight;    this.editor = this._module;    if (!this.opts.toolbar) {      return;    }    if (!$.isArray(this.opts.toolbar)) {      this.opts.toolbar = ['bold', 'italic', 'underline', 'strikethrough', '|', 'ol', 'ul', 'blockquote', 'code', '|', 'link', 'image', '|', 'indent', 'outdent'];    }    this._render();    this.list.on('click', function(e) {      return false;    });    this.wrapper.on('mousedown', (function(_this) {      return function(e) {        return _this.list.find('.menu-on').removeClass('.menu-on');      };    })(this));    $(document).on('mousedown.simditor' + this.editor.id, (function(_this) {      return function(e) {        return _this.list.find('.menu-on').removeClass('.menu-on');      };    })(this));    if (!this.opts.toolbarHidden && this.opts.toolbarFloat) {      this.wrapper.css('top', this.opts.toolbarFloatOffset);      toolbarHeight = 0;      initToolbarFloat = (function(_this) {        return function() {          _this.wrapper.css('position', 'static');          _this.wrapper.width('auto');          _this.editor.util.reflow(_this.wrapper);          _this.wrapper.width(_this.wrapper.outerWidth());          _this.wrapper.css('left', _this.editor.util.os.mobile ? _this.wrapper.position().left : _this.wrapper.offset().left);          _this.wrapper.css('position', '');          toolbarHeight = _this.wrapper.outerHeight();          _this.editor.placeholderEl.css('top', toolbarHeight);          return true;        };      })(this);      floatInitialized = null;      $(window).on('resize.simditor-' + this.editor.id, function(e) {        return floatInitialized = initToolbarFloat();      });      $(window).on('scroll.simditor-' + this.editor.id, (function(_this) {        return function(e) {          var bottomEdge, scrollTop, topEdge;          if (!_this.wrapper.is(':visible')) {            return;          }          topEdge = _this.editor.wrapper.offset().top;          bottomEdge = topEdge + _this.editor.wrapper.outerHeight() - 80;          scrollTop = $(document).scrollTop() + _this.opts.toolbarFloatOffset;          if (scrollTop <= topEdge || scrollTop >= bottomEdge) {            _this.editor.wrapper.removeClass('toolbar-floating').css('padding-top', '');            if (_this.editor.util.os.mobile) {              return _this.wrapper.css('top', _this.opts.toolbarFloatOffset);            }          } else {            floatInitialized || (floatInitialized = initToolbarFloat());            _this.editor.wrapper.addClass('toolbar-floating').css('padding-top', toolbarHeight);            if (_this.editor.util.os.mobile) {              return _this.wrapper.css('top', scrollTop - topEdge + _this.opts.toolbarFloatOffset);            }          }        };      })(this));    }    this.editor.on('destroy', (function(_this) {      return function() {        return _this.buttons.length = 0;      };    })(this));    return $(document).on("mousedown.simditor-" + this.editor.id, (function(_this) {      return function(e) {        return _this.list.find('li.menu-on').removeClass('menu-on');      };    })(this));  };  Toolbar.prototype._render = function() {    var k, len, name, ref;    this.buttons = [];    this.wrapper = $(this._tpl.wrapper).prependTo(this.editor.wrapper);    this.list = this.wrapper.find('ul');    ref = this.opts.toolbar;    for (k = 0, len = ref.length; k < len; k++) {      name = ref[k];      if (name === '|') {        $(this._tpl.separator).appendTo(this.list);        continue;      }      if (!this.constructor.buttons[name]) {        throw new Error("simditor: invalid toolbar button " + name);        continue;      }      this.buttons.push(new this.constructor.buttons[name]({        editor: this.editor      }));    }    if (this.opts.toolbarHidden) {      return this.wrapper.hide();    }  };  Toolbar.prototype.findButton = function(name) {    var button;    button = this.list.find('.toolbar-item-' + name).data('button');    return button != null ? button : null;  };  Toolbar.addButton = function(btn) {    return this.buttons[btn.prototype.name] = btn;  };  Toolbar.buttons = {};  return Toolbar;})(SimpleModule);Indentation = (function(superClass) {  extend(Indentation, superClass);  function Indentation() {    return Indentation.__super__.constructor.apply(this, arguments);  }  Indentation.pluginName = 'Indentation';  Indentation.prototype.opts = {    tabIndent: true  };  Indentation.prototype._init = function() {    this.editor = this._module;    return this.editor.keystroke.add('tab', '*', (function(_this) {      return function(e) {        var codeButton;        codeButton = _this.editor.toolbar.findButton('code');        if (!(_this.opts.tabIndent || (codeButton && codeButton.active))) {          return;        }        return _this.indent(e.shiftKey);      };    })(this));  };  Indentation.prototype.indent = function(isBackward) {    var $blockNodes, $endNodes, $startNodes, nodes, result;    $startNodes = this.editor.selection.startNodes();    $endNodes = this.editor.selection.endNodes();    $blockNodes = this.editor.selection.blockNodes();    nodes = [];    $blockNodes = $blockNodes.each(function(i, node) {      var include, j, k, len, n;      include = true;      for (j = k = 0, len = nodes.length; k < len; j = ++k) {        n = nodes[j];        if ($.contains(node, n)) {          include = false;          break;        } else if ($.contains(n, node)) {          nodes.splice(j, 1, node);          include = false;          break;        }      }      if (include) {        return nodes.push(node);      }    });    $blockNodes = $(nodes);    result = false;    $blockNodes.each((function(_this) {      return function(i, blockEl) {        var r;        r = isBackward ? _this.outdentBlock(blockEl) : _this.indentBlock(blockEl);        if (r) {          return result = r;        }      };    })(this));    return result;  };  Indentation.prototype.indentBlock = function(blockEl) {    var $blockEl, $childList, $nextTd, $nextTr, $parentLi, $pre, $td, $tr, marginLeft, tagName;    $blockEl = $(blockEl);    if (!$blockEl.length) {      return;    }    if ($blockEl.is('pre')) {      $pre = this.editor.selection.containerNode();      if (!($pre.is($blockEl) || $pre.closest('pre').is($blockEl))) {        return;      }      this.indentText(this.editor.selection.range());    } else if ($blockEl.is('li')) {      $parentLi = $blockEl.prev('li');      if ($parentLi.length < 1) {        return;      }      this.editor.selection.save();      tagName = $blockEl.parent()[0].tagName;      $childList = $parentLi.children('ul, ol');      if ($childList.length > 0) {        $childList.append($blockEl);      } else {        $('<' + tagName + '/>').append($blockEl).appendTo($parentLi);      }      this.editor.selection.restore();    } else if ($blockEl.is('p, h1, h2, h3, h4')) {      marginLeft = parseInt($blockEl.css('margin-left')) || 0;      marginLeft = (Math.round(marginLeft / this.opts.indentWidth) + 1) * this.opts.indentWidth;      $blockEl.css('margin-left', marginLeft);    } else if ($blockEl.is('table') || $blockEl.is('.simditor-table')) {      $td = this.editor.selection.containerNode().closest('td, th');      $nextTd = $td.next('td, th');      if (!($nextTd.length > 0)) {        $tr = $td.parent('tr');        $nextTr = $tr.next('tr');        if ($nextTr.length < 1 && $tr.parent().is('thead')) {          $nextTr = $tr.parent('thead').next('tbody').find('tr:first');        }        $nextTd = $nextTr.find('td:first, th:first');      }      if (!($td.length > 0 && $nextTd.length > 0)) {        return;      }      this.editor.selection.setRangeAtEndOf($nextTd);    } else {      return false;    }    return true;  };  Indentation.prototype.indentText = function(range) {    var text, textNode;    text = range.toString().replace(/^(?=.+)/mg, '\u00A0\u00A0');    textNode = document.createTextNode(text || '\u00A0\u00A0');    range.deleteContents();    range.insertNode(textNode);    if (text) {      range.selectNode(textNode);      return this.editor.selection.range(range);    } else {      return this.editor.selection.setRangeAfter(textNode);    }  };  Indentation.prototype.outdentBlock = function(blockEl) {    var $blockEl, $parent, $parentLi, $pre, $prevTd, $prevTr, $td, $tr, marginLeft, range;    $blockEl = $(blockEl);    if (!($blockEl && $blockEl.length > 0)) {      return;    }    if ($blockEl.is('pre')) {      $pre = this.editor.selection.containerNode();      if (!($pre.is($blockEl) || $pre.closest('pre').is($blockEl))) {        return;      }      this.outdentText(range);    } else if ($blockEl.is('li')) {      $parent = $blockEl.parent();      $parentLi = $parent.parent('li');      this.editor.selection.save();      if ($parentLi.length < 1) {        range = document.createRange();        range.setStartBefore($parent[0]);        range.setEndBefore($blockEl[0]);        $parent.before(range.extractContents());        $('<p/>').insertBefore($parent).after($blockEl.children('ul, ol')).append($blockEl.contents());        $blockEl.remove();      } else {        if ($blockEl.next('li').length > 0) {          $('<' + $parent[0].tagName + '/>').append($blockEl.nextAll('li')).appendTo($blockEl);        }        $blockEl.insertAfter($parentLi);        if ($parent.children('li').length < 1) {          $parent.remove();        }      }      this.editor.selection.restore();    } else if ($blockEl.is('p, h1, h2, h3, h4')) {      marginLeft = parseInt($blockEl.css('margin-left')) || 0;      marginLeft = Math.max(Math.round(marginLeft / this.opts.indentWidth) - 1, 0) * this.opts.indentWidth;      $blockEl.css('margin-left', marginLeft === 0 ? '' : marginLeft);    } else if ($blockEl.is('table') || $blockEl.is('.simditor-table')) {      $td = this.editor.selection.containerNode().closest('td, th');      $prevTd = $td.prev('td, th');      if (!($prevTd.length > 0)) {        $tr = $td.parent('tr');        $prevTr = $tr.prev('tr');        if ($prevTr.length < 1 && $tr.parent().is('tbody')) {          $prevTr = $tr.parent('tbody').prev('thead').find('tr:first');        }        $prevTd = $prevTr.find('td:last, th:last');      }      if (!($td.length > 0 && $prevTd.length > 0)) {        return;      }      this.editor.selection.setRangeAtEndOf($prevTd);    } else {      return false;    }    return true;  };  Indentation.prototype.outdentText = function(range) {};  return Indentation;})(SimpleModule);Clipboard = (function(superClass) {  extend(Clipboard, superClass);  function Clipboard() {    return Clipboard.__super__.constructor.apply(this, arguments);  }  Clipboard.pluginName = 'Clipboard';  Clipboard.prototype.opts = {    pasteImage: false,    cleanPaste: false  };  Clipboard.prototype._init = function() {    this.editor = this._module;    if (this.opts.pasteImage && typeof this.opts.pasteImage !== 'string') {      this.opts.pasteImage = 'inline';    }    return this.editor.body.on('paste', (function(_this) {      return function(e) {        var range;        if (_this.pasting || _this._pasteBin) {          return;        }        if (_this.editor.triggerHandler(e) === false) {          return false;        }        range = _this.editor.selection.deleteRangeContents();        if (_this.editor.body.html()) {          if (!range.collapsed) {            range.collapse(true);          }        } else {          _this.editor.formatter.format();          _this.editor.selection.setRangeAtStartOf(_this.editor.body.find('p:first'));        }        if (_this._processPasteByClipboardApi(e)) {          return false;        }        _this.editor.inputManager.throttledValueChanged.clear();        _this.editor.inputManager.throttledSelectionChanged.clear();        _this.editor.undoManager.throttledPushState.clear();        _this.editor.selection.reset();        _this.editor.undoManager.resetCaretPosition();        _this.pasting = true;        return _this._getPasteContent(function(pasteContent) {          _this._processPasteContent(pasteContent);          _this._pasteInBlockEl = null;          _this._pastePlainText = null;          return _this.pasting = false;        });      };    })(this));  };  Clipboard.prototype._processPasteByClipboardApi = function(e) {    var imageFile, pasteItem, ref, uploadOpt;    if (this.editor.util.browser.edge) {      return;    }    if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.items && e.originalEvent.clipboardData.items.length > 0) {      pasteItem = e.originalEvent.clipboardData.items[0];      if (/^image\//.test(pasteItem.type)) {        imageFile = pasteItem.getAsFile();        if (!((imageFile != null) && this.opts.pasteImage)) {          return;        }        if (!imageFile.name) {          imageFile.name = "Clipboard Image.png";        }        if (this.editor.triggerHandler('pasting', [imageFile]) === false) {          return;        }        uploadOpt = {};        uploadOpt[this.opts.pasteImage] = true;        if ((ref = this.editor.uploader) != null) {          ref.upload(imageFile, uploadOpt);        }        return true;      }    }  };  Clipboard.prototype._getPasteContent = function(callback) {    var state;    this._pasteBin = $('<div contenteditable="true" />').addClass('simditor-paste-bin').attr('tabIndex', '-1').appendTo(this.editor.el);    state = {      html: this.editor.body.html(),      caret: this.editor.undoManager.caretPosition()    };    this._pasteBin.focus();    return setTimeout((function(_this) {      return function() {        var pasteContent;        _this.editor.hidePopover();        _this.editor.body.get(0).innerHTML = state.html;        _this.editor.undoManager.caretPosition(state.caret);        _this.editor.body.focus();        _this.editor.selection.reset();        _this.editor.selection.range();        _this._pasteInBlockEl = _this.editor.selection.blockNodes().last();        _this._pastePlainText = _this.opts.cleanPaste || _this._pasteInBlockEl.is('pre, table');        if (_this._pastePlainText) {          pasteContent = _this.editor.formatter.clearHtml(_this._pasteBin.html(), true);        } else {          pasteContent = $('<div/>').append(_this._pasteBin.contents());          pasteContent.find('style').remove();          pasteContent.find('table colgroup').remove();          _this.editor.formatter.format(pasteContent);          _this.editor.formatter.decorate(pasteContent);          _this.editor.formatter.beautify(pasteContent.children());          pasteContent = pasteContent.contents();        }        _this._pasteBin.remove();        _this._pasteBin = null;        return callback(pasteContent);      };    })(this), 0);  };  Clipboard.prototype._processPasteContent = function(pasteContent) {    var $blockEl, $img, blob, children, dataURLtoBlob, img, insertPosition, k, l, lastLine, len, len1, len2, len3, len4, line, lines, m, node, o, q, ref, ref1, ref2, uploadOpt, uploader;    if (this.editor.triggerHandler('pasting', [pasteContent]) === false) {      return;    }    $blockEl = this._pasteInBlockEl;    if (!pasteContent) {      return;    } else if (this._pastePlainText) {      if ($blockEl.is('table')) {        lines = pasteContent.split('\n');        lastLine = lines.pop();        for (k = 0, len = lines.length; k < len; k++) {          line = lines[k];          this.editor.selection.insertNode(document.createTextNode(line));          this.editor.selection.insertNode($('<br/>'));        }        this.editor.selection.insertNode(document.createTextNode(lastLine));      } else {        pasteContent = $('<div/>').text(pasteContent);        ref = pasteContent.contents();        for (l = 0, len1 = ref.length; l < len1; l++) {          node = ref[l];          this.editor.selection.insertNode($(node)[0]);        }      }    } else if ($blockEl.is(this.editor.body)) {      for (m = 0, len2 = pasteContent.length; m < len2; m++) {        node = pasteContent[m];        this.editor.selection.insertNode(node);      }    } else if (pasteContent.length < 1) {      return;    } else if (pasteContent.length === 1) {      if (pasteContent.is('p')) {        children = pasteContent.contents();        if ($blockEl.is('h1, h2, h3, h4, h5')) {          if (children.length) {            children.css('font-size', '');          }        }        if (children.length === 1 && children.is('img')) {          $img = children;          if (/^data:image/.test($img.attr('src'))) {            if (!this.opts.pasteImage) {              return;            }            blob = this.editor.util.dataURLtoBlob($img.attr("src"));            blob.name = "Clipboard Image.png";            uploadOpt = {};            uploadOpt[this.opts.pasteImage] = true;            if ((ref1 = this.editor.uploader) != null) {              ref1.upload(blob, uploadOpt);            }            return;          } else if (new RegExp('^blob:' + location.origin + '/').test($img.attr('src'))) {            if (!this.opts.pasteImage) {              return;            }            uploadOpt = {};            uploadOpt[this.opts.pasteImage] = true;            dataURLtoBlob = this.editor.util.dataURLtoBlob;            uploader = this.editor.uploader;            img = new Image;            img.onload = function() {              var canvas;              canvas = document.createElement('canvas');              canvas.width = img.naturalWidth;              canvas.height = img.naturalHeight;              canvas.getContext('2d').drawImage(img, 0, 0);              blob = dataURLtoBlob(canvas.toDataURL('image/png'));              blob.name = 'Clipboard Image.png';              if (uploader !== null) {                uploader.upload(blob, uploadOpt);              }            };            img.src = $img.attr('src');            return;          } else if ($img.is('img[src^="webkit-fake-url://"]')) {            return;          }        }        for (o = 0, len3 = children.length; o < len3; o++) {          node = children[o];          this.editor.selection.insertNode(node);        }      } else if ($blockEl.is('p') && this.editor.util.isEmptyNode($blockEl)) {        $blockEl.replaceWith(pasteContent);        this.editor.selection.setRangeAtEndOf(pasteContent);      } else if (pasteContent.is('ul, ol')) {        if (pasteContent.find('li').length === 1) {          pasteContent = $('<div/>').text(pasteContent.text());          ref2 = pasteContent.contents();          for (q = 0, len4 = ref2.length; q < len4; q++) {            node = ref2[q];            this.editor.selection.insertNode($(node)[0]);          }        } else if ($blockEl.is('li')) {          $blockEl.parent().after(pasteContent);          this.editor.selection.setRangeAtEndOf(pasteContent);        } else {          $blockEl.after(pasteContent);          this.editor.selection.setRangeAtEndOf(pasteContent);        }      } else {        $blockEl.after(pasteContent);        this.editor.selection.setRangeAtEndOf(pasteContent);      }    } else {      if ($blockEl.is('li')) {        $blockEl = $blockEl.parent();      }      if (this.editor.selection.rangeAtStartOf($blockEl)) {        insertPosition = 'before';      } else if (this.editor.selection.rangeAtEndOf($blockEl)) {        insertPosition = 'after';      } else {        this.editor.selection.breakBlockEl($blockEl);        insertPosition = 'before';      }      $blockEl[insertPosition](pasteContent);      this.editor.selection.setRangeAtEndOf(pasteContent.last());    }    return this.editor.inputManager.throttledValueChanged();  };  return Clipboard;})(SimpleModule);Simditor = (function(superClass) {  extend(Simditor, superClass);  function Simditor() {    return Simditor.__super__.constructor.apply(this, arguments);  }  Simditor.connect(Util);  Simditor.connect(InputManager);  Simditor.connect(Selection);  Simditor.connect(UndoManager);  Simditor.connect(Keystroke);  Simditor.connect(Formatter);  Simditor.connect(Toolbar);  Simditor.connect(Indentation);  Simditor.connect(Clipboard);  Simditor.count = 0;  Simditor.prototype.opts = {    textarea: null,    placeholder: '',    defaultImage: 'images/image.png',    params: {},    upload: false,    indentWidth: 40  };  Simditor.prototype._init = function() {    var e, editor, uploadOpts;    this.textarea = $(this.opts.textarea);    this.opts.placeholder = this.opts.placeholder || this.textarea.attr('placeholder');    if (!this.textarea.length) {      throw new Error('simditor: param textarea is required.');      return;    }    editor = this.textarea.data('simditor');    if (editor != null) {      editor.destroy();    }    this.id = ++Simditor.count;    this._render();    if (simpleHotkeys) {      this.hotkeys = simpleHotkeys({        el: this.body      });    } else {      throw new Error('simditor: simple-hotkeys is required.');      return;    }    if (this.opts.upload && simpleUploader) {      uploadOpts = typeof this.opts.upload === 'object' ? this.opts.upload : {};      this.uploader = simpleUploader(uploadOpts);    }    this.on('initialized', (function(_this) {      return function() {        if (_this.opts.placeholder) {          _this.on('valuechanged', function() {            return _this._placeholder();          });        }        _this.setValue(_this.textarea.val().trim() || '');        if (_this.textarea.attr('autofocus')) {          return _this.focus();        }      };    })(this));    if (this.util.browser.mozilla) {      this.util.reflow();      try {        document.execCommand('enableObjectResizing', false, false);        return document.execCommand('enableInlineTableEditing', false, false);      } catch (_error) {        e = _error;      }    }  };  Simditor.prototype._tpl = "<div class=\"simditor\">\n  <div class=\"simditor-wrapper\">\n    <div class=\"simditor-placeholder\"></div>\n    <div class=\"simditor-body\" contenteditable=\"true\">\n    </div>\n  </div>\n</div>";  Simditor.prototype._render = function() {    var key, ref, results, val;    this.el = $(this._tpl).insertBefore(this.textarea);    this.wrapper = this.el.find('.simditor-wrapper');    this.body = this.wrapper.find('.simditor-body');    this.placeholderEl = this.wrapper.find('.simditor-placeholder').append(this.opts.placeholder);    this.el.data('simditor', this);    this.wrapper.append(this.textarea);    this.textarea.data('simditor', this).blur();    this.body.attr('tabindex', this.textarea.attr('tabindex'));    if (this.util.os.mac) {      this.el.addClass('simditor-mac');    } else if (this.util.os.linux) {      this.el.addClass('simditor-linux');    }    if (this.util.os.mobile) {      this.el.addClass('simditor-mobile');    }    if (this.opts.params) {      ref = this.opts.params;      results = [];      for (key in ref) {        val = ref[key];        results.push($('<input/>', {          type: 'hidden',          name: key,          value: val        }).insertAfter(this.textarea));      }      return results;    }  };  Simditor.prototype._placeholder = function() {    var children;    children = this.body.children();    if (children.length === 0 || (children.length === 1 && this.util.isEmptyNode(children) && parseInt(children.css('margin-left') || 0) < this.opts.indentWidth)) {      return this.placeholderEl.show();    } else {      return this.placeholderEl.hide();    }  };  Simditor.prototype.setValue = function(val) {    this.hidePopover();    this.textarea.val(val);    this.body.get(0).innerHTML = val;    this.formatter.format();    this.formatter.decorate();    this.util.reflow(this.body);    this.inputManager.lastCaretPosition = null;    return this.trigger('valuechanged');  };  Simditor.prototype.getValue = function() {    return this.sync();  };  Simditor.prototype.sync = function() {    var children, cloneBody, emptyP, firstP, lastP, val;    cloneBody = this.body.clone();    this.formatter.undecorate(cloneBody);    this.formatter.format(cloneBody);    this.formatter.autolink(cloneBody);    children = cloneBody.children();    lastP = children.last('p');    firstP = children.first('p');    while (lastP.is('p') && this.util.isEmptyNode(lastP)) {      emptyP = lastP;      lastP = lastP.prev('p');      emptyP.remove();    }    while (firstP.is('p') && this.util.isEmptyNode(firstP)) {      emptyP = firstP;      firstP = lastP.next('p');      emptyP.remove();    }    cloneBody.find('img.uploading').remove();    val = $.trim(cloneBody.html());    this.textarea.val(val);    return val;  };  Simditor.prototype.focus = function() {    var $blockEl, range;    if (!(this.body.is(':visible') && this.body.is('[contenteditable]'))) {      this.el.find('textarea:visible').focus();      return;    }    if (this.inputManager.lastCaretPosition) {      this.undoManager.caretPosition(this.inputManager.lastCaretPosition);      return this.inputManager.lastCaretPosition = null;    } else {      $blockEl = this.body.children().last();      if (!$blockEl.is('p')) {        $blockEl = $('<p/>').append(this.util.phBr).appendTo(this.body);      }      range = document.createRange();      return this.selection.setRangeAtEndOf($blockEl, range);    }  };  Simditor.prototype.blur = function() {    if (this.body.is(':visible') && this.body.is('[contenteditable]')) {      return this.body.blur();    } else {      return this.body.find('textarea:visible').blur();    }  };  Simditor.prototype.hidePopover = function() {    return this.el.find('.simditor-popover').each(function(i, popover) {      popover = $(popover).data('popover');      if (popover.active) {        return popover.hide();      }    });  };  Simditor.prototype.destroy = function() {    this.triggerHandler('destroy');    this.textarea.closest('form').off('.simditor .simditor-' + this.id);    this.selection.clear();    this.inputManager.focused = false;    this.textarea.insertBefore(this.el).hide().val('').removeData('simditor');    this.el.remove();    $(document).off('.simditor-' + this.id);    $(window).off('.simditor-' + this.id);    return this.off();  };  return Simditor;})(SimpleModule);Simditor.i18n = {  'zh-CN': {    'blockquote': '引用',    'bold': '加粗文字',    'code': '插入代码',    'color': '文字颜色',    'coloredText': '彩色文字',    'hr': '分隔线',    'image': '插入图片',    'externalImage': '外链图片',    'uploadImage': '上传图片',    'uploadFailed': '上传失败了',    'uploadError': '上传出错了',    'imageUrl': '图片地址',    'imageSize': '图片尺寸',    'imageAlt': '图片描述',    'restoreImageSize': '还原图片尺寸',    'uploading': '正在上传',    'indent': '向右缩进',    'outdent': '向左缩进',    'italic': '斜体文字',    'link': '插入链接',    'linkText': '链接文字',    'linkUrl': '链接地址',    'linkTarget': '打开方式',    'openLinkInCurrentWindow': '在当前窗口中打开',    'openLinkInNewWindow': '在新窗口中打开',    'removeLink': '移除链接',    'ol': '有序列表',    'ul': '无序列表',    'strikethrough': '删除线文字',    'table': '表格',    'deleteRow': '删除行',    'insertRowAbove': '在上面插入行',    'insertRowBelow': '在下面插入行',    'deleteColumn': '删除列',    'insertColumnLeft': '在左边插入列',    'insertColumnRight': '在右边插入列',    'deleteTable': '删除表格',    'title': '标题',    'normalText': '普通文本',    'underline': '下划线文字',    'alignment': '水平对齐',    'alignCenter': '居中',    'alignLeft': '居左',    'alignRight': '居右',    'selectLanguage': '选择程序语言',    'fontScale': '字体大小',    'fontScaleXLarge': '超大字体',    'fontScaleLarge': '大号字体',    'fontScaleNormal': '正常大小',    'fontScaleSmall': '小号字体',    'fontScaleXSmall': '超小字体'  },  'en-US': {    'blockquote': 'Block Quote',    'bold': 'Bold',    'code': 'Code',    'color': 'Text Color',    'coloredText': 'Colored Text',    'hr': 'Horizontal Line',    'image': 'Insert Image',    'externalImage': 'External Image',    'uploadImage': 'Upload Image',    'uploadFailed': 'Upload failed',    'uploadError': 'Error occurs during upload',    'imageUrl': 'Url',    'imageSize': 'Size',    'imageAlt': 'Alt',    'restoreImageSize': 'Restore Origin Size',    'uploading': 'Uploading',    'indent': 'Indent',    'outdent': 'Outdent',    'italic': 'Italic',    'link': 'Insert Link',    'linkText': 'Text',    'linkUrl': 'Url',    'linkTarget': 'Target',    'openLinkInCurrentWindow': 'Open link in current window',    'openLinkInNewWindow': 'Open link in new window',    'removeLink': 'Remove Link',    'ol': 'Ordered List',    'ul': 'Unordered List',    'strikethrough': 'Strikethrough',    'table': 'Table',    'deleteRow': 'Delete Row',    'insertRowAbove': 'Insert Row Above',    'insertRowBelow': 'Insert Row Below',    'deleteColumn': 'Delete Column',    'insertColumnLeft': 'Insert Column Left',    'insertColumnRight': 'Insert Column Right',    'deleteTable': 'Delete Table',    'title': 'Title',    'normalText': 'Text',    'underline': 'Underline',    'alignment': 'Alignment',    'alignCenter': 'Align Center',    'alignLeft': 'Align Left',    'alignRight': 'Align Right',    'selectLanguage': 'Select Language',    'fontScale': 'Font Size',    'fontScaleXLarge': 'X Large Size',    'fontScaleLarge': 'Large Size',    'fontScaleNormal': 'Normal Size',    'fontScaleSmall': 'Small Size',    'fontScaleXSmall': 'X Small Size'  }};Button = (function(superClass) {  extend(Button, superClass);  Button.prototype._tpl = {    item: '<li><a tabindex="-1" unselectable="on" class="toolbar-item" href="javascript:;"><span></span></a></li>',    menuWrapper: '<div class="toolbar-menu"></div>',    menuItem: '<li><a tabindex="-1" unselectable="on" class="menu-item" href="javascript:;"><span></span></a></li>',    separator: '<li><span class="separator"></span></li>'  };  Button.prototype.name = '';  Button.prototype.icon = '';  Button.prototype.title = '';  Button.prototype.text = '';  Button.prototype.htmlTag = '';  Button.prototype.disableTag = '';  Button.prototype.menu = false;  Button.prototype.active = false;  Button.prototype.disabled = false;  Button.prototype.needFocus = true;  Button.prototype.shortcut = null;  function Button(opts) {    this.editor = opts.editor;    this.title = this._t(this.name);    Button.__super__.constructor.call(this, opts);  }  Button.prototype._init = function() {    var k, len, ref, tag;    this.render();    this.el.on('mousedown', (function(_this) {      return function(e) {        var exceed, noFocus, param;        e.preventDefault();        noFocus = _this.needFocus && !_this.editor.inputManager.focused;        if (_this.el.hasClass('disabled')) {          return false;        }        if (noFocus) {          _this.editor.focus();        }        if (_this.menu) {          _this.wrapper.toggleClass('menu-on').siblings('li').removeClass('menu-on');          if (_this.wrapper.is('.menu-on')) {            exceed = _this.menuWrapper.offset().left + _this.menuWrapper.outerWidth() + 5 - _this.editor.wrapper.offset().left - _this.editor.wrapper.outerWidth();            if (exceed > 0) {              _this.menuWrapper.css({                'left': 'auto',                'right': 0              });            }            _this.trigger('menuexpand');          }          return false;        }        param = _this.el.data('param');        _this.command(param);        return false;      };    })(this));    this.wrapper.on('click', 'a.menu-item', (function(_this) {      return function(e) {        var btn, noFocus, param;        e.preventDefault();        btn = $(e.currentTarget);        _this.wrapper.removeClass('menu-on');        noFocus = _this.needFocus && !_this.editor.inputManager.focused;        if (btn.hasClass('disabled') || noFocus) {          return false;        }        _this.editor.toolbar.wrapper.removeClass('menu-on');        param = btn.data('param');        _this.command(param);        return false;      };    })(this));    this.wrapper.on('mousedown', 'a.menu-item', function(e) {      return false;    });    this.editor.on('blur', (function(_this) {      return function() {        var editorActive;        editorActive = _this.editor.body.is(':visible') && _this.editor.body.is('[contenteditable]');        if (!(editorActive && !_this.editor.clipboard.pasting)) {          return;        }        _this.setActive(false);        return _this.setDisabled(false);      };    })(this));    if (this.shortcut != null) {      this.editor.hotkeys.add(this.shortcut, (function(_this) {        return function(e) {          _this.el.mousedown();          return false;        };      })(this));    }    ref = this.htmlTag.split(',');    for (k = 0, len = ref.length; k < len; k++) {      tag = ref[k];      tag = $.trim(tag);      if (tag && $.inArray(tag, this.editor.formatter._allowedTags) < 0) {        this.editor.formatter._allowedTags.push(tag);      }    }    return this.editor.on('selectionchanged', (function(_this) {      return function(e) {        if (_this.editor.inputManager.focused) {          return _this._status();        }      };    })(this));  };  Button.prototype.iconClassOf = function(icon) {    if (icon) {      return "simditor-icon simditor-icon-" + icon;    } else {      return '';    }  };  Button.prototype.setIcon = function(icon) {    return this.el.find('span').removeClass().addClass(this.iconClassOf(icon)).text(this.text);  };  Button.prototype.render = function() {    this.wrapper = $(this._tpl.item).appendTo(this.editor.toolbar.list);    this.el = this.wrapper.find('a.toolbar-item');    this.el.attr('title', this.title).addClass("toolbar-item-" + this.name).data('button', this);    this.setIcon(this.icon);    if (!this.menu) {      return;    }    this.menuWrapper = $(this._tpl.menuWrapper).appendTo(this.wrapper);    this.menuWrapper.addClass("toolbar-menu-" + this.name);    return this.renderMenu();  };  Button.prototype.renderMenu = function() {    var $menuBtnEl, $menuItemEl, k, len, menuItem, ref, ref1, results;    if (!$.isArray(this.menu)) {      return;    }    this.menuEl = $('<ul/>').appendTo(this.menuWrapper);    ref = this.menu;    results = [];    for (k = 0, len = ref.length; k < len; k++) {      menuItem = ref[k];      if (menuItem === '|') {        $(this._tpl.separator).appendTo(this.menuEl);        continue;      }      $menuItemEl = $(this._tpl.menuItem).appendTo(this.menuEl);      $menuBtnEl = $menuItemEl.find('a.menu-item').attr({        'title': (ref1 = menuItem.title) != null ? ref1 : menuItem.text,        'data-param': menuItem.param      }).addClass('menu-item-' + menuItem.name);      if (menuItem.icon) {        results.push($menuBtnEl.find('span').addClass(this.iconClassOf(menuItem.icon)));      } else {        results.push($menuBtnEl.find('span').text(menuItem.text));      }    }    return results;  };  Button.prototype.setActive = function(active) {    if (active === this.active) {      return;    }    this.active = active;    return this.el.toggleClass('active', this.active);  };  Button.prototype.setDisabled = function(disabled) {    if (disabled === this.disabled) {      return;    }    this.disabled = disabled;    return this.el.toggleClass('disabled', this.disabled);  };  Button.prototype._disableStatus = function() {    var disabled, endNodes, startNodes;    startNodes = this.editor.selection.startNodes();    endNodes = this.editor.selection.endNodes();    disabled = startNodes.filter(this.disableTag).length > 0 || endNodes.filter(this.disableTag).length > 0;    this.setDisabled(disabled);    if (this.disabled) {      this.setActive(false);    }    return this.disabled;  };  Button.prototype._activeStatus = function() {    var active, endNode, endNodes, startNode, startNodes;    startNodes = this.editor.selection.startNodes();    endNodes = this.editor.selection.endNodes();    startNode = startNodes.filter(this.htmlTag);    endNode = endNodes.filter(this.htmlTag);    active = startNode.length > 0 && endNode.length > 0 && startNode.is(endNode);    this.node = active ? startNode : null;    this.setActive(active);    return this.active;  };  Button.prototype._status = function() {    this._disableStatus();    if (this.disabled) {      return;    }    return this._activeStatus();  };  Button.prototype.command = function(param) {};  Button.prototype._t = function() {    var args, ref, result;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    result = Button.__super__._t.apply(this, args);    if (!result) {      result = (ref = this.editor)._t.apply(ref, args);    }    return result;  };  return Button;})(SimpleModule);Simditor.Button = Button;Popover = (function(superClass) {  extend(Popover, superClass);  Popover.prototype.offset = {    top: 4,    left: 0  };  Popover.prototype.target = null;  Popover.prototype.active = false;  function Popover(opts) {    this.button = opts.button;    this.editor = opts.button.editor;    Popover.__super__.constructor.call(this, opts);  }  Popover.prototype._init = function() {    this.el = $('<div class="simditor-popover"></div>').appendTo(this.editor.el).data('popover', this);    this.render();    this.el.on('mouseenter', (function(_this) {      return function(e) {        return _this.el.addClass('hover');      };    })(this));    return this.el.on('mouseleave', (function(_this) {      return function(e) {        return _this.el.removeClass('hover');      };    })(this));  };  Popover.prototype.render = function() {};  Popover.prototype._initLabelWidth = function() {    var $fields;    $fields = this.el.find('.settings-field');    if (!($fields.length > 0)) {      return;    }    this._labelWidth = 0;    $fields.each((function(_this) {      return function(i, field) {        var $field, $label;        $field = $(field);        $label = $field.find('label');        if (!($label.length > 0)) {          return;        }        return _this._labelWidth = Math.max(_this._labelWidth, $label.width());      };    })(this));    return $fields.find('label').width(this._labelWidth);  };  Popover.prototype.show = function($target, position) {    if (position == null) {      position = 'bottom';    }    if ($target == null) {      return;    }    this.el.siblings('.simditor-popover').each(function(i, popover) {      popover = $(popover).data('popover');      if (popover.active) {        return popover.hide();      }    });    if (this.active && this.target) {      this.target.removeClass('selected');    }    this.target = $target.addClass('selected');    if (this.active) {      this.refresh(position);      return this.trigger('popovershow');    } else {      this.active = true;      this.el.css({        left: -9999      }).show();      if (!this._labelWidth) {        this._initLabelWidth();      }      this.editor.util.reflow();      this.refresh(position);      return this.trigger('popovershow');    }  };  Popover.prototype.hide = function() {    if (!this.active) {      return;    }    if (this.target) {      this.target.removeClass('selected');    }    this.target = null;    this.active = false;    this.el.hide();    return this.trigger('popoverhide');  };  Popover.prototype.refresh = function(position) {    var editorOffset, left, maxLeft, targetH, targetOffset, top;    if (position == null) {      position = 'bottom';    }    if (!this.active) {      return;    }    editorOffset = this.editor.el.offset();    targetOffset = this.target.offset();    targetH = this.target.outerHeight();    if (position === 'bottom') {      top = targetOffset.top - editorOffset.top + targetH;    } else if (position === 'top') {      top = targetOffset.top - editorOffset.top - this.el.height();    }    maxLeft = this.editor.wrapper.width() - this.el.outerWidth() - 10;    left = Math.min(targetOffset.left - editorOffset.left, maxLeft);    return this.el.css({      top: top + this.offset.top,      left: left + this.offset.left    });  };  Popover.prototype.destroy = function() {    this.target = null;    this.active = false;    this.editor.off('.linkpopover');    return this.el.remove();  };  Popover.prototype._t = function() {    var args, ref, result;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    result = Popover.__super__._t.apply(this, args);    if (!result) {      result = (ref = this.button)._t.apply(ref, args);    }    return result;  };  return Popover;})(SimpleModule);Simditor.Popover = Popover;TitleButton = (function(superClass) {  extend(TitleButton, superClass);  function TitleButton() {    return TitleButton.__super__.constructor.apply(this, arguments);  }  TitleButton.prototype.name = 'title';  TitleButton.prototype.htmlTag = 'h1, h2, h3, h4, h5';  TitleButton.prototype.disableTag = 'pre, table';  TitleButton.prototype._init = function() {    this.menu = [      {        name: 'normal',        text: this._t('normalText'),        param: 'p'      }, '|', {        name: 'h1',        text: this._t('title') + ' 1',        param: 'h1'      }, {        name: 'h2',        text: this._t('title') + ' 2',        param: 'h2'      }, {        name: 'h3',        text: this._t('title') + ' 3',        param: 'h3'      }, {        name: 'h4',        text: this._t('title') + ' 4',        param: 'h4'      }, {        name: 'h5',        text: this._t('title') + ' 5',        param: 'h5'      }    ];    return TitleButton.__super__._init.call(this);  };  TitleButton.prototype.setActive = function(active, param) {    TitleButton.__super__.setActive.call(this, active);    if (active) {      param || (param = this.node[0].tagName.toLowerCase());    }    this.el.removeClass('active-p active-h1 active-h2 active-h3 active-h4 active-h5');    if (active) {      return this.el.addClass('active active-' + param);    }  };  TitleButton.prototype.command = function(param) {    var $rootNodes;    $rootNodes = this.editor.selection.rootNodes();    this.editor.selection.save();    $rootNodes.each((function(_this) {      return function(i, node) {        var $node;        $node = $(node);        if ($node.is('blockquote') || $node.is(param) || $node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node)) {          return;        }        return $('<' + param + '/>').append($node.contents()).replaceAll($node);      };    })(this));    this.editor.selection.restore();    return this.editor.trigger('valuechanged');  };  return TitleButton;})(Button);Simditor.Toolbar.addButton(TitleButton);FontScaleButton = (function(superClass) {  extend(FontScaleButton, superClass);  function FontScaleButton() {    return FontScaleButton.__super__.constructor.apply(this, arguments);  }  FontScaleButton.prototype.name = 'fontScale';  FontScaleButton.prototype.icon = 'font';  FontScaleButton.prototype.htmlTag = 'span';  FontScaleButton.prototype.disableTag = 'pre, h1, h2, h3, h4, h5';  FontScaleButton.prototype.sizeMap = {    'x-large': '1.5em',    'large': '1.25em',    'small': '.75em',    'x-small': '.5em'  };  FontScaleButton.prototype._init = function() {    this.menu = [      {        name: '150%',        text: this._t('fontScaleXLarge'),        param: '5'      }, {        name: '125%',        text: this._t('fontScaleLarge'),        param: '4'      }, {        name: '100%',        text: this._t('fontScaleNormal'),        param: '3'      }, {        name: '75%',        text: this._t('fontScaleSmall'),        param: '2'      }, {        name: '50%',        text: this._t('fontScaleXSmall'),        param: '1'      }    ];    return FontScaleButton.__super__._init.call(this);  };  FontScaleButton.prototype._activeStatus = function() {    var active, endNode, endNodes, range, startNode, startNodes;    range = this.editor.selection.range();    startNodes = this.editor.selection.startNodes();    endNodes = this.editor.selection.endNodes();    startNode = startNodes.filter('span[style*="font-size"]');    endNode = endNodes.filter('span[style*="font-size"]');    active = startNodes.length > 0 && endNodes.length > 0 && startNode.is(endNode);    this.setActive(active);    return this.active;  };  FontScaleButton.prototype.command = function(param) {    var $scales, containerNode, range;    range = this.editor.selection.range();    if (range.collapsed) {      return;    }    this.editor.selection.range(range);    document.execCommand('styleWithCSS', false, true);    document.execCommand('fontSize', false, param);    document.execCommand('styleWithCSS', false, false);    this.editor.selection.reset();    this.editor.selection.range();    containerNode = this.editor.selection.containerNode();    if (containerNode[0].nodeType === Node.TEXT_NODE) {      $scales = containerNode.closest('span[style*="font-size"]');    } else {      $scales = containerNode.find('span[style*="font-size"]');    }    $scales.each((function(_this) {      return function(i, n) {        var $span, size;        $span = $(n);        size = n.style.fontSize;        if (/large|x-large|small|x-small/.test(size)) {          return $span.css('fontSize', _this.sizeMap[size]);        } else if (size === 'medium') {          if ($span[0].style.length > 1) {            return $span.css('fontSize', '');          } else {            return $span.replaceWith($span.contents());          }        }      };    })(this));    return this.editor.trigger('valuechanged');  };  return FontScaleButton;})(Button);Simditor.Toolbar.addButton(FontScaleButton);BoldButton = (function(superClass) {  extend(BoldButton, superClass);  function BoldButton() {    return BoldButton.__super__.constructor.apply(this, arguments);  }  BoldButton.prototype.name = 'bold';  BoldButton.prototype.icon = 'bold';  BoldButton.prototype.htmlTag = 'b, strong';  BoldButton.prototype.disableTag = 'pre';  BoldButton.prototype.shortcut = 'cmd+b';  BoldButton.prototype._init = function() {    if (this.editor.util.os.mac) {      this.title = this.title + ' ( Cmd + b )';    } else {      this.title = this.title + ' ( Ctrl + b )';      this.shortcut = 'ctrl+b';    }    return BoldButton.__super__._init.call(this);  };  BoldButton.prototype._activeStatus = function() {    var active;    active = document.queryCommandState('bold') === true;    this.setActive(active);    return this.active;  };  BoldButton.prototype.command = function() {    document.execCommand('bold');    if (!this.editor.util.support.oninput) {      this.editor.trigger('valuechanged');    }    return $(document).trigger('selectionchange');  };  return BoldButton;})(Button);Simditor.Toolbar.addButton(BoldButton);ItalicButton = (function(superClass) {  extend(ItalicButton, superClass);  function ItalicButton() {    return ItalicButton.__super__.constructor.apply(this, arguments);  }  ItalicButton.prototype.name = 'italic';  ItalicButton.prototype.icon = 'italic';  ItalicButton.prototype.htmlTag = 'i';  ItalicButton.prototype.disableTag = 'pre';  ItalicButton.prototype.shortcut = 'cmd+i';  ItalicButton.prototype._init = function() {    if (this.editor.util.os.mac) {      this.title = this.title + " ( Cmd + i )";    } else {      this.title = this.title + " ( Ctrl + i )";      this.shortcut = 'ctrl+i';    }    return ItalicButton.__super__._init.call(this);  };  ItalicButton.prototype._activeStatus = function() {    var active;    active = document.queryCommandState('italic') === true;    this.setActive(active);    return this.active;  };  ItalicButton.prototype.command = function() {    document.execCommand('italic');    if (!this.editor.util.support.oninput) {      this.editor.trigger('valuechanged');    }    return $(document).trigger('selectionchange');  };  return ItalicButton;})(Button);Simditor.Toolbar.addButton(ItalicButton);UnderlineButton = (function(superClass) {  extend(UnderlineButton, superClass);  function UnderlineButton() {    return UnderlineButton.__super__.constructor.apply(this, arguments);  }  UnderlineButton.prototype.name = 'underline';  UnderlineButton.prototype.icon = 'underline';  UnderlineButton.prototype.htmlTag = 'u';  UnderlineButton.prototype.disableTag = 'pre';  UnderlineButton.prototype.shortcut = 'cmd+u';  UnderlineButton.prototype.render = function() {    if (this.editor.util.os.mac) {      this.title = this.title + ' ( Cmd + u )';    } else {      this.title = this.title + ' ( Ctrl + u )';      this.shortcut = 'ctrl+u';    }    return UnderlineButton.__super__.render.call(this);  };  UnderlineButton.prototype._activeStatus = function() {    var active;    active = document.queryCommandState('underline') === true;    this.setActive(active);    return this.active;  };  UnderlineButton.prototype.command = function() {    document.execCommand('underline');    if (!this.editor.util.support.oninput) {      this.editor.trigger('valuechanged');    }    return $(document).trigger('selectionchange');  };  return UnderlineButton;})(Button);Simditor.Toolbar.addButton(UnderlineButton);ColorButton = (function(superClass) {  extend(ColorButton, superClass);  function ColorButton() {    return ColorButton.__super__.constructor.apply(this, arguments);  }  ColorButton.prototype.name = 'color';  ColorButton.prototype.icon = 'tint';  ColorButton.prototype.disableTag = 'pre';  ColorButton.prototype.menu = true;  ColorButton.prototype.render = function() {    var args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    return ColorButton.__super__.render.apply(this, args);  };  ColorButton.prototype.renderMenu = function() {    $('<ul class="color-list">\n  <li><a href="javascript:;" class="font-color font-color-1"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-2"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-3"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-4"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-5"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-6"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-7"></a></li>\n  <li><a href="javascript:;" class="font-color font-color-default"></a></li>\n</ul>').appendTo(this.menuWrapper);    this.menuWrapper.on('mousedown', '.color-list', function(e) {      return false;    });    return this.menuWrapper.on('click', '.font-color', (function(_this) {      return function(e) {        var $link, $p, hex, range, rgb, textNode;        _this.wrapper.removeClass('menu-on');        $link = $(e.currentTarget);        if ($link.hasClass('font-color-default')) {          $p = _this.editor.body.find('p, li');          if (!($p.length > 0)) {            return;          }          rgb = window.getComputedStyle($p[0], null).getPropertyValue('color');          hex = _this._convertRgbToHex(rgb);        } else {          rgb = window.getComputedStyle($link[0], null).getPropertyValue('background-color');          hex = _this._convertRgbToHex(rgb);        }        if (!hex) {          return;        }        range = _this.editor.selection.range();        if (!$link.hasClass('font-color-default') && range.collapsed) {          textNode = document.createTextNode(_this._t('coloredText'));          range.insertNode(textNode);          range.selectNodeContents(textNode);        }        _this.editor.selection.range(range);        document.execCommand('styleWithCSS', false, true);        document.execCommand('foreColor', false, hex);        document.execCommand('styleWithCSS', false, false);        if (!_this.editor.util.support.oninput) {          return _this.editor.trigger('valuechanged');        }      };    })(this));  };  ColorButton.prototype._convertRgbToHex = function(rgb) {    var match, re, rgbToHex;    re = /rgb\((\d+),\s?(\d+),\s?(\d+)\)/g;    match = re.exec(rgb);    if (!match) {      return '';    }    rgbToHex = function(r, g, b) {      var componentToHex;      componentToHex = function(c) {        var hex;        hex = c.toString(16);        if (hex.length === 1) {          return '0' + hex;        } else {          return hex;        }      };      return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);    };    return rgbToHex(match[1] * 1, match[2] * 1, match[3] * 1);  };  return ColorButton;})(Button);Simditor.Toolbar.addButton(ColorButton);ListButton = (function(superClass) {  extend(ListButton, superClass);  function ListButton() {    return ListButton.__super__.constructor.apply(this, arguments);  }  ListButton.prototype.type = '';  ListButton.prototype.disableTag = 'pre, table';  ListButton.prototype.command = function(param) {    var $list, $rootNodes, anotherType;    $rootNodes = this.editor.selection.blockNodes();    anotherType = this.type === 'ul' ? 'ol' : 'ul';    this.editor.selection.save();    $list = null;    $rootNodes.each((function(_this) {      return function(i, node) {        var $node;        $node = $(node);        if ($node.is('blockquote, li') || $node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node) || !$.contains(document, node)) {          return;        }        if ($node.is(_this.type)) {          $node.children('li').each(function(i, li) {            var $childList, $li;            $li = $(li);            $childList = $li.children('ul, ol').insertAfter($node);            return $('<p/>').append($(li).html() || _this.editor.util.phBr).insertBefore($node);          });          return $node.remove();        } else if ($node.is(anotherType)) {          return $('<' + _this.type + '/>').append($node.contents()).replaceAll($node);        } else if ($list && $node.prev().is($list)) {          $('<li/>').append($node.html() || _this.editor.util.phBr).appendTo($list);          return $node.remove();        } else {          $list = $("<" + _this.type + "><li></li></" + _this.type + ">");          $list.find('li').append($node.html() || _this.editor.util.phBr);          return $list.replaceAll($node);        }      };    })(this));    this.editor.selection.restore();    return this.editor.trigger('valuechanged');  };  return ListButton;})(Button);OrderListButton = (function(superClass) {  extend(OrderListButton, superClass);  function OrderListButton() {    return OrderListButton.__super__.constructor.apply(this, arguments);  }  OrderListButton.prototype.type = 'ol';  OrderListButton.prototype.name = 'ol';  OrderListButton.prototype.icon = 'list-ol';  OrderListButton.prototype.htmlTag = 'ol';  OrderListButton.prototype.shortcut = 'cmd+/';  OrderListButton.prototype._init = function() {    if (this.editor.util.os.mac) {      this.title = this.title + ' ( Cmd + / )';    } else {      this.title = this.title + ' ( ctrl + / )';      this.shortcut = 'ctrl+/';    }    return OrderListButton.__super__._init.call(this);  };  return OrderListButton;})(ListButton);UnorderListButton = (function(superClass) {  extend(UnorderListButton, superClass);  function UnorderListButton() {    return UnorderListButton.__super__.constructor.apply(this, arguments);  }  UnorderListButton.prototype.type = 'ul';  UnorderListButton.prototype.name = 'ul';  UnorderListButton.prototype.icon = 'list-ul';  UnorderListButton.prototype.htmlTag = 'ul';  UnorderListButton.prototype.shortcut = 'cmd+.';  UnorderListButton.prototype._init = function() {    if (this.editor.util.os.mac) {      this.title = this.title + ' ( Cmd + . )';    } else {      this.title = this.title + ' ( Ctrl + . )';      this.shortcut = 'ctrl+.';    }    return UnorderListButton.__super__._init.call(this);  };  return UnorderListButton;})(ListButton);Simditor.Toolbar.addButton(OrderListButton);Simditor.Toolbar.addButton(UnorderListButton);BlockquoteButton = (function(superClass) {  extend(BlockquoteButton, superClass);  function BlockquoteButton() {    return BlockquoteButton.__super__.constructor.apply(this, arguments);  }  BlockquoteButton.prototype.name = 'blockquote';  BlockquoteButton.prototype.icon = 'quote-left';  BlockquoteButton.prototype.htmlTag = 'blockquote';  BlockquoteButton.prototype.disableTag = 'pre, table';  BlockquoteButton.prototype.command = function() {    var $rootNodes, clearCache, nodeCache;    $rootNodes = this.editor.selection.rootNodes();    $rootNodes = $rootNodes.filter(function(i, node) {      return !$(node).parent().is('blockquote');    });    this.editor.selection.save();    nodeCache = [];    clearCache = (function(_this) {      return function() {        if (nodeCache.length > 0) {          $("<" + _this.htmlTag + "/>").insertBefore(nodeCache[0]).append(nodeCache);          return nodeCache.length = 0;        }      };    })(this);    $rootNodes.each((function(_this) {      return function(i, node) {        var $node;        $node = $(node);        if (!$node.parent().is(_this.editor.body)) {          return;        }        if ($node.is(_this.htmlTag)) {          clearCache();          return $node.children().unwrap();        } else if ($node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node)) {          return clearCache();        } else {          return nodeCache.push(node);        }      };    })(this));    clearCache();    this.editor.selection.restore();    return this.editor.trigger('valuechanged');  };  return BlockquoteButton;})(Button);Simditor.Toolbar.addButton(BlockquoteButton);CodeButton = (function(superClass) {  extend(CodeButton, superClass);  function CodeButton() {    return CodeButton.__super__.constructor.apply(this, arguments);  }  CodeButton.prototype.name = 'code';  CodeButton.prototype.icon = 'code';  CodeButton.prototype.htmlTag = 'pre';  CodeButton.prototype.disableTag = 'ul, ol, table';  CodeButton.prototype._init = function() {    CodeButton.__super__._init.call(this);    this.editor.on('decorate', (function(_this) {      return function(e, $el) {        return $el.find('pre').each(function(i, pre) {          return _this.decorate($(pre));        });      };    })(this));    return this.editor.on('undecorate', (function(_this) {      return function(e, $el) {        return $el.find('pre').each(function(i, pre) {          return _this.undecorate($(pre));        });      };    })(this));  };  CodeButton.prototype.render = function() {    var args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    CodeButton.__super__.render.apply(this, args);    return this.popover = new CodePopover({      button: this    });  };  CodeButton.prototype._checkMode = function() {    var $blockNodes, range;    range = this.editor.selection.range();    if (($blockNodes = $(range.cloneContents()).find(this.editor.util.blockNodes.join(','))) > 0 || (range.collapsed && this.editor.selection.startNodes().filter('code').length === 0)) {      this.inlineMode = false;      return this.htmlTag = 'pre';    } else {      this.inlineMode = true;      return this.htmlTag = 'code';    }  };  CodeButton.prototype._status = function() {    this._checkMode();    CodeButton.__super__._status.call(this);    if (this.inlineMode) {      return;    }    if (this.active) {      return this.popover.show(this.node);    } else {      return this.popover.hide();    }  };  CodeButton.prototype.decorate = function($pre) {    var $code, lang, ref, ref1;    $code = $pre.find('> code');    if ($code.length > 0) {      lang = (ref = $code.attr('class')) != null ? (ref1 = ref.match(/lang-(\S+)/)) != null ? ref1[1] : void 0 : void 0;      $code.contents().unwrap();      if (lang) {        return $pre.attr('data-lang', lang);      }    }  };  CodeButton.prototype.undecorate = function($pre) {    var $code, lang;    lang = $pre.attr('data-lang');    $code = $('<code/>');    if (lang && lang !== -1) {      $code.addClass('lang-' + lang);    }    return $pre.wrapInner($code).removeAttr('data-lang');  };  CodeButton.prototype.command = function() {    if (this.inlineMode) {      return this._inlineCommand();    } else {      return this._blockCommand();    }  };  CodeButton.prototype._blockCommand = function() {    var $rootNodes, clearCache, nodeCache, resultNodes;    $rootNodes = this.editor.selection.rootNodes();    nodeCache = [];    resultNodes = [];    clearCache = (function(_this) {      return function() {        var $pre;        if (!(nodeCache.length > 0)) {          return;        }        $pre = $("<" + _this.htmlTag + "/>").insertBefore(nodeCache[0]).text(_this.editor.formatter.clearHtml(nodeCache));        resultNodes.push($pre[0]);        return nodeCache.length = 0;      };    })(this);    $rootNodes.each((function(_this) {      return function(i, node) {        var $node, $p;        $node = $(node);        if ($node.is(_this.htmlTag)) {          clearCache();          $p = $('<p/>').append($node.html().replace('\n', '<br/>')).replaceAll($node);          return resultNodes.push($p[0]);        } else if ($node.is(_this.disableTag) || _this.editor.util.isDecoratedNode($node) || $node.is('blockquote')) {          return clearCache();        } else {          return nodeCache.push(node);        }      };    })(this));    clearCache();    this.editor.selection.setRangeAtEndOf($(resultNodes).last());    return this.editor.trigger('valuechanged');  };  CodeButton.prototype._inlineCommand = function() {    var $code, $contents, range;    range = this.editor.selection.range();    if (this.active) {      range.selectNodeContents(this.node[0]);      this.editor.selection.save(range);      this.node.contents().unwrap();      this.editor.selection.restore();    } else {      $contents = $(range.extractContents());      $code = $("<" + this.htmlTag + "/>").append($contents.contents());      range.insertNode($code[0]);      range.selectNodeContents($code[0]);      this.editor.selection.range(range);    }    return this.editor.trigger('valuechanged');  };  return CodeButton;})(Button);CodePopover = (function(superClass) {  extend(CodePopover, superClass);  function CodePopover() {    return CodePopover.__super__.constructor.apply(this, arguments);  }  CodePopover.prototype.render = function() {    var $option, k, lang, len, ref;    this._tpl = "<div class=\"code-settings\">\n  <div class=\"settings-field\">\n    <select class=\"select-lang\">\n      <option value=\"-1\">" + (this._t('selectLanguage')) + "</option>\n    </select>\n  </div>\n</div>";    this.langs = this.editor.opts.codeLanguages || [      {        name: 'Bash',        value: 'bash'      }, {        name: 'C++',        value: 'c++'      }, {        name: 'C#',        value: 'cs'      }, {        name: 'CSS',        value: 'css'      }, {        name: 'Erlang',        value: 'erlang'      }, {        name: 'Less',        value: 'less'      }, {        name: 'Sass',        value: 'sass'      }, {        name: 'Diff',        value: 'diff'      }, {        name: 'CoffeeScript',        value: 'coffeescript'      }, {        name: 'HTML,XML',        value: 'html'      }, {        name: 'JSON',        value: 'json'      }, {        name: 'Java',        value: 'java'      }, {        name: 'JavaScript',        value: 'js'      }, {        name: 'Markdown',        value: 'markdown'      }, {        name: 'Objective C',        value: 'oc'      }, {        name: 'PHP',        value: 'php'      }, {        name: 'Perl',        value: 'parl'      }, {        name: 'Python',        value: 'python'      }, {        name: 'Ruby',        value: 'ruby'      }, {        name: 'SQL',        value: 'sql'      }    ];    this.el.addClass('code-popover').append(this._tpl);    this.selectEl = this.el.find('.select-lang');    ref = this.langs;    for (k = 0, len = ref.length; k < len; k++) {      lang = ref[k];      $option = $('<option/>', {        text: lang.name,        value: lang.value      }).appendTo(this.selectEl);    }    this.selectEl.on('change', (function(_this) {      return function(e) {        var selected;        _this.lang = _this.selectEl.val();        selected = _this.target.hasClass('selected');        _this.target.removeClass().removeAttr('data-lang');        if (_this.lang !== -1) {          _this.target.attr('data-lang', _this.lang);        }        if (selected) {          _this.target.addClass('selected');        }        return _this.editor.trigger('valuechanged');      };    })(this));    return this.editor.on('valuechanged', (function(_this) {      return function(e) {        if (_this.active) {          return _this.refresh();        }      };    })(this));  };  CodePopover.prototype.show = function() {    var args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    CodePopover.__super__.show.apply(this, args);    this.lang = this.target.attr('data-lang');    if (this.lang != null) {      return this.selectEl.val(this.lang);    } else {      return this.selectEl.val(-1);    }  };  return CodePopover;})(Popover);Simditor.Toolbar.addButton(CodeButton);LinkButton = (function(superClass) {  extend(LinkButton, superClass);  function LinkButton() {    return LinkButton.__super__.constructor.apply(this, arguments);  }  LinkButton.prototype.name = 'link';  LinkButton.prototype.icon = 'link';  LinkButton.prototype.htmlTag = 'a';  LinkButton.prototype.disableTag = 'pre';  LinkButton.prototype.render = function() {    var args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    LinkButton.__super__.render.apply(this, args);    return this.popover = new LinkPopover({      button: this    });  };  LinkButton.prototype._status = function() {    LinkButton.__super__._status.call(this);    if (this.active && !this.editor.selection.rangeAtEndOf(this.node)) {      return this.popover.show(this.node);    } else {      return this.popover.hide();    }  };  LinkButton.prototype.command = function() {    var $contents, $link, $newBlock, linkText, range, txtNode;    range = this.editor.selection.range();    if (this.active) {      txtNode = document.createTextNode(this.node.text());      this.node.replaceWith(txtNode);      range.selectNode(txtNode);    } else {      $contents = $(range.extractContents());      linkText = this.editor.formatter.clearHtml($contents.contents(), false);      $link = $('<a/>', {        href: '',        target: '_blank',        text: linkText || this._t('linkText')      });      if (this.editor.selection.blockNodes().length > 0) {        range.insertNode($link[0]);      } else {        $newBlock = $('<p/>').append($link);        range.insertNode($newBlock[0]);      }      range.selectNodeContents($link[0]);      this.popover.one('popovershow', (function(_this) {        return function() {          if (linkText) {            _this.popover.urlEl.focus();            return _this.popover.urlEl[0].select();          } else {            _this.popover.textEl.focus();            return _this.popover.textEl[0].select();          }        };      })(this));    }    this.editor.selection.range(range);    return this.editor.trigger('valuechanged');  };  return LinkButton;})(Button);LinkPopover = (function(superClass) {  extend(LinkPopover, superClass);  function LinkPopover() {    return LinkPopover.__super__.constructor.apply(this, arguments);  }  LinkPopover.prototype.render = function() {    var tpl;    tpl = "<div class=\"link-settings\">\n  <div class=\"settings-field\">\n    <label>" + (this._t('linkText')) + "</label>\n    <input class=\"link-text\" type=\"text\"/>\n    <a class=\"btn-unlink\" href=\"javascript:;\" title=\"" + (this._t('removeLink')) + "\"\n      tabindex=\"-1\">\n      <span class=\"simditor-icon simditor-icon-unlink\"></span>\n    </a>\n  </div>\n  <div class=\"settings-field\">\n    <label>" + (this._t('linkUrl')) + "</label>\n    <input class=\"link-url\" type=\"text\"/>\n  </div>\n  <div class=\"settings-field\">\n    <label>" + (this._t('linkTarget')) + "</label>\n    <select class=\"link-target\">\n      <option value=\"_blank\">" + (this._t('openLinkInNewWindow')) + " (_blank)</option>\n      <option value=\"_self\">" + (this._t('openLinkInCurrentWindow')) + " (_self)</option>\n    </select>\n  </div>\n</div>";    this.el.addClass('link-popover').append(tpl);    this.textEl = this.el.find('.link-text');    this.urlEl = this.el.find('.link-url');    this.unlinkEl = this.el.find('.btn-unlink');    this.selectTarget = this.el.find('.link-target');    this.textEl.on('keyup', (function(_this) {      return function(e) {        if (e.which === 13) {          return;        }        _this.target.text(_this.textEl.val());        return _this.editor.inputManager.throttledValueChanged();      };    })(this));    this.urlEl.on('keyup', (function(_this) {      return function(e) {        var val;        if (e.which === 13) {          return;        }        val = _this.urlEl.val();        if (!(/https?:\/\/|^\//ig.test(val) || !val)) {          val = 'http://' + val;        }        _this.target.attr('href', val);        return _this.editor.inputManager.throttledValueChanged();      };    })(this));    $([this.urlEl[0], this.textEl[0]]).on('keydown', (function(_this) {      return function(e) {        var range;        if (e.which === 13 || e.which === 27 || (!e.shiftKey && e.which === 9 && $(e.target).hasClass('link-url'))) {          e.preventDefault();          range = document.createRange();          _this.editor.selection.setRangeAfter(_this.target, range);          _this.hide();          return _this.editor.inputManager.throttledValueChanged();        }      };    })(this));    this.unlinkEl.on('click', (function(_this) {      return function(e) {        var range, txtNode;        txtNode = document.createTextNode(_this.target.text());        _this.target.replaceWith(txtNode);        _this.hide();        range = document.createRange();        _this.editor.selection.setRangeAfter(txtNode, range);        return _this.editor.inputManager.throttledValueChanged();      };    })(this));    return this.selectTarget.on('change', (function(_this) {      return function(e) {        _this.target.attr('target', _this.selectTarget.val());        return _this.editor.inputManager.throttledValueChanged();      };    })(this));  };  LinkPopover.prototype.show = function() {    var args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    LinkPopover.__super__.show.apply(this, args);    this.textEl.val(this.target.text());    return this.urlEl.val(this.target.attr('href'));  };  return LinkPopover;})(Popover);Simditor.Toolbar.addButton(LinkButton);ImageButton = (function(superClass) {  extend(ImageButton, superClass);  function ImageButton() {    return ImageButton.__super__.constructor.apply(this, arguments);  }  ImageButton.prototype.name = 'image';  ImageButton.prototype.icon = 'picture-o';  ImageButton.prototype.htmlTag = 'img';  ImageButton.prototype.disableTag = 'pre, table';  ImageButton.prototype.defaultImage = '';  ImageButton.prototype.needFocus = false;  ImageButton.prototype._init = function() {    var item, k, len, ref;    if (this.editor.opts.imageButton) {      if (Array.isArray(this.editor.opts.imageButton)) {        this.menu = [];        ref = this.editor.opts.imageButton;        for (k = 0, len = ref.length; k < len; k++) {          item = ref[k];          this.menu.push({            name: item + '-image',            text: this._t(item + 'Image')          });        }      } else {        this.menu = false;      }    } else {      if (this.editor.uploader != null) {        this.menu = [          {            name: 'upload-image',            text: this._t('uploadImage')          }, {            name: 'external-image',            text: this._t('externalImage')          }        ];      } else {        this.menu = false;      }    }    this.defaultImage = this.editor.opts.defaultImage;    this.editor.body.on('click', 'img:not([data-non-image])', (function(_this) {      return function(e) {        var $img, range;        $img = $(e.currentTarget);        range = document.createRange();        range.selectNode($img[0]);        _this.editor.selection.range(range);        if (!_this.editor.util.support.onselectionchange) {          _this.editor.trigger('selectionchanged');        }        return false;      };    })(this));    this.editor.body.on('mouseup', 'img:not([data-non-image])', function(e) {      return false;    });    this.editor.on('selectionchanged.image', (function(_this) {      return function() {        var $contents, $img, range;        range = _this.editor.selection.range();        if (range == null) {          return;        }        $contents = $(range.cloneContents()).contents();        if ($contents.length === 1 && $contents.is('img:not([data-non-image])')) {          $img = $(range.startContainer).contents().eq(range.startOffset);          return _this.popover.show($img);        } else {          return _this.popover.hide();        }      };    })(this));    this.editor.on('valuechanged.image', (function(_this) {      return function() {        var $masks;        $masks = _this.editor.wrapper.find('.simditor-image-loading');        if (!($masks.length > 0)) {          return;        }        return $masks.each(function(i, mask) {          var $img, $mask, file;          $mask = $(mask);          $img = $mask.data('img');          if (!($img && $img.parent().length > 0)) {            $mask.remove();            if ($img) {              file = $img.data('file');              if (file) {                _this.editor.uploader.cancel(file);                if (_this.editor.body.find('img.uploading').length < 1) {                  return _this.editor.uploader.trigger('uploadready', [file]);                }              }            }          }        });      };    })(this));    return ImageButton.__super__._init.call(this);  };  ImageButton.prototype.render = function() {    var args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    ImageButton.__super__.render.apply(this, args);    this.popover = new ImagePopover({      button: this    });    if (this.editor.opts.imageButton === 'upload') {      return this._initUploader(this.el);    }  };  ImageButton.prototype.renderMenu = function() {    ImageButton.__super__.renderMenu.call(this);    return this._initUploader();  };  ImageButton.prototype._initUploader = function($uploadItem) {    var $input, createInput, uploadProgress;    if ($uploadItem == null) {      $uploadItem = this.menuEl.find('.menu-item-upload-image');    }    if (this.editor.uploader == null) {      this.el.find('.btn-upload').remove();      return;    }    $input = null;    createInput = (function(_this) {      return function() {        if ($input) {          $input.remove();        }        return $input = $('<input/>', {          type: 'file',          title: _this._t('uploadImage'),          multiple: true,          accept: 'image/gif,image/jpeg,image/jpg,image/png,image/svg'        }).appendTo($uploadItem);      };    })(this);    createInput();    $uploadItem.on('click mousedown', 'input[type=file]', function(e) {      return e.stopPropagation();    });    $uploadItem.on('change', 'input[type=file]', (function(_this) {      return function(e) {        if (_this.editor.inputManager.focused) {          _this.editor.uploader.upload($input, {            inline: true          });          createInput();        } else {          _this.editor.one('focus', function(e) {            _this.editor.uploader.upload($input, {              inline: true            });            return createInput();          });          _this.editor.focus();        }        return _this.wrapper.removeClass('menu-on');      };    })(this));    this.editor.uploader.on('beforeupload', (function(_this) {      return function(e, file) {        var $img;        if (!file.inline) {          return;        }        if (file.img) {          $img = $(file.img);        } else {          $img = _this.createImage(file.name);          file.img = $img;        }        $img.addClass('uploading');        $img.data('file', file);        return _this.editor.uploader.readImageFile(file.obj, function(img) {          var src;          if (!$img.hasClass('uploading')) {            return;          }          src = img ? img.src : _this.defaultImage;          return _this.loadImage($img, src, function() {            if (_this.popover.active) {              _this.popover.refresh();              return _this.popover.srcEl.val(_this._t('uploading')).prop('disabled', true);            }          });        });      };    })(this));    uploadProgress = $.proxy(this.editor.util.throttle(function(e, file, loaded, total) {      var $img, $mask, percent;      if (!file.inline) {        return;      }      $mask = file.img.data('mask');      if (!$mask) {        return;      }      $img = $mask.data('img');      if (!($img.hasClass('uploading') && $img.parent().length > 0)) {        $mask.remove();        return;      }      percent = loaded / total;      percent = (percent * 100).toFixed(0);      if (percent > 99) {        percent = 99;      }      return $mask.find('.progress').height((100 - percent) + "%");    }, 500), this);    this.editor.uploader.on('uploadprogress', uploadProgress);    this.editor.uploader.on('uploadsuccess', (function(_this) {      return function(e, file, result) {        var $img, img_path, msg;        if (!file.inline) {          return;        }        $img = file.img;        if (!($img.hasClass('uploading') && $img.parent().length > 0)) {          return;        }        if (typeof result !== 'object') {          try {            result = $.parseJSON(result);          } catch (_error) {            e = _error;            result = {              success: false            };          }        }        if (result.success === false) {          msg = result.msg || _this._t('uploadFailed');          alert(msg);          img_path = _this.defaultImage;        } else {          img_path = result.file_path;        }        _this.loadImage($img, img_path, function() {          var $mask;          $img.removeData('file');          $img.removeClass('uploading').removeClass('loading');          $mask = $img.data('mask');          if ($mask) {            $mask.remove();          }          $img.removeData('mask');          _this.editor.trigger('valuechanged');          if (_this.editor.body.find('img.uploading').length < 1) {            return _this.editor.uploader.trigger('uploadready', [file, result]);          }        });        if (_this.popover.active) {          _this.popover.srcEl.prop('disabled', false);          return _this.popover.srcEl.val(result.file_path);        }      };    })(this));    return this.editor.uploader.on('uploaderror', (function(_this) {      return function(e, file, xhr) {        var $img, msg, result;        if (!file.inline) {          return;        }        if (xhr.statusText === 'abort') {          return;        }        if (xhr.responseText) {          try {            result = $.parseJSON(xhr.responseText);            msg = result.msg;          } catch (_error) {            e = _error;            msg = _this._t('uploadError');          }        }        $img = file.img;        if (!($img.hasClass('uploading') && $img.parent().length > 0)) {          return;        }        _this.loadImage($img, _this.defaultImage, function() {          var $mask;          $img.removeData('file');          $img.removeClass('uploading').removeClass('loading');          $mask = $img.data('mask');          if ($mask) {            $mask.remove();          }          return $img.removeData('mask');        });        if (_this.popover.active) {          _this.popover.srcEl.prop('disabled', false);          _this.popover.srcEl.val(_this.defaultImage);        }        _this.editor.trigger('valuechanged');        if (_this.editor.body.find('img.uploading').length < 1) {          return _this.editor.uploader.trigger('uploadready', [file, result]);        }      };    })(this));  };  ImageButton.prototype._status = function() {    return this._disableStatus();  };  ImageButton.prototype.loadImage = function($img, src, callback) {    var $mask, img, positionMask;    positionMask = (function(_this) {      return function() {        var imgOffset, wrapperOffset;        imgOffset = $img.offset();        wrapperOffset = _this.editor.wrapper.offset();        return $mask.css({          top: imgOffset.top - wrapperOffset.top,          left: imgOffset.left - wrapperOffset.left,          width: $img.width(),          height: $img.height()        }).show();      };    })(this);    $img.addClass('loading');    $mask = $img.data('mask');    if (!$mask) {      $mask = $('<div class="simditor-image-loading">\n  <div class="progress"></div>\n</div>').hide().appendTo(this.editor.wrapper);      positionMask();      $img.data('mask', $mask);      $mask.data('img', $img);    }    img = new Image();    img.onload = (function(_this) {      return function() {        var height, width;        if (!$img.hasClass('loading') && !$img.hasClass('uploading')) {          return;        }        width = img.width;        height = img.height;        $img.attr({          src: src,          width: width,          height: height,          'data-image-size': width + ',' + height        }).removeClass('loading');        if ($img.hasClass('uploading')) {          _this.editor.util.reflow(_this.editor.body);          positionMask();        } else {          $mask.remove();          $img.removeData('mask');        }        if ($.isFunction(callback)) {          return callback(img);        }      };    })(this);    img.onerror = function() {      if ($.isFunction(callback)) {        callback(false);      }      $mask.remove();      return $img.removeData('mask').removeClass('loading');    };    return img.src = src;  };  ImageButton.prototype.createImage = function(name) {    var $img, range;    if (name == null) {      name = 'Image';    }    if (!this.editor.inputManager.focused) {      this.editor.focus();    }    range = this.editor.selection.range();    range.deleteContents();    this.editor.selection.range(range);    $img = $('<img/>').attr('alt', name);    range.insertNode($img[0]);    this.editor.selection.setRangeAfter($img, range);    this.editor.trigger('valuechanged');    return $img;  };  ImageButton.prototype.command = function(src) {    var $img;    $img = this.createImage();    return this.loadImage($img, src || this.defaultImage, (function(_this) {      return function() {        _this.editor.trigger('valuechanged');        _this.editor.util.reflow($img);        $img.click();        return _this.popover.one('popovershow', function() {          _this.popover.srcEl.focus();          return _this.popover.srcEl[0].select();        });      };    })(this));  };  return ImageButton;})(Button);ImagePopover = (function(superClass) {  extend(ImagePopover, superClass);  function ImagePopover() {    return ImagePopover.__super__.constructor.apply(this, arguments);  }  ImagePopover.prototype.offset = {    top: 6,    left: -4  };  ImagePopover.prototype.render = function() {    var tpl;    tpl = "<div class=\"link-settings\">\n  <div class=\"settings-field\">\n    <label>" + (this._t('imageUrl')) + "</label>\n    <input class=\"image-src\" type=\"text\" tabindex=\"1\" />\n    <a class=\"btn-upload\" href=\"javascript:;\"\n      title=\"" + (this._t('uploadImage')) + "\" tabindex=\"-1\">\n      <span class=\"simditor-icon simditor-icon-upload\"></span>\n    </a>\n  </div>\n  <div class='settings-field'>\n    <label>" + (this._t('imageAlt')) + "</label>\n    <input class=\"image-alt\" id=\"image-alt\" type=\"text\" tabindex=\"1\" />\n  </div>\n  <div class=\"settings-field\">\n    <label>" + (this._t('imageSize')) + "</label>\n    <input class=\"image-size\" id=\"image-width\" type=\"text\" tabindex=\"2\" />\n    <span class=\"times\">×</span>\n    <input class=\"image-size\" id=\"image-height\" type=\"text\" tabindex=\"3\" />\n    <a class=\"btn-restore\" href=\"javascript:;\"\n      title=\"" + (this._t('restoreImageSize')) + "\" tabindex=\"-1\">\n      <span class=\"simditor-icon simditor-icon-undo\"></span>\n    </a>\n  </div>\n</div>";    this.el.addClass('image-popover').append(tpl);    this.srcEl = this.el.find('.image-src');    this.widthEl = this.el.find('#image-width');    this.heightEl = this.el.find('#image-height');    this.altEl = this.el.find('#image-alt');    this.srcEl.on('keydown', (function(_this) {      return function(e) {        var range;        if (!(e.which === 13 && !_this.target.hasClass('uploading'))) {          return;        }        e.preventDefault();        range = document.createRange();        _this.button.editor.selection.setRangeAfter(_this.target, range);        return _this.hide();      };    })(this));    this.srcEl.on('blur', (function(_this) {      return function(e) {        return _this._loadImage(_this.srcEl.val());      };    })(this));    this.el.find('.image-size').on('blur', (function(_this) {      return function(e) {        _this._resizeImg($(e.currentTarget));        return _this.el.data('popover').refresh();      };    })(this));    this.el.find('.image-size').on('keyup', (function(_this) {      return function(e) {        var inputEl;        inputEl = $(e.currentTarget);        if (!(e.which === 13 || e.which === 27 || e.which === 9)) {          return _this._resizeImg(inputEl, true);        }      };    })(this));    this.el.find('.image-size').on('keydown', (function(_this) {      return function(e) {        var $img, inputEl, range;        inputEl = $(e.currentTarget);        if (e.which === 13 || e.which === 27) {          e.preventDefault();          if (e.which === 13) {            _this._resizeImg(inputEl);          } else {            _this._restoreImg();          }          $img = _this.target;          _this.hide();          range = document.createRange();          return _this.button.editor.selection.setRangeAfter($img, range);        } else if (e.which === 9) {          return _this.el.data('popover').refresh();        }      };    })(this));    this.altEl.on('keydown', (function(_this) {      return function(e) {        var range;        if (e.which === 13) {          e.preventDefault();          range = document.createRange();          _this.button.editor.selection.setRangeAfter(_this.target, range);          return _this.hide();        }      };    })(this));    this.altEl.on('keyup', (function(_this) {      return function(e) {        if (e.which === 13 || e.which === 27 || e.which === 9) {          return;        }        _this.alt = _this.altEl.val();        return _this.target.attr('alt', _this.alt);      };    })(this));    this.el.find('.btn-restore').on('click', (function(_this) {      return function(e) {        _this._restoreImg();        return _this.el.data('popover').refresh();      };    })(this));    this.editor.on('valuechanged', (function(_this) {      return function(e) {        if (_this.active) {          return _this.refresh();        }      };    })(this));    return this._initUploader();  };  ImagePopover.prototype._initUploader = function() {    var $uploadBtn, createInput;    $uploadBtn = this.el.find('.btn-upload');    if (this.editor.uploader == null) {      $uploadBtn.remove();      return;    }    createInput = (function(_this) {      return function() {        if (_this.input) {          _this.input.remove();        }        return _this.input = $('<input/>', {          type: 'file',          title: _this._t('uploadImage'),          multiple: true,          accept: 'image/gif,image/jpeg,image/jpg,image/png,image/svg'        }).appendTo($uploadBtn);      };    })(this);    createInput();    this.el.on('click mousedown', 'input[type=file]', function(e) {      return e.stopPropagation();    });    return this.el.on('change', 'input[type=file]', (function(_this) {      return function(e) {        _this.editor.uploader.upload(_this.input, {          inline: true,          img: _this.target        });        return createInput();      };    })(this));  };  ImagePopover.prototype._resizeImg = function(inputEl, onlySetVal) {    var height, value, width;    if (onlySetVal == null) {      onlySetVal = false;    }    value = inputEl.val() * 1;    if (!(this.target && ($.isNumeric(value) || value < 0))) {      return;    }    if (inputEl.is(this.widthEl)) {      width = value;      height = this.height * value / this.width;      this.heightEl.val(height);    } else {      height = value;      width = this.width * value / this.height;      this.widthEl.val(width);    }    if (!onlySetVal) {      this.target.attr({        width: width,        height: height      });      return this.editor.trigger('valuechanged');    }  };  ImagePopover.prototype._restoreImg = function() {    var ref, size;    size = ((ref = this.target.data('image-size')) != null ? ref.split(",") : void 0) || [this.width, this.height];    this.target.attr({      width: size[0] * 1,      height: size[1] * 1    });    this.widthEl.val(size[0]);    this.heightEl.val(size[1]);    return this.editor.trigger('valuechanged');  };  ImagePopover.prototype._loadImage = function(src, callback) {    if (/^data:image/.test(src) && !this.editor.uploader) {      if (callback) {        callback(false);      }      return;    }    if (this.target.attr('src') === src) {      return;    }    return this.button.loadImage(this.target, src, (function(_this) {      return function(img) {        var blob;        if (!img) {          return;        }        if (_this.active) {          _this.width = img.width;          _this.height = img.height;          _this.widthEl.val(_this.width);          _this.heightEl.val(_this.height);        }        if (/^data:image/.test(src)) {          blob = _this.editor.util.dataURLtoBlob(src);          blob.name = "Base64 Image.png";          _this.editor.uploader.upload(blob, {            inline: true,            img: _this.target          });        } else {          _this.editor.trigger('valuechanged');        }        if (callback) {          return callback(img);        }      };    })(this));  };  ImagePopover.prototype.show = function() {    var $img, args;    args = 1 <= arguments.length ? slice.call(arguments, 0) : [];    ImagePopover.__super__.show.apply(this, args);    $img = this.target;    this.width = $img.width();    this.height = $img.height();    this.alt = $img.attr('alt');    if ($img.hasClass('uploading')) {      return this.srcEl.val(this._t('uploading')).prop('disabled', true);    } else {      this.srcEl.val($img.attr('src')).prop('disabled', false);      this.widthEl.val(this.width);      this.heightEl.val(this.height);      return this.altEl.val(this.alt);    }  };  return ImagePopover;})(Popover);Simditor.Toolbar.addButton(ImageButton);IndentButton = (function(superClass) {  extend(IndentButton, superClass);  function IndentButton() {    return IndentButton.__super__.constructor.apply(this, arguments);  }  IndentButton.prototype.name = 'indent';  IndentButton.prototype.icon = 'indent';  IndentButton.prototype._init = function() {    var hotkey;    hotkey = this.editor.opts.tabIndent === false ? '' : ' (Tab)';    this.title = this._t(this.name) + hotkey;    return IndentButton.__super__._init.call(this);  };  IndentButton.prototype._status = function() {};  IndentButton.prototype.command = function() {    return this.editor.indentation.indent();  };  return IndentButton;})(Button);Simditor.Toolbar.addButton(IndentButton);OutdentButton = (function(superClass) {  extend(OutdentButton, superClass);  function OutdentButton() {    return OutdentButton.__super__.constructor.apply(this, arguments);  }  OutdentButton.prototype.name = 'outdent';  OutdentButton.prototype.icon = 'outdent';  OutdentButton.prototype._init = function() {    var hotkey;    hotkey = this.editor.opts.tabIndent === false ? '' : ' (Shift + Tab)';    this.title = this._t(this.name) + hotkey;    return OutdentButton.__super__._init.call(this);  };  OutdentButton.prototype._status = function() {};  OutdentButton.prototype.command = function() {    return this.editor.indentation.indent(true);  };  return OutdentButton;})(Button);Simditor.Toolbar.addButton(OutdentButton);HrButton = (function(superClass) {  extend(HrButton, superClass);  function HrButton() {    return HrButton.__super__.constructor.apply(this, arguments);  }  HrButton.prototype.name = 'hr';  HrButton.prototype.icon = 'minus';  HrButton.prototype.htmlTag = 'hr';  HrButton.prototype._status = function() {};  HrButton.prototype.command = function() {    var $hr, $newBlock, $nextBlock, $rootBlock;    $rootBlock = this.editor.selection.rootNodes().first();    $nextBlock = $rootBlock.next();    if ($nextBlock.length > 0) {      this.editor.selection.save();    } else {      $newBlock = $('<p/>').append(this.editor.util.phBr);    }    $hr = $('<hr/>').insertAfter($rootBlock);    if ($newBlock) {      $newBlock.insertAfter($hr);      this.editor.selection.setRangeAtStartOf($newBlock);    } else {      this.editor.selection.restore();    }    return this.editor.trigger('valuechanged');  };  return HrButton;})(Button);Simditor.Toolbar.addButton(HrButton);TableButton = (function(superClass) {  extend(TableButton, superClass);  function TableButton() {    return TableButton.__super__.constructor.apply(this, arguments);  }  TableButton.prototype.name = 'table';  TableButton.prototype.icon = 'table';  TableButton.prototype.htmlTag = 'table';  TableButton.prototype.disableTag = 'pre, li, blockquote';  TableButton.prototype.menu = true;  TableButton.prototype._init = function() {    TableButton.__super__._init.call(this);    $.merge(this.editor.formatter._allowedTags, ['thead', 'th', 'tbody', 'tr', 'td', 'colgroup', 'col']);    $.extend(this.editor.formatter._allowedAttributes, {      td: ['rowspan', 'colspan'],      col: ['width']    });    $.extend(this.editor.formatter._allowedStyles, {      td: ['text-align'],      th: ['text-align']    });    this._initShortcuts();    this._initResize();    this.editor.on('decorate', (function(_this) {      return function(e, $el) {        return $el.find('table').each(function(i, table) {          return _this.decorate($(table));        });      };    })(this));    this.editor.on('undecorate', (function(_this) {      return function(e, $el) {        return $el.find('table').each(function(i, table) {          return _this.undecorate($(table));        });      };    })(this));    this.editor.on('selectionchanged.table', (function(_this) {      return function(e) {        var $container, range;        _this.editor.body.find('.simditor-table td, .simditor-table th').removeClass('active');        range = _this.editor.selection.range();        if (!range) {          return;        }        $container = _this.editor.selection.containerNode();        if (range.collapsed && $container.is('.simditor-table')) {          _this.editor.selection.setRangeAtEndOf($container);        }        return $container.closest('td, th', _this.editor.body).addClass('active');      };    })(this));    this.editor.on('blur.table', (function(_this) {      return function(e) {        return _this.editor.body.find('.simditor-table td, .simditor-table th').removeClass('active');      };    })(this));    this.editor.keystroke.add('up', 'td', (function(_this) {      return function(e, $node) {        _this._tdNav($node, 'up');        return true;      };    })(this));    this.editor.keystroke.add('up', 'th', (function(_this) {      return function(e, $node) {        _this._tdNav($node, 'up');        return true;      };    })(this));    this.editor.keystroke.add('down', 'td', (function(_this) {      return function(e, $node) {        _this._tdNav($node, 'down');        return true;      };    })(this));    return this.editor.keystroke.add('down', 'th', (function(_this) {      return function(e, $node) {        _this._tdNav($node, 'down');        return true;      };    })(this));  };  TableButton.prototype._tdNav = function($td, direction) {    var $anotherTr, $tr, action, anotherTag, index, parentTag, ref;    if (direction == null) {      direction = 'up';    }    action = direction === 'up' ? 'prev' : 'next';    ref = direction === 'up' ? ['tbody', 'thead'] : ['thead', 'tbody'], parentTag = ref[0], anotherTag = ref[1];    $tr = $td.parent('tr');    $anotherTr = this["_" + action + "Row"]($tr);    if (!($anotherTr.length > 0)) {      return true;    }    index = $tr.find('td, th').index($td);    return this.editor.selection.setRangeAtEndOf($anotherTr.find('td, th').eq(index));  };  TableButton.prototype._nextRow = function($tr) {    var $nextTr;    $nextTr = $tr.next('tr');    if ($nextTr.length < 1 && $tr.parent('thead').length > 0) {      $nextTr = $tr.parent('thead').next('tbody').find('tr:first');    }    return $nextTr;  };  TableButton.prototype._prevRow = function($tr) {    var $prevTr;    $prevTr = $tr.prev('tr');    if ($prevTr.length < 1 && $tr.parent('tbody').length > 0) {      $prevTr = $tr.parent('tbody').prev('thead').find('tr');    }    return $prevTr;  };  TableButton.prototype._initResize = function() {    var $editor;    $editor = this.editor;    $(document).on('mousemove.simditor-table', '.simditor-table td, .simditor-table th', function(e) {      var $col, $colgroup, $resizeHandle, $td, $wrapper, index, ref, ref1, x;      $wrapper = $(this).parents('.simditor-table');      $resizeHandle = $wrapper.find('.simditor-resize-handle');      $colgroup = $wrapper.find('colgroup');      if ($wrapper.hasClass('resizing')) {        return;      }      $td = $(e.currentTarget);      x = e.pageX - $(e.currentTarget).offset().left;      if (x < 5 && $td.prev().length > 0) {        $td = $td.prev();      }      if ($td.next('td, th').length < 1) {        $resizeHandle.hide();        return;      }      if ((ref = $resizeHandle.data('td')) != null ? ref.is($td) : void 0) {        $resizeHandle.show();        return;      }      index = $td.parent().find('td, th').index($td);      $col = $colgroup.find('col').eq(index);      if ((ref1 = $resizeHandle.data('col')) != null ? ref1.is($col) : void 0) {        $resizeHandle.show();        return;      }      return $resizeHandle.css('left', $td.position().left + $td.outerWidth() - 5).data('td', $td).data('col', $col).show();    });    $(document).on('mouseleave.simditor-table', '.simditor-table', function(e) {      return $(this).find('.simditor-resize-handle').hide();    });    return $(document).on('mousedown.simditor-resize-handle', '.simditor-resize-handle', function(e) {      var $handle, $leftCol, $leftTd, $rightCol, $rightTd, $wrapper, minWidth, startHandleLeft, startLeftWidth, startRightWidth, startX, tableWidth;      $wrapper = $(this).parent('.simditor-table');      $handle = $(e.currentTarget);      $leftTd = $handle.data('td');      $leftCol = $handle.data('col');      $rightTd = $leftTd.next('td, th');      $rightCol = $leftCol.next('col');      startX = e.pageX;      startLeftWidth = $leftTd.outerWidth() * 1;      startRightWidth = $rightTd.outerWidth() * 1;      startHandleLeft = parseFloat($handle.css('left'));      tableWidth = $leftTd.closest('table').width();      minWidth = 50;      $(document).on('mousemove.simditor-resize-table', function(e) {        var deltaX, leftWidth, rightWidth;        deltaX = e.pageX - startX;        leftWidth = startLeftWidth + deltaX;        rightWidth = startRightWidth - deltaX;        if (leftWidth < minWidth) {          leftWidth = minWidth;          deltaX = minWidth - startLeftWidth;          rightWidth = startRightWidth - deltaX;        } else if (rightWidth < minWidth) {          rightWidth = minWidth;          deltaX = startRightWidth - minWidth;          leftWidth = startLeftWidth + deltaX;        }        $leftCol.attr('width', (leftWidth / tableWidth * 100) + '%');        $rightCol.attr('width', (rightWidth / tableWidth * 100) + '%');        return $handle.css('left', startHandleLeft + deltaX);      });      $(document).one('mouseup.simditor-resize-table', function(e) {        $editor.sync();        $(document).off('.simditor-resize-table');        return $wrapper.removeClass('resizing');      });      $wrapper.addClass('resizing');      return false;    });  };  TableButton.prototype._initShortcuts = function() {    this.editor.hotkeys.add('ctrl+alt+up', (function(_this) {      return function(e) {        _this.editMenu.find('.menu-item[data-param=insertRowAbove]').click();        return false;      };    })(this));    this.editor.hotkeys.add('ctrl+alt+down', (function(_this) {      return function(e) {        _this.editMenu.find('.menu-item[data-param=insertRowBelow]').click();        return false;      };    })(this));    this.editor.hotkeys.add('ctrl+alt+left', (function(_this) {      return function(e) {        _this.editMenu.find('.menu-item[data-param=insertColLeft]').click();        return false;      };    })(this));    return this.editor.hotkeys.add('ctrl+alt+right', (function(_this) {      return function(e) {        _this.editMenu.find('.menu-item[data-param=insertColRight]').click();        return false;      };    })(this));  };  TableButton.prototype.decorate = function($table) {    var $colgroup, $headRow, $resizeHandle, $tbody, $thead, $wrapper;    if ($table.parent('.simditor-table').length > 0) {      this.undecorate($table);    }    $table.wrap('<div class="simditor-table"></div>');    $wrapper = $table.parent('.simditor-table');    $colgroup = $table.find('colgroup');    if ($table.find('thead').length < 1) {      $thead = $('<thead />');      $headRow = $table.find('tr').first();      $thead.append($headRow);      this._changeCellTag($headRow, 'th');      $tbody = $table.find('tbody');      if ($tbody.length > 0) {        $tbody.before($thead);      } else {        $table.prepend($thead);      }    }    if ($colgroup.length < 1) {      $colgroup = $('<colgroup/>').prependTo($table);      $table.find('thead tr th').each(function(i, td) {        var $col;        return $col = $('<col/>').appendTo($colgroup);      });      this.refreshTableWidth($table);    }    $resizeHandle = $('<div />', {      "class": 'simditor-resize-handle',      contenteditable: 'false'    }).appendTo($wrapper);    return $table.parent();  };  TableButton.prototype.undecorate = function($table) {    if (!($table.parent('.simditor-table').length > 0)) {      return;    }    return $table.parent().replaceWith($table);  };  TableButton.prototype.renderMenu = function() {    var $table;    $("<div class=\"menu-create-table\">\n</div>\n<div class=\"menu-edit-table\">\n  <ul>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"deleteRow\">\n        <span>" + (this._t('deleteRow')) + "</span>\n      </a>\n    </li>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"insertRowAbove\">\n        <span>" + (this._t('insertRowAbove')) + " ( Ctrl + Alt + ↑ )</span>\n      </a>\n    </li>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"insertRowBelow\">\n        <span>" + (this._t('insertRowBelow')) + " ( Ctrl + Alt + ↓ )</span>\n      </a>\n    </li>\n    <li><span class=\"separator\"></span></li>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"deleteCol\">\n        <span>" + (this._t('deleteColumn')) + "</span>\n      </a>\n    </li>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"insertColLeft\">\n        <span>" + (this._t('insertColumnLeft')) + " ( Ctrl + Alt + ← )</span>\n      </a>\n    </li>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"insertColRight\">\n        <span>" + (this._t('insertColumnRight')) + " ( Ctrl + Alt + → )</span>\n      </a>\n    </li>\n    <li><span class=\"separator\"></span></li>\n    <li>\n      <a tabindex=\"-1\" unselectable=\"on\" class=\"menu-item\"\n        href=\"javascript:;\" data-param=\"deleteTable\">\n        <span>" + (this._t('deleteTable')) + "</span>\n      </a>\n    </li>\n  </ul>\n</div>").appendTo(this.menuWrapper);    this.createMenu = this.menuWrapper.find('.menu-create-table');    this.editMenu = this.menuWrapper.find('.menu-edit-table');    $table = this.createTable(6, 6).appendTo(this.createMenu);    this.createMenu.on('mouseenter', 'td, th', (function(_this) {      return function(e) {        var $td, $tr, $trs, num;        _this.createMenu.find('td, th').removeClass('selected');        $td = $(e.currentTarget);        $tr = $td.parent();        num = $tr.find('td, th').index($td) + 1;        $trs = $tr.prevAll('tr').addBack();        if ($tr.parent().is('tbody')) {          $trs = $trs.add($table.find('thead tr'));        }        return $trs.find("td:lt(" + num + "), th:lt(" + num + ")").addClass('selected');      };    })(this));    this.createMenu.on('mouseleave', function(e) {      return $(e.currentTarget).find('td, th').removeClass('selected');    });    return this.createMenu.on('mousedown', 'td, th', (function(_this) {      return function(e) {        var $closestBlock, $td, $tr, colNum, rowNum;        _this.wrapper.removeClass('menu-on');        if (!_this.editor.inputManager.focused) {          return;        }        $td = $(e.currentTarget);        $tr = $td.parent();        colNum = $tr.find('td').index($td) + 1;        rowNum = $tr.prevAll('tr').length + 1;        if ($tr.parent().is('tbody')) {          rowNum += 1;        }        $table = _this.createTable(rowNum, colNum, true);        $closestBlock = _this.editor.selection.blockNodes().last();        if (_this.editor.util.isEmptyNode($closestBlock)) {          $closestBlock.replaceWith($table);        } else {          $closestBlock.after($table);        }        _this.decorate($table);        _this.editor.selection.setRangeAtStartOf($table.find('th:first'));        _this.editor.trigger('valuechanged');        return false;      };    })(this));  };  TableButton.prototype.createTable = function(row, col, phBr) {    var $table, $tbody, $td, $thead, $tr, c, k, l, r, ref, ref1;    $table = $('<table/>');    $thead = $('<thead/>').appendTo($table);    $tbody = $('<tbody/>').appendTo($table);    for (r = k = 0, ref = row; 0 <= ref ? k < ref : k > ref; r = 0 <= ref ? ++k : --k) {      $tr = $('<tr/>');      $tr.appendTo(r === 0 ? $thead : $tbody);      for (c = l = 0, ref1 = col; 0 <= ref1 ? l < ref1 : l > ref1; c = 0 <= ref1 ? ++l : --l) {        $td = $(r === 0 ? '<th/>' : '<td/>').appendTo($tr);        if (phBr) {          $td.append(this.editor.util.phBr);        }      }    }    return $table;  };  TableButton.prototype.refreshTableWidth = function($table) {    return setTimeout((function(_this) {      return function() {        var cols, tableWidth;        tableWidth = $table.width();        cols = $table.find('col');        return $table.find('thead tr th').each(function(i, td) {          var $col;          $col = cols.eq(i);          return $col.attr('width', ($(td).outerWidth() / tableWidth * 100) + '%');        });      };    })(this), 0);  };  TableButton.prototype.setActive = function(active) {    TableButton.__super__.setActive.call(this, active);    if (active) {      this.createMenu.hide();      return this.editMenu.show();    } else {      this.createMenu.show();      return this.editMenu.hide();    }  };  TableButton.prototype._changeCellTag = function($tr, tagName) {    return $tr.find('td, th').each(function(i, cell) {      var $cell;      $cell = $(cell);      return $cell.replaceWith("<" + tagName + ">" + ($cell.html()) + "</" + tagName + ">");    });  };  TableButton.prototype.deleteRow = function($td) {    var $newTr, $tr, index;    $tr = $td.parent('tr');    if ($tr.closest('table').find('tr').length < 1) {      return this.deleteTable($td);    } else {      $newTr = this._nextRow($tr);      if (!($newTr.length > 0)) {        $newTr = this._prevRow($tr);      }      index = $tr.find('td, th').index($td);      if ($tr.parent().is('thead')) {        $newTr.appendTo($tr.parent());        this._changeCellTag($newTr, 'th');      }      $tr.remove();      return this.editor.selection.setRangeAtEndOf($newTr.find('td, th').eq(index));    }  };  TableButton.prototype.insertRow = function($td, direction) {    var $newTr, $table, $tr, cellTag, colNum, i, index, k, ref;    if (direction == null) {      direction = 'after';    }    $tr = $td.parent('tr');    $table = $tr.closest('table');    colNum = 0;    $table.find('tr').each(function(i, tr) {      return colNum = Math.max(colNum, $(tr).find('td').length);    });    index = $tr.find('td, th').index($td);    $newTr = $('<tr/>');    cellTag = 'td';    if (direction === 'after' && $tr.parent().is('thead')) {      $tr.parent().next('tbody').prepend($newTr);    } else if (direction === 'before' && $tr.parent().is('thead')) {      $tr.before($newTr);      $tr.parent().next('tbody').prepend($tr);      this._changeCellTag($tr, 'td');      cellTag = 'th';    } else {      $tr[direction]($newTr);    }    for (i = k = 1, ref = colNum; 1 <= ref ? k <= ref : k >= ref; i = 1 <= ref ? ++k : --k) {      $("<" + cellTag + "/>").append(this.editor.util.phBr).appendTo($newTr);    }    return this.editor.selection.setRangeAtStartOf($newTr.find('td, th').eq(index));  };  TableButton.prototype.deleteCol = function($td) {    var $newTd, $table, $tr, index, noOtherCol, noOtherRow;    $tr = $td.parent('tr');    noOtherRow = $tr.closest('table').find('tr').length < 2;    noOtherCol = $td.siblings('td, th').length < 1;    if (noOtherRow && noOtherCol) {      return this.deleteTable($td);    } else {      index = $tr.find('td, th').index($td);      $newTd = $td.next('td, th');      if (!($newTd.length > 0)) {        $newTd = $tr.prev('td, th');      }      $table = $tr.closest('table');      $table.find('col').eq(index).remove();      $table.find('tr').each(function(i, tr) {        return $(tr).find('td, th').eq(index).remove();      });      this.refreshTableWidth($table);      return this.editor.selection.setRangeAtEndOf($newTd);    }  };  TableButton.prototype.insertCol = function($td, direction) {    var $col, $newCol, $newTd, $table, $tr, index, tableWidth, width;    if (direction == null) {      direction = 'after';    }    $tr = $td.parent('tr');    index = $tr.find('td, th').index($td);    $table = $td.closest('table');    $col = $table.find('col').eq(index);    $table.find('tr').each((function(_this) {      return function(i, tr) {        var $newTd, cellTag;        cellTag = $(tr).parent().is('thead') ? 'th' : 'td';        $newTd = $("<" + cellTag + "/>").append(_this.editor.util.phBr);        return $(tr).find('td, th').eq(index)[direction]($newTd);      };    })(this));    $newCol = $('<col/>');    $col[direction]($newCol);    tableWidth = $table.width();    width = Math.max(parseFloat($col.attr('width')) / 2, 50 / tableWidth * 100);    $col.attr('width', width + '%');    $newCol.attr('width', width + '%');    this.refreshTableWidth($table);    $newTd = direction === 'after' ? $td.next('td, th') : $td.prev('td, th');    return this.editor.selection.setRangeAtStartOf($newTd);  };  TableButton.prototype.deleteTable = function($td) {    var $block, $table;    $table = $td.closest('.simditor-table');    $block = $table.next('p');    $table.remove();    if ($block.length > 0) {      return this.editor.selection.setRangeAtStartOf($block);    }  };  TableButton.prototype.command = function(param) {    var $td;    $td = this.editor.selection.containerNode().closest('td, th');    if (!($td.length > 0)) {      return;    }    if (param === 'deleteRow') {      this.deleteRow($td);    } else if (param === 'insertRowAbove') {      this.insertRow($td, 'before');    } else if (param === 'insertRowBelow') {      this.insertRow($td);    } else if (param === 'deleteCol') {      this.deleteCol($td);    } else if (param === 'insertColLeft') {      this.insertCol($td, 'before');    } else if (param === 'insertColRight') {      this.insertCol($td);    } else if (param === 'deleteTable') {      this.deleteTable($td);    } else {      return;    }    return this.editor.trigger('valuechanged');  };  return TableButton;})(Button);Simditor.Toolbar.addButton(TableButton);StrikethroughButton = (function(superClass) {  extend(StrikethroughButton, superClass);  function StrikethroughButton() {    return StrikethroughButton.__super__.constructor.apply(this, arguments);  }  StrikethroughButton.prototype.name = 'strikethrough';  StrikethroughButton.prototype.icon = 'strikethrough';  StrikethroughButton.prototype.htmlTag = 'strike';  StrikethroughButton.prototype.disableTag = 'pre';  StrikethroughButton.prototype._activeStatus = function() {    var active;    active = document.queryCommandState('strikethrough') === true;    this.setActive(active);    return this.active;  };  StrikethroughButton.prototype.command = function() {    document.execCommand('strikethrough');    if (!this.editor.util.support.oninput) {      this.editor.trigger('valuechanged');    }    return $(document).trigger('selectionchange');  };  return StrikethroughButton;})(Button);Simditor.Toolbar.addButton(StrikethroughButton);AlignmentButton = (function(superClass) {  extend(AlignmentButton, superClass);  function AlignmentButton() {    return AlignmentButton.__super__.constructor.apply(this, arguments);  }  AlignmentButton.prototype.name = "alignment";  AlignmentButton.prototype.icon = 'align-left';  AlignmentButton.prototype.htmlTag = 'p, h1, h2, h3, h4, td, th';  AlignmentButton.prototype._init = function() {    this.menu = [      {        name: 'left',        text: this._t('alignLeft'),        icon: 'align-left',        param: 'left'      }, {        name: 'center',        text: this._t('alignCenter'),        icon: 'align-center',        param: 'center'      }, {        name: 'right',        text: this._t('alignRight'),        icon: 'align-right',        param: 'right'      }    ];    return AlignmentButton.__super__._init.call(this);  };  AlignmentButton.prototype.setActive = function(active, align) {    if (align == null) {      align = 'left';    }    if (align !== 'left' && align !== 'center' && align !== 'right') {      align = 'left';    }    if (align === 'left') {      AlignmentButton.__super__.setActive.call(this, false);    } else {      AlignmentButton.__super__.setActive.call(this, active);    }    this.el.removeClass('align-left align-center align-right');    if (active) {      this.el.addClass('align-' + align);    }    this.setIcon('align-' + align);    return this.menuEl.find('.menu-item').show().end().find('.menu-item-' + align).hide();  };  AlignmentButton.prototype._status = function() {    this.nodes = this.editor.selection.nodes().filter(this.htmlTag);    if (this.nodes.length < 1) {      this.setDisabled(true);      return this.setActive(false);    } else {      this.setDisabled(false);      return this.setActive(true, this.nodes.first().css('text-align'));    }  };  AlignmentButton.prototype.command = function(align) {    if (align !== 'left' && align !== 'center' && align !== 'right') {      throw new Error("simditor alignment button: invalid align " + align);    }    this.nodes.css({      'text-align': align === 'left' ? '' : align    });    this.editor.trigger('valuechanged');    return this.editor.inputManager.throttledSelectionChanged();  };  return AlignmentButton;})(Button);Simditor.Toolbar.addButton(AlignmentButton);return Simditor;}));
 |