theme.js 314 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830
  1. (function () {
  2. var inlite = (function (domGlobals) {
  3. 'use strict';
  4. var global = tinymce.util.Tools.resolve('tinymce.ThemeManager');
  5. var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
  6. var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  7. var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay');
  8. var flatten = function (arr) {
  9. return arr.reduce(function (results, item) {
  10. return Array.isArray(item) ? results.concat(flatten(item)) : results.concat(item);
  11. }, []);
  12. };
  13. var DeepFlatten = { flatten: flatten };
  14. var result = function (id, rect) {
  15. return {
  16. id: id,
  17. rect: rect
  18. };
  19. };
  20. var match = function (editor, matchers) {
  21. for (var i = 0; i < matchers.length; i++) {
  22. var f = matchers[i];
  23. var result_1 = f(editor);
  24. if (result_1) {
  25. return result_1;
  26. }
  27. }
  28. return null;
  29. };
  30. var Matcher = {
  31. match: match,
  32. result: result
  33. };
  34. var fromClientRect = function (clientRect) {
  35. return {
  36. x: clientRect.left,
  37. y: clientRect.top,
  38. w: clientRect.width,
  39. h: clientRect.height
  40. };
  41. };
  42. var toClientRect = function (geomRect) {
  43. return {
  44. left: geomRect.x,
  45. top: geomRect.y,
  46. width: geomRect.w,
  47. height: geomRect.h,
  48. right: geomRect.x + geomRect.w,
  49. bottom: geomRect.y + geomRect.h
  50. };
  51. };
  52. var Convert = {
  53. fromClientRect: fromClientRect,
  54. toClientRect: toClientRect
  55. };
  56. var toAbsolute = function (rect) {
  57. var vp = global$2.DOM.getViewPort();
  58. return {
  59. x: rect.x + vp.x,
  60. y: rect.y + vp.y,
  61. w: rect.w,
  62. h: rect.h
  63. };
  64. };
  65. var measureElement = function (elm) {
  66. var clientRect = elm.getBoundingClientRect();
  67. return toAbsolute({
  68. x: clientRect.left,
  69. y: clientRect.top,
  70. w: Math.max(elm.clientWidth, elm.offsetWidth),
  71. h: Math.max(elm.clientHeight, elm.offsetHeight)
  72. });
  73. };
  74. var getElementRect = function (editor, elm) {
  75. return measureElement(elm);
  76. };
  77. var getPageAreaRect = function (editor) {
  78. return measureElement(editor.getElement().ownerDocument.body);
  79. };
  80. var getContentAreaRect = function (editor) {
  81. return measureElement(editor.getContentAreaContainer() || editor.getBody());
  82. };
  83. var getSelectionRect = function (editor) {
  84. var clientRect = editor.selection.getBoundingClientRect();
  85. return clientRect ? toAbsolute(Convert.fromClientRect(clientRect)) : null;
  86. };
  87. var Measure = {
  88. getElementRect: getElementRect,
  89. getPageAreaRect: getPageAreaRect,
  90. getContentAreaRect: getContentAreaRect,
  91. getSelectionRect: getSelectionRect
  92. };
  93. var element = function (element, predicateIds) {
  94. return function (editor) {
  95. for (var i = 0; i < predicateIds.length; i++) {
  96. if (predicateIds[i].predicate(element)) {
  97. var result = Matcher.result(predicateIds[i].id, Measure.getElementRect(editor, element));
  98. return result;
  99. }
  100. }
  101. return null;
  102. };
  103. };
  104. var parent = function (elements, predicateIds) {
  105. return function (editor) {
  106. for (var i = 0; i < elements.length; i++) {
  107. for (var x = 0; x < predicateIds.length; x++) {
  108. if (predicateIds[x].predicate(elements[i])) {
  109. return Matcher.result(predicateIds[x].id, Measure.getElementRect(editor, elements[i]));
  110. }
  111. }
  112. }
  113. return null;
  114. };
  115. };
  116. var ElementMatcher = {
  117. element: element,
  118. parent: parent
  119. };
  120. var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  121. var create = function (id, predicate) {
  122. return {
  123. id: id,
  124. predicate: predicate
  125. };
  126. };
  127. var fromContextToolbars = function (toolbars) {
  128. return global$4.map(toolbars, function (toolbar) {
  129. return create(toolbar.id, toolbar.predicate);
  130. });
  131. };
  132. var PredicateId = {
  133. create: create,
  134. fromContextToolbars: fromContextToolbars
  135. };
  136. var textSelection = function (id) {
  137. return function (editor) {
  138. if (!editor.selection.isCollapsed()) {
  139. var result = Matcher.result(id, Measure.getSelectionRect(editor));
  140. return result;
  141. }
  142. return null;
  143. };
  144. };
  145. var emptyTextBlock = function (elements, id) {
  146. return function (editor) {
  147. var i;
  148. var textBlockElementsMap = editor.schema.getTextBlockElements();
  149. for (i = 0; i < elements.length; i++) {
  150. if (elements[i].nodeName === 'TABLE') {
  151. return null;
  152. }
  153. }
  154. for (i = 0; i < elements.length; i++) {
  155. if (elements[i].nodeName in textBlockElementsMap) {
  156. if (editor.dom.isEmpty(elements[i])) {
  157. return Matcher.result(id, Measure.getSelectionRect(editor));
  158. }
  159. return null;
  160. }
  161. }
  162. return null;
  163. };
  164. };
  165. var SelectionMatcher = {
  166. textSelection: textSelection,
  167. emptyTextBlock: emptyTextBlock
  168. };
  169. var fireSkinLoaded = function (editor) {
  170. editor.fire('SkinLoaded');
  171. };
  172. var fireBeforeRenderUI = function (editor) {
  173. return editor.fire('BeforeRenderUI');
  174. };
  175. var Events = {
  176. fireSkinLoaded: fireSkinLoaded,
  177. fireBeforeRenderUI: fireBeforeRenderUI
  178. };
  179. var global$5 = tinymce.util.Tools.resolve('tinymce.EditorManager');
  180. var isType = function (type) {
  181. return function (value) {
  182. return typeof value === type;
  183. };
  184. };
  185. var isArray = function (value) {
  186. return Array.isArray(value);
  187. };
  188. var isNull = function (value) {
  189. return value === null;
  190. };
  191. var isObject = function (predicate) {
  192. return function (value) {
  193. return !isNull(value) && !isArray(value) && predicate(value);
  194. };
  195. };
  196. var isString = function (value) {
  197. return isType('string')(value);
  198. };
  199. var isNumber = function (value) {
  200. return isType('number')(value);
  201. };
  202. var isFunction = function (value) {
  203. return isType('function')(value);
  204. };
  205. var isBoolean = function (value) {
  206. return isType('boolean')(value);
  207. };
  208. var Type = {
  209. isString: isString,
  210. isNumber: isNumber,
  211. isBoolean: isBoolean,
  212. isFunction: isFunction,
  213. isObject: isObject(isType('object')),
  214. isNull: isNull,
  215. isArray: isArray
  216. };
  217. var validDefaultOrDie = function (value, predicate) {
  218. if (predicate(value)) {
  219. return true;
  220. }
  221. throw new Error('Default value doesn\'t match requested type.');
  222. };
  223. var getByTypeOr = function (predicate) {
  224. return function (editor, name, defaultValue) {
  225. var settings = editor.settings;
  226. validDefaultOrDie(defaultValue, predicate);
  227. return name in settings && predicate(settings[name]) ? settings[name] : defaultValue;
  228. };
  229. };
  230. var splitNoEmpty = function (str, delim) {
  231. return str.split(delim).filter(function (item) {
  232. return item.length > 0;
  233. });
  234. };
  235. var itemsToArray = function (value, defaultValue) {
  236. var stringToItemsArray = function (value) {
  237. return typeof value === 'string' ? splitNoEmpty(value, /[ ,]/) : value;
  238. };
  239. var boolToItemsArray = function (value, defaultValue) {
  240. return value === false ? [] : defaultValue;
  241. };
  242. if (Type.isArray(value)) {
  243. return value;
  244. } else if (Type.isString(value)) {
  245. return stringToItemsArray(value);
  246. } else if (Type.isBoolean(value)) {
  247. return boolToItemsArray(value, defaultValue);
  248. }
  249. return defaultValue;
  250. };
  251. var getToolbarItemsOr = function (predicate) {
  252. return function (editor, name, defaultValue) {
  253. var value = name in editor.settings ? editor.settings[name] : defaultValue;
  254. validDefaultOrDie(defaultValue, predicate);
  255. return itemsToArray(value, defaultValue);
  256. };
  257. };
  258. var EditorSettings = {
  259. getStringOr: getByTypeOr(Type.isString),
  260. getBoolOr: getByTypeOr(Type.isBoolean),
  261. getNumberOr: getByTypeOr(Type.isNumber),
  262. getHandlerOr: getByTypeOr(Type.isFunction),
  263. getToolbarItemsOr: getToolbarItemsOr(Type.isArray)
  264. };
  265. var global$6 = tinymce.util.Tools.resolve('tinymce.geom.Rect');
  266. var result$1 = function (rect, position) {
  267. return {
  268. rect: rect,
  269. position: position
  270. };
  271. };
  272. var moveTo = function (rect, toRect) {
  273. return {
  274. x: toRect.x,
  275. y: toRect.y,
  276. w: rect.w,
  277. h: rect.h
  278. };
  279. };
  280. var calcByPositions = function (testPositions1, testPositions2, targetRect, contentAreaRect, panelRect) {
  281. var relPos, relRect, outputPanelRect;
  282. var paddedContentRect = {
  283. x: contentAreaRect.x,
  284. y: contentAreaRect.y,
  285. w: contentAreaRect.w + (contentAreaRect.w < panelRect.w + targetRect.w ? panelRect.w : 0),
  286. h: contentAreaRect.h + (contentAreaRect.h < panelRect.h + targetRect.h ? panelRect.h : 0)
  287. };
  288. relPos = global$6.findBestRelativePosition(panelRect, targetRect, paddedContentRect, testPositions1);
  289. targetRect = global$6.clamp(targetRect, paddedContentRect);
  290. if (relPos) {
  291. relRect = global$6.relativePosition(panelRect, targetRect, relPos);
  292. outputPanelRect = moveTo(panelRect, relRect);
  293. return result$1(outputPanelRect, relPos);
  294. }
  295. targetRect = global$6.intersect(paddedContentRect, targetRect);
  296. if (targetRect) {
  297. relPos = global$6.findBestRelativePosition(panelRect, targetRect, paddedContentRect, testPositions2);
  298. if (relPos) {
  299. relRect = global$6.relativePosition(panelRect, targetRect, relPos);
  300. outputPanelRect = moveTo(panelRect, relRect);
  301. return result$1(outputPanelRect, relPos);
  302. }
  303. outputPanelRect = moveTo(panelRect, targetRect);
  304. return result$1(outputPanelRect, relPos);
  305. }
  306. return null;
  307. };
  308. var calcInsert = function (targetRect, contentAreaRect, panelRect) {
  309. return calcByPositions([
  310. 'cr-cl',
  311. 'cl-cr'
  312. ], [
  313. 'bc-tc',
  314. 'bl-tl',
  315. 'br-tr'
  316. ], targetRect, contentAreaRect, panelRect);
  317. };
  318. var calc = function (targetRect, contentAreaRect, panelRect) {
  319. return calcByPositions([
  320. 'tc-bc',
  321. 'bc-tc',
  322. 'tl-bl',
  323. 'bl-tl',
  324. 'tr-br',
  325. 'br-tr',
  326. 'cr-cl',
  327. 'cl-cr'
  328. ], [
  329. 'bc-tc',
  330. 'bl-tl',
  331. 'br-tr',
  332. 'cr-cl'
  333. ], targetRect, contentAreaRect, panelRect);
  334. };
  335. var userConstrain = function (handler, targetRect, contentAreaRect, panelRect) {
  336. var userConstrainedPanelRect;
  337. if (typeof handler === 'function') {
  338. userConstrainedPanelRect = handler({
  339. elementRect: Convert.toClientRect(targetRect),
  340. contentAreaRect: Convert.toClientRect(contentAreaRect),
  341. panelRect: Convert.toClientRect(panelRect)
  342. });
  343. return Convert.fromClientRect(userConstrainedPanelRect);
  344. }
  345. return panelRect;
  346. };
  347. var defaultHandler = function (rects) {
  348. return rects.panelRect;
  349. };
  350. var Layout = {
  351. calcInsert: calcInsert,
  352. calc: calc,
  353. userConstrain: userConstrain,
  354. defaultHandler: defaultHandler
  355. };
  356. var toAbsoluteUrl = function (editor, url) {
  357. return editor.documentBaseURI.toAbsolute(url);
  358. };
  359. var urlFromName = function (name) {
  360. var prefix = global$5.baseURL + '/skins/';
  361. return name ? prefix + name : prefix + 'lightgray';
  362. };
  363. var getTextSelectionToolbarItems = function (editor) {
  364. return EditorSettings.getToolbarItemsOr(editor, 'selection_toolbar', [
  365. 'bold',
  366. 'italic',
  367. '|',
  368. 'quicklink',
  369. 'h2',
  370. 'h3',
  371. 'blockquote'
  372. ]);
  373. };
  374. var getInsertToolbarItems = function (editor) {
  375. return EditorSettings.getToolbarItemsOr(editor, 'insert_toolbar', [
  376. 'quickimage',
  377. 'quicktable'
  378. ]);
  379. };
  380. var getPositionHandler = function (editor) {
  381. return EditorSettings.getHandlerOr(editor, 'inline_toolbar_position_handler', Layout.defaultHandler);
  382. };
  383. var getSkinUrl = function (editor) {
  384. var settings = editor.settings;
  385. return settings.skin_url ? toAbsoluteUrl(editor, settings.skin_url) : urlFromName(settings.skin);
  386. };
  387. var isSkinDisabled = function (editor) {
  388. return editor.settings.skin === false;
  389. };
  390. var Settings = {
  391. getTextSelectionToolbarItems: getTextSelectionToolbarItems,
  392. getInsertToolbarItems: getInsertToolbarItems,
  393. getPositionHandler: getPositionHandler,
  394. getSkinUrl: getSkinUrl,
  395. isSkinDisabled: isSkinDisabled
  396. };
  397. var fireSkinLoaded$1 = function (editor, callback) {
  398. var done = function () {
  399. editor._skinLoaded = true;
  400. Events.fireSkinLoaded(editor);
  401. callback();
  402. };
  403. if (editor.initialized) {
  404. done();
  405. } else {
  406. editor.on('init', done);
  407. }
  408. };
  409. var load = function (editor, callback) {
  410. var skinUrl = Settings.getSkinUrl(editor);
  411. var done = function () {
  412. fireSkinLoaded$1(editor, callback);
  413. };
  414. if (Settings.isSkinDisabled(editor)) {
  415. done();
  416. } else {
  417. global$2.DOM.styleSheetLoader.load(skinUrl + '/skin.min.css', done);
  418. editor.contentCSS.push(skinUrl + '/content.inline.min.css');
  419. }
  420. };
  421. var SkinLoader = { load: load };
  422. var getSelectionElements = function (editor) {
  423. var node = editor.selection.getNode();
  424. var elms = editor.dom.getParents(node, '*');
  425. return elms;
  426. };
  427. var createToolbar = function (editor, selector, id, items) {
  428. var selectorPredicate = function (elm) {
  429. return editor.dom.is(elm, selector);
  430. };
  431. return {
  432. predicate: selectorPredicate,
  433. id: id,
  434. items: items
  435. };
  436. };
  437. var getToolbars = function (editor) {
  438. var contextToolbars = editor.contextToolbars;
  439. return DeepFlatten.flatten([
  440. contextToolbars ? contextToolbars : [],
  441. createToolbar(editor, 'img', 'image', 'alignleft aligncenter alignright')
  442. ]);
  443. };
  444. var findMatchResult = function (editor, toolbars) {
  445. var result, elements, contextToolbarsPredicateIds;
  446. elements = getSelectionElements(editor);
  447. contextToolbarsPredicateIds = PredicateId.fromContextToolbars(toolbars);
  448. result = Matcher.match(editor, [
  449. ElementMatcher.element(elements[0], contextToolbarsPredicateIds),
  450. SelectionMatcher.textSelection('text'),
  451. SelectionMatcher.emptyTextBlock(elements, 'insert'),
  452. ElementMatcher.parent(elements, contextToolbarsPredicateIds)
  453. ]);
  454. return result && result.rect ? result : null;
  455. };
  456. var editorHasFocus = function (editor) {
  457. return domGlobals.document.activeElement === editor.getBody();
  458. };
  459. var togglePanel = function (editor, panel) {
  460. var toggle = function () {
  461. var toolbars = getToolbars(editor);
  462. var result = findMatchResult(editor, toolbars);
  463. if (result) {
  464. panel.show(editor, result.id, result.rect, toolbars);
  465. } else {
  466. panel.hide();
  467. }
  468. };
  469. return function () {
  470. if (!editor.removed && editorHasFocus(editor)) {
  471. toggle();
  472. }
  473. };
  474. };
  475. var repositionPanel = function (editor, panel) {
  476. return function () {
  477. var toolbars = getToolbars(editor);
  478. var result = findMatchResult(editor, toolbars);
  479. if (result) {
  480. panel.reposition(editor, result.id, result.rect);
  481. }
  482. };
  483. };
  484. var ignoreWhenFormIsVisible = function (editor, panel, f) {
  485. return function () {
  486. if (!editor.removed && !panel.inForm()) {
  487. f();
  488. }
  489. };
  490. };
  491. var bindContextualToolbarsEvents = function (editor, panel) {
  492. var throttledTogglePanel = global$3.throttle(togglePanel(editor, panel), 0);
  493. var throttledTogglePanelWhenNotInForm = global$3.throttle(ignoreWhenFormIsVisible(editor, panel, togglePanel(editor, panel)), 0);
  494. var reposition = repositionPanel(editor, panel);
  495. editor.on('blur hide ObjectResizeStart', panel.hide);
  496. editor.on('click', throttledTogglePanel);
  497. editor.on('nodeChange mouseup', throttledTogglePanelWhenNotInForm);
  498. editor.on('ResizeEditor keyup', throttledTogglePanel);
  499. editor.on('ResizeWindow', reposition);
  500. global$2.DOM.bind(global$1.container, 'scroll', reposition);
  501. editor.on('remove', function () {
  502. global$2.DOM.unbind(global$1.container, 'scroll', reposition);
  503. panel.remove();
  504. });
  505. editor.shortcuts.add('Alt+F10,F10', '', panel.focus);
  506. };
  507. var overrideLinkShortcut = function (editor, panel) {
  508. editor.shortcuts.remove('meta+k');
  509. editor.shortcuts.add('meta+k', '', function () {
  510. var toolbars = getToolbars(editor);
  511. var result = Matcher.match(editor, [SelectionMatcher.textSelection('quicklink')]);
  512. if (result) {
  513. panel.show(editor, result.id, result.rect, toolbars);
  514. }
  515. });
  516. };
  517. var renderInlineUI = function (editor, panel) {
  518. SkinLoader.load(editor, function () {
  519. bindContextualToolbarsEvents(editor, panel);
  520. overrideLinkShortcut(editor, panel);
  521. });
  522. return {};
  523. };
  524. var fail = function (message) {
  525. throw new Error(message);
  526. };
  527. var renderUI = function (editor, panel) {
  528. return editor.inline ? renderInlineUI(editor, panel) : fail('inlite theme only supports inline mode.');
  529. };
  530. var Render = { renderUI: renderUI };
  531. var noop = function () {
  532. };
  533. var constant = function (value) {
  534. return function () {
  535. return value;
  536. };
  537. };
  538. var never = constant(false);
  539. var always = constant(true);
  540. var never$1 = never;
  541. var always$1 = always;
  542. var none = function () {
  543. return NONE;
  544. };
  545. var NONE = function () {
  546. var eq = function (o) {
  547. return o.isNone();
  548. };
  549. var call = function (thunk) {
  550. return thunk();
  551. };
  552. var id = function (n) {
  553. return n;
  554. };
  555. var noop = function () {
  556. };
  557. var nul = function () {
  558. return null;
  559. };
  560. var undef = function () {
  561. return undefined;
  562. };
  563. var me = {
  564. fold: function (n, s) {
  565. return n();
  566. },
  567. is: never$1,
  568. isSome: never$1,
  569. isNone: always$1,
  570. getOr: id,
  571. getOrThunk: call,
  572. getOrDie: function (msg) {
  573. throw new Error(msg || 'error: getOrDie called on none.');
  574. },
  575. getOrNull: nul,
  576. getOrUndefined: undef,
  577. or: id,
  578. orThunk: call,
  579. map: none,
  580. ap: none,
  581. each: noop,
  582. bind: none,
  583. flatten: none,
  584. exists: never$1,
  585. forall: always$1,
  586. filter: none,
  587. equals: eq,
  588. equals_: eq,
  589. toArray: function () {
  590. return [];
  591. },
  592. toString: constant('none()')
  593. };
  594. if (Object.freeze) {
  595. Object.freeze(me);
  596. }
  597. return me;
  598. }();
  599. var some = function (a) {
  600. var constant_a = function () {
  601. return a;
  602. };
  603. var self = function () {
  604. return me;
  605. };
  606. var map = function (f) {
  607. return some(f(a));
  608. };
  609. var bind = function (f) {
  610. return f(a);
  611. };
  612. var me = {
  613. fold: function (n, s) {
  614. return s(a);
  615. },
  616. is: function (v) {
  617. return a === v;
  618. },
  619. isSome: always$1,
  620. isNone: never$1,
  621. getOr: constant_a,
  622. getOrThunk: constant_a,
  623. getOrDie: constant_a,
  624. getOrNull: constant_a,
  625. getOrUndefined: constant_a,
  626. or: self,
  627. orThunk: self,
  628. map: map,
  629. ap: function (optfab) {
  630. return optfab.fold(none, function (fab) {
  631. return some(fab(a));
  632. });
  633. },
  634. each: function (f) {
  635. f(a);
  636. },
  637. bind: bind,
  638. flatten: constant_a,
  639. exists: bind,
  640. forall: bind,
  641. filter: function (f) {
  642. return f(a) ? me : NONE;
  643. },
  644. equals: function (o) {
  645. return o.is(a);
  646. },
  647. equals_: function (o, elementEq) {
  648. return o.fold(never$1, function (b) {
  649. return elementEq(a, b);
  650. });
  651. },
  652. toArray: function () {
  653. return [a];
  654. },
  655. toString: function () {
  656. return 'some(' + a + ')';
  657. }
  658. };
  659. return me;
  660. };
  661. var from = function (value) {
  662. return value === null || value === undefined ? NONE : some(value);
  663. };
  664. var Option = {
  665. some: some,
  666. none: none,
  667. from: from
  668. };
  669. var typeOf = function (x) {
  670. if (x === null) {
  671. return 'null';
  672. }
  673. var t = typeof x;
  674. if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  675. return 'array';
  676. }
  677. if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  678. return 'string';
  679. }
  680. return t;
  681. };
  682. var isType$1 = function (type) {
  683. return function (value) {
  684. return typeOf(value) === type;
  685. };
  686. };
  687. var isArray$1 = isType$1('array');
  688. var isFunction$1 = isType$1('function');
  689. var isNumber$1 = isType$1('number');
  690. var slice = Array.prototype.slice;
  691. var rawIndexOf = function () {
  692. var pIndexOf = Array.prototype.indexOf;
  693. var fastIndex = function (xs, x) {
  694. return pIndexOf.call(xs, x);
  695. };
  696. var slowIndex = function (xs, x) {
  697. return slowIndexOf(xs, x);
  698. };
  699. return pIndexOf === undefined ? slowIndex : fastIndex;
  700. }();
  701. var indexOf = function (xs, x) {
  702. var r = rawIndexOf(xs, x);
  703. return r === -1 ? Option.none() : Option.some(r);
  704. };
  705. var exists = function (xs, pred) {
  706. return findIndex(xs, pred).isSome();
  707. };
  708. var map = function (xs, f) {
  709. var len = xs.length;
  710. var r = new Array(len);
  711. for (var i = 0; i < len; i++) {
  712. var x = xs[i];
  713. r[i] = f(x, i, xs);
  714. }
  715. return r;
  716. };
  717. var each = function (xs, f) {
  718. for (var i = 0, len = xs.length; i < len; i++) {
  719. var x = xs[i];
  720. f(x, i, xs);
  721. }
  722. };
  723. var filter = function (xs, pred) {
  724. var r = [];
  725. for (var i = 0, len = xs.length; i < len; i++) {
  726. var x = xs[i];
  727. if (pred(x, i, xs)) {
  728. r.push(x);
  729. }
  730. }
  731. return r;
  732. };
  733. var foldl = function (xs, f, acc) {
  734. each(xs, function (x) {
  735. acc = f(acc, x);
  736. });
  737. return acc;
  738. };
  739. var find = function (xs, pred) {
  740. for (var i = 0, len = xs.length; i < len; i++) {
  741. var x = xs[i];
  742. if (pred(x, i, xs)) {
  743. return Option.some(x);
  744. }
  745. }
  746. return Option.none();
  747. };
  748. var findIndex = function (xs, pred) {
  749. for (var i = 0, len = xs.length; i < len; i++) {
  750. var x = xs[i];
  751. if (pred(x, i, xs)) {
  752. return Option.some(i);
  753. }
  754. }
  755. return Option.none();
  756. };
  757. var slowIndexOf = function (xs, x) {
  758. for (var i = 0, len = xs.length; i < len; ++i) {
  759. if (xs[i] === x) {
  760. return i;
  761. }
  762. }
  763. return -1;
  764. };
  765. var push = Array.prototype.push;
  766. var flatten$1 = function (xs) {
  767. var r = [];
  768. for (var i = 0, len = xs.length; i < len; ++i) {
  769. if (!isArray$1(xs[i])) {
  770. throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
  771. }
  772. push.apply(r, xs[i]);
  773. }
  774. return r;
  775. };
  776. var from$1 = isFunction$1(Array.from) ? Array.from : function (x) {
  777. return slice.call(x);
  778. };
  779. var count = 0;
  780. var funcs = {
  781. id: function () {
  782. return 'mceu_' + count++;
  783. },
  784. create: function (name, attrs, children) {
  785. var elm = domGlobals.document.createElement(name);
  786. global$2.DOM.setAttribs(elm, attrs);
  787. if (typeof children === 'string') {
  788. elm.innerHTML = children;
  789. } else {
  790. global$4.each(children, function (child) {
  791. if (child.nodeType) {
  792. elm.appendChild(child);
  793. }
  794. });
  795. }
  796. return elm;
  797. },
  798. createFragment: function (html) {
  799. return global$2.DOM.createFragment(html);
  800. },
  801. getWindowSize: function () {
  802. return global$2.DOM.getViewPort();
  803. },
  804. getSize: function (elm) {
  805. var width, height;
  806. if (elm.getBoundingClientRect) {
  807. var rect = elm.getBoundingClientRect();
  808. width = Math.max(rect.width || rect.right - rect.left, elm.offsetWidth);
  809. height = Math.max(rect.height || rect.bottom - rect.bottom, elm.offsetHeight);
  810. } else {
  811. width = elm.offsetWidth;
  812. height = elm.offsetHeight;
  813. }
  814. return {
  815. width: width,
  816. height: height
  817. };
  818. },
  819. getPos: function (elm, root) {
  820. return global$2.DOM.getPos(elm, root || funcs.getContainer());
  821. },
  822. getContainer: function () {
  823. return global$1.container ? global$1.container : domGlobals.document.body;
  824. },
  825. getViewPort: function (win) {
  826. return global$2.DOM.getViewPort(win);
  827. },
  828. get: function (id) {
  829. return domGlobals.document.getElementById(id);
  830. },
  831. addClass: function (elm, cls) {
  832. return global$2.DOM.addClass(elm, cls);
  833. },
  834. removeClass: function (elm, cls) {
  835. return global$2.DOM.removeClass(elm, cls);
  836. },
  837. hasClass: function (elm, cls) {
  838. return global$2.DOM.hasClass(elm, cls);
  839. },
  840. toggleClass: function (elm, cls, state) {
  841. return global$2.DOM.toggleClass(elm, cls, state);
  842. },
  843. css: function (elm, name, value) {
  844. return global$2.DOM.setStyle(elm, name, value);
  845. },
  846. getRuntimeStyle: function (elm, name) {
  847. return global$2.DOM.getStyle(elm, name, true);
  848. },
  849. on: function (target, name, callback, scope) {
  850. return global$2.DOM.bind(target, name, callback, scope);
  851. },
  852. off: function (target, name, callback) {
  853. return global$2.DOM.unbind(target, name, callback);
  854. },
  855. fire: function (target, name, args) {
  856. return global$2.DOM.fire(target, name, args);
  857. },
  858. innerHtml: function (elm, html) {
  859. global$2.DOM.setHTML(elm, html);
  860. }
  861. };
  862. var global$7 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');
  863. var global$8 = tinymce.util.Tools.resolve('tinymce.util.Class');
  864. var global$9 = tinymce.util.Tools.resolve('tinymce.util.EventDispatcher');
  865. var BoxUtils = {
  866. parseBox: function (value) {
  867. var len;
  868. var radix = 10;
  869. if (!value) {
  870. return;
  871. }
  872. if (typeof value === 'number') {
  873. value = value || 0;
  874. return {
  875. top: value,
  876. left: value,
  877. bottom: value,
  878. right: value
  879. };
  880. }
  881. value = value.split(' ');
  882. len = value.length;
  883. if (len === 1) {
  884. value[1] = value[2] = value[3] = value[0];
  885. } else if (len === 2) {
  886. value[2] = value[0];
  887. value[3] = value[1];
  888. } else if (len === 3) {
  889. value[3] = value[1];
  890. }
  891. return {
  892. top: parseInt(value[0], radix) || 0,
  893. right: parseInt(value[1], radix) || 0,
  894. bottom: parseInt(value[2], radix) || 0,
  895. left: parseInt(value[3], radix) || 0
  896. };
  897. },
  898. measureBox: function (elm, prefix) {
  899. function getStyle(name) {
  900. var defaultView = elm.ownerDocument.defaultView;
  901. if (defaultView) {
  902. var computedStyle = defaultView.getComputedStyle(elm, null);
  903. if (computedStyle) {
  904. name = name.replace(/[A-Z]/g, function (a) {
  905. return '-' + a;
  906. });
  907. return computedStyle.getPropertyValue(name);
  908. } else {
  909. return null;
  910. }
  911. }
  912. return elm.currentStyle[name];
  913. }
  914. function getSide(name) {
  915. var val = parseFloat(getStyle(name));
  916. return isNaN(val) ? 0 : val;
  917. }
  918. return {
  919. top: getSide(prefix + 'TopWidth'),
  920. right: getSide(prefix + 'RightWidth'),
  921. bottom: getSide(prefix + 'BottomWidth'),
  922. left: getSide(prefix + 'LeftWidth')
  923. };
  924. }
  925. };
  926. function noop$1() {
  927. }
  928. function ClassList(onchange) {
  929. this.cls = [];
  930. this.cls._map = {};
  931. this.onchange = onchange || noop$1;
  932. this.prefix = '';
  933. }
  934. global$4.extend(ClassList.prototype, {
  935. add: function (cls) {
  936. if (cls && !this.contains(cls)) {
  937. this.cls._map[cls] = true;
  938. this.cls.push(cls);
  939. this._change();
  940. }
  941. return this;
  942. },
  943. remove: function (cls) {
  944. if (this.contains(cls)) {
  945. var i = void 0;
  946. for (i = 0; i < this.cls.length; i++) {
  947. if (this.cls[i] === cls) {
  948. break;
  949. }
  950. }
  951. this.cls.splice(i, 1);
  952. delete this.cls._map[cls];
  953. this._change();
  954. }
  955. return this;
  956. },
  957. toggle: function (cls, state) {
  958. var curState = this.contains(cls);
  959. if (curState !== state) {
  960. if (curState) {
  961. this.remove(cls);
  962. } else {
  963. this.add(cls);
  964. }
  965. this._change();
  966. }
  967. return this;
  968. },
  969. contains: function (cls) {
  970. return !!this.cls._map[cls];
  971. },
  972. _change: function () {
  973. delete this.clsValue;
  974. this.onchange.call(this);
  975. }
  976. });
  977. ClassList.prototype.toString = function () {
  978. var value;
  979. if (this.clsValue) {
  980. return this.clsValue;
  981. }
  982. value = '';
  983. for (var i = 0; i < this.cls.length; i++) {
  984. if (i > 0) {
  985. value += ' ';
  986. }
  987. value += this.prefix + this.cls[i];
  988. }
  989. return value;
  990. };
  991. function unique(array) {
  992. var uniqueItems = [];
  993. var i = array.length, item;
  994. while (i--) {
  995. item = array[i];
  996. if (!item.__checked) {
  997. uniqueItems.push(item);
  998. item.__checked = 1;
  999. }
  1000. }
  1001. i = uniqueItems.length;
  1002. while (i--) {
  1003. delete uniqueItems[i].__checked;
  1004. }
  1005. return uniqueItems;
  1006. }
  1007. var expression = /^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i;
  1008. var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g;
  1009. var whiteSpace = /^\s*|\s*$/g;
  1010. var Collection;
  1011. var Selector = global$8.extend({
  1012. init: function (selector) {
  1013. var match = this.match;
  1014. function compileNameFilter(name) {
  1015. if (name) {
  1016. name = name.toLowerCase();
  1017. return function (item) {
  1018. return name === '*' || item.type === name;
  1019. };
  1020. }
  1021. }
  1022. function compileIdFilter(id) {
  1023. if (id) {
  1024. return function (item) {
  1025. return item._name === id;
  1026. };
  1027. }
  1028. }
  1029. function compileClassesFilter(classes) {
  1030. if (classes) {
  1031. classes = classes.split('.');
  1032. return function (item) {
  1033. var i = classes.length;
  1034. while (i--) {
  1035. if (!item.classes.contains(classes[i])) {
  1036. return false;
  1037. }
  1038. }
  1039. return true;
  1040. };
  1041. }
  1042. }
  1043. function compileAttrFilter(name, cmp, check) {
  1044. if (name) {
  1045. return function (item) {
  1046. var value = item[name] ? item[name]() : '';
  1047. return !cmp ? !!check : cmp === '=' ? value === check : cmp === '*=' ? value.indexOf(check) >= 0 : cmp === '~=' ? (' ' + value + ' ').indexOf(' ' + check + ' ') >= 0 : cmp === '!=' ? value !== check : cmp === '^=' ? value.indexOf(check) === 0 : cmp === '$=' ? value.substr(value.length - check.length) === check : false;
  1048. };
  1049. }
  1050. }
  1051. function compilePsuedoFilter(name) {
  1052. var notSelectors;
  1053. if (name) {
  1054. name = /(?:not\((.+)\))|(.+)/i.exec(name);
  1055. if (!name[1]) {
  1056. name = name[2];
  1057. return function (item, index, length) {
  1058. return name === 'first' ? index === 0 : name === 'last' ? index === length - 1 : name === 'even' ? index % 2 === 0 : name === 'odd' ? index % 2 === 1 : item[name] ? item[name]() : false;
  1059. };
  1060. }
  1061. notSelectors = parseChunks(name[1], []);
  1062. return function (item) {
  1063. return !match(item, notSelectors);
  1064. };
  1065. }
  1066. }
  1067. function compile(selector, filters, direct) {
  1068. var parts;
  1069. function add(filter) {
  1070. if (filter) {
  1071. filters.push(filter);
  1072. }
  1073. }
  1074. parts = expression.exec(selector.replace(whiteSpace, ''));
  1075. add(compileNameFilter(parts[1]));
  1076. add(compileIdFilter(parts[2]));
  1077. add(compileClassesFilter(parts[3]));
  1078. add(compileAttrFilter(parts[4], parts[5], parts[6]));
  1079. add(compilePsuedoFilter(parts[7]));
  1080. filters.pseudo = !!parts[7];
  1081. filters.direct = direct;
  1082. return filters;
  1083. }
  1084. function parseChunks(selector, selectors) {
  1085. var parts = [];
  1086. var extra, matches, i;
  1087. do {
  1088. chunker.exec('');
  1089. matches = chunker.exec(selector);
  1090. if (matches) {
  1091. selector = matches[3];
  1092. parts.push(matches[1]);
  1093. if (matches[2]) {
  1094. extra = matches[3];
  1095. break;
  1096. }
  1097. }
  1098. } while (matches);
  1099. if (extra) {
  1100. parseChunks(extra, selectors);
  1101. }
  1102. selector = [];
  1103. for (i = 0; i < parts.length; i++) {
  1104. if (parts[i] !== '>') {
  1105. selector.push(compile(parts[i], [], parts[i - 1] === '>'));
  1106. }
  1107. }
  1108. selectors.push(selector);
  1109. return selectors;
  1110. }
  1111. this._selectors = parseChunks(selector, []);
  1112. },
  1113. match: function (control, selectors) {
  1114. var i, l, si, sl, selector, fi, fl, filters, index, length, siblings, count, item;
  1115. selectors = selectors || this._selectors;
  1116. for (i = 0, l = selectors.length; i < l; i++) {
  1117. selector = selectors[i];
  1118. sl = selector.length;
  1119. item = control;
  1120. count = 0;
  1121. for (si = sl - 1; si >= 0; si--) {
  1122. filters = selector[si];
  1123. while (item) {
  1124. if (filters.pseudo) {
  1125. siblings = item.parent().items();
  1126. index = length = siblings.length;
  1127. while (index--) {
  1128. if (siblings[index] === item) {
  1129. break;
  1130. }
  1131. }
  1132. }
  1133. for (fi = 0, fl = filters.length; fi < fl; fi++) {
  1134. if (!filters[fi](item, index, length)) {
  1135. fi = fl + 1;
  1136. break;
  1137. }
  1138. }
  1139. if (fi === fl) {
  1140. count++;
  1141. break;
  1142. } else {
  1143. if (si === sl - 1) {
  1144. break;
  1145. }
  1146. }
  1147. item = item.parent();
  1148. }
  1149. }
  1150. if (count === sl) {
  1151. return true;
  1152. }
  1153. }
  1154. return false;
  1155. },
  1156. find: function (container) {
  1157. var matches = [], i, l;
  1158. var selectors = this._selectors;
  1159. function collect(items, selector, index) {
  1160. var i, l, fi, fl, item;
  1161. var filters = selector[index];
  1162. for (i = 0, l = items.length; i < l; i++) {
  1163. item = items[i];
  1164. for (fi = 0, fl = filters.length; fi < fl; fi++) {
  1165. if (!filters[fi](item, i, l)) {
  1166. fi = fl + 1;
  1167. break;
  1168. }
  1169. }
  1170. if (fi === fl) {
  1171. if (index === selector.length - 1) {
  1172. matches.push(item);
  1173. } else {
  1174. if (item.items) {
  1175. collect(item.items(), selector, index + 1);
  1176. }
  1177. }
  1178. } else if (filters.direct) {
  1179. return;
  1180. }
  1181. if (item.items) {
  1182. collect(item.items(), selector, index);
  1183. }
  1184. }
  1185. }
  1186. if (container.items) {
  1187. for (i = 0, l = selectors.length; i < l; i++) {
  1188. collect(container.items(), selectors[i], 0);
  1189. }
  1190. if (l > 1) {
  1191. matches = unique(matches);
  1192. }
  1193. }
  1194. if (!Collection) {
  1195. Collection = Selector.Collection;
  1196. }
  1197. return new Collection(matches);
  1198. }
  1199. });
  1200. var Collection$1, proto;
  1201. var push$1 = Array.prototype.push, slice$1 = Array.prototype.slice;
  1202. proto = {
  1203. length: 0,
  1204. init: function (items) {
  1205. if (items) {
  1206. this.add(items);
  1207. }
  1208. },
  1209. add: function (items) {
  1210. var self = this;
  1211. if (!global$4.isArray(items)) {
  1212. if (items instanceof Collection$1) {
  1213. self.add(items.toArray());
  1214. } else {
  1215. push$1.call(self, items);
  1216. }
  1217. } else {
  1218. push$1.apply(self, items);
  1219. }
  1220. return self;
  1221. },
  1222. set: function (items) {
  1223. var self = this;
  1224. var len = self.length;
  1225. var i;
  1226. self.length = 0;
  1227. self.add(items);
  1228. for (i = self.length; i < len; i++) {
  1229. delete self[i];
  1230. }
  1231. return self;
  1232. },
  1233. filter: function (selector) {
  1234. var self = this;
  1235. var i, l;
  1236. var matches = [];
  1237. var item, match;
  1238. if (typeof selector === 'string') {
  1239. selector = new Selector(selector);
  1240. match = function (item) {
  1241. return selector.match(item);
  1242. };
  1243. } else {
  1244. match = selector;
  1245. }
  1246. for (i = 0, l = self.length; i < l; i++) {
  1247. item = self[i];
  1248. if (match(item)) {
  1249. matches.push(item);
  1250. }
  1251. }
  1252. return new Collection$1(matches);
  1253. },
  1254. slice: function () {
  1255. return new Collection$1(slice$1.apply(this, arguments));
  1256. },
  1257. eq: function (index) {
  1258. return index === -1 ? this.slice(index) : this.slice(index, +index + 1);
  1259. },
  1260. each: function (callback) {
  1261. global$4.each(this, callback);
  1262. return this;
  1263. },
  1264. toArray: function () {
  1265. return global$4.toArray(this);
  1266. },
  1267. indexOf: function (ctrl) {
  1268. var self = this;
  1269. var i = self.length;
  1270. while (i--) {
  1271. if (self[i] === ctrl) {
  1272. break;
  1273. }
  1274. }
  1275. return i;
  1276. },
  1277. reverse: function () {
  1278. return new Collection$1(global$4.toArray(this).reverse());
  1279. },
  1280. hasClass: function (cls) {
  1281. return this[0] ? this[0].classes.contains(cls) : false;
  1282. },
  1283. prop: function (name, value) {
  1284. var self = this;
  1285. var item;
  1286. if (value !== undefined) {
  1287. self.each(function (item) {
  1288. if (item[name]) {
  1289. item[name](value);
  1290. }
  1291. });
  1292. return self;
  1293. }
  1294. item = self[0];
  1295. if (item && item[name]) {
  1296. return item[name]();
  1297. }
  1298. },
  1299. exec: function (name) {
  1300. var self = this, args = global$4.toArray(arguments).slice(1);
  1301. self.each(function (item) {
  1302. if (item[name]) {
  1303. item[name].apply(item, args);
  1304. }
  1305. });
  1306. return self;
  1307. },
  1308. remove: function () {
  1309. var i = this.length;
  1310. while (i--) {
  1311. this[i].remove();
  1312. }
  1313. return this;
  1314. },
  1315. addClass: function (cls) {
  1316. return this.each(function (item) {
  1317. item.classes.add(cls);
  1318. });
  1319. },
  1320. removeClass: function (cls) {
  1321. return this.each(function (item) {
  1322. item.classes.remove(cls);
  1323. });
  1324. }
  1325. };
  1326. global$4.each('fire on off show hide append prepend before after reflow'.split(' '), function (name) {
  1327. proto[name] = function () {
  1328. var args = global$4.toArray(arguments);
  1329. this.each(function (ctrl) {
  1330. if (name in ctrl) {
  1331. ctrl[name].apply(ctrl, args);
  1332. }
  1333. });
  1334. return this;
  1335. };
  1336. });
  1337. global$4.each('text name disabled active selected checked visible parent value data'.split(' '), function (name) {
  1338. proto[name] = function (value) {
  1339. return this.prop(name, value);
  1340. };
  1341. });
  1342. Collection$1 = global$8.extend(proto);
  1343. Selector.Collection = Collection$1;
  1344. var Collection$2 = Collection$1;
  1345. var Binding = function (settings) {
  1346. this.create = settings.create;
  1347. };
  1348. Binding.create = function (model, name) {
  1349. return new Binding({
  1350. create: function (otherModel, otherName) {
  1351. var bindings;
  1352. var fromSelfToOther = function (e) {
  1353. otherModel.set(otherName, e.value);
  1354. };
  1355. var fromOtherToSelf = function (e) {
  1356. model.set(name, e.value);
  1357. };
  1358. otherModel.on('change:' + otherName, fromOtherToSelf);
  1359. model.on('change:' + name, fromSelfToOther);
  1360. bindings = otherModel._bindings;
  1361. if (!bindings) {
  1362. bindings = otherModel._bindings = [];
  1363. otherModel.on('destroy', function () {
  1364. var i = bindings.length;
  1365. while (i--) {
  1366. bindings[i]();
  1367. }
  1368. });
  1369. }
  1370. bindings.push(function () {
  1371. model.off('change:' + name, fromSelfToOther);
  1372. });
  1373. return model.get(name);
  1374. }
  1375. });
  1376. };
  1377. var global$a = tinymce.util.Tools.resolve('tinymce.util.Observable');
  1378. function isNode(node) {
  1379. return node.nodeType > 0;
  1380. }
  1381. function isEqual(a, b) {
  1382. var k, checked;
  1383. if (a === b) {
  1384. return true;
  1385. }
  1386. if (a === null || b === null) {
  1387. return a === b;
  1388. }
  1389. if (typeof a !== 'object' || typeof b !== 'object') {
  1390. return a === b;
  1391. }
  1392. if (global$4.isArray(b)) {
  1393. if (a.length !== b.length) {
  1394. return false;
  1395. }
  1396. k = a.length;
  1397. while (k--) {
  1398. if (!isEqual(a[k], b[k])) {
  1399. return false;
  1400. }
  1401. }
  1402. }
  1403. if (isNode(a) || isNode(b)) {
  1404. return a === b;
  1405. }
  1406. checked = {};
  1407. for (k in b) {
  1408. if (!isEqual(a[k], b[k])) {
  1409. return false;
  1410. }
  1411. checked[k] = true;
  1412. }
  1413. for (k in a) {
  1414. if (!checked[k] && !isEqual(a[k], b[k])) {
  1415. return false;
  1416. }
  1417. }
  1418. return true;
  1419. }
  1420. var ObservableObject = global$8.extend({
  1421. Mixins: [global$a],
  1422. init: function (data) {
  1423. var name, value;
  1424. data = data || {};
  1425. for (name in data) {
  1426. value = data[name];
  1427. if (value instanceof Binding) {
  1428. data[name] = value.create(this, name);
  1429. }
  1430. }
  1431. this.data = data;
  1432. },
  1433. set: function (name, value) {
  1434. var key, args;
  1435. var oldValue = this.data[name];
  1436. if (value instanceof Binding) {
  1437. value = value.create(this, name);
  1438. }
  1439. if (typeof name === 'object') {
  1440. for (key in name) {
  1441. this.set(key, name[key]);
  1442. }
  1443. return this;
  1444. }
  1445. if (!isEqual(oldValue, value)) {
  1446. this.data[name] = value;
  1447. args = {
  1448. target: this,
  1449. name: name,
  1450. value: value,
  1451. oldValue: oldValue
  1452. };
  1453. this.fire('change:' + name, args);
  1454. this.fire('change', args);
  1455. }
  1456. return this;
  1457. },
  1458. get: function (name) {
  1459. return this.data[name];
  1460. },
  1461. has: function (name) {
  1462. return name in this.data;
  1463. },
  1464. bind: function (name) {
  1465. return Binding.create(this, name);
  1466. },
  1467. destroy: function () {
  1468. this.fire('destroy');
  1469. }
  1470. });
  1471. var dirtyCtrls = {}, animationFrameRequested;
  1472. var ReflowQueue = {
  1473. add: function (ctrl) {
  1474. var parent = ctrl.parent();
  1475. if (parent) {
  1476. if (!parent._layout || parent._layout.isNative()) {
  1477. return;
  1478. }
  1479. if (!dirtyCtrls[parent._id]) {
  1480. dirtyCtrls[parent._id] = parent;
  1481. }
  1482. if (!animationFrameRequested) {
  1483. animationFrameRequested = true;
  1484. global$3.requestAnimationFrame(function () {
  1485. var id, ctrl;
  1486. animationFrameRequested = false;
  1487. for (id in dirtyCtrls) {
  1488. ctrl = dirtyCtrls[id];
  1489. if (ctrl.state.get('rendered')) {
  1490. ctrl.reflow();
  1491. }
  1492. }
  1493. dirtyCtrls = {};
  1494. }, domGlobals.document.body);
  1495. }
  1496. }
  1497. },
  1498. remove: function (ctrl) {
  1499. if (dirtyCtrls[ctrl._id]) {
  1500. delete dirtyCtrls[ctrl._id];
  1501. }
  1502. }
  1503. };
  1504. var getUiContainerDelta = function (ctrl) {
  1505. var uiContainer = getUiContainer(ctrl);
  1506. if (uiContainer && global$2.DOM.getStyle(uiContainer, 'position', true) !== 'static') {
  1507. var containerPos = global$2.DOM.getPos(uiContainer);
  1508. var dx = uiContainer.scrollLeft - containerPos.x;
  1509. var dy = uiContainer.scrollTop - containerPos.y;
  1510. return Option.some({
  1511. x: dx,
  1512. y: dy
  1513. });
  1514. } else {
  1515. return Option.none();
  1516. }
  1517. };
  1518. var setUiContainer = function (editor, ctrl) {
  1519. var uiContainer = global$2.DOM.select(editor.settings.ui_container)[0];
  1520. ctrl.getRoot().uiContainer = uiContainer;
  1521. };
  1522. var getUiContainer = function (ctrl) {
  1523. return ctrl ? ctrl.getRoot().uiContainer : null;
  1524. };
  1525. var inheritUiContainer = function (fromCtrl, toCtrl) {
  1526. return toCtrl.uiContainer = getUiContainer(fromCtrl);
  1527. };
  1528. var UiContainer = {
  1529. getUiContainerDelta: getUiContainerDelta,
  1530. setUiContainer: setUiContainer,
  1531. getUiContainer: getUiContainer,
  1532. inheritUiContainer: inheritUiContainer
  1533. };
  1534. var hasMouseWheelEventSupport = 'onmousewheel' in domGlobals.document;
  1535. var hasWheelEventSupport = false;
  1536. var classPrefix = 'mce-';
  1537. var Control, idCounter = 0;
  1538. var proto$1 = {
  1539. Statics: { classPrefix: classPrefix },
  1540. isRtl: function () {
  1541. return Control.rtl;
  1542. },
  1543. classPrefix: classPrefix,
  1544. init: function (settings) {
  1545. var self = this;
  1546. var classes, defaultClasses;
  1547. function applyClasses(classes) {
  1548. var i;
  1549. classes = classes.split(' ');
  1550. for (i = 0; i < classes.length; i++) {
  1551. self.classes.add(classes[i]);
  1552. }
  1553. }
  1554. self.settings = settings = global$4.extend({}, self.Defaults, settings);
  1555. self._id = settings.id || 'mceu_' + idCounter++;
  1556. self._aria = { role: settings.role };
  1557. self._elmCache = {};
  1558. self.$ = global$7;
  1559. self.state = new ObservableObject({
  1560. visible: true,
  1561. active: false,
  1562. disabled: false,
  1563. value: ''
  1564. });
  1565. self.data = new ObservableObject(settings.data);
  1566. self.classes = new ClassList(function () {
  1567. if (self.state.get('rendered')) {
  1568. self.getEl().className = this.toString();
  1569. }
  1570. });
  1571. self.classes.prefix = self.classPrefix;
  1572. classes = settings.classes;
  1573. if (classes) {
  1574. if (self.Defaults) {
  1575. defaultClasses = self.Defaults.classes;
  1576. if (defaultClasses && classes !== defaultClasses) {
  1577. applyClasses(defaultClasses);
  1578. }
  1579. }
  1580. applyClasses(classes);
  1581. }
  1582. global$4.each('title text name visible disabled active value'.split(' '), function (name) {
  1583. if (name in settings) {
  1584. self[name](settings[name]);
  1585. }
  1586. });
  1587. self.on('click', function () {
  1588. if (self.disabled()) {
  1589. return false;
  1590. }
  1591. });
  1592. self.settings = settings;
  1593. self.borderBox = BoxUtils.parseBox(settings.border);
  1594. self.paddingBox = BoxUtils.parseBox(settings.padding);
  1595. self.marginBox = BoxUtils.parseBox(settings.margin);
  1596. if (settings.hidden) {
  1597. self.hide();
  1598. }
  1599. },
  1600. Properties: 'parent,name',
  1601. getContainerElm: function () {
  1602. var uiContainer = UiContainer.getUiContainer(this);
  1603. return uiContainer ? uiContainer : funcs.getContainer();
  1604. },
  1605. getParentCtrl: function (elm) {
  1606. var ctrl;
  1607. var lookup = this.getRoot().controlIdLookup;
  1608. while (elm && lookup) {
  1609. ctrl = lookup[elm.id];
  1610. if (ctrl) {
  1611. break;
  1612. }
  1613. elm = elm.parentNode;
  1614. }
  1615. return ctrl;
  1616. },
  1617. initLayoutRect: function () {
  1618. var self = this;
  1619. var settings = self.settings;
  1620. var borderBox, layoutRect;
  1621. var elm = self.getEl();
  1622. var width, height, minWidth, minHeight, autoResize;
  1623. var startMinWidth, startMinHeight, initialSize;
  1624. borderBox = self.borderBox = self.borderBox || BoxUtils.measureBox(elm, 'border');
  1625. self.paddingBox = self.paddingBox || BoxUtils.measureBox(elm, 'padding');
  1626. self.marginBox = self.marginBox || BoxUtils.measureBox(elm, 'margin');
  1627. initialSize = funcs.getSize(elm);
  1628. startMinWidth = settings.minWidth;
  1629. startMinHeight = settings.minHeight;
  1630. minWidth = startMinWidth || initialSize.width;
  1631. minHeight = startMinHeight || initialSize.height;
  1632. width = settings.width;
  1633. height = settings.height;
  1634. autoResize = settings.autoResize;
  1635. autoResize = typeof autoResize !== 'undefined' ? autoResize : !width && !height;
  1636. width = width || minWidth;
  1637. height = height || minHeight;
  1638. var deltaW = borderBox.left + borderBox.right;
  1639. var deltaH = borderBox.top + borderBox.bottom;
  1640. var maxW = settings.maxWidth || 65535;
  1641. var maxH = settings.maxHeight || 65535;
  1642. self._layoutRect = layoutRect = {
  1643. x: settings.x || 0,
  1644. y: settings.y || 0,
  1645. w: width,
  1646. h: height,
  1647. deltaW: deltaW,
  1648. deltaH: deltaH,
  1649. contentW: width - deltaW,
  1650. contentH: height - deltaH,
  1651. innerW: width - deltaW,
  1652. innerH: height - deltaH,
  1653. startMinWidth: startMinWidth || 0,
  1654. startMinHeight: startMinHeight || 0,
  1655. minW: Math.min(minWidth, maxW),
  1656. minH: Math.min(minHeight, maxH),
  1657. maxW: maxW,
  1658. maxH: maxH,
  1659. autoResize: autoResize,
  1660. scrollW: 0
  1661. };
  1662. self._lastLayoutRect = {};
  1663. return layoutRect;
  1664. },
  1665. layoutRect: function (newRect) {
  1666. var self = this;
  1667. var curRect = self._layoutRect, lastLayoutRect, size, deltaWidth, deltaHeight, repaintControls;
  1668. if (!curRect) {
  1669. curRect = self.initLayoutRect();
  1670. }
  1671. if (newRect) {
  1672. deltaWidth = curRect.deltaW;
  1673. deltaHeight = curRect.deltaH;
  1674. if (newRect.x !== undefined) {
  1675. curRect.x = newRect.x;
  1676. }
  1677. if (newRect.y !== undefined) {
  1678. curRect.y = newRect.y;
  1679. }
  1680. if (newRect.minW !== undefined) {
  1681. curRect.minW = newRect.minW;
  1682. }
  1683. if (newRect.minH !== undefined) {
  1684. curRect.minH = newRect.minH;
  1685. }
  1686. size = newRect.w;
  1687. if (size !== undefined) {
  1688. size = size < curRect.minW ? curRect.minW : size;
  1689. size = size > curRect.maxW ? curRect.maxW : size;
  1690. curRect.w = size;
  1691. curRect.innerW = size - deltaWidth;
  1692. }
  1693. size = newRect.h;
  1694. if (size !== undefined) {
  1695. size = size < curRect.minH ? curRect.minH : size;
  1696. size = size > curRect.maxH ? curRect.maxH : size;
  1697. curRect.h = size;
  1698. curRect.innerH = size - deltaHeight;
  1699. }
  1700. size = newRect.innerW;
  1701. if (size !== undefined) {
  1702. size = size < curRect.minW - deltaWidth ? curRect.minW - deltaWidth : size;
  1703. size = size > curRect.maxW - deltaWidth ? curRect.maxW - deltaWidth : size;
  1704. curRect.innerW = size;
  1705. curRect.w = size + deltaWidth;
  1706. }
  1707. size = newRect.innerH;
  1708. if (size !== undefined) {
  1709. size = size < curRect.minH - deltaHeight ? curRect.minH - deltaHeight : size;
  1710. size = size > curRect.maxH - deltaHeight ? curRect.maxH - deltaHeight : size;
  1711. curRect.innerH = size;
  1712. curRect.h = size + deltaHeight;
  1713. }
  1714. if (newRect.contentW !== undefined) {
  1715. curRect.contentW = newRect.contentW;
  1716. }
  1717. if (newRect.contentH !== undefined) {
  1718. curRect.contentH = newRect.contentH;
  1719. }
  1720. lastLayoutRect = self._lastLayoutRect;
  1721. if (lastLayoutRect.x !== curRect.x || lastLayoutRect.y !== curRect.y || lastLayoutRect.w !== curRect.w || lastLayoutRect.h !== curRect.h) {
  1722. repaintControls = Control.repaintControls;
  1723. if (repaintControls) {
  1724. if (repaintControls.map && !repaintControls.map[self._id]) {
  1725. repaintControls.push(self);
  1726. repaintControls.map[self._id] = true;
  1727. }
  1728. }
  1729. lastLayoutRect.x = curRect.x;
  1730. lastLayoutRect.y = curRect.y;
  1731. lastLayoutRect.w = curRect.w;
  1732. lastLayoutRect.h = curRect.h;
  1733. }
  1734. return self;
  1735. }
  1736. return curRect;
  1737. },
  1738. repaint: function () {
  1739. var self = this;
  1740. var style, bodyStyle, bodyElm, rect, borderBox;
  1741. var borderW, borderH, lastRepaintRect, round, value;
  1742. round = !domGlobals.document.createRange ? Math.round : function (value) {
  1743. return value;
  1744. };
  1745. style = self.getEl().style;
  1746. rect = self._layoutRect;
  1747. lastRepaintRect = self._lastRepaintRect || {};
  1748. borderBox = self.borderBox;
  1749. borderW = borderBox.left + borderBox.right;
  1750. borderH = borderBox.top + borderBox.bottom;
  1751. if (rect.x !== lastRepaintRect.x) {
  1752. style.left = round(rect.x) + 'px';
  1753. lastRepaintRect.x = rect.x;
  1754. }
  1755. if (rect.y !== lastRepaintRect.y) {
  1756. style.top = round(rect.y) + 'px';
  1757. lastRepaintRect.y = rect.y;
  1758. }
  1759. if (rect.w !== lastRepaintRect.w) {
  1760. value = round(rect.w - borderW);
  1761. style.width = (value >= 0 ? value : 0) + 'px';
  1762. lastRepaintRect.w = rect.w;
  1763. }
  1764. if (rect.h !== lastRepaintRect.h) {
  1765. value = round(rect.h - borderH);
  1766. style.height = (value >= 0 ? value : 0) + 'px';
  1767. lastRepaintRect.h = rect.h;
  1768. }
  1769. if (self._hasBody && rect.innerW !== lastRepaintRect.innerW) {
  1770. value = round(rect.innerW);
  1771. bodyElm = self.getEl('body');
  1772. if (bodyElm) {
  1773. bodyStyle = bodyElm.style;
  1774. bodyStyle.width = (value >= 0 ? value : 0) + 'px';
  1775. }
  1776. lastRepaintRect.innerW = rect.innerW;
  1777. }
  1778. if (self._hasBody && rect.innerH !== lastRepaintRect.innerH) {
  1779. value = round(rect.innerH);
  1780. bodyElm = bodyElm || self.getEl('body');
  1781. if (bodyElm) {
  1782. bodyStyle = bodyStyle || bodyElm.style;
  1783. bodyStyle.height = (value >= 0 ? value : 0) + 'px';
  1784. }
  1785. lastRepaintRect.innerH = rect.innerH;
  1786. }
  1787. self._lastRepaintRect = lastRepaintRect;
  1788. self.fire('repaint', {}, false);
  1789. },
  1790. updateLayoutRect: function () {
  1791. var self = this;
  1792. self.parent()._lastRect = null;
  1793. funcs.css(self.getEl(), {
  1794. width: '',
  1795. height: ''
  1796. });
  1797. self._layoutRect = self._lastRepaintRect = self._lastLayoutRect = null;
  1798. self.initLayoutRect();
  1799. },
  1800. on: function (name, callback) {
  1801. var self = this;
  1802. function resolveCallbackName(name) {
  1803. var callback, scope;
  1804. if (typeof name !== 'string') {
  1805. return name;
  1806. }
  1807. return function (e) {
  1808. if (!callback) {
  1809. self.parentsAndSelf().each(function (ctrl) {
  1810. var callbacks = ctrl.settings.callbacks;
  1811. if (callbacks && (callback = callbacks[name])) {
  1812. scope = ctrl;
  1813. return false;
  1814. }
  1815. });
  1816. }
  1817. if (!callback) {
  1818. e.action = name;
  1819. this.fire('execute', e);
  1820. return;
  1821. }
  1822. return callback.call(scope, e);
  1823. };
  1824. }
  1825. getEventDispatcher(self).on(name, resolveCallbackName(callback));
  1826. return self;
  1827. },
  1828. off: function (name, callback) {
  1829. getEventDispatcher(this).off(name, callback);
  1830. return this;
  1831. },
  1832. fire: function (name, args, bubble) {
  1833. var self = this;
  1834. args = args || {};
  1835. if (!args.control) {
  1836. args.control = self;
  1837. }
  1838. args = getEventDispatcher(self).fire(name, args);
  1839. if (bubble !== false && self.parent) {
  1840. var parent = self.parent();
  1841. while (parent && !args.isPropagationStopped()) {
  1842. parent.fire(name, args, false);
  1843. parent = parent.parent();
  1844. }
  1845. }
  1846. return args;
  1847. },
  1848. hasEventListeners: function (name) {
  1849. return getEventDispatcher(this).has(name);
  1850. },
  1851. parents: function (selector) {
  1852. var self = this;
  1853. var ctrl, parents = new Collection$2();
  1854. for (ctrl = self.parent(); ctrl; ctrl = ctrl.parent()) {
  1855. parents.add(ctrl);
  1856. }
  1857. if (selector) {
  1858. parents = parents.filter(selector);
  1859. }
  1860. return parents;
  1861. },
  1862. parentsAndSelf: function (selector) {
  1863. return new Collection$2(this).add(this.parents(selector));
  1864. },
  1865. next: function () {
  1866. var parentControls = this.parent().items();
  1867. return parentControls[parentControls.indexOf(this) + 1];
  1868. },
  1869. prev: function () {
  1870. var parentControls = this.parent().items();
  1871. return parentControls[parentControls.indexOf(this) - 1];
  1872. },
  1873. innerHtml: function (html) {
  1874. this.$el.html(html);
  1875. return this;
  1876. },
  1877. getEl: function (suffix) {
  1878. var id = suffix ? this._id + '-' + suffix : this._id;
  1879. if (!this._elmCache[id]) {
  1880. this._elmCache[id] = global$7('#' + id)[0];
  1881. }
  1882. return this._elmCache[id];
  1883. },
  1884. show: function () {
  1885. return this.visible(true);
  1886. },
  1887. hide: function () {
  1888. return this.visible(false);
  1889. },
  1890. focus: function () {
  1891. try {
  1892. this.getEl().focus();
  1893. } catch (ex) {
  1894. }
  1895. return this;
  1896. },
  1897. blur: function () {
  1898. this.getEl().blur();
  1899. return this;
  1900. },
  1901. aria: function (name, value) {
  1902. var self = this, elm = self.getEl(self.ariaTarget);
  1903. if (typeof value === 'undefined') {
  1904. return self._aria[name];
  1905. }
  1906. self._aria[name] = value;
  1907. if (self.state.get('rendered')) {
  1908. elm.setAttribute(name === 'role' ? name : 'aria-' + name, value);
  1909. }
  1910. return self;
  1911. },
  1912. encode: function (text, translate) {
  1913. if (translate !== false) {
  1914. text = this.translate(text);
  1915. }
  1916. return (text || '').replace(/[&<>"]/g, function (match) {
  1917. return '&#' + match.charCodeAt(0) + ';';
  1918. });
  1919. },
  1920. translate: function (text) {
  1921. return Control.translate ? Control.translate(text) : text;
  1922. },
  1923. before: function (items) {
  1924. var self = this, parent = self.parent();
  1925. if (parent) {
  1926. parent.insert(items, parent.items().indexOf(self), true);
  1927. }
  1928. return self;
  1929. },
  1930. after: function (items) {
  1931. var self = this, parent = self.parent();
  1932. if (parent) {
  1933. parent.insert(items, parent.items().indexOf(self));
  1934. }
  1935. return self;
  1936. },
  1937. remove: function () {
  1938. var self = this;
  1939. var elm = self.getEl();
  1940. var parent = self.parent();
  1941. var newItems, i;
  1942. if (self.items) {
  1943. var controls = self.items().toArray();
  1944. i = controls.length;
  1945. while (i--) {
  1946. controls[i].remove();
  1947. }
  1948. }
  1949. if (parent && parent.items) {
  1950. newItems = [];
  1951. parent.items().each(function (item) {
  1952. if (item !== self) {
  1953. newItems.push(item);
  1954. }
  1955. });
  1956. parent.items().set(newItems);
  1957. parent._lastRect = null;
  1958. }
  1959. if (self._eventsRoot && self._eventsRoot === self) {
  1960. global$7(elm).off();
  1961. }
  1962. var lookup = self.getRoot().controlIdLookup;
  1963. if (lookup) {
  1964. delete lookup[self._id];
  1965. }
  1966. if (elm && elm.parentNode) {
  1967. elm.parentNode.removeChild(elm);
  1968. }
  1969. self.state.set('rendered', false);
  1970. self.state.destroy();
  1971. self.fire('remove');
  1972. return self;
  1973. },
  1974. renderBefore: function (elm) {
  1975. global$7(elm).before(this.renderHtml());
  1976. this.postRender();
  1977. return this;
  1978. },
  1979. renderTo: function (elm) {
  1980. global$7(elm || this.getContainerElm()).append(this.renderHtml());
  1981. this.postRender();
  1982. return this;
  1983. },
  1984. preRender: function () {
  1985. },
  1986. render: function () {
  1987. },
  1988. renderHtml: function () {
  1989. return '<div id="' + this._id + '" class="' + this.classes + '"></div>';
  1990. },
  1991. postRender: function () {
  1992. var self = this;
  1993. var settings = self.settings;
  1994. var elm, box, parent, name, parentEventsRoot;
  1995. self.$el = global$7(self.getEl());
  1996. self.state.set('rendered', true);
  1997. for (name in settings) {
  1998. if (name.indexOf('on') === 0) {
  1999. self.on(name.substr(2), settings[name]);
  2000. }
  2001. }
  2002. if (self._eventsRoot) {
  2003. for (parent = self.parent(); !parentEventsRoot && parent; parent = parent.parent()) {
  2004. parentEventsRoot = parent._eventsRoot;
  2005. }
  2006. if (parentEventsRoot) {
  2007. for (name in parentEventsRoot._nativeEvents) {
  2008. self._nativeEvents[name] = true;
  2009. }
  2010. }
  2011. }
  2012. bindPendingEvents(self);
  2013. if (settings.style) {
  2014. elm = self.getEl();
  2015. if (elm) {
  2016. elm.setAttribute('style', settings.style);
  2017. elm.style.cssText = settings.style;
  2018. }
  2019. }
  2020. if (self.settings.border) {
  2021. box = self.borderBox;
  2022. self.$el.css({
  2023. 'border-top-width': box.top,
  2024. 'border-right-width': box.right,
  2025. 'border-bottom-width': box.bottom,
  2026. 'border-left-width': box.left
  2027. });
  2028. }
  2029. var root = self.getRoot();
  2030. if (!root.controlIdLookup) {
  2031. root.controlIdLookup = {};
  2032. }
  2033. root.controlIdLookup[self._id] = self;
  2034. for (var key in self._aria) {
  2035. self.aria(key, self._aria[key]);
  2036. }
  2037. if (self.state.get('visible') === false) {
  2038. self.getEl().style.display = 'none';
  2039. }
  2040. self.bindStates();
  2041. self.state.on('change:visible', function (e) {
  2042. var state = e.value;
  2043. var parentCtrl;
  2044. if (self.state.get('rendered')) {
  2045. self.getEl().style.display = state === false ? 'none' : '';
  2046. self.getEl().getBoundingClientRect();
  2047. }
  2048. parentCtrl = self.parent();
  2049. if (parentCtrl) {
  2050. parentCtrl._lastRect = null;
  2051. }
  2052. self.fire(state ? 'show' : 'hide');
  2053. ReflowQueue.add(self);
  2054. });
  2055. self.fire('postrender', {}, false);
  2056. },
  2057. bindStates: function () {
  2058. },
  2059. scrollIntoView: function (align) {
  2060. function getOffset(elm, rootElm) {
  2061. var x, y, parent = elm;
  2062. x = y = 0;
  2063. while (parent && parent !== rootElm && parent.nodeType) {
  2064. x += parent.offsetLeft || 0;
  2065. y += parent.offsetTop || 0;
  2066. parent = parent.offsetParent;
  2067. }
  2068. return {
  2069. x: x,
  2070. y: y
  2071. };
  2072. }
  2073. var elm = this.getEl(), parentElm = elm.parentNode;
  2074. var x, y, width, height, parentWidth, parentHeight;
  2075. var pos = getOffset(elm, parentElm);
  2076. x = pos.x;
  2077. y = pos.y;
  2078. width = elm.offsetWidth;
  2079. height = elm.offsetHeight;
  2080. parentWidth = parentElm.clientWidth;
  2081. parentHeight = parentElm.clientHeight;
  2082. if (align === 'end') {
  2083. x -= parentWidth - width;
  2084. y -= parentHeight - height;
  2085. } else if (align === 'center') {
  2086. x -= parentWidth / 2 - width / 2;
  2087. y -= parentHeight / 2 - height / 2;
  2088. }
  2089. parentElm.scrollLeft = x;
  2090. parentElm.scrollTop = y;
  2091. return this;
  2092. },
  2093. getRoot: function () {
  2094. var ctrl = this, rootControl;
  2095. var parents = [];
  2096. while (ctrl) {
  2097. if (ctrl.rootControl) {
  2098. rootControl = ctrl.rootControl;
  2099. break;
  2100. }
  2101. parents.push(ctrl);
  2102. rootControl = ctrl;
  2103. ctrl = ctrl.parent();
  2104. }
  2105. if (!rootControl) {
  2106. rootControl = this;
  2107. }
  2108. var i = parents.length;
  2109. while (i--) {
  2110. parents[i].rootControl = rootControl;
  2111. }
  2112. return rootControl;
  2113. },
  2114. reflow: function () {
  2115. ReflowQueue.remove(this);
  2116. var parent = this.parent();
  2117. if (parent && parent._layout && !parent._layout.isNative()) {
  2118. parent.reflow();
  2119. }
  2120. return this;
  2121. }
  2122. };
  2123. global$4.each('text title visible disabled active value'.split(' '), function (name) {
  2124. proto$1[name] = function (value) {
  2125. if (arguments.length === 0) {
  2126. return this.state.get(name);
  2127. }
  2128. if (typeof value !== 'undefined') {
  2129. this.state.set(name, value);
  2130. }
  2131. return this;
  2132. };
  2133. });
  2134. Control = global$8.extend(proto$1);
  2135. function getEventDispatcher(obj) {
  2136. if (!obj._eventDispatcher) {
  2137. obj._eventDispatcher = new global$9({
  2138. scope: obj,
  2139. toggleEvent: function (name, state) {
  2140. if (state && global$9.isNative(name)) {
  2141. if (!obj._nativeEvents) {
  2142. obj._nativeEvents = {};
  2143. }
  2144. obj._nativeEvents[name] = true;
  2145. if (obj.state.get('rendered')) {
  2146. bindPendingEvents(obj);
  2147. }
  2148. }
  2149. }
  2150. });
  2151. }
  2152. return obj._eventDispatcher;
  2153. }
  2154. function bindPendingEvents(eventCtrl) {
  2155. var i, l, parents, eventRootCtrl, nativeEvents, name;
  2156. function delegate(e) {
  2157. var control = eventCtrl.getParentCtrl(e.target);
  2158. if (control) {
  2159. control.fire(e.type, e);
  2160. }
  2161. }
  2162. function mouseLeaveHandler() {
  2163. var ctrl = eventRootCtrl._lastHoverCtrl;
  2164. if (ctrl) {
  2165. ctrl.fire('mouseleave', { target: ctrl.getEl() });
  2166. ctrl.parents().each(function (ctrl) {
  2167. ctrl.fire('mouseleave', { target: ctrl.getEl() });
  2168. });
  2169. eventRootCtrl._lastHoverCtrl = null;
  2170. }
  2171. }
  2172. function mouseEnterHandler(e) {
  2173. var ctrl = eventCtrl.getParentCtrl(e.target), lastCtrl = eventRootCtrl._lastHoverCtrl, idx = 0, i, parents, lastParents;
  2174. if (ctrl !== lastCtrl) {
  2175. eventRootCtrl._lastHoverCtrl = ctrl;
  2176. parents = ctrl.parents().toArray().reverse();
  2177. parents.push(ctrl);
  2178. if (lastCtrl) {
  2179. lastParents = lastCtrl.parents().toArray().reverse();
  2180. lastParents.push(lastCtrl);
  2181. for (idx = 0; idx < lastParents.length; idx++) {
  2182. if (parents[idx] !== lastParents[idx]) {
  2183. break;
  2184. }
  2185. }
  2186. for (i = lastParents.length - 1; i >= idx; i--) {
  2187. lastCtrl = lastParents[i];
  2188. lastCtrl.fire('mouseleave', { target: lastCtrl.getEl() });
  2189. }
  2190. }
  2191. for (i = idx; i < parents.length; i++) {
  2192. ctrl = parents[i];
  2193. ctrl.fire('mouseenter', { target: ctrl.getEl() });
  2194. }
  2195. }
  2196. }
  2197. function fixWheelEvent(e) {
  2198. e.preventDefault();
  2199. if (e.type === 'mousewheel') {
  2200. e.deltaY = -1 / 40 * e.wheelDelta;
  2201. if (e.wheelDeltaX) {
  2202. e.deltaX = -1 / 40 * e.wheelDeltaX;
  2203. }
  2204. } else {
  2205. e.deltaX = 0;
  2206. e.deltaY = e.detail;
  2207. }
  2208. e = eventCtrl.fire('wheel', e);
  2209. }
  2210. nativeEvents = eventCtrl._nativeEvents;
  2211. if (nativeEvents) {
  2212. parents = eventCtrl.parents().toArray();
  2213. parents.unshift(eventCtrl);
  2214. for (i = 0, l = parents.length; !eventRootCtrl && i < l; i++) {
  2215. eventRootCtrl = parents[i]._eventsRoot;
  2216. }
  2217. if (!eventRootCtrl) {
  2218. eventRootCtrl = parents[parents.length - 1] || eventCtrl;
  2219. }
  2220. eventCtrl._eventsRoot = eventRootCtrl;
  2221. for (l = i, i = 0; i < l; i++) {
  2222. parents[i]._eventsRoot = eventRootCtrl;
  2223. }
  2224. var eventRootDelegates = eventRootCtrl._delegates;
  2225. if (!eventRootDelegates) {
  2226. eventRootDelegates = eventRootCtrl._delegates = {};
  2227. }
  2228. for (name in nativeEvents) {
  2229. if (!nativeEvents) {
  2230. return false;
  2231. }
  2232. if (name === 'wheel' && !hasWheelEventSupport) {
  2233. if (hasMouseWheelEventSupport) {
  2234. global$7(eventCtrl.getEl()).on('mousewheel', fixWheelEvent);
  2235. } else {
  2236. global$7(eventCtrl.getEl()).on('DOMMouseScroll', fixWheelEvent);
  2237. }
  2238. continue;
  2239. }
  2240. if (name === 'mouseenter' || name === 'mouseleave') {
  2241. if (!eventRootCtrl._hasMouseEnter) {
  2242. global$7(eventRootCtrl.getEl()).on('mouseleave', mouseLeaveHandler).on('mouseover', mouseEnterHandler);
  2243. eventRootCtrl._hasMouseEnter = 1;
  2244. }
  2245. } else if (!eventRootDelegates[name]) {
  2246. global$7(eventRootCtrl.getEl()).on(name, delegate);
  2247. eventRootDelegates[name] = true;
  2248. }
  2249. nativeEvents[name] = false;
  2250. }
  2251. }
  2252. }
  2253. var Control$1 = Control;
  2254. var isStatic = function (elm) {
  2255. return funcs.getRuntimeStyle(elm, 'position') === 'static';
  2256. };
  2257. var isFixed = function (ctrl) {
  2258. return ctrl.state.get('fixed');
  2259. };
  2260. function calculateRelativePosition(ctrl, targetElm, rel) {
  2261. var ctrlElm, pos, x, y, selfW, selfH, targetW, targetH, viewport, size;
  2262. viewport = getWindowViewPort();
  2263. pos = funcs.getPos(targetElm, UiContainer.getUiContainer(ctrl));
  2264. x = pos.x;
  2265. y = pos.y;
  2266. if (isFixed(ctrl) && isStatic(domGlobals.document.body)) {
  2267. x -= viewport.x;
  2268. y -= viewport.y;
  2269. }
  2270. ctrlElm = ctrl.getEl();
  2271. size = funcs.getSize(ctrlElm);
  2272. selfW = size.width;
  2273. selfH = size.height;
  2274. size = funcs.getSize(targetElm);
  2275. targetW = size.width;
  2276. targetH = size.height;
  2277. rel = (rel || '').split('');
  2278. if (rel[0] === 'b') {
  2279. y += targetH;
  2280. }
  2281. if (rel[1] === 'r') {
  2282. x += targetW;
  2283. }
  2284. if (rel[0] === 'c') {
  2285. y += Math.round(targetH / 2);
  2286. }
  2287. if (rel[1] === 'c') {
  2288. x += Math.round(targetW / 2);
  2289. }
  2290. if (rel[3] === 'b') {
  2291. y -= selfH;
  2292. }
  2293. if (rel[4] === 'r') {
  2294. x -= selfW;
  2295. }
  2296. if (rel[3] === 'c') {
  2297. y -= Math.round(selfH / 2);
  2298. }
  2299. if (rel[4] === 'c') {
  2300. x -= Math.round(selfW / 2);
  2301. }
  2302. return {
  2303. x: x,
  2304. y: y,
  2305. w: selfW,
  2306. h: selfH
  2307. };
  2308. }
  2309. var getUiContainerViewPort = function (customUiContainer) {
  2310. return {
  2311. x: 0,
  2312. y: 0,
  2313. w: customUiContainer.scrollWidth - 1,
  2314. h: customUiContainer.scrollHeight - 1
  2315. };
  2316. };
  2317. var getWindowViewPort = function () {
  2318. var win = domGlobals.window;
  2319. var x = Math.max(win.pageXOffset, domGlobals.document.body.scrollLeft, domGlobals.document.documentElement.scrollLeft);
  2320. var y = Math.max(win.pageYOffset, domGlobals.document.body.scrollTop, domGlobals.document.documentElement.scrollTop);
  2321. var w = win.innerWidth || domGlobals.document.documentElement.clientWidth;
  2322. var h = win.innerHeight || domGlobals.document.documentElement.clientHeight;
  2323. return {
  2324. x: x,
  2325. y: y,
  2326. w: w,
  2327. h: h
  2328. };
  2329. };
  2330. var getViewPortRect = function (ctrl) {
  2331. var customUiContainer = UiContainer.getUiContainer(ctrl);
  2332. return customUiContainer && !isFixed(ctrl) ? getUiContainerViewPort(customUiContainer) : getWindowViewPort();
  2333. };
  2334. var Movable = {
  2335. testMoveRel: function (elm, rels) {
  2336. var viewPortRect = getViewPortRect(this);
  2337. for (var i = 0; i < rels.length; i++) {
  2338. var pos = calculateRelativePosition(this, elm, rels[i]);
  2339. if (isFixed(this)) {
  2340. if (pos.x > 0 && pos.x + pos.w < viewPortRect.w && pos.y > 0 && pos.y + pos.h < viewPortRect.h) {
  2341. return rels[i];
  2342. }
  2343. } else {
  2344. if (pos.x > viewPortRect.x && pos.x + pos.w < viewPortRect.w + viewPortRect.x && pos.y > viewPortRect.y && pos.y + pos.h < viewPortRect.h + viewPortRect.y) {
  2345. return rels[i];
  2346. }
  2347. }
  2348. }
  2349. return rels[0];
  2350. },
  2351. moveRel: function (elm, rel) {
  2352. if (typeof rel !== 'string') {
  2353. rel = this.testMoveRel(elm, rel);
  2354. }
  2355. var pos = calculateRelativePosition(this, elm, rel);
  2356. return this.moveTo(pos.x, pos.y);
  2357. },
  2358. moveBy: function (dx, dy) {
  2359. var self = this, rect = self.layoutRect();
  2360. self.moveTo(rect.x + dx, rect.y + dy);
  2361. return self;
  2362. },
  2363. moveTo: function (x, y) {
  2364. var self = this;
  2365. function constrain(value, max, size) {
  2366. if (value < 0) {
  2367. return 0;
  2368. }
  2369. if (value + size > max) {
  2370. value = max - size;
  2371. return value < 0 ? 0 : value;
  2372. }
  2373. return value;
  2374. }
  2375. if (self.settings.constrainToViewport) {
  2376. var viewPortRect = getViewPortRect(this);
  2377. var layoutRect = self.layoutRect();
  2378. x = constrain(x, viewPortRect.w + viewPortRect.x, layoutRect.w);
  2379. y = constrain(y, viewPortRect.h + viewPortRect.y, layoutRect.h);
  2380. }
  2381. var uiContainer = UiContainer.getUiContainer(self);
  2382. if (uiContainer && isStatic(uiContainer) && !isFixed(self)) {
  2383. x -= uiContainer.scrollLeft;
  2384. y -= uiContainer.scrollTop;
  2385. }
  2386. if (uiContainer) {
  2387. x += 1;
  2388. y += 1;
  2389. }
  2390. if (self.state.get('rendered')) {
  2391. self.layoutRect({
  2392. x: x,
  2393. y: y
  2394. }).repaint();
  2395. } else {
  2396. self.settings.x = x;
  2397. self.settings.y = y;
  2398. }
  2399. self.fire('move', {
  2400. x: x,
  2401. y: y
  2402. });
  2403. return self;
  2404. }
  2405. };
  2406. var Tooltip = Control$1.extend({
  2407. Mixins: [Movable],
  2408. Defaults: { classes: 'widget tooltip tooltip-n' },
  2409. renderHtml: function () {
  2410. var self = this, prefix = self.classPrefix;
  2411. return '<div id="' + self._id + '" class="' + self.classes + '" role="presentation">' + '<div class="' + prefix + 'tooltip-arrow"></div>' + '<div class="' + prefix + 'tooltip-inner">' + self.encode(self.state.get('text')) + '</div>' + '</div>';
  2412. },
  2413. bindStates: function () {
  2414. var self = this;
  2415. self.state.on('change:text', function (e) {
  2416. self.getEl().lastChild.innerHTML = self.encode(e.value);
  2417. });
  2418. return self._super();
  2419. },
  2420. repaint: function () {
  2421. var self = this;
  2422. var style, rect;
  2423. style = self.getEl().style;
  2424. rect = self._layoutRect;
  2425. style.left = rect.x + 'px';
  2426. style.top = rect.y + 'px';
  2427. style.zIndex = 65535 + 65535;
  2428. }
  2429. });
  2430. var Widget = Control$1.extend({
  2431. init: function (settings) {
  2432. var self = this;
  2433. self._super(settings);
  2434. settings = self.settings;
  2435. self.canFocus = true;
  2436. if (settings.tooltip && Widget.tooltips !== false) {
  2437. self.on('mouseenter', function (e) {
  2438. var tooltip = self.tooltip().moveTo(-65535);
  2439. if (e.control === self) {
  2440. var rel = tooltip.text(settings.tooltip).show().testMoveRel(self.getEl(), [
  2441. 'bc-tc',
  2442. 'bc-tl',
  2443. 'bc-tr'
  2444. ]);
  2445. tooltip.classes.toggle('tooltip-n', rel === 'bc-tc');
  2446. tooltip.classes.toggle('tooltip-nw', rel === 'bc-tl');
  2447. tooltip.classes.toggle('tooltip-ne', rel === 'bc-tr');
  2448. tooltip.moveRel(self.getEl(), rel);
  2449. } else {
  2450. tooltip.hide();
  2451. }
  2452. });
  2453. self.on('mouseleave mousedown click', function () {
  2454. self.tooltip().remove();
  2455. self._tooltip = null;
  2456. });
  2457. }
  2458. self.aria('label', settings.ariaLabel || settings.tooltip);
  2459. },
  2460. tooltip: function () {
  2461. if (!this._tooltip) {
  2462. this._tooltip = new Tooltip({ type: 'tooltip' });
  2463. UiContainer.inheritUiContainer(this, this._tooltip);
  2464. this._tooltip.renderTo();
  2465. }
  2466. return this._tooltip;
  2467. },
  2468. postRender: function () {
  2469. var self = this, settings = self.settings;
  2470. self._super();
  2471. if (!self.parent() && (settings.width || settings.height)) {
  2472. self.initLayoutRect();
  2473. self.repaint();
  2474. }
  2475. if (settings.autofocus) {
  2476. self.focus();
  2477. }
  2478. },
  2479. bindStates: function () {
  2480. var self = this;
  2481. function disable(state) {
  2482. self.aria('disabled', state);
  2483. self.classes.toggle('disabled', state);
  2484. }
  2485. function active(state) {
  2486. self.aria('pressed', state);
  2487. self.classes.toggle('active', state);
  2488. }
  2489. self.state.on('change:disabled', function (e) {
  2490. disable(e.value);
  2491. });
  2492. self.state.on('change:active', function (e) {
  2493. active(e.value);
  2494. });
  2495. if (self.state.get('disabled')) {
  2496. disable(true);
  2497. }
  2498. if (self.state.get('active')) {
  2499. active(true);
  2500. }
  2501. return self._super();
  2502. },
  2503. remove: function () {
  2504. this._super();
  2505. if (this._tooltip) {
  2506. this._tooltip.remove();
  2507. this._tooltip = null;
  2508. }
  2509. }
  2510. });
  2511. var Progress = Widget.extend({
  2512. Defaults: { value: 0 },
  2513. init: function (settings) {
  2514. var self = this;
  2515. self._super(settings);
  2516. self.classes.add('progress');
  2517. if (!self.settings.filter) {
  2518. self.settings.filter = function (value) {
  2519. return Math.round(value);
  2520. };
  2521. }
  2522. },
  2523. renderHtml: function () {
  2524. var self = this, id = self._id, prefix = this.classPrefix;
  2525. return '<div id="' + id + '" class="' + self.classes + '">' + '<div class="' + prefix + 'bar-container">' + '<div class="' + prefix + 'bar"></div>' + '</div>' + '<div class="' + prefix + 'text">0%</div>' + '</div>';
  2526. },
  2527. postRender: function () {
  2528. var self = this;
  2529. self._super();
  2530. self.value(self.settings.value);
  2531. return self;
  2532. },
  2533. bindStates: function () {
  2534. var self = this;
  2535. function setValue(value) {
  2536. value = self.settings.filter(value);
  2537. self.getEl().lastChild.innerHTML = value + '%';
  2538. self.getEl().firstChild.firstChild.style.width = value + '%';
  2539. }
  2540. self.state.on('change:value', function (e) {
  2541. setValue(e.value);
  2542. });
  2543. setValue(self.state.get('value'));
  2544. return self._super();
  2545. }
  2546. });
  2547. var updateLiveRegion = function (ctx, text) {
  2548. ctx.getEl().lastChild.textContent = text + (ctx.progressBar ? ' ' + ctx.progressBar.value() + '%' : '');
  2549. };
  2550. var Notification = Control$1.extend({
  2551. Mixins: [Movable],
  2552. Defaults: { classes: 'widget notification' },
  2553. init: function (settings) {
  2554. var self = this;
  2555. self._super(settings);
  2556. self.maxWidth = settings.maxWidth;
  2557. if (settings.text) {
  2558. self.text(settings.text);
  2559. }
  2560. if (settings.icon) {
  2561. self.icon = settings.icon;
  2562. }
  2563. if (settings.color) {
  2564. self.color = settings.color;
  2565. }
  2566. if (settings.type) {
  2567. self.classes.add('notification-' + settings.type);
  2568. }
  2569. if (settings.timeout && (settings.timeout < 0 || settings.timeout > 0) && !settings.closeButton) {
  2570. self.closeButton = false;
  2571. } else {
  2572. self.classes.add('has-close');
  2573. self.closeButton = true;
  2574. }
  2575. if (settings.progressBar) {
  2576. self.progressBar = new Progress();
  2577. }
  2578. self.on('click', function (e) {
  2579. if (e.target.className.indexOf(self.classPrefix + 'close') !== -1) {
  2580. self.close();
  2581. }
  2582. });
  2583. },
  2584. renderHtml: function () {
  2585. var self = this;
  2586. var prefix = self.classPrefix;
  2587. var icon = '', closeButton = '', progressBar = '', notificationStyle = '';
  2588. if (self.icon) {
  2589. icon = '<i class="' + prefix + 'ico' + ' ' + prefix + 'i-' + self.icon + '"></i>';
  2590. }
  2591. notificationStyle = ' style="max-width: ' + self.maxWidth + 'px;' + (self.color ? 'background-color: ' + self.color + ';"' : '"');
  2592. if (self.closeButton) {
  2593. closeButton = '<button type="button" class="' + prefix + 'close" aria-hidden="true">\xD7</button>';
  2594. }
  2595. if (self.progressBar) {
  2596. progressBar = self.progressBar.renderHtml();
  2597. }
  2598. return '<div id="' + self._id + '" class="' + self.classes + '"' + notificationStyle + ' role="presentation">' + icon + '<div class="' + prefix + 'notification-inner">' + self.state.get('text') + '</div>' + progressBar + closeButton + '<div style="clip: rect(1px, 1px, 1px, 1px);height: 1px;overflow: hidden;position: absolute;width: 1px;"' + ' aria-live="assertive" aria-relevant="additions" aria-atomic="true"></div>' + '</div>';
  2599. },
  2600. postRender: function () {
  2601. var self = this;
  2602. global$3.setTimeout(function () {
  2603. self.$el.addClass(self.classPrefix + 'in');
  2604. updateLiveRegion(self, self.state.get('text'));
  2605. }, 100);
  2606. return self._super();
  2607. },
  2608. bindStates: function () {
  2609. var self = this;
  2610. self.state.on('change:text', function (e) {
  2611. self.getEl().firstChild.innerHTML = e.value;
  2612. updateLiveRegion(self, e.value);
  2613. });
  2614. if (self.progressBar) {
  2615. self.progressBar.bindStates();
  2616. self.progressBar.state.on('change:value', function (e) {
  2617. updateLiveRegion(self, self.state.get('text'));
  2618. });
  2619. }
  2620. return self._super();
  2621. },
  2622. close: function () {
  2623. var self = this;
  2624. if (!self.fire('close').isDefaultPrevented()) {
  2625. self.remove();
  2626. }
  2627. return self;
  2628. },
  2629. repaint: function () {
  2630. var self = this;
  2631. var style, rect;
  2632. style = self.getEl().style;
  2633. rect = self._layoutRect;
  2634. style.left = rect.x + 'px';
  2635. style.top = rect.y + 'px';
  2636. style.zIndex = 65535 - 1;
  2637. }
  2638. });
  2639. function NotificationManagerImpl (editor) {
  2640. var getEditorContainer = function (editor) {
  2641. return editor.inline ? editor.getElement() : editor.getContentAreaContainer();
  2642. };
  2643. var getContainerWidth = function () {
  2644. var container = getEditorContainer(editor);
  2645. return funcs.getSize(container).width;
  2646. };
  2647. var prePositionNotifications = function (notifications) {
  2648. each(notifications, function (notification) {
  2649. notification.moveTo(0, 0);
  2650. });
  2651. };
  2652. var positionNotifications = function (notifications) {
  2653. if (notifications.length > 0) {
  2654. var firstItem = notifications.slice(0, 1)[0];
  2655. var container = getEditorContainer(editor);
  2656. firstItem.moveRel(container, 'tc-tc');
  2657. each(notifications, function (notification, index) {
  2658. if (index > 0) {
  2659. notification.moveRel(notifications[index - 1].getEl(), 'bc-tc');
  2660. }
  2661. });
  2662. }
  2663. };
  2664. var reposition = function (notifications) {
  2665. prePositionNotifications(notifications);
  2666. positionNotifications(notifications);
  2667. };
  2668. var open = function (args, closeCallback) {
  2669. var extendedArgs = global$4.extend(args, { maxWidth: getContainerWidth() });
  2670. var notif = new Notification(extendedArgs);
  2671. notif.args = extendedArgs;
  2672. if (extendedArgs.timeout > 0) {
  2673. notif.timer = setTimeout(function () {
  2674. notif.close();
  2675. closeCallback();
  2676. }, extendedArgs.timeout);
  2677. }
  2678. notif.on('close', function () {
  2679. closeCallback();
  2680. });
  2681. notif.renderTo();
  2682. return notif;
  2683. };
  2684. var close = function (notification) {
  2685. notification.close();
  2686. };
  2687. var getArgs = function (notification) {
  2688. return notification.args;
  2689. };
  2690. return {
  2691. open: open,
  2692. close: close,
  2693. reposition: reposition,
  2694. getArgs: getArgs
  2695. };
  2696. }
  2697. function getDocumentSize(doc) {
  2698. var documentElement, body, scrollWidth, clientWidth;
  2699. var offsetWidth, scrollHeight, clientHeight, offsetHeight;
  2700. var max = Math.max;
  2701. documentElement = doc.documentElement;
  2702. body = doc.body;
  2703. scrollWidth = max(documentElement.scrollWidth, body.scrollWidth);
  2704. clientWidth = max(documentElement.clientWidth, body.clientWidth);
  2705. offsetWidth = max(documentElement.offsetWidth, body.offsetWidth);
  2706. scrollHeight = max(documentElement.scrollHeight, body.scrollHeight);
  2707. clientHeight = max(documentElement.clientHeight, body.clientHeight);
  2708. offsetHeight = max(documentElement.offsetHeight, body.offsetHeight);
  2709. return {
  2710. width: scrollWidth < offsetWidth ? clientWidth : scrollWidth,
  2711. height: scrollHeight < offsetHeight ? clientHeight : scrollHeight
  2712. };
  2713. }
  2714. function updateWithTouchData(e) {
  2715. var keys, i;
  2716. if (e.changedTouches) {
  2717. keys = 'screenX screenY pageX pageY clientX clientY'.split(' ');
  2718. for (i = 0; i < keys.length; i++) {
  2719. e[keys[i]] = e.changedTouches[0][keys[i]];
  2720. }
  2721. }
  2722. }
  2723. function DragHelper (id, settings) {
  2724. var $eventOverlay;
  2725. var doc = settings.document || domGlobals.document;
  2726. var downButton;
  2727. var start, stop, drag, startX, startY;
  2728. settings = settings || {};
  2729. var handleElement = doc.getElementById(settings.handle || id);
  2730. start = function (e) {
  2731. var docSize = getDocumentSize(doc);
  2732. var handleElm, cursor;
  2733. updateWithTouchData(e);
  2734. e.preventDefault();
  2735. downButton = e.button;
  2736. handleElm = handleElement;
  2737. startX = e.screenX;
  2738. startY = e.screenY;
  2739. if (domGlobals.window.getComputedStyle) {
  2740. cursor = domGlobals.window.getComputedStyle(handleElm, null).getPropertyValue('cursor');
  2741. } else {
  2742. cursor = handleElm.runtimeStyle.cursor;
  2743. }
  2744. $eventOverlay = global$7('<div></div>').css({
  2745. position: 'absolute',
  2746. top: 0,
  2747. left: 0,
  2748. width: docSize.width,
  2749. height: docSize.height,
  2750. zIndex: 2147483647,
  2751. opacity: 0.0001,
  2752. cursor: cursor
  2753. }).appendTo(doc.body);
  2754. global$7(doc).on('mousemove touchmove', drag).on('mouseup touchend', stop);
  2755. settings.start(e);
  2756. };
  2757. drag = function (e) {
  2758. updateWithTouchData(e);
  2759. if (e.button !== downButton) {
  2760. return stop(e);
  2761. }
  2762. e.deltaX = e.screenX - startX;
  2763. e.deltaY = e.screenY - startY;
  2764. e.preventDefault();
  2765. settings.drag(e);
  2766. };
  2767. stop = function (e) {
  2768. updateWithTouchData(e);
  2769. global$7(doc).off('mousemove touchmove', drag).off('mouseup touchend', stop);
  2770. $eventOverlay.remove();
  2771. if (settings.stop) {
  2772. settings.stop(e);
  2773. }
  2774. };
  2775. this.destroy = function () {
  2776. global$7(handleElement).off();
  2777. };
  2778. global$7(handleElement).on('mousedown touchstart', start);
  2779. }
  2780. var global$b = tinymce.util.Tools.resolve('tinymce.ui.Factory');
  2781. var hasTabstopData = function (elm) {
  2782. return elm.getAttribute('data-mce-tabstop') ? true : false;
  2783. };
  2784. function KeyboardNavigation (settings) {
  2785. var root = settings.root;
  2786. var focusedElement, focusedControl;
  2787. function isElement(node) {
  2788. return node && node.nodeType === 1;
  2789. }
  2790. try {
  2791. focusedElement = domGlobals.document.activeElement;
  2792. } catch (ex) {
  2793. focusedElement = domGlobals.document.body;
  2794. }
  2795. focusedControl = root.getParentCtrl(focusedElement);
  2796. function getRole(elm) {
  2797. elm = elm || focusedElement;
  2798. if (isElement(elm)) {
  2799. return elm.getAttribute('role');
  2800. }
  2801. return null;
  2802. }
  2803. function getParentRole(elm) {
  2804. var role, parent = elm || focusedElement;
  2805. while (parent = parent.parentNode) {
  2806. if (role = getRole(parent)) {
  2807. return role;
  2808. }
  2809. }
  2810. }
  2811. function getAriaProp(name) {
  2812. var elm = focusedElement;
  2813. if (isElement(elm)) {
  2814. return elm.getAttribute('aria-' + name);
  2815. }
  2816. }
  2817. function isTextInputElement(elm) {
  2818. var tagName = elm.tagName.toUpperCase();
  2819. return tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT';
  2820. }
  2821. function canFocus(elm) {
  2822. if (isTextInputElement(elm) && !elm.hidden) {
  2823. return true;
  2824. }
  2825. if (hasTabstopData(elm)) {
  2826. return true;
  2827. }
  2828. if (/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(getRole(elm))) {
  2829. return true;
  2830. }
  2831. return false;
  2832. }
  2833. function getFocusElements(elm) {
  2834. var elements = [];
  2835. function collect(elm) {
  2836. if (elm.nodeType !== 1 || elm.style.display === 'none' || elm.disabled) {
  2837. return;
  2838. }
  2839. if (canFocus(elm)) {
  2840. elements.push(elm);
  2841. }
  2842. for (var i = 0; i < elm.childNodes.length; i++) {
  2843. collect(elm.childNodes[i]);
  2844. }
  2845. }
  2846. collect(elm || root.getEl());
  2847. return elements;
  2848. }
  2849. function getNavigationRoot(targetControl) {
  2850. var navigationRoot, controls;
  2851. targetControl = targetControl || focusedControl;
  2852. controls = targetControl.parents().toArray();
  2853. controls.unshift(targetControl);
  2854. for (var i = 0; i < controls.length; i++) {
  2855. navigationRoot = controls[i];
  2856. if (navigationRoot.settings.ariaRoot) {
  2857. break;
  2858. }
  2859. }
  2860. return navigationRoot;
  2861. }
  2862. function focusFirst(targetControl) {
  2863. var navigationRoot = getNavigationRoot(targetControl);
  2864. var focusElements = getFocusElements(navigationRoot.getEl());
  2865. if (navigationRoot.settings.ariaRemember && 'lastAriaIndex' in navigationRoot) {
  2866. moveFocusToIndex(navigationRoot.lastAriaIndex, focusElements);
  2867. } else {
  2868. moveFocusToIndex(0, focusElements);
  2869. }
  2870. }
  2871. function moveFocusToIndex(idx, elements) {
  2872. if (idx < 0) {
  2873. idx = elements.length - 1;
  2874. } else if (idx >= elements.length) {
  2875. idx = 0;
  2876. }
  2877. if (elements[idx]) {
  2878. elements[idx].focus();
  2879. }
  2880. return idx;
  2881. }
  2882. function moveFocus(dir, elements) {
  2883. var idx = -1;
  2884. var navigationRoot = getNavigationRoot();
  2885. elements = elements || getFocusElements(navigationRoot.getEl());
  2886. for (var i = 0; i < elements.length; i++) {
  2887. if (elements[i] === focusedElement) {
  2888. idx = i;
  2889. }
  2890. }
  2891. idx += dir;
  2892. navigationRoot.lastAriaIndex = moveFocusToIndex(idx, elements);
  2893. }
  2894. function left() {
  2895. var parentRole = getParentRole();
  2896. if (parentRole === 'tablist') {
  2897. moveFocus(-1, getFocusElements(focusedElement.parentNode));
  2898. } else if (focusedControl.parent().submenu) {
  2899. cancel();
  2900. } else {
  2901. moveFocus(-1);
  2902. }
  2903. }
  2904. function right() {
  2905. var role = getRole(), parentRole = getParentRole();
  2906. if (parentRole === 'tablist') {
  2907. moveFocus(1, getFocusElements(focusedElement.parentNode));
  2908. } else if (role === 'menuitem' && parentRole === 'menu' && getAriaProp('haspopup')) {
  2909. enter();
  2910. } else {
  2911. moveFocus(1);
  2912. }
  2913. }
  2914. function up() {
  2915. moveFocus(-1);
  2916. }
  2917. function down() {
  2918. var role = getRole(), parentRole = getParentRole();
  2919. if (role === 'menuitem' && parentRole === 'menubar') {
  2920. enter();
  2921. } else if (role === 'button' && getAriaProp('haspopup')) {
  2922. enter({ key: 'down' });
  2923. } else {
  2924. moveFocus(1);
  2925. }
  2926. }
  2927. function tab(e) {
  2928. var parentRole = getParentRole();
  2929. if (parentRole === 'tablist') {
  2930. var elm = getFocusElements(focusedControl.getEl('body'))[0];
  2931. if (elm) {
  2932. elm.focus();
  2933. }
  2934. } else {
  2935. moveFocus(e.shiftKey ? -1 : 1);
  2936. }
  2937. }
  2938. function cancel() {
  2939. focusedControl.fire('cancel');
  2940. }
  2941. function enter(aria) {
  2942. aria = aria || {};
  2943. focusedControl.fire('click', {
  2944. target: focusedElement,
  2945. aria: aria
  2946. });
  2947. }
  2948. root.on('keydown', function (e) {
  2949. function handleNonTabOrEscEvent(e, handler) {
  2950. if (isTextInputElement(focusedElement) || hasTabstopData(focusedElement)) {
  2951. return;
  2952. }
  2953. if (getRole(focusedElement) === 'slider') {
  2954. return;
  2955. }
  2956. if (handler(e) !== false) {
  2957. e.preventDefault();
  2958. }
  2959. }
  2960. if (e.isDefaultPrevented()) {
  2961. return;
  2962. }
  2963. switch (e.keyCode) {
  2964. case 37:
  2965. handleNonTabOrEscEvent(e, left);
  2966. break;
  2967. case 39:
  2968. handleNonTabOrEscEvent(e, right);
  2969. break;
  2970. case 38:
  2971. handleNonTabOrEscEvent(e, up);
  2972. break;
  2973. case 40:
  2974. handleNonTabOrEscEvent(e, down);
  2975. break;
  2976. case 27:
  2977. cancel();
  2978. break;
  2979. case 14:
  2980. case 13:
  2981. case 32:
  2982. handleNonTabOrEscEvent(e, enter);
  2983. break;
  2984. case 9:
  2985. tab(e);
  2986. e.preventDefault();
  2987. break;
  2988. }
  2989. });
  2990. root.on('focusin', function (e) {
  2991. focusedElement = e.target;
  2992. focusedControl = e.control;
  2993. });
  2994. return { focusFirst: focusFirst };
  2995. }
  2996. var selectorCache = {};
  2997. var Container = Control$1.extend({
  2998. init: function (settings) {
  2999. var self = this;
  3000. self._super(settings);
  3001. settings = self.settings;
  3002. if (settings.fixed) {
  3003. self.state.set('fixed', true);
  3004. }
  3005. self._items = new Collection$2();
  3006. if (self.isRtl()) {
  3007. self.classes.add('rtl');
  3008. }
  3009. self.bodyClasses = new ClassList(function () {
  3010. if (self.state.get('rendered')) {
  3011. self.getEl('body').className = this.toString();
  3012. }
  3013. });
  3014. self.bodyClasses.prefix = self.classPrefix;
  3015. self.classes.add('container');
  3016. self.bodyClasses.add('container-body');
  3017. if (settings.containerCls) {
  3018. self.classes.add(settings.containerCls);
  3019. }
  3020. self._layout = global$b.create((settings.layout || '') + 'layout');
  3021. if (self.settings.items) {
  3022. self.add(self.settings.items);
  3023. } else {
  3024. self.add(self.render());
  3025. }
  3026. self._hasBody = true;
  3027. },
  3028. items: function () {
  3029. return this._items;
  3030. },
  3031. find: function (selector) {
  3032. selector = selectorCache[selector] = selectorCache[selector] || new Selector(selector);
  3033. return selector.find(this);
  3034. },
  3035. add: function (items) {
  3036. var self = this;
  3037. self.items().add(self.create(items)).parent(self);
  3038. return self;
  3039. },
  3040. focus: function (keyboard) {
  3041. var self = this;
  3042. var focusCtrl, keyboardNav, items;
  3043. if (keyboard) {
  3044. keyboardNav = self.keyboardNav || self.parents().eq(-1)[0].keyboardNav;
  3045. if (keyboardNav) {
  3046. keyboardNav.focusFirst(self);
  3047. return;
  3048. }
  3049. }
  3050. items = self.find('*');
  3051. if (self.statusbar) {
  3052. items.add(self.statusbar.items());
  3053. }
  3054. items.each(function (ctrl) {
  3055. if (ctrl.settings.autofocus) {
  3056. focusCtrl = null;
  3057. return false;
  3058. }
  3059. if (ctrl.canFocus) {
  3060. focusCtrl = focusCtrl || ctrl;
  3061. }
  3062. });
  3063. if (focusCtrl) {
  3064. focusCtrl.focus();
  3065. }
  3066. return self;
  3067. },
  3068. replace: function (oldItem, newItem) {
  3069. var ctrlElm;
  3070. var items = this.items();
  3071. var i = items.length;
  3072. while (i--) {
  3073. if (items[i] === oldItem) {
  3074. items[i] = newItem;
  3075. break;
  3076. }
  3077. }
  3078. if (i >= 0) {
  3079. ctrlElm = newItem.getEl();
  3080. if (ctrlElm) {
  3081. ctrlElm.parentNode.removeChild(ctrlElm);
  3082. }
  3083. ctrlElm = oldItem.getEl();
  3084. if (ctrlElm) {
  3085. ctrlElm.parentNode.removeChild(ctrlElm);
  3086. }
  3087. }
  3088. newItem.parent(this);
  3089. },
  3090. create: function (items) {
  3091. var self = this;
  3092. var settings;
  3093. var ctrlItems = [];
  3094. if (!global$4.isArray(items)) {
  3095. items = [items];
  3096. }
  3097. global$4.each(items, function (item) {
  3098. if (item) {
  3099. if (!(item instanceof Control$1)) {
  3100. if (typeof item === 'string') {
  3101. item = { type: item };
  3102. }
  3103. settings = global$4.extend({}, self.settings.defaults, item);
  3104. item.type = settings.type = settings.type || item.type || self.settings.defaultType || (settings.defaults ? settings.defaults.type : null);
  3105. item = global$b.create(settings);
  3106. }
  3107. ctrlItems.push(item);
  3108. }
  3109. });
  3110. return ctrlItems;
  3111. },
  3112. renderNew: function () {
  3113. var self = this;
  3114. self.items().each(function (ctrl, index) {
  3115. var containerElm;
  3116. ctrl.parent(self);
  3117. if (!ctrl.state.get('rendered')) {
  3118. containerElm = self.getEl('body');
  3119. if (containerElm.hasChildNodes() && index <= containerElm.childNodes.length - 1) {
  3120. global$7(containerElm.childNodes[index]).before(ctrl.renderHtml());
  3121. } else {
  3122. global$7(containerElm).append(ctrl.renderHtml());
  3123. }
  3124. ctrl.postRender();
  3125. ReflowQueue.add(ctrl);
  3126. }
  3127. });
  3128. self._layout.applyClasses(self.items().filter(':visible'));
  3129. self._lastRect = null;
  3130. return self;
  3131. },
  3132. append: function (items) {
  3133. return this.add(items).renderNew();
  3134. },
  3135. prepend: function (items) {
  3136. var self = this;
  3137. self.items().set(self.create(items).concat(self.items().toArray()));
  3138. return self.renderNew();
  3139. },
  3140. insert: function (items, index, before) {
  3141. var self = this;
  3142. var curItems, beforeItems, afterItems;
  3143. items = self.create(items);
  3144. curItems = self.items();
  3145. if (!before && index < curItems.length - 1) {
  3146. index += 1;
  3147. }
  3148. if (index >= 0 && index < curItems.length) {
  3149. beforeItems = curItems.slice(0, index).toArray();
  3150. afterItems = curItems.slice(index).toArray();
  3151. curItems.set(beforeItems.concat(items, afterItems));
  3152. }
  3153. return self.renderNew();
  3154. },
  3155. fromJSON: function (data) {
  3156. var self = this;
  3157. for (var name in data) {
  3158. self.find('#' + name).value(data[name]);
  3159. }
  3160. return self;
  3161. },
  3162. toJSON: function () {
  3163. var self = this, data = {};
  3164. self.find('*').each(function (ctrl) {
  3165. var name = ctrl.name(), value = ctrl.value();
  3166. if (name && typeof value !== 'undefined') {
  3167. data[name] = value;
  3168. }
  3169. });
  3170. return data;
  3171. },
  3172. renderHtml: function () {
  3173. var self = this, layout = self._layout, role = this.settings.role;
  3174. self.preRender();
  3175. layout.preRender(self);
  3176. return '<div id="' + self._id + '" class="' + self.classes + '"' + (role ? ' role="' + this.settings.role + '"' : '') + '>' + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>';
  3177. },
  3178. postRender: function () {
  3179. var self = this;
  3180. var box;
  3181. self.items().exec('postRender');
  3182. self._super();
  3183. self._layout.postRender(self);
  3184. self.state.set('rendered', true);
  3185. if (self.settings.style) {
  3186. self.$el.css(self.settings.style);
  3187. }
  3188. if (self.settings.border) {
  3189. box = self.borderBox;
  3190. self.$el.css({
  3191. 'border-top-width': box.top,
  3192. 'border-right-width': box.right,
  3193. 'border-bottom-width': box.bottom,
  3194. 'border-left-width': box.left
  3195. });
  3196. }
  3197. if (!self.parent()) {
  3198. self.keyboardNav = KeyboardNavigation({ root: self });
  3199. }
  3200. return self;
  3201. },
  3202. initLayoutRect: function () {
  3203. var self = this, layoutRect = self._super();
  3204. self._layout.recalc(self);
  3205. return layoutRect;
  3206. },
  3207. recalc: function () {
  3208. var self = this;
  3209. var rect = self._layoutRect;
  3210. var lastRect = self._lastRect;
  3211. if (!lastRect || lastRect.w !== rect.w || lastRect.h !== rect.h) {
  3212. self._layout.recalc(self);
  3213. rect = self.layoutRect();
  3214. self._lastRect = {
  3215. x: rect.x,
  3216. y: rect.y,
  3217. w: rect.w,
  3218. h: rect.h
  3219. };
  3220. return true;
  3221. }
  3222. },
  3223. reflow: function () {
  3224. var i;
  3225. ReflowQueue.remove(this);
  3226. if (this.visible()) {
  3227. Control$1.repaintControls = [];
  3228. Control$1.repaintControls.map = {};
  3229. this.recalc();
  3230. i = Control$1.repaintControls.length;
  3231. while (i--) {
  3232. Control$1.repaintControls[i].repaint();
  3233. }
  3234. if (this.settings.layout !== 'flow' && this.settings.layout !== 'stack') {
  3235. this.repaint();
  3236. }
  3237. Control$1.repaintControls = [];
  3238. }
  3239. return this;
  3240. }
  3241. });
  3242. var Scrollable = {
  3243. init: function () {
  3244. var self = this;
  3245. self.on('repaint', self.renderScroll);
  3246. },
  3247. renderScroll: function () {
  3248. var self = this, margin = 2;
  3249. function repaintScroll() {
  3250. var hasScrollH, hasScrollV, bodyElm;
  3251. function repaintAxis(axisName, posName, sizeName, contentSizeName, hasScroll, ax) {
  3252. var containerElm, scrollBarElm, scrollThumbElm;
  3253. var containerSize, scrollSize, ratio, rect;
  3254. var posNameLower, sizeNameLower;
  3255. scrollBarElm = self.getEl('scroll' + axisName);
  3256. if (scrollBarElm) {
  3257. posNameLower = posName.toLowerCase();
  3258. sizeNameLower = sizeName.toLowerCase();
  3259. global$7(self.getEl('absend')).css(posNameLower, self.layoutRect()[contentSizeName] - 1);
  3260. if (!hasScroll) {
  3261. global$7(scrollBarElm).css('display', 'none');
  3262. return;
  3263. }
  3264. global$7(scrollBarElm).css('display', 'block');
  3265. containerElm = self.getEl('body');
  3266. scrollThumbElm = self.getEl('scroll' + axisName + 't');
  3267. containerSize = containerElm['client' + sizeName] - margin * 2;
  3268. containerSize -= hasScrollH && hasScrollV ? scrollBarElm['client' + ax] : 0;
  3269. scrollSize = containerElm['scroll' + sizeName];
  3270. ratio = containerSize / scrollSize;
  3271. rect = {};
  3272. rect[posNameLower] = containerElm['offset' + posName] + margin;
  3273. rect[sizeNameLower] = containerSize;
  3274. global$7(scrollBarElm).css(rect);
  3275. rect = {};
  3276. rect[posNameLower] = containerElm['scroll' + posName] * ratio;
  3277. rect[sizeNameLower] = containerSize * ratio;
  3278. global$7(scrollThumbElm).css(rect);
  3279. }
  3280. }
  3281. bodyElm = self.getEl('body');
  3282. hasScrollH = bodyElm.scrollWidth > bodyElm.clientWidth;
  3283. hasScrollV = bodyElm.scrollHeight > bodyElm.clientHeight;
  3284. repaintAxis('h', 'Left', 'Width', 'contentW', hasScrollH, 'Height');
  3285. repaintAxis('v', 'Top', 'Height', 'contentH', hasScrollV, 'Width');
  3286. }
  3287. function addScroll() {
  3288. function addScrollAxis(axisName, posName, sizeName, deltaPosName, ax) {
  3289. var scrollStart;
  3290. var axisId = self._id + '-scroll' + axisName, prefix = self.classPrefix;
  3291. global$7(self.getEl()).append('<div id="' + axisId + '" class="' + prefix + 'scrollbar ' + prefix + 'scrollbar-' + axisName + '">' + '<div id="' + axisId + 't" class="' + prefix + 'scrollbar-thumb"></div>' + '</div>');
  3292. self.draghelper = new DragHelper(axisId + 't', {
  3293. start: function () {
  3294. scrollStart = self.getEl('body')['scroll' + posName];
  3295. global$7('#' + axisId).addClass(prefix + 'active');
  3296. },
  3297. drag: function (e) {
  3298. var ratio, hasScrollH, hasScrollV, containerSize;
  3299. var layoutRect = self.layoutRect();
  3300. hasScrollH = layoutRect.contentW > layoutRect.innerW;
  3301. hasScrollV = layoutRect.contentH > layoutRect.innerH;
  3302. containerSize = self.getEl('body')['client' + sizeName] - margin * 2;
  3303. containerSize -= hasScrollH && hasScrollV ? self.getEl('scroll' + axisName)['client' + ax] : 0;
  3304. ratio = containerSize / self.getEl('body')['scroll' + sizeName];
  3305. self.getEl('body')['scroll' + posName] = scrollStart + e['delta' + deltaPosName] / ratio;
  3306. },
  3307. stop: function () {
  3308. global$7('#' + axisId).removeClass(prefix + 'active');
  3309. }
  3310. });
  3311. }
  3312. self.classes.add('scroll');
  3313. addScrollAxis('v', 'Top', 'Height', 'Y', 'Width');
  3314. addScrollAxis('h', 'Left', 'Width', 'X', 'Height');
  3315. }
  3316. if (self.settings.autoScroll) {
  3317. if (!self._hasScroll) {
  3318. self._hasScroll = true;
  3319. addScroll();
  3320. self.on('wheel', function (e) {
  3321. var bodyEl = self.getEl('body');
  3322. bodyEl.scrollLeft += (e.deltaX || 0) * 10;
  3323. bodyEl.scrollTop += e.deltaY * 10;
  3324. repaintScroll();
  3325. });
  3326. global$7(self.getEl('body')).on('scroll', repaintScroll);
  3327. }
  3328. repaintScroll();
  3329. }
  3330. }
  3331. };
  3332. var Panel = Container.extend({
  3333. Defaults: {
  3334. layout: 'fit',
  3335. containerCls: 'panel'
  3336. },
  3337. Mixins: [Scrollable],
  3338. renderHtml: function () {
  3339. var self = this;
  3340. var layout = self._layout;
  3341. var innerHtml = self.settings.html;
  3342. self.preRender();
  3343. layout.preRender(self);
  3344. if (typeof innerHtml === 'undefined') {
  3345. innerHtml = '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + layout.renderHtml(self) + '</div>';
  3346. } else {
  3347. if (typeof innerHtml === 'function') {
  3348. innerHtml = innerHtml.call(self);
  3349. }
  3350. self._hasBody = false;
  3351. }
  3352. return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1" role="group">' + (self._preBodyHtml || '') + innerHtml + '</div>';
  3353. }
  3354. });
  3355. var Resizable = {
  3356. resizeToContent: function () {
  3357. this._layoutRect.autoResize = true;
  3358. this._lastRect = null;
  3359. this.reflow();
  3360. },
  3361. resizeTo: function (w, h) {
  3362. if (w <= 1 || h <= 1) {
  3363. var rect = funcs.getWindowSize();
  3364. w = w <= 1 ? w * rect.w : w;
  3365. h = h <= 1 ? h * rect.h : h;
  3366. }
  3367. this._layoutRect.autoResize = false;
  3368. return this.layoutRect({
  3369. minW: w,
  3370. minH: h,
  3371. w: w,
  3372. h: h
  3373. }).reflow();
  3374. },
  3375. resizeBy: function (dw, dh) {
  3376. var self = this, rect = self.layoutRect();
  3377. return self.resizeTo(rect.w + dw, rect.h + dh);
  3378. }
  3379. };
  3380. var documentClickHandler, documentScrollHandler, windowResizeHandler;
  3381. var visiblePanels = [];
  3382. var zOrder = [];
  3383. var hasModal;
  3384. function isChildOf(ctrl, parent) {
  3385. while (ctrl) {
  3386. if (ctrl === parent) {
  3387. return true;
  3388. }
  3389. ctrl = ctrl.parent();
  3390. }
  3391. }
  3392. function skipOrHidePanels(e) {
  3393. var i = visiblePanels.length;
  3394. while (i--) {
  3395. var panel = visiblePanels[i], clickCtrl = panel.getParentCtrl(e.target);
  3396. if (panel.settings.autohide) {
  3397. if (clickCtrl) {
  3398. if (isChildOf(clickCtrl, panel) || panel.parent() === clickCtrl) {
  3399. continue;
  3400. }
  3401. }
  3402. e = panel.fire('autohide', { target: e.target });
  3403. if (!e.isDefaultPrevented()) {
  3404. panel.hide();
  3405. }
  3406. }
  3407. }
  3408. }
  3409. function bindDocumentClickHandler() {
  3410. if (!documentClickHandler) {
  3411. documentClickHandler = function (e) {
  3412. if (e.button === 2) {
  3413. return;
  3414. }
  3415. skipOrHidePanels(e);
  3416. };
  3417. global$7(domGlobals.document).on('click touchstart', documentClickHandler);
  3418. }
  3419. }
  3420. function bindDocumentScrollHandler() {
  3421. if (!documentScrollHandler) {
  3422. documentScrollHandler = function () {
  3423. var i;
  3424. i = visiblePanels.length;
  3425. while (i--) {
  3426. repositionPanel$1(visiblePanels[i]);
  3427. }
  3428. };
  3429. global$7(domGlobals.window).on('scroll', documentScrollHandler);
  3430. }
  3431. }
  3432. function bindWindowResizeHandler() {
  3433. if (!windowResizeHandler) {
  3434. var docElm_1 = domGlobals.document.documentElement;
  3435. var clientWidth_1 = docElm_1.clientWidth, clientHeight_1 = docElm_1.clientHeight;
  3436. windowResizeHandler = function () {
  3437. if (!domGlobals.document.all || clientWidth_1 !== docElm_1.clientWidth || clientHeight_1 !== docElm_1.clientHeight) {
  3438. clientWidth_1 = docElm_1.clientWidth;
  3439. clientHeight_1 = docElm_1.clientHeight;
  3440. FloatPanel.hideAll();
  3441. }
  3442. };
  3443. global$7(domGlobals.window).on('resize', windowResizeHandler);
  3444. }
  3445. }
  3446. function repositionPanel$1(panel) {
  3447. var scrollY = funcs.getViewPort().y;
  3448. function toggleFixedChildPanels(fixed, deltaY) {
  3449. var parent;
  3450. for (var i = 0; i < visiblePanels.length; i++) {
  3451. if (visiblePanels[i] !== panel) {
  3452. parent = visiblePanels[i].parent();
  3453. while (parent && (parent = parent.parent())) {
  3454. if (parent === panel) {
  3455. visiblePanels[i].fixed(fixed).moveBy(0, deltaY).repaint();
  3456. }
  3457. }
  3458. }
  3459. }
  3460. }
  3461. if (panel.settings.autofix) {
  3462. if (!panel.state.get('fixed')) {
  3463. panel._autoFixY = panel.layoutRect().y;
  3464. if (panel._autoFixY < scrollY) {
  3465. panel.fixed(true).layoutRect({ y: 0 }).repaint();
  3466. toggleFixedChildPanels(true, scrollY - panel._autoFixY);
  3467. }
  3468. } else {
  3469. if (panel._autoFixY > scrollY) {
  3470. panel.fixed(false).layoutRect({ y: panel._autoFixY }).repaint();
  3471. toggleFixedChildPanels(false, panel._autoFixY - scrollY);
  3472. }
  3473. }
  3474. }
  3475. }
  3476. function addRemove(add, ctrl) {
  3477. var i, zIndex = FloatPanel.zIndex || 65535, topModal;
  3478. if (add) {
  3479. zOrder.push(ctrl);
  3480. } else {
  3481. i = zOrder.length;
  3482. while (i--) {
  3483. if (zOrder[i] === ctrl) {
  3484. zOrder.splice(i, 1);
  3485. }
  3486. }
  3487. }
  3488. if (zOrder.length) {
  3489. for (i = 0; i < zOrder.length; i++) {
  3490. if (zOrder[i].modal) {
  3491. zIndex++;
  3492. topModal = zOrder[i];
  3493. }
  3494. zOrder[i].getEl().style.zIndex = zIndex;
  3495. zOrder[i].zIndex = zIndex;
  3496. zIndex++;
  3497. }
  3498. }
  3499. var modalBlockEl = global$7('#' + ctrl.classPrefix + 'modal-block', ctrl.getContainerElm())[0];
  3500. if (topModal) {
  3501. global$7(modalBlockEl).css('z-index', topModal.zIndex - 1);
  3502. } else if (modalBlockEl) {
  3503. modalBlockEl.parentNode.removeChild(modalBlockEl);
  3504. hasModal = false;
  3505. }
  3506. FloatPanel.currentZIndex = zIndex;
  3507. }
  3508. var FloatPanel = Panel.extend({
  3509. Mixins: [
  3510. Movable,
  3511. Resizable
  3512. ],
  3513. init: function (settings) {
  3514. var self = this;
  3515. self._super(settings);
  3516. self._eventsRoot = self;
  3517. self.classes.add('floatpanel');
  3518. if (settings.autohide) {
  3519. bindDocumentClickHandler();
  3520. bindWindowResizeHandler();
  3521. visiblePanels.push(self);
  3522. }
  3523. if (settings.autofix) {
  3524. bindDocumentScrollHandler();
  3525. self.on('move', function () {
  3526. repositionPanel$1(this);
  3527. });
  3528. }
  3529. self.on('postrender show', function (e) {
  3530. if (e.control === self) {
  3531. var $modalBlockEl_1;
  3532. var prefix_1 = self.classPrefix;
  3533. if (self.modal && !hasModal) {
  3534. $modalBlockEl_1 = global$7('#' + prefix_1 + 'modal-block', self.getContainerElm());
  3535. if (!$modalBlockEl_1[0]) {
  3536. $modalBlockEl_1 = global$7('<div id="' + prefix_1 + 'modal-block" class="' + prefix_1 + 'reset ' + prefix_1 + 'fade"></div>').appendTo(self.getContainerElm());
  3537. }
  3538. global$3.setTimeout(function () {
  3539. $modalBlockEl_1.addClass(prefix_1 + 'in');
  3540. global$7(self.getEl()).addClass(prefix_1 + 'in');
  3541. });
  3542. hasModal = true;
  3543. }
  3544. addRemove(true, self);
  3545. }
  3546. });
  3547. self.on('show', function () {
  3548. self.parents().each(function (ctrl) {
  3549. if (ctrl.state.get('fixed')) {
  3550. self.fixed(true);
  3551. return false;
  3552. }
  3553. });
  3554. });
  3555. if (settings.popover) {
  3556. self._preBodyHtml = '<div class="' + self.classPrefix + 'arrow"></div>';
  3557. self.classes.add('popover').add('bottom').add(self.isRtl() ? 'end' : 'start');
  3558. }
  3559. self.aria('label', settings.ariaLabel);
  3560. self.aria('labelledby', self._id);
  3561. self.aria('describedby', self.describedBy || self._id + '-none');
  3562. },
  3563. fixed: function (state) {
  3564. var self = this;
  3565. if (self.state.get('fixed') !== state) {
  3566. if (self.state.get('rendered')) {
  3567. var viewport = funcs.getViewPort();
  3568. if (state) {
  3569. self.layoutRect().y -= viewport.y;
  3570. } else {
  3571. self.layoutRect().y += viewport.y;
  3572. }
  3573. }
  3574. self.classes.toggle('fixed', state);
  3575. self.state.set('fixed', state);
  3576. }
  3577. return self;
  3578. },
  3579. show: function () {
  3580. var self = this;
  3581. var i;
  3582. var state = self._super();
  3583. i = visiblePanels.length;
  3584. while (i--) {
  3585. if (visiblePanels[i] === self) {
  3586. break;
  3587. }
  3588. }
  3589. if (i === -1) {
  3590. visiblePanels.push(self);
  3591. }
  3592. return state;
  3593. },
  3594. hide: function () {
  3595. removeVisiblePanel(this);
  3596. addRemove(false, this);
  3597. return this._super();
  3598. },
  3599. hideAll: function () {
  3600. FloatPanel.hideAll();
  3601. },
  3602. close: function () {
  3603. var self = this;
  3604. if (!self.fire('close').isDefaultPrevented()) {
  3605. self.remove();
  3606. addRemove(false, self);
  3607. }
  3608. return self;
  3609. },
  3610. remove: function () {
  3611. removeVisiblePanel(this);
  3612. this._super();
  3613. },
  3614. postRender: function () {
  3615. var self = this;
  3616. if (self.settings.bodyRole) {
  3617. this.getEl('body').setAttribute('role', self.settings.bodyRole);
  3618. }
  3619. return self._super();
  3620. }
  3621. });
  3622. FloatPanel.hideAll = function () {
  3623. var i = visiblePanels.length;
  3624. while (i--) {
  3625. var panel = visiblePanels[i];
  3626. if (panel && panel.settings.autohide) {
  3627. panel.hide();
  3628. visiblePanels.splice(i, 1);
  3629. }
  3630. }
  3631. };
  3632. function removeVisiblePanel(panel) {
  3633. var i;
  3634. i = visiblePanels.length;
  3635. while (i--) {
  3636. if (visiblePanels[i] === panel) {
  3637. visiblePanels.splice(i, 1);
  3638. }
  3639. }
  3640. i = zOrder.length;
  3641. while (i--) {
  3642. if (zOrder[i] === panel) {
  3643. zOrder.splice(i, 1);
  3644. }
  3645. }
  3646. }
  3647. var windows = [];
  3648. var oldMetaValue = '';
  3649. function toggleFullScreenState(state) {
  3650. var noScaleMetaValue = 'width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0';
  3651. var viewport = global$7('meta[name=viewport]')[0], contentValue;
  3652. if (global$1.overrideViewPort === false) {
  3653. return;
  3654. }
  3655. if (!viewport) {
  3656. viewport = domGlobals.document.createElement('meta');
  3657. viewport.setAttribute('name', 'viewport');
  3658. domGlobals.document.getElementsByTagName('head')[0].appendChild(viewport);
  3659. }
  3660. contentValue = viewport.getAttribute('content');
  3661. if (contentValue && typeof oldMetaValue !== 'undefined') {
  3662. oldMetaValue = contentValue;
  3663. }
  3664. viewport.setAttribute('content', state ? noScaleMetaValue : oldMetaValue);
  3665. }
  3666. function toggleBodyFullScreenClasses(classPrefix, state) {
  3667. if (checkFullscreenWindows() && state === false) {
  3668. global$7([
  3669. domGlobals.document.documentElement,
  3670. domGlobals.document.body
  3671. ]).removeClass(classPrefix + 'fullscreen');
  3672. }
  3673. }
  3674. function checkFullscreenWindows() {
  3675. for (var i = 0; i < windows.length; i++) {
  3676. if (windows[i]._fullscreen) {
  3677. return true;
  3678. }
  3679. }
  3680. return false;
  3681. }
  3682. function handleWindowResize() {
  3683. if (!global$1.desktop) {
  3684. var lastSize_1 = {
  3685. w: domGlobals.window.innerWidth,
  3686. h: domGlobals.window.innerHeight
  3687. };
  3688. global$3.setInterval(function () {
  3689. var w = domGlobals.window.innerWidth, h = domGlobals.window.innerHeight;
  3690. if (lastSize_1.w !== w || lastSize_1.h !== h) {
  3691. lastSize_1 = {
  3692. w: w,
  3693. h: h
  3694. };
  3695. global$7(domGlobals.window).trigger('resize');
  3696. }
  3697. }, 100);
  3698. }
  3699. function reposition() {
  3700. var i;
  3701. var rect = funcs.getWindowSize();
  3702. var layoutRect;
  3703. for (i = 0; i < windows.length; i++) {
  3704. layoutRect = windows[i].layoutRect();
  3705. windows[i].moveTo(windows[i].settings.x || Math.max(0, rect.w / 2 - layoutRect.w / 2), windows[i].settings.y || Math.max(0, rect.h / 2 - layoutRect.h / 2));
  3706. }
  3707. }
  3708. global$7(domGlobals.window).on('resize', reposition);
  3709. }
  3710. var Window = FloatPanel.extend({
  3711. modal: true,
  3712. Defaults: {
  3713. border: 1,
  3714. layout: 'flex',
  3715. containerCls: 'panel',
  3716. role: 'dialog',
  3717. callbacks: {
  3718. submit: function () {
  3719. this.fire('submit', { data: this.toJSON() });
  3720. },
  3721. close: function () {
  3722. this.close();
  3723. }
  3724. }
  3725. },
  3726. init: function (settings) {
  3727. var self = this;
  3728. self._super(settings);
  3729. if (self.isRtl()) {
  3730. self.classes.add('rtl');
  3731. }
  3732. self.classes.add('window');
  3733. self.bodyClasses.add('window-body');
  3734. self.state.set('fixed', true);
  3735. if (settings.buttons) {
  3736. self.statusbar = new Panel({
  3737. layout: 'flex',
  3738. border: '1 0 0 0',
  3739. spacing: 3,
  3740. padding: 10,
  3741. align: 'center',
  3742. pack: self.isRtl() ? 'start' : 'end',
  3743. defaults: { type: 'button' },
  3744. items: settings.buttons
  3745. });
  3746. self.statusbar.classes.add('foot');
  3747. self.statusbar.parent(self);
  3748. }
  3749. self.on('click', function (e) {
  3750. var closeClass = self.classPrefix + 'close';
  3751. if (funcs.hasClass(e.target, closeClass) || funcs.hasClass(e.target.parentNode, closeClass)) {
  3752. self.close();
  3753. }
  3754. });
  3755. self.on('cancel', function () {
  3756. self.close();
  3757. });
  3758. self.on('move', function (e) {
  3759. if (e.control === self) {
  3760. FloatPanel.hideAll();
  3761. }
  3762. });
  3763. self.aria('describedby', self.describedBy || self._id + '-none');
  3764. self.aria('label', settings.title);
  3765. self._fullscreen = false;
  3766. },
  3767. recalc: function () {
  3768. var self = this;
  3769. var statusbar = self.statusbar;
  3770. var layoutRect, width, x, needsRecalc;
  3771. if (self._fullscreen) {
  3772. self.layoutRect(funcs.getWindowSize());
  3773. self.layoutRect().contentH = self.layoutRect().innerH;
  3774. }
  3775. self._super();
  3776. layoutRect = self.layoutRect();
  3777. if (self.settings.title && !self._fullscreen) {
  3778. width = layoutRect.headerW;
  3779. if (width > layoutRect.w) {
  3780. x = layoutRect.x - Math.max(0, width / 2);
  3781. self.layoutRect({
  3782. w: width,
  3783. x: x
  3784. });
  3785. needsRecalc = true;
  3786. }
  3787. }
  3788. if (statusbar) {
  3789. statusbar.layoutRect({ w: self.layoutRect().innerW }).recalc();
  3790. width = statusbar.layoutRect().minW + layoutRect.deltaW;
  3791. if (width > layoutRect.w) {
  3792. x = layoutRect.x - Math.max(0, width - layoutRect.w);
  3793. self.layoutRect({
  3794. w: width,
  3795. x: x
  3796. });
  3797. needsRecalc = true;
  3798. }
  3799. }
  3800. if (needsRecalc) {
  3801. self.recalc();
  3802. }
  3803. },
  3804. initLayoutRect: function () {
  3805. var self = this;
  3806. var layoutRect = self._super();
  3807. var deltaH = 0, headEl;
  3808. if (self.settings.title && !self._fullscreen) {
  3809. headEl = self.getEl('head');
  3810. var size = funcs.getSize(headEl);
  3811. layoutRect.headerW = size.width;
  3812. layoutRect.headerH = size.height;
  3813. deltaH += layoutRect.headerH;
  3814. }
  3815. if (self.statusbar) {
  3816. deltaH += self.statusbar.layoutRect().h;
  3817. }
  3818. layoutRect.deltaH += deltaH;
  3819. layoutRect.minH += deltaH;
  3820. layoutRect.h += deltaH;
  3821. var rect = funcs.getWindowSize();
  3822. layoutRect.x = self.settings.x || Math.max(0, rect.w / 2 - layoutRect.w / 2);
  3823. layoutRect.y = self.settings.y || Math.max(0, rect.h / 2 - layoutRect.h / 2);
  3824. return layoutRect;
  3825. },
  3826. renderHtml: function () {
  3827. var self = this, layout = self._layout, id = self._id, prefix = self.classPrefix;
  3828. var settings = self.settings;
  3829. var headerHtml = '', footerHtml = '', html = settings.html;
  3830. self.preRender();
  3831. layout.preRender(self);
  3832. if (settings.title) {
  3833. headerHtml = '<div id="' + id + '-head" class="' + prefix + 'window-head">' + '<div id="' + id + '-title" class="' + prefix + 'title">' + self.encode(settings.title) + '</div>' + '<div id="' + id + '-dragh" class="' + prefix + 'dragh"></div>' + '<button type="button" class="' + prefix + 'close" aria-hidden="true">' + '<i class="mce-ico mce-i-remove"></i>' + '</button>' + '</div>';
  3834. }
  3835. if (settings.url) {
  3836. html = '<iframe src="' + settings.url + '" tabindex="-1"></iframe>';
  3837. }
  3838. if (typeof html === 'undefined') {
  3839. html = layout.renderHtml(self);
  3840. }
  3841. if (self.statusbar) {
  3842. footerHtml = self.statusbar.renderHtml();
  3843. }
  3844. return '<div id="' + id + '" class="' + self.classes + '" hidefocus="1">' + '<div class="' + self.classPrefix + 'reset" role="application">' + headerHtml + '<div id="' + id + '-body" class="' + self.bodyClasses + '">' + html + '</div>' + footerHtml + '</div>' + '</div>';
  3845. },
  3846. fullscreen: function (state) {
  3847. var self = this;
  3848. var documentElement = domGlobals.document.documentElement;
  3849. var slowRendering;
  3850. var prefix = self.classPrefix;
  3851. var layoutRect;
  3852. if (state !== self._fullscreen) {
  3853. global$7(domGlobals.window).on('resize', function () {
  3854. var time;
  3855. if (self._fullscreen) {
  3856. if (!slowRendering) {
  3857. time = new Date().getTime();
  3858. var rect = funcs.getWindowSize();
  3859. self.moveTo(0, 0).resizeTo(rect.w, rect.h);
  3860. if (new Date().getTime() - time > 50) {
  3861. slowRendering = true;
  3862. }
  3863. } else {
  3864. if (!self._timer) {
  3865. self._timer = global$3.setTimeout(function () {
  3866. var rect = funcs.getWindowSize();
  3867. self.moveTo(0, 0).resizeTo(rect.w, rect.h);
  3868. self._timer = 0;
  3869. }, 50);
  3870. }
  3871. }
  3872. }
  3873. });
  3874. layoutRect = self.layoutRect();
  3875. self._fullscreen = state;
  3876. if (!state) {
  3877. self.borderBox = BoxUtils.parseBox(self.settings.border);
  3878. self.getEl('head').style.display = '';
  3879. layoutRect.deltaH += layoutRect.headerH;
  3880. global$7([
  3881. documentElement,
  3882. domGlobals.document.body
  3883. ]).removeClass(prefix + 'fullscreen');
  3884. self.classes.remove('fullscreen');
  3885. self.moveTo(self._initial.x, self._initial.y).resizeTo(self._initial.w, self._initial.h);
  3886. } else {
  3887. self._initial = {
  3888. x: layoutRect.x,
  3889. y: layoutRect.y,
  3890. w: layoutRect.w,
  3891. h: layoutRect.h
  3892. };
  3893. self.borderBox = BoxUtils.parseBox('0');
  3894. self.getEl('head').style.display = 'none';
  3895. layoutRect.deltaH -= layoutRect.headerH + 2;
  3896. global$7([
  3897. documentElement,
  3898. domGlobals.document.body
  3899. ]).addClass(prefix + 'fullscreen');
  3900. self.classes.add('fullscreen');
  3901. var rect = funcs.getWindowSize();
  3902. self.moveTo(0, 0).resizeTo(rect.w, rect.h);
  3903. }
  3904. }
  3905. return self.reflow();
  3906. },
  3907. postRender: function () {
  3908. var self = this;
  3909. var startPos;
  3910. setTimeout(function () {
  3911. self.classes.add('in');
  3912. self.fire('open');
  3913. }, 0);
  3914. self._super();
  3915. if (self.statusbar) {
  3916. self.statusbar.postRender();
  3917. }
  3918. self.focus();
  3919. this.dragHelper = new DragHelper(self._id + '-dragh', {
  3920. start: function () {
  3921. startPos = {
  3922. x: self.layoutRect().x,
  3923. y: self.layoutRect().y
  3924. };
  3925. },
  3926. drag: function (e) {
  3927. self.moveTo(startPos.x + e.deltaX, startPos.y + e.deltaY);
  3928. }
  3929. });
  3930. self.on('submit', function (e) {
  3931. if (!e.isDefaultPrevented()) {
  3932. self.close();
  3933. }
  3934. });
  3935. windows.push(self);
  3936. toggleFullScreenState(true);
  3937. },
  3938. submit: function () {
  3939. return this.fire('submit', { data: this.toJSON() });
  3940. },
  3941. remove: function () {
  3942. var self = this;
  3943. var i;
  3944. self.dragHelper.destroy();
  3945. self._super();
  3946. if (self.statusbar) {
  3947. this.statusbar.remove();
  3948. }
  3949. toggleBodyFullScreenClasses(self.classPrefix, false);
  3950. i = windows.length;
  3951. while (i--) {
  3952. if (windows[i] === self) {
  3953. windows.splice(i, 1);
  3954. }
  3955. }
  3956. toggleFullScreenState(windows.length > 0);
  3957. },
  3958. getContentWindow: function () {
  3959. var ifr = this.getEl().getElementsByTagName('iframe')[0];
  3960. return ifr ? ifr.contentWindow : null;
  3961. }
  3962. });
  3963. handleWindowResize();
  3964. var MessageBox = Window.extend({
  3965. init: function (settings) {
  3966. settings = {
  3967. border: 1,
  3968. padding: 20,
  3969. layout: 'flex',
  3970. pack: 'center',
  3971. align: 'center',
  3972. containerCls: 'panel',
  3973. autoScroll: true,
  3974. buttons: {
  3975. type: 'button',
  3976. text: 'Ok',
  3977. action: 'ok'
  3978. },
  3979. items: {
  3980. type: 'label',
  3981. multiline: true,
  3982. maxWidth: 500,
  3983. maxHeight: 200
  3984. }
  3985. };
  3986. this._super(settings);
  3987. },
  3988. Statics: {
  3989. OK: 1,
  3990. OK_CANCEL: 2,
  3991. YES_NO: 3,
  3992. YES_NO_CANCEL: 4,
  3993. msgBox: function (settings) {
  3994. var buttons;
  3995. var callback = settings.callback || function () {
  3996. };
  3997. function createButton(text, status, primary) {
  3998. return {
  3999. type: 'button',
  4000. text: text,
  4001. subtype: primary ? 'primary' : '',
  4002. onClick: function (e) {
  4003. e.control.parents()[1].close();
  4004. callback(status);
  4005. }
  4006. };
  4007. }
  4008. switch (settings.buttons) {
  4009. case MessageBox.OK_CANCEL:
  4010. buttons = [
  4011. createButton('Ok', true, true),
  4012. createButton('Cancel', false)
  4013. ];
  4014. break;
  4015. case MessageBox.YES_NO:
  4016. case MessageBox.YES_NO_CANCEL:
  4017. buttons = [
  4018. createButton('Yes', 1, true),
  4019. createButton('No', 0)
  4020. ];
  4021. if (settings.buttons === MessageBox.YES_NO_CANCEL) {
  4022. buttons.push(createButton('Cancel', -1));
  4023. }
  4024. break;
  4025. default:
  4026. buttons = [createButton('Ok', true, true)];
  4027. break;
  4028. }
  4029. return new Window({
  4030. padding: 20,
  4031. x: settings.x,
  4032. y: settings.y,
  4033. minWidth: 300,
  4034. minHeight: 100,
  4035. layout: 'flex',
  4036. pack: 'center',
  4037. align: 'center',
  4038. buttons: buttons,
  4039. title: settings.title,
  4040. role: 'alertdialog',
  4041. items: {
  4042. type: 'label',
  4043. multiline: true,
  4044. maxWidth: 500,
  4045. maxHeight: 200,
  4046. text: settings.text
  4047. },
  4048. onPostRender: function () {
  4049. this.aria('describedby', this.items()[0]._id);
  4050. },
  4051. onClose: settings.onClose,
  4052. onCancel: function () {
  4053. callback(false);
  4054. }
  4055. }).renderTo(domGlobals.document.body).reflow();
  4056. },
  4057. alert: function (settings, callback) {
  4058. if (typeof settings === 'string') {
  4059. settings = { text: settings };
  4060. }
  4061. settings.callback = callback;
  4062. return MessageBox.msgBox(settings);
  4063. },
  4064. confirm: function (settings, callback) {
  4065. if (typeof settings === 'string') {
  4066. settings = { text: settings };
  4067. }
  4068. settings.callback = callback;
  4069. settings.buttons = MessageBox.OK_CANCEL;
  4070. return MessageBox.msgBox(settings);
  4071. }
  4072. }
  4073. });
  4074. function WindowManagerImpl (editor) {
  4075. var open = function (args, params, closeCallback) {
  4076. var win;
  4077. args.title = args.title || ' ';
  4078. args.url = args.url || args.file;
  4079. if (args.url) {
  4080. args.width = parseInt(args.width || 320, 10);
  4081. args.height = parseInt(args.height || 240, 10);
  4082. }
  4083. if (args.body) {
  4084. args.items = {
  4085. defaults: args.defaults,
  4086. type: args.bodyType || 'form',
  4087. items: args.body,
  4088. data: args.data,
  4089. callbacks: args.commands
  4090. };
  4091. }
  4092. if (!args.url && !args.buttons) {
  4093. args.buttons = [
  4094. {
  4095. text: 'Ok',
  4096. subtype: 'primary',
  4097. onclick: function () {
  4098. win.find('form')[0].submit();
  4099. }
  4100. },
  4101. {
  4102. text: 'Cancel',
  4103. onclick: function () {
  4104. win.close();
  4105. }
  4106. }
  4107. ];
  4108. }
  4109. win = new Window(args);
  4110. win.on('close', function () {
  4111. closeCallback(win);
  4112. });
  4113. if (args.data) {
  4114. win.on('postRender', function () {
  4115. this.find('*').each(function (ctrl) {
  4116. var name = ctrl.name();
  4117. if (name in args.data) {
  4118. ctrl.value(args.data[name]);
  4119. }
  4120. });
  4121. });
  4122. }
  4123. win.features = args || {};
  4124. win.params = params || {};
  4125. win = win.renderTo(domGlobals.document.body).reflow();
  4126. return win;
  4127. };
  4128. var alert = function (message, choiceCallback, closeCallback) {
  4129. var win;
  4130. win = MessageBox.alert(message, function () {
  4131. choiceCallback();
  4132. });
  4133. win.on('close', function () {
  4134. closeCallback(win);
  4135. });
  4136. return win;
  4137. };
  4138. var confirm = function (message, choiceCallback, closeCallback) {
  4139. var win;
  4140. win = MessageBox.confirm(message, function (state) {
  4141. choiceCallback(state);
  4142. });
  4143. win.on('close', function () {
  4144. closeCallback(win);
  4145. });
  4146. return win;
  4147. };
  4148. var close = function (window) {
  4149. window.close();
  4150. };
  4151. var getParams = function (window) {
  4152. return window.params;
  4153. };
  4154. var setParams = function (window, params) {
  4155. window.params = params;
  4156. };
  4157. return {
  4158. open: open,
  4159. alert: alert,
  4160. confirm: confirm,
  4161. close: close,
  4162. getParams: getParams,
  4163. setParams: setParams
  4164. };
  4165. }
  4166. var get = function (editor, panel) {
  4167. var renderUI = function () {
  4168. return Render.renderUI(editor, panel);
  4169. };
  4170. return {
  4171. renderUI: renderUI,
  4172. getNotificationManagerImpl: function () {
  4173. return NotificationManagerImpl(editor);
  4174. },
  4175. getWindowManagerImpl: function () {
  4176. return WindowManagerImpl();
  4177. }
  4178. };
  4179. };
  4180. var ThemeApi = { get: get };
  4181. var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
  4182. var path = function (parts, scope) {
  4183. var o = scope !== undefined && scope !== null ? scope : Global;
  4184. for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
  4185. o = o[parts[i]];
  4186. }
  4187. return o;
  4188. };
  4189. var resolve = function (p, scope) {
  4190. var parts = p.split('.');
  4191. return path(parts, scope);
  4192. };
  4193. var unsafe = function (name, scope) {
  4194. return resolve(name, scope);
  4195. };
  4196. var getOrDie = function (name, scope) {
  4197. var actual = unsafe(name, scope);
  4198. if (actual === undefined || actual === null) {
  4199. throw new Error(name + ' not available on this browser');
  4200. }
  4201. return actual;
  4202. };
  4203. var Global$1 = { getOrDie: getOrDie };
  4204. function FileReader () {
  4205. var f = Global$1.getOrDie('FileReader');
  4206. return new f();
  4207. }
  4208. var global$c = tinymce.util.Tools.resolve('tinymce.util.Promise');
  4209. var blobToBase64 = function (blob) {
  4210. return new global$c(function (resolve) {
  4211. var reader = FileReader();
  4212. reader.onloadend = function () {
  4213. resolve(reader.result.split(',')[1]);
  4214. };
  4215. reader.readAsDataURL(blob);
  4216. });
  4217. };
  4218. var Conversions = { blobToBase64: blobToBase64 };
  4219. var pickFile = function () {
  4220. return new global$c(function (resolve) {
  4221. var fileInput;
  4222. fileInput = domGlobals.document.createElement('input');
  4223. fileInput.type = 'file';
  4224. fileInput.style.position = 'fixed';
  4225. fileInput.style.left = 0;
  4226. fileInput.style.top = 0;
  4227. fileInput.style.opacity = 0.001;
  4228. domGlobals.document.body.appendChild(fileInput);
  4229. fileInput.onchange = function (e) {
  4230. resolve(Array.prototype.slice.call(e.target.files));
  4231. };
  4232. fileInput.click();
  4233. fileInput.parentNode.removeChild(fileInput);
  4234. });
  4235. };
  4236. var Picker = { pickFile: pickFile };
  4237. var count$1 = 0;
  4238. var seed = function () {
  4239. var rnd = function () {
  4240. return Math.round(Math.random() * 4294967295).toString(36);
  4241. };
  4242. return 's' + Date.now().toString(36) + rnd() + rnd() + rnd();
  4243. };
  4244. var uuid = function (prefix) {
  4245. return prefix + count$1++ + seed();
  4246. };
  4247. var Uuid = { uuid: uuid };
  4248. var create$1 = function (dom, rng) {
  4249. var bookmark = {};
  4250. function setupEndPoint(start) {
  4251. var offsetNode, container, offset;
  4252. container = rng[start ? 'startContainer' : 'endContainer'];
  4253. offset = rng[start ? 'startOffset' : 'endOffset'];
  4254. if (container.nodeType === 1) {
  4255. offsetNode = dom.create('span', { 'data-mce-type': 'bookmark' });
  4256. if (container.hasChildNodes()) {
  4257. offset = Math.min(offset, container.childNodes.length - 1);
  4258. if (start) {
  4259. container.insertBefore(offsetNode, container.childNodes[offset]);
  4260. } else {
  4261. dom.insertAfter(offsetNode, container.childNodes[offset]);
  4262. }
  4263. } else {
  4264. container.appendChild(offsetNode);
  4265. }
  4266. container = offsetNode;
  4267. offset = 0;
  4268. }
  4269. bookmark[start ? 'startContainer' : 'endContainer'] = container;
  4270. bookmark[start ? 'startOffset' : 'endOffset'] = offset;
  4271. }
  4272. setupEndPoint(true);
  4273. if (!rng.collapsed) {
  4274. setupEndPoint();
  4275. }
  4276. return bookmark;
  4277. };
  4278. var resolve$1 = function (dom, bookmark) {
  4279. function restoreEndPoint(start) {
  4280. var container, offset, node;
  4281. function nodeIndex(container) {
  4282. var node = container.parentNode.firstChild, idx = 0;
  4283. while (node) {
  4284. if (node === container) {
  4285. return idx;
  4286. }
  4287. if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') {
  4288. idx++;
  4289. }
  4290. node = node.nextSibling;
  4291. }
  4292. return -1;
  4293. }
  4294. container = node = bookmark[start ? 'startContainer' : 'endContainer'];
  4295. offset = bookmark[start ? 'startOffset' : 'endOffset'];
  4296. if (!container) {
  4297. return;
  4298. }
  4299. if (container.nodeType === 1) {
  4300. offset = nodeIndex(container);
  4301. container = container.parentNode;
  4302. dom.remove(node);
  4303. }
  4304. bookmark[start ? 'startContainer' : 'endContainer'] = container;
  4305. bookmark[start ? 'startOffset' : 'endOffset'] = offset;
  4306. }
  4307. restoreEndPoint(true);
  4308. restoreEndPoint();
  4309. var rng = dom.createRng();
  4310. rng.setStart(bookmark.startContainer, bookmark.startOffset);
  4311. if (bookmark.endContainer) {
  4312. rng.setEnd(bookmark.endContainer, bookmark.endOffset);
  4313. }
  4314. return rng;
  4315. };
  4316. var Bookmark = {
  4317. create: create$1,
  4318. resolve: resolve$1
  4319. };
  4320. var global$d = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
  4321. var global$e = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');
  4322. var getSelectedElements = function (rootElm, startNode, endNode) {
  4323. var walker, node;
  4324. var elms = [];
  4325. walker = new global$d(startNode, rootElm);
  4326. for (node = startNode; node; node = walker.next()) {
  4327. if (node.nodeType === 1) {
  4328. elms.push(node);
  4329. }
  4330. if (node === endNode) {
  4331. break;
  4332. }
  4333. }
  4334. return elms;
  4335. };
  4336. var unwrapElements = function (editor, elms) {
  4337. var bookmark, dom, selection;
  4338. dom = editor.dom;
  4339. selection = editor.selection;
  4340. bookmark = Bookmark.create(dom, selection.getRng());
  4341. global$4.each(elms, function (elm) {
  4342. editor.dom.remove(elm, true);
  4343. });
  4344. selection.setRng(Bookmark.resolve(dom, bookmark));
  4345. };
  4346. var isLink = function (elm) {
  4347. return elm.nodeName === 'A' && elm.hasAttribute('href');
  4348. };
  4349. var getParentAnchorOrSelf = function (dom, elm) {
  4350. var anchorElm = dom.getParent(elm, isLink);
  4351. return anchorElm ? anchorElm : elm;
  4352. };
  4353. var getSelectedAnchors = function (editor) {
  4354. var startElm, endElm, rootElm, anchorElms, selection, dom, rng;
  4355. selection = editor.selection;
  4356. dom = editor.dom;
  4357. rng = selection.getRng();
  4358. startElm = getParentAnchorOrSelf(dom, global$e.getNode(rng.startContainer, rng.startOffset));
  4359. endElm = global$e.getNode(rng.endContainer, rng.endOffset);
  4360. rootElm = editor.getBody();
  4361. anchorElms = global$4.grep(getSelectedElements(rootElm, startElm, endElm), isLink);
  4362. return anchorElms;
  4363. };
  4364. var unlinkSelection = function (editor) {
  4365. unwrapElements(editor, getSelectedAnchors(editor));
  4366. };
  4367. var Unlink = { unlinkSelection: unlinkSelection };
  4368. var createTableHtml = function (cols, rows) {
  4369. var x, y, html;
  4370. html = '<table data-mce-id="mce" style="width: 100%">';
  4371. html += '<tbody>';
  4372. for (y = 0; y < rows; y++) {
  4373. html += '<tr>';
  4374. for (x = 0; x < cols; x++) {
  4375. html += '<td><br></td>';
  4376. }
  4377. html += '</tr>';
  4378. }
  4379. html += '</tbody>';
  4380. html += '</table>';
  4381. return html;
  4382. };
  4383. var getInsertedElement = function (editor) {
  4384. var elms = editor.dom.select('*[data-mce-id]');
  4385. return elms[0];
  4386. };
  4387. var insertTableHtml = function (editor, cols, rows) {
  4388. editor.undoManager.transact(function () {
  4389. var tableElm, cellElm;
  4390. editor.insertContent(createTableHtml(cols, rows));
  4391. tableElm = getInsertedElement(editor);
  4392. tableElm.removeAttribute('data-mce-id');
  4393. cellElm = editor.dom.select('td,th', tableElm);
  4394. editor.selection.setCursorLocation(cellElm[0], 0);
  4395. });
  4396. };
  4397. var insertTable = function (editor, cols, rows) {
  4398. editor.plugins.table ? editor.plugins.table.insertTable(cols, rows) : insertTableHtml(editor, cols, rows);
  4399. };
  4400. var formatBlock = function (editor, formatName) {
  4401. editor.execCommand('FormatBlock', false, formatName);
  4402. };
  4403. var insertBlob = function (editor, base64, blob) {
  4404. var blobCache, blobInfo;
  4405. blobCache = editor.editorUpload.blobCache;
  4406. blobInfo = blobCache.create(Uuid.uuid('mceu'), blob, base64);
  4407. blobCache.add(blobInfo);
  4408. editor.insertContent(editor.dom.createHTML('img', { src: blobInfo.blobUri() }));
  4409. };
  4410. var collapseSelectionToEnd = function (editor) {
  4411. editor.selection.collapse(false);
  4412. };
  4413. var unlink = function (editor) {
  4414. editor.focus();
  4415. Unlink.unlinkSelection(editor);
  4416. collapseSelectionToEnd(editor);
  4417. };
  4418. var changeHref = function (editor, elm, url) {
  4419. editor.focus();
  4420. editor.dom.setAttrib(elm, 'href', url);
  4421. collapseSelectionToEnd(editor);
  4422. };
  4423. var insertLink = function (editor, url) {
  4424. editor.execCommand('mceInsertLink', false, { href: url });
  4425. collapseSelectionToEnd(editor);
  4426. };
  4427. var updateOrInsertLink = function (editor, url) {
  4428. var elm = editor.dom.getParent(editor.selection.getStart(), 'a[href]');
  4429. elm ? changeHref(editor, elm, url) : insertLink(editor, url);
  4430. };
  4431. var createLink = function (editor, url) {
  4432. url.trim().length === 0 ? unlink(editor) : updateOrInsertLink(editor, url);
  4433. };
  4434. var Actions = {
  4435. insertTable: insertTable,
  4436. formatBlock: formatBlock,
  4437. insertBlob: insertBlob,
  4438. createLink: createLink,
  4439. unlink: unlink
  4440. };
  4441. var addHeaderButtons = function (editor) {
  4442. var formatBlock = function (name) {
  4443. return function () {
  4444. Actions.formatBlock(editor, name);
  4445. };
  4446. };
  4447. for (var i = 1; i < 6; i++) {
  4448. var name = 'h' + i;
  4449. editor.addButton(name, {
  4450. text: name.toUpperCase(),
  4451. tooltip: 'Heading ' + i,
  4452. stateSelector: name,
  4453. onclick: formatBlock(name),
  4454. onPostRender: function () {
  4455. var span = this.getEl().firstChild.firstChild;
  4456. span.style.fontWeight = 'bold';
  4457. }
  4458. });
  4459. }
  4460. };
  4461. var addToEditor = function (editor, panel) {
  4462. editor.addButton('quicklink', {
  4463. icon: 'link',
  4464. tooltip: 'Insert/Edit link',
  4465. stateSelector: 'a[href]',
  4466. onclick: function () {
  4467. panel.showForm(editor, 'quicklink');
  4468. }
  4469. });
  4470. editor.addButton('quickimage', {
  4471. icon: 'image',
  4472. tooltip: 'Insert image',
  4473. onclick: function () {
  4474. Picker.pickFile().then(function (files) {
  4475. var blob = files[0];
  4476. Conversions.blobToBase64(blob).then(function (base64) {
  4477. Actions.insertBlob(editor, base64, blob);
  4478. });
  4479. });
  4480. }
  4481. });
  4482. editor.addButton('quicktable', {
  4483. icon: 'table',
  4484. tooltip: 'Insert table',
  4485. onclick: function () {
  4486. panel.hide();
  4487. Actions.insertTable(editor, 2, 2);
  4488. }
  4489. });
  4490. addHeaderButtons(editor);
  4491. };
  4492. var Buttons = { addToEditor: addToEditor };
  4493. var getUiContainerDelta$1 = function () {
  4494. var uiContainer = global$1.container;
  4495. if (uiContainer && global$2.DOM.getStyle(uiContainer, 'position', true) !== 'static') {
  4496. var containerPos = global$2.DOM.getPos(uiContainer);
  4497. var dx = containerPos.x - uiContainer.scrollLeft;
  4498. var dy = containerPos.y - uiContainer.scrollTop;
  4499. return Option.some({
  4500. x: dx,
  4501. y: dy
  4502. });
  4503. } else {
  4504. return Option.none();
  4505. }
  4506. };
  4507. var UiContainer$1 = { getUiContainerDelta: getUiContainerDelta$1 };
  4508. var isDomainLike = function (href) {
  4509. return /^www\.|\.(com|org|edu|gov|uk|net|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es|mil)$/i.test(href.trim());
  4510. };
  4511. var isAbsolute = function (href) {
  4512. return /^https?:\/\//.test(href.trim());
  4513. };
  4514. var UrlType = {
  4515. isDomainLike: isDomainLike,
  4516. isAbsolute: isAbsolute
  4517. };
  4518. var focusFirstTextBox = function (form) {
  4519. form.find('textbox').eq(0).each(function (ctrl) {
  4520. ctrl.focus();
  4521. });
  4522. };
  4523. var createForm = function (name, spec) {
  4524. var form = global$b.create(global$4.extend({
  4525. type: 'form',
  4526. layout: 'flex',
  4527. direction: 'row',
  4528. padding: 5,
  4529. name: name,
  4530. spacing: 3
  4531. }, spec));
  4532. form.on('show', function () {
  4533. focusFirstTextBox(form);
  4534. });
  4535. return form;
  4536. };
  4537. var toggleVisibility = function (ctrl, state) {
  4538. return state ? ctrl.show() : ctrl.hide();
  4539. };
  4540. var askAboutPrefix = function (editor, href) {
  4541. return new global$c(function (resolve) {
  4542. editor.windowManager.confirm('The URL you entered seems to be an external link. Do you want to add the required http:// prefix?', function (result) {
  4543. var output = result === true ? 'http://' + href : href;
  4544. resolve(output);
  4545. });
  4546. });
  4547. };
  4548. var convertLinkToAbsolute = function (editor, href) {
  4549. return !UrlType.isAbsolute(href) && UrlType.isDomainLike(href) ? askAboutPrefix(editor, href) : global$c.resolve(href);
  4550. };
  4551. var createQuickLinkForm = function (editor, hide) {
  4552. var attachState = {};
  4553. var unlink = function () {
  4554. editor.focus();
  4555. Actions.unlink(editor);
  4556. hide();
  4557. };
  4558. var onChangeHandler = function (e) {
  4559. var meta = e.meta;
  4560. if (meta && meta.attach) {
  4561. attachState = {
  4562. href: this.value(),
  4563. attach: meta.attach
  4564. };
  4565. }
  4566. };
  4567. var onShowHandler = function (e) {
  4568. if (e.control === this) {
  4569. var elm = void 0, linkurl = '';
  4570. elm = editor.dom.getParent(editor.selection.getStart(), 'a[href]');
  4571. if (elm) {
  4572. linkurl = editor.dom.getAttrib(elm, 'href');
  4573. }
  4574. this.fromJSON({ linkurl: linkurl });
  4575. toggleVisibility(this.find('#unlink'), elm);
  4576. this.find('#linkurl')[0].focus();
  4577. }
  4578. };
  4579. return createForm('quicklink', {
  4580. items: [
  4581. {
  4582. type: 'button',
  4583. name: 'unlink',
  4584. icon: 'unlink',
  4585. onclick: unlink,
  4586. tooltip: 'Remove link'
  4587. },
  4588. {
  4589. type: 'filepicker',
  4590. name: 'linkurl',
  4591. placeholder: 'Paste or type a link',
  4592. filetype: 'file',
  4593. onchange: onChangeHandler
  4594. },
  4595. {
  4596. type: 'button',
  4597. icon: 'checkmark',
  4598. subtype: 'primary',
  4599. tooltip: 'Ok',
  4600. onclick: 'submit'
  4601. }
  4602. ],
  4603. onshow: onShowHandler,
  4604. onsubmit: function (e) {
  4605. convertLinkToAbsolute(editor, e.data.linkurl).then(function (url) {
  4606. editor.undoManager.transact(function () {
  4607. if (url === attachState.href) {
  4608. attachState.attach();
  4609. attachState = {};
  4610. }
  4611. Actions.createLink(editor, url);
  4612. });
  4613. hide();
  4614. });
  4615. }
  4616. });
  4617. };
  4618. var Forms = { createQuickLinkForm: createQuickLinkForm };
  4619. var getSelectorStateResult = function (itemName, item) {
  4620. var result = function (selector, handler) {
  4621. return {
  4622. selector: selector,
  4623. handler: handler
  4624. };
  4625. };
  4626. var activeHandler = function (state) {
  4627. item.active(state);
  4628. };
  4629. var disabledHandler = function (state) {
  4630. item.disabled(state);
  4631. };
  4632. if (item.settings.stateSelector) {
  4633. return result(item.settings.stateSelector, activeHandler);
  4634. }
  4635. if (item.settings.disabledStateSelector) {
  4636. return result(item.settings.disabledStateSelector, disabledHandler);
  4637. }
  4638. return null;
  4639. };
  4640. var bindSelectorChanged = function (editor, itemName, item) {
  4641. return function () {
  4642. var result = getSelectorStateResult(itemName, item);
  4643. if (result !== null) {
  4644. editor.selection.selectorChanged(result.selector, result.handler);
  4645. }
  4646. };
  4647. };
  4648. var itemsToArray$1 = function (items) {
  4649. if (Type.isArray(items)) {
  4650. return items;
  4651. } else if (Type.isString(items)) {
  4652. return items.split(/[ ,]/);
  4653. }
  4654. return [];
  4655. };
  4656. var create$2 = function (editor, name, items) {
  4657. var toolbarItems = [];
  4658. var buttonGroup;
  4659. if (!items) {
  4660. return;
  4661. }
  4662. global$4.each(itemsToArray$1(items), function (item) {
  4663. if (item === '|') {
  4664. buttonGroup = null;
  4665. } else {
  4666. if (editor.buttons[item]) {
  4667. if (!buttonGroup) {
  4668. buttonGroup = {
  4669. type: 'buttongroup',
  4670. items: []
  4671. };
  4672. toolbarItems.push(buttonGroup);
  4673. }
  4674. var button = editor.buttons[item];
  4675. if (Type.isFunction(button)) {
  4676. button = button();
  4677. }
  4678. button.type = button.type || 'button';
  4679. button = global$b.create(button);
  4680. button.on('postRender', bindSelectorChanged(editor, item, button));
  4681. buttonGroup.items.push(button);
  4682. }
  4683. }
  4684. });
  4685. return global$b.create({
  4686. type: 'toolbar',
  4687. layout: 'flow',
  4688. name: name,
  4689. items: toolbarItems
  4690. });
  4691. };
  4692. var Toolbar = { create: create$2 };
  4693. var create$3 = function () {
  4694. var panel, currentRect;
  4695. var createToolbars = function (editor, toolbars) {
  4696. return global$4.map(toolbars, function (toolbar) {
  4697. return Toolbar.create(editor, toolbar.id, toolbar.items);
  4698. });
  4699. };
  4700. var hasToolbarItems = function (toolbar) {
  4701. return toolbar.items().length > 0;
  4702. };
  4703. var create = function (editor, toolbars) {
  4704. var items = createToolbars(editor, toolbars).concat([
  4705. Toolbar.create(editor, 'text', Settings.getTextSelectionToolbarItems(editor)),
  4706. Toolbar.create(editor, 'insert', Settings.getInsertToolbarItems(editor)),
  4707. Forms.createQuickLinkForm(editor, hide)
  4708. ]);
  4709. return global$b.create({
  4710. type: 'floatpanel',
  4711. role: 'dialog',
  4712. classes: 'tinymce tinymce-inline arrow',
  4713. ariaLabel: 'Inline toolbar',
  4714. layout: 'flex',
  4715. direction: 'column',
  4716. align: 'stretch',
  4717. autohide: false,
  4718. autofix: true,
  4719. fixed: true,
  4720. border: 1,
  4721. items: global$4.grep(items, hasToolbarItems),
  4722. oncancel: function () {
  4723. editor.focus();
  4724. }
  4725. });
  4726. };
  4727. var showPanel = function (panel) {
  4728. if (panel) {
  4729. panel.show();
  4730. }
  4731. };
  4732. var movePanelTo = function (panel, pos) {
  4733. panel.moveTo(pos.x, pos.y);
  4734. };
  4735. var togglePositionClass = function (panel, relPos) {
  4736. relPos = relPos ? relPos.substr(0, 2) : '';
  4737. global$4.each({
  4738. t: 'down',
  4739. b: 'up',
  4740. c: 'center'
  4741. }, function (cls, pos) {
  4742. panel.classes.toggle('arrow-' + cls, pos === relPos.substr(0, 1));
  4743. });
  4744. if (relPos === 'cr') {
  4745. panel.classes.toggle('arrow-left', true);
  4746. panel.classes.toggle('arrow-right', false);
  4747. } else if (relPos === 'cl') {
  4748. panel.classes.toggle('arrow-left', false);
  4749. panel.classes.toggle('arrow-right', true);
  4750. } else {
  4751. global$4.each({
  4752. l: 'left',
  4753. r: 'right'
  4754. }, function (cls, pos) {
  4755. panel.classes.toggle('arrow-' + cls, pos === relPos.substr(1, 1));
  4756. });
  4757. }
  4758. };
  4759. var showToolbar = function (panel, id) {
  4760. var toolbars = panel.items().filter('#' + id);
  4761. if (toolbars.length > 0) {
  4762. toolbars[0].show();
  4763. panel.reflow();
  4764. return true;
  4765. }
  4766. return false;
  4767. };
  4768. var repositionPanelAt = function (panel, id, editor, targetRect) {
  4769. var contentAreaRect, panelRect, result, userConstainHandler;
  4770. userConstainHandler = Settings.getPositionHandler(editor);
  4771. contentAreaRect = Measure.getContentAreaRect(editor);
  4772. panelRect = global$2.DOM.getRect(panel.getEl());
  4773. if (id === 'insert') {
  4774. result = Layout.calcInsert(targetRect, contentAreaRect, panelRect);
  4775. } else {
  4776. result = Layout.calc(targetRect, contentAreaRect, panelRect);
  4777. }
  4778. if (result) {
  4779. var delta = UiContainer$1.getUiContainerDelta().getOr({
  4780. x: 0,
  4781. y: 0
  4782. });
  4783. var transposedPanelRect = {
  4784. x: result.rect.x - delta.x,
  4785. y: result.rect.y - delta.y,
  4786. w: result.rect.w,
  4787. h: result.rect.h
  4788. };
  4789. currentRect = targetRect;
  4790. movePanelTo(panel, Layout.userConstrain(userConstainHandler, targetRect, contentAreaRect, transposedPanelRect));
  4791. togglePositionClass(panel, result.position);
  4792. return true;
  4793. } else {
  4794. return false;
  4795. }
  4796. };
  4797. var showPanelAt = function (panel, id, editor, targetRect) {
  4798. showPanel(panel);
  4799. panel.items().hide();
  4800. if (!showToolbar(panel, id)) {
  4801. hide();
  4802. return;
  4803. }
  4804. if (repositionPanelAt(panel, id, editor, targetRect) === false) {
  4805. hide();
  4806. }
  4807. };
  4808. var hasFormVisible = function () {
  4809. return panel.items().filter('form:visible').length > 0;
  4810. };
  4811. var showForm = function (editor, id) {
  4812. if (panel) {
  4813. panel.items().hide();
  4814. if (!showToolbar(panel, id)) {
  4815. hide();
  4816. return;
  4817. }
  4818. var contentAreaRect = void 0, panelRect = void 0, result = void 0, userConstainHandler = void 0;
  4819. showPanel(panel);
  4820. panel.items().hide();
  4821. showToolbar(panel, id);
  4822. userConstainHandler = Settings.getPositionHandler(editor);
  4823. contentAreaRect = Measure.getContentAreaRect(editor);
  4824. panelRect = global$2.DOM.getRect(panel.getEl());
  4825. result = Layout.calc(currentRect, contentAreaRect, panelRect);
  4826. if (result) {
  4827. panelRect = result.rect;
  4828. movePanelTo(panel, Layout.userConstrain(userConstainHandler, currentRect, contentAreaRect, panelRect));
  4829. togglePositionClass(panel, result.position);
  4830. }
  4831. }
  4832. };
  4833. var show = function (editor, id, targetRect, toolbars) {
  4834. if (!panel) {
  4835. Events.fireBeforeRenderUI(editor);
  4836. panel = create(editor, toolbars);
  4837. panel.renderTo().reflow().moveTo(targetRect.x, targetRect.y);
  4838. editor.nodeChanged();
  4839. }
  4840. showPanelAt(panel, id, editor, targetRect);
  4841. };
  4842. var reposition = function (editor, id, targetRect) {
  4843. if (panel) {
  4844. repositionPanelAt(panel, id, editor, targetRect);
  4845. }
  4846. };
  4847. var hide = function () {
  4848. if (panel) {
  4849. panel.hide();
  4850. }
  4851. };
  4852. var focus = function () {
  4853. if (panel) {
  4854. panel.find('toolbar:visible').eq(0).each(function (item) {
  4855. item.focus(true);
  4856. });
  4857. }
  4858. };
  4859. var remove = function () {
  4860. if (panel) {
  4861. panel.remove();
  4862. panel = null;
  4863. }
  4864. };
  4865. var inForm = function () {
  4866. return panel && panel.visible() && hasFormVisible();
  4867. };
  4868. return {
  4869. show: show,
  4870. showForm: showForm,
  4871. reposition: reposition,
  4872. inForm: inForm,
  4873. hide: hide,
  4874. focus: focus,
  4875. remove: remove
  4876. };
  4877. };
  4878. var Layout$1 = global$8.extend({
  4879. Defaults: {
  4880. firstControlClass: 'first',
  4881. lastControlClass: 'last'
  4882. },
  4883. init: function (settings) {
  4884. this.settings = global$4.extend({}, this.Defaults, settings);
  4885. },
  4886. preRender: function (container) {
  4887. container.bodyClasses.add(this.settings.containerClass);
  4888. },
  4889. applyClasses: function (items) {
  4890. var self = this;
  4891. var settings = self.settings;
  4892. var firstClass, lastClass, firstItem, lastItem;
  4893. firstClass = settings.firstControlClass;
  4894. lastClass = settings.lastControlClass;
  4895. items.each(function (item) {
  4896. item.classes.remove(firstClass).remove(lastClass).add(settings.controlClass);
  4897. if (item.visible()) {
  4898. if (!firstItem) {
  4899. firstItem = item;
  4900. }
  4901. lastItem = item;
  4902. }
  4903. });
  4904. if (firstItem) {
  4905. firstItem.classes.add(firstClass);
  4906. }
  4907. if (lastItem) {
  4908. lastItem.classes.add(lastClass);
  4909. }
  4910. },
  4911. renderHtml: function (container) {
  4912. var self = this;
  4913. var html = '';
  4914. self.applyClasses(container.items());
  4915. container.items().each(function (item) {
  4916. html += item.renderHtml();
  4917. });
  4918. return html;
  4919. },
  4920. recalc: function () {
  4921. },
  4922. postRender: function () {
  4923. },
  4924. isNative: function () {
  4925. return false;
  4926. }
  4927. });
  4928. var AbsoluteLayout = Layout$1.extend({
  4929. Defaults: {
  4930. containerClass: 'abs-layout',
  4931. controlClass: 'abs-layout-item'
  4932. },
  4933. recalc: function (container) {
  4934. container.items().filter(':visible').each(function (ctrl) {
  4935. var settings = ctrl.settings;
  4936. ctrl.layoutRect({
  4937. x: settings.x,
  4938. y: settings.y,
  4939. w: settings.w,
  4940. h: settings.h
  4941. });
  4942. if (ctrl.recalc) {
  4943. ctrl.recalc();
  4944. }
  4945. });
  4946. },
  4947. renderHtml: function (container) {
  4948. return '<div id="' + container._id + '-absend" class="' + container.classPrefix + 'abs-end"></div>' + this._super(container);
  4949. }
  4950. });
  4951. var Button = Widget.extend({
  4952. Defaults: {
  4953. classes: 'widget btn',
  4954. role: 'button'
  4955. },
  4956. init: function (settings) {
  4957. var self = this;
  4958. var size;
  4959. self._super(settings);
  4960. settings = self.settings;
  4961. size = self.settings.size;
  4962. self.on('click mousedown', function (e) {
  4963. e.preventDefault();
  4964. });
  4965. self.on('touchstart', function (e) {
  4966. self.fire('click', e);
  4967. e.preventDefault();
  4968. });
  4969. if (settings.subtype) {
  4970. self.classes.add(settings.subtype);
  4971. }
  4972. if (size) {
  4973. self.classes.add('btn-' + size);
  4974. }
  4975. if (settings.icon) {
  4976. self.icon(settings.icon);
  4977. }
  4978. },
  4979. icon: function (icon) {
  4980. if (!arguments.length) {
  4981. return this.state.get('icon');
  4982. }
  4983. this.state.set('icon', icon);
  4984. return this;
  4985. },
  4986. repaint: function () {
  4987. var btnElm = this.getEl().firstChild;
  4988. var btnStyle;
  4989. if (btnElm) {
  4990. btnStyle = btnElm.style;
  4991. btnStyle.width = btnStyle.height = '100%';
  4992. }
  4993. this._super();
  4994. },
  4995. renderHtml: function () {
  4996. var self = this, id = self._id, prefix = self.classPrefix;
  4997. var icon = self.state.get('icon'), image;
  4998. var text = self.state.get('text');
  4999. var textHtml = '';
  5000. var ariaPressed;
  5001. var settings = self.settings;
  5002. image = settings.image;
  5003. if (image) {
  5004. icon = 'none';
  5005. if (typeof image !== 'string') {
  5006. image = domGlobals.window.getSelection ? image[0] : image[1];
  5007. }
  5008. image = ' style="background-image: url(\'' + image + '\')"';
  5009. } else {
  5010. image = '';
  5011. }
  5012. if (text) {
  5013. self.classes.add('btn-has-text');
  5014. textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
  5015. }
  5016. icon = icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
  5017. ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
  5018. return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1"' + ariaPressed + '>' + '<button id="' + id + '-button" role="presentation" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + '</button>' + '</div>';
  5019. },
  5020. bindStates: function () {
  5021. var self = this, $ = self.$, textCls = self.classPrefix + 'txt';
  5022. function setButtonText(text) {
  5023. var $span = $('span.' + textCls, self.getEl());
  5024. if (text) {
  5025. if (!$span[0]) {
  5026. $('button:first', self.getEl()).append('<span class="' + textCls + '"></span>');
  5027. $span = $('span.' + textCls, self.getEl());
  5028. }
  5029. $span.html(self.encode(text));
  5030. } else {
  5031. $span.remove();
  5032. }
  5033. self.classes.toggle('btn-has-text', !!text);
  5034. }
  5035. self.state.on('change:text', function (e) {
  5036. setButtonText(e.value);
  5037. });
  5038. self.state.on('change:icon', function (e) {
  5039. var icon = e.value;
  5040. var prefix = self.classPrefix;
  5041. self.settings.icon = icon;
  5042. icon = icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : '';
  5043. var btnElm = self.getEl().firstChild;
  5044. var iconElm = btnElm.getElementsByTagName('i')[0];
  5045. if (icon) {
  5046. if (!iconElm || iconElm !== btnElm.firstChild) {
  5047. iconElm = domGlobals.document.createElement('i');
  5048. btnElm.insertBefore(iconElm, btnElm.firstChild);
  5049. }
  5050. iconElm.className = icon;
  5051. } else if (iconElm) {
  5052. btnElm.removeChild(iconElm);
  5053. }
  5054. setButtonText(self.state.get('text'));
  5055. });
  5056. return self._super();
  5057. }
  5058. });
  5059. var BrowseButton = Button.extend({
  5060. init: function (settings) {
  5061. var self = this;
  5062. settings = global$4.extend({
  5063. text: 'Browse...',
  5064. multiple: false,
  5065. accept: null
  5066. }, settings);
  5067. self._super(settings);
  5068. self.classes.add('browsebutton');
  5069. if (settings.multiple) {
  5070. self.classes.add('multiple');
  5071. }
  5072. },
  5073. postRender: function () {
  5074. var self = this;
  5075. var input = funcs.create('input', {
  5076. type: 'file',
  5077. id: self._id + '-browse',
  5078. accept: self.settings.accept
  5079. });
  5080. self._super();
  5081. global$7(input).on('change', function (e) {
  5082. var files = e.target.files;
  5083. self.value = function () {
  5084. if (!files.length) {
  5085. return null;
  5086. } else if (self.settings.multiple) {
  5087. return files;
  5088. } else {
  5089. return files[0];
  5090. }
  5091. };
  5092. e.preventDefault();
  5093. if (files.length) {
  5094. self.fire('change', e);
  5095. }
  5096. });
  5097. global$7(input).on('click', function (e) {
  5098. e.stopPropagation();
  5099. });
  5100. global$7(self.getEl('button')).on('click touchstart', function (e) {
  5101. e.stopPropagation();
  5102. input.click();
  5103. e.preventDefault();
  5104. });
  5105. self.getEl().appendChild(input);
  5106. },
  5107. remove: function () {
  5108. global$7(this.getEl('button')).off();
  5109. global$7(this.getEl('input')).off();
  5110. this._super();
  5111. }
  5112. });
  5113. var ButtonGroup = Container.extend({
  5114. Defaults: {
  5115. defaultType: 'button',
  5116. role: 'group'
  5117. },
  5118. renderHtml: function () {
  5119. var self = this, layout = self._layout;
  5120. self.classes.add('btn-group');
  5121. self.preRender();
  5122. layout.preRender(self);
  5123. return '<div id="' + self._id + '" class="' + self.classes + '">' + '<div id="' + self._id + '-body">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>';
  5124. }
  5125. });
  5126. var Checkbox = Widget.extend({
  5127. Defaults: {
  5128. classes: 'checkbox',
  5129. role: 'checkbox',
  5130. checked: false
  5131. },
  5132. init: function (settings) {
  5133. var self = this;
  5134. self._super(settings);
  5135. self.on('click mousedown', function (e) {
  5136. e.preventDefault();
  5137. });
  5138. self.on('click', function (e) {
  5139. e.preventDefault();
  5140. if (!self.disabled()) {
  5141. self.checked(!self.checked());
  5142. }
  5143. });
  5144. self.checked(self.settings.checked);
  5145. },
  5146. checked: function (state) {
  5147. if (!arguments.length) {
  5148. return this.state.get('checked');
  5149. }
  5150. this.state.set('checked', state);
  5151. return this;
  5152. },
  5153. value: function (state) {
  5154. if (!arguments.length) {
  5155. return this.checked();
  5156. }
  5157. return this.checked(state);
  5158. },
  5159. renderHtml: function () {
  5160. var self = this, id = self._id, prefix = self.classPrefix;
  5161. return '<div id="' + id + '" class="' + self.classes + '" unselectable="on" aria-labelledby="' + id + '-al" tabindex="-1">' + '<i class="' + prefix + 'ico ' + prefix + 'i-checkbox"></i>' + '<span id="' + id + '-al" class="' + prefix + 'label">' + self.encode(self.state.get('text')) + '</span>' + '</div>';
  5162. },
  5163. bindStates: function () {
  5164. var self = this;
  5165. function checked(state) {
  5166. self.classes.toggle('checked', state);
  5167. self.aria('checked', state);
  5168. }
  5169. self.state.on('change:text', function (e) {
  5170. self.getEl('al').firstChild.data = self.translate(e.value);
  5171. });
  5172. self.state.on('change:checked change:value', function (e) {
  5173. self.fire('change');
  5174. checked(e.value);
  5175. });
  5176. self.state.on('change:icon', function (e) {
  5177. var icon = e.value;
  5178. var prefix = self.classPrefix;
  5179. if (typeof icon === 'undefined') {
  5180. return self.settings.icon;
  5181. }
  5182. self.settings.icon = icon;
  5183. icon = icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : '';
  5184. var btnElm = self.getEl().firstChild;
  5185. var iconElm = btnElm.getElementsByTagName('i')[0];
  5186. if (icon) {
  5187. if (!iconElm || iconElm !== btnElm.firstChild) {
  5188. iconElm = domGlobals.document.createElement('i');
  5189. btnElm.insertBefore(iconElm, btnElm.firstChild);
  5190. }
  5191. iconElm.className = icon;
  5192. } else if (iconElm) {
  5193. btnElm.removeChild(iconElm);
  5194. }
  5195. });
  5196. if (self.state.get('checked')) {
  5197. checked(true);
  5198. }
  5199. return self._super();
  5200. }
  5201. });
  5202. var global$f = tinymce.util.Tools.resolve('tinymce.util.VK');
  5203. var ComboBox = Widget.extend({
  5204. init: function (settings) {
  5205. var self = this;
  5206. self._super(settings);
  5207. settings = self.settings;
  5208. self.classes.add('combobox');
  5209. self.subinput = true;
  5210. self.ariaTarget = 'inp';
  5211. settings.menu = settings.menu || settings.values;
  5212. if (settings.menu) {
  5213. settings.icon = 'caret';
  5214. }
  5215. self.on('click', function (e) {
  5216. var elm = e.target;
  5217. var root = self.getEl();
  5218. if (!global$7.contains(root, elm) && elm !== root) {
  5219. return;
  5220. }
  5221. while (elm && elm !== root) {
  5222. if (elm.id && elm.id.indexOf('-open') !== -1) {
  5223. self.fire('action');
  5224. if (settings.menu) {
  5225. self.showMenu();
  5226. if (e.aria) {
  5227. self.menu.items()[0].focus();
  5228. }
  5229. }
  5230. }
  5231. elm = elm.parentNode;
  5232. }
  5233. });
  5234. self.on('keydown', function (e) {
  5235. var rootControl;
  5236. if (e.keyCode === 13 && e.target.nodeName === 'INPUT') {
  5237. e.preventDefault();
  5238. self.parents().reverse().each(function (ctrl) {
  5239. if (ctrl.toJSON) {
  5240. rootControl = ctrl;
  5241. return false;
  5242. }
  5243. });
  5244. self.fire('submit', { data: rootControl.toJSON() });
  5245. }
  5246. });
  5247. self.on('keyup', function (e) {
  5248. if (e.target.nodeName === 'INPUT') {
  5249. var oldValue = self.state.get('value');
  5250. var newValue = e.target.value;
  5251. if (newValue !== oldValue) {
  5252. self.state.set('value', newValue);
  5253. self.fire('autocomplete', e);
  5254. }
  5255. }
  5256. });
  5257. self.on('mouseover', function (e) {
  5258. var tooltip = self.tooltip().moveTo(-65535);
  5259. if (self.statusLevel() && e.target.className.indexOf(self.classPrefix + 'status') !== -1) {
  5260. var statusMessage = self.statusMessage() || 'Ok';
  5261. var rel = tooltip.text(statusMessage).show().testMoveRel(e.target, [
  5262. 'bc-tc',
  5263. 'bc-tl',
  5264. 'bc-tr'
  5265. ]);
  5266. tooltip.classes.toggle('tooltip-n', rel === 'bc-tc');
  5267. tooltip.classes.toggle('tooltip-nw', rel === 'bc-tl');
  5268. tooltip.classes.toggle('tooltip-ne', rel === 'bc-tr');
  5269. tooltip.moveRel(e.target, rel);
  5270. }
  5271. });
  5272. },
  5273. statusLevel: function (value) {
  5274. if (arguments.length > 0) {
  5275. this.state.set('statusLevel', value);
  5276. }
  5277. return this.state.get('statusLevel');
  5278. },
  5279. statusMessage: function (value) {
  5280. if (arguments.length > 0) {
  5281. this.state.set('statusMessage', value);
  5282. }
  5283. return this.state.get('statusMessage');
  5284. },
  5285. showMenu: function () {
  5286. var self = this;
  5287. var settings = self.settings;
  5288. var menu;
  5289. if (!self.menu) {
  5290. menu = settings.menu || [];
  5291. if (menu.length) {
  5292. menu = {
  5293. type: 'menu',
  5294. items: menu
  5295. };
  5296. } else {
  5297. menu.type = menu.type || 'menu';
  5298. }
  5299. self.menu = global$b.create(menu).parent(self).renderTo(self.getContainerElm());
  5300. self.fire('createmenu');
  5301. self.menu.reflow();
  5302. self.menu.on('cancel', function (e) {
  5303. if (e.control === self.menu) {
  5304. self.focus();
  5305. }
  5306. });
  5307. self.menu.on('show hide', function (e) {
  5308. e.control.items().each(function (ctrl) {
  5309. ctrl.active(ctrl.value() === self.value());
  5310. });
  5311. }).fire('show');
  5312. self.menu.on('select', function (e) {
  5313. self.value(e.control.value());
  5314. });
  5315. self.on('focusin', function (e) {
  5316. if (e.target.tagName.toUpperCase() === 'INPUT') {
  5317. self.menu.hide();
  5318. }
  5319. });
  5320. self.aria('expanded', true);
  5321. }
  5322. self.menu.show();
  5323. self.menu.layoutRect({ w: self.layoutRect().w });
  5324. self.menu.moveRel(self.getEl(), self.isRtl() ? [
  5325. 'br-tr',
  5326. 'tr-br'
  5327. ] : [
  5328. 'bl-tl',
  5329. 'tl-bl'
  5330. ]);
  5331. },
  5332. focus: function () {
  5333. this.getEl('inp').focus();
  5334. },
  5335. repaint: function () {
  5336. var self = this, elm = self.getEl(), openElm = self.getEl('open'), rect = self.layoutRect();
  5337. var width, lineHeight, innerPadding = 0;
  5338. var inputElm = elm.firstChild;
  5339. if (self.statusLevel() && self.statusLevel() !== 'none') {
  5340. innerPadding = parseInt(funcs.getRuntimeStyle(inputElm, 'padding-right'), 10) - parseInt(funcs.getRuntimeStyle(inputElm, 'padding-left'), 10);
  5341. }
  5342. if (openElm) {
  5343. width = rect.w - funcs.getSize(openElm).width - 10;
  5344. } else {
  5345. width = rect.w - 10;
  5346. }
  5347. var doc = domGlobals.document;
  5348. if (doc.all && (!doc.documentMode || doc.documentMode <= 8)) {
  5349. lineHeight = self.layoutRect().h - 2 + 'px';
  5350. }
  5351. global$7(inputElm).css({
  5352. width: width - innerPadding,
  5353. lineHeight: lineHeight
  5354. });
  5355. self._super();
  5356. return self;
  5357. },
  5358. postRender: function () {
  5359. var self = this;
  5360. global$7(this.getEl('inp')).on('change', function (e) {
  5361. self.state.set('value', e.target.value);
  5362. self.fire('change', e);
  5363. });
  5364. return self._super();
  5365. },
  5366. renderHtml: function () {
  5367. var self = this, id = self._id, settings = self.settings, prefix = self.classPrefix;
  5368. var value = self.state.get('value') || '';
  5369. var icon, text, openBtnHtml = '', extraAttrs = '', statusHtml = '';
  5370. if ('spellcheck' in settings) {
  5371. extraAttrs += ' spellcheck="' + settings.spellcheck + '"';
  5372. }
  5373. if (settings.maxLength) {
  5374. extraAttrs += ' maxlength="' + settings.maxLength + '"';
  5375. }
  5376. if (settings.size) {
  5377. extraAttrs += ' size="' + settings.size + '"';
  5378. }
  5379. if (settings.subtype) {
  5380. extraAttrs += ' type="' + settings.subtype + '"';
  5381. }
  5382. statusHtml = '<i id="' + id + '-status" class="mce-status mce-ico" style="display: none"></i>';
  5383. if (self.disabled()) {
  5384. extraAttrs += ' disabled="disabled"';
  5385. }
  5386. icon = settings.icon;
  5387. if (icon && icon !== 'caret') {
  5388. icon = prefix + 'ico ' + prefix + 'i-' + settings.icon;
  5389. }
  5390. text = self.state.get('text');
  5391. if (icon || text) {
  5392. openBtnHtml = '<div id="' + id + '-open" class="' + prefix + 'btn ' + prefix + 'open" tabIndex="-1" role="button">' + '<button id="' + id + '-action" type="button" hidefocus="1" tabindex="-1">' + (icon !== 'caret' ? '<i class="' + icon + '"></i>' : '<i class="' + prefix + 'caret"></i>') + (text ? (icon ? ' ' : '') + text : '') + '</button>' + '</div>';
  5393. self.classes.add('has-open');
  5394. }
  5395. return '<div id="' + id + '" class="' + self.classes + '">' + '<input id="' + id + '-inp" class="' + prefix + 'textbox" value="' + self.encode(value, false) + '" hidefocus="1"' + extraAttrs + ' placeholder="' + self.encode(settings.placeholder) + '" />' + statusHtml + openBtnHtml + '</div>';
  5396. },
  5397. value: function (value) {
  5398. if (arguments.length) {
  5399. this.state.set('value', value);
  5400. return this;
  5401. }
  5402. if (this.state.get('rendered')) {
  5403. this.state.set('value', this.getEl('inp').value);
  5404. }
  5405. return this.state.get('value');
  5406. },
  5407. showAutoComplete: function (items, term) {
  5408. var self = this;
  5409. if (items.length === 0) {
  5410. self.hideMenu();
  5411. return;
  5412. }
  5413. var insert = function (value, title) {
  5414. return function () {
  5415. self.fire('selectitem', {
  5416. title: title,
  5417. value: value
  5418. });
  5419. };
  5420. };
  5421. if (self.menu) {
  5422. self.menu.items().remove();
  5423. } else {
  5424. self.menu = global$b.create({
  5425. type: 'menu',
  5426. classes: 'combobox-menu',
  5427. layout: 'flow'
  5428. }).parent(self).renderTo();
  5429. }
  5430. global$4.each(items, function (item) {
  5431. self.menu.add({
  5432. text: item.title,
  5433. url: item.previewUrl,
  5434. match: term,
  5435. classes: 'menu-item-ellipsis',
  5436. onclick: insert(item.value, item.title)
  5437. });
  5438. });
  5439. self.menu.renderNew();
  5440. self.hideMenu();
  5441. self.menu.on('cancel', function (e) {
  5442. if (e.control.parent() === self.menu) {
  5443. e.stopPropagation();
  5444. self.focus();
  5445. self.hideMenu();
  5446. }
  5447. });
  5448. self.menu.on('select', function () {
  5449. self.focus();
  5450. });
  5451. var maxW = self.layoutRect().w;
  5452. self.menu.layoutRect({
  5453. w: maxW,
  5454. minW: 0,
  5455. maxW: maxW
  5456. });
  5457. self.menu.repaint();
  5458. self.menu.reflow();
  5459. self.menu.show();
  5460. self.menu.moveRel(self.getEl(), self.isRtl() ? [
  5461. 'br-tr',
  5462. 'tr-br'
  5463. ] : [
  5464. 'bl-tl',
  5465. 'tl-bl'
  5466. ]);
  5467. },
  5468. hideMenu: function () {
  5469. if (this.menu) {
  5470. this.menu.hide();
  5471. }
  5472. },
  5473. bindStates: function () {
  5474. var self = this;
  5475. self.state.on('change:value', function (e) {
  5476. if (self.getEl('inp').value !== e.value) {
  5477. self.getEl('inp').value = e.value;
  5478. }
  5479. });
  5480. self.state.on('change:disabled', function (e) {
  5481. self.getEl('inp').disabled = e.value;
  5482. });
  5483. self.state.on('change:statusLevel', function (e) {
  5484. var statusIconElm = self.getEl('status');
  5485. var prefix = self.classPrefix, value = e.value;
  5486. funcs.css(statusIconElm, 'display', value === 'none' ? 'none' : '');
  5487. funcs.toggleClass(statusIconElm, prefix + 'i-checkmark', value === 'ok');
  5488. funcs.toggleClass(statusIconElm, prefix + 'i-warning', value === 'warn');
  5489. funcs.toggleClass(statusIconElm, prefix + 'i-error', value === 'error');
  5490. self.classes.toggle('has-status', value !== 'none');
  5491. self.repaint();
  5492. });
  5493. funcs.on(self.getEl('status'), 'mouseleave', function () {
  5494. self.tooltip().hide();
  5495. });
  5496. self.on('cancel', function (e) {
  5497. if (self.menu && self.menu.visible()) {
  5498. e.stopPropagation();
  5499. self.hideMenu();
  5500. }
  5501. });
  5502. var focusIdx = function (idx, menu) {
  5503. if (menu && menu.items().length > 0) {
  5504. menu.items().eq(idx)[0].focus();
  5505. }
  5506. };
  5507. self.on('keydown', function (e) {
  5508. var keyCode = e.keyCode;
  5509. if (e.target.nodeName === 'INPUT') {
  5510. if (keyCode === global$f.DOWN) {
  5511. e.preventDefault();
  5512. self.fire('autocomplete');
  5513. focusIdx(0, self.menu);
  5514. } else if (keyCode === global$f.UP) {
  5515. e.preventDefault();
  5516. focusIdx(-1, self.menu);
  5517. }
  5518. }
  5519. });
  5520. return self._super();
  5521. },
  5522. remove: function () {
  5523. global$7(this.getEl('inp')).off();
  5524. if (this.menu) {
  5525. this.menu.remove();
  5526. }
  5527. this._super();
  5528. }
  5529. });
  5530. var ColorBox = ComboBox.extend({
  5531. init: function (settings) {
  5532. var self = this;
  5533. settings.spellcheck = false;
  5534. if (settings.onaction) {
  5535. settings.icon = 'none';
  5536. }
  5537. self._super(settings);
  5538. self.classes.add('colorbox');
  5539. self.on('change keyup postrender', function () {
  5540. self.repaintColor(self.value());
  5541. });
  5542. },
  5543. repaintColor: function (value) {
  5544. var openElm = this.getEl('open');
  5545. var elm = openElm ? openElm.getElementsByTagName('i')[0] : null;
  5546. if (elm) {
  5547. try {
  5548. elm.style.background = value;
  5549. } catch (ex) {
  5550. }
  5551. }
  5552. },
  5553. bindStates: function () {
  5554. var self = this;
  5555. self.state.on('change:value', function (e) {
  5556. if (self.state.get('rendered')) {
  5557. self.repaintColor(e.value);
  5558. }
  5559. });
  5560. return self._super();
  5561. }
  5562. });
  5563. var PanelButton = Button.extend({
  5564. showPanel: function () {
  5565. var self = this, settings = self.settings;
  5566. self.classes.add('opened');
  5567. if (!self.panel) {
  5568. var panelSettings = settings.panel;
  5569. if (panelSettings.type) {
  5570. panelSettings = {
  5571. layout: 'grid',
  5572. items: panelSettings
  5573. };
  5574. }
  5575. panelSettings.role = panelSettings.role || 'dialog';
  5576. panelSettings.popover = true;
  5577. panelSettings.autohide = true;
  5578. panelSettings.ariaRoot = true;
  5579. self.panel = new FloatPanel(panelSettings).on('hide', function () {
  5580. self.classes.remove('opened');
  5581. }).on('cancel', function (e) {
  5582. e.stopPropagation();
  5583. self.focus();
  5584. self.hidePanel();
  5585. }).parent(self).renderTo(self.getContainerElm());
  5586. self.panel.fire('show');
  5587. self.panel.reflow();
  5588. } else {
  5589. self.panel.show();
  5590. }
  5591. var rtlRels = [
  5592. 'bc-tc',
  5593. 'bc-tl',
  5594. 'bc-tr'
  5595. ];
  5596. var ltrRels = [
  5597. 'bc-tc',
  5598. 'bc-tr',
  5599. 'bc-tl',
  5600. 'tc-bc',
  5601. 'tc-br',
  5602. 'tc-bl'
  5603. ];
  5604. var rel = self.panel.testMoveRel(self.getEl(), settings.popoverAlign || (self.isRtl() ? rtlRels : ltrRels));
  5605. self.panel.classes.toggle('start', rel.substr(-1) === 'l');
  5606. self.panel.classes.toggle('end', rel.substr(-1) === 'r');
  5607. var isTop = rel.substr(0, 1) === 't';
  5608. self.panel.classes.toggle('bottom', !isTop);
  5609. self.panel.classes.toggle('top', isTop);
  5610. self.panel.moveRel(self.getEl(), rel);
  5611. },
  5612. hidePanel: function () {
  5613. var self = this;
  5614. if (self.panel) {
  5615. self.panel.hide();
  5616. }
  5617. },
  5618. postRender: function () {
  5619. var self = this;
  5620. self.aria('haspopup', true);
  5621. self.on('click', function (e) {
  5622. if (e.control === self) {
  5623. if (self.panel && self.panel.visible()) {
  5624. self.hidePanel();
  5625. } else {
  5626. self.showPanel();
  5627. self.panel.focus(!!e.aria);
  5628. }
  5629. }
  5630. });
  5631. return self._super();
  5632. },
  5633. remove: function () {
  5634. if (this.panel) {
  5635. this.panel.remove();
  5636. this.panel = null;
  5637. }
  5638. return this._super();
  5639. }
  5640. });
  5641. var DOM = global$2.DOM;
  5642. var ColorButton = PanelButton.extend({
  5643. init: function (settings) {
  5644. this._super(settings);
  5645. this.classes.add('splitbtn');
  5646. this.classes.add('colorbutton');
  5647. },
  5648. color: function (color) {
  5649. if (color) {
  5650. this._color = color;
  5651. this.getEl('preview').style.backgroundColor = color;
  5652. return this;
  5653. }
  5654. return this._color;
  5655. },
  5656. resetColor: function () {
  5657. this._color = null;
  5658. this.getEl('preview').style.backgroundColor = null;
  5659. return this;
  5660. },
  5661. renderHtml: function () {
  5662. var self = this, id = self._id, prefix = self.classPrefix, text = self.state.get('text');
  5663. var icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + self.settings.icon : '';
  5664. var image = self.settings.image ? ' style="background-image: url(\'' + self.settings.image + '\')"' : '';
  5665. var textHtml = '';
  5666. if (text) {
  5667. self.classes.add('btn-has-text');
  5668. textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
  5669. }
  5670. return '<div id="' + id + '" class="' + self.classes + '" role="button" tabindex="-1" aria-haspopup="true">' + '<button role="presentation" hidefocus="1" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + '<span id="' + id + '-preview" class="' + prefix + 'preview"></span>' + textHtml + '</button>' + '<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>';
  5671. },
  5672. postRender: function () {
  5673. var self = this, onClickHandler = self.settings.onclick;
  5674. self.on('click', function (e) {
  5675. if (e.aria && e.aria.key === 'down') {
  5676. return;
  5677. }
  5678. if (e.control === self && !DOM.getParent(e.target, '.' + self.classPrefix + 'open')) {
  5679. e.stopImmediatePropagation();
  5680. onClickHandler.call(self, e);
  5681. }
  5682. });
  5683. delete self.settings.onclick;
  5684. return self._super();
  5685. }
  5686. });
  5687. var global$g = tinymce.util.Tools.resolve('tinymce.util.Color');
  5688. var ColorPicker = Widget.extend({
  5689. Defaults: { classes: 'widget colorpicker' },
  5690. init: function (settings) {
  5691. this._super(settings);
  5692. },
  5693. postRender: function () {
  5694. var self = this;
  5695. var color = self.color();
  5696. var hsv, hueRootElm, huePointElm, svRootElm, svPointElm;
  5697. hueRootElm = self.getEl('h');
  5698. huePointElm = self.getEl('hp');
  5699. svRootElm = self.getEl('sv');
  5700. svPointElm = self.getEl('svp');
  5701. function getPos(elm, event) {
  5702. var pos = funcs.getPos(elm);
  5703. var x, y;
  5704. x = event.pageX - pos.x;
  5705. y = event.pageY - pos.y;
  5706. x = Math.max(0, Math.min(x / elm.clientWidth, 1));
  5707. y = Math.max(0, Math.min(y / elm.clientHeight, 1));
  5708. return {
  5709. x: x,
  5710. y: y
  5711. };
  5712. }
  5713. function updateColor(hsv, hueUpdate) {
  5714. var hue = (360 - hsv.h) / 360;
  5715. funcs.css(huePointElm, { top: hue * 100 + '%' });
  5716. if (!hueUpdate) {
  5717. funcs.css(svPointElm, {
  5718. left: hsv.s + '%',
  5719. top: 100 - hsv.v + '%'
  5720. });
  5721. }
  5722. svRootElm.style.background = global$g({
  5723. s: 100,
  5724. v: 100,
  5725. h: hsv.h
  5726. }).toHex();
  5727. self.color().parse({
  5728. s: hsv.s,
  5729. v: hsv.v,
  5730. h: hsv.h
  5731. });
  5732. }
  5733. function updateSaturationAndValue(e) {
  5734. var pos;
  5735. pos = getPos(svRootElm, e);
  5736. hsv.s = pos.x * 100;
  5737. hsv.v = (1 - pos.y) * 100;
  5738. updateColor(hsv);
  5739. self.fire('change');
  5740. }
  5741. function updateHue(e) {
  5742. var pos;
  5743. pos = getPos(hueRootElm, e);
  5744. hsv = color.toHsv();
  5745. hsv.h = (1 - pos.y) * 360;
  5746. updateColor(hsv, true);
  5747. self.fire('change');
  5748. }
  5749. self._repaint = function () {
  5750. hsv = color.toHsv();
  5751. updateColor(hsv);
  5752. };
  5753. self._super();
  5754. self._svdraghelper = new DragHelper(self._id + '-sv', {
  5755. start: updateSaturationAndValue,
  5756. drag: updateSaturationAndValue
  5757. });
  5758. self._hdraghelper = new DragHelper(self._id + '-h', {
  5759. start: updateHue,
  5760. drag: updateHue
  5761. });
  5762. self._repaint();
  5763. },
  5764. rgb: function () {
  5765. return this.color().toRgb();
  5766. },
  5767. value: function (value) {
  5768. var self = this;
  5769. if (arguments.length) {
  5770. self.color().parse(value);
  5771. if (self._rendered) {
  5772. self._repaint();
  5773. }
  5774. } else {
  5775. return self.color().toHex();
  5776. }
  5777. },
  5778. color: function () {
  5779. if (!this._color) {
  5780. this._color = global$g();
  5781. }
  5782. return this._color;
  5783. },
  5784. renderHtml: function () {
  5785. var self = this;
  5786. var id = self._id;
  5787. var prefix = self.classPrefix;
  5788. var hueHtml;
  5789. var stops = '#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000';
  5790. function getOldIeFallbackHtml() {
  5791. var i, l, html = '', gradientPrefix, stopsList;
  5792. gradientPrefix = 'filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=';
  5793. stopsList = stops.split(',');
  5794. for (i = 0, l = stopsList.length - 1; i < l; i++) {
  5795. html += '<div class="' + prefix + 'colorpicker-h-chunk" style="' + 'height:' + 100 / l + '%;' + gradientPrefix + stopsList[i] + ',endColorstr=' + stopsList[i + 1] + ');' + '-ms-' + gradientPrefix + stopsList[i] + ',endColorstr=' + stopsList[i + 1] + ')' + '"></div>';
  5796. }
  5797. return html;
  5798. }
  5799. var gradientCssText = 'background: -ms-linear-gradient(top,' + stops + ');' + 'background: linear-gradient(to bottom,' + stops + ');';
  5800. hueHtml = '<div id="' + id + '-h" class="' + prefix + 'colorpicker-h" style="' + gradientCssText + '">' + getOldIeFallbackHtml() + '<div id="' + id + '-hp" class="' + prefix + 'colorpicker-h-marker"></div>' + '</div>';
  5801. return '<div id="' + id + '" class="' + self.classes + '">' + '<div id="' + id + '-sv" class="' + prefix + 'colorpicker-sv">' + '<div class="' + prefix + 'colorpicker-overlay1">' + '<div class="' + prefix + 'colorpicker-overlay2">' + '<div id="' + id + '-svp" class="' + prefix + 'colorpicker-selector1">' + '<div class="' + prefix + 'colorpicker-selector2"></div>' + '</div>' + '</div>' + '</div>' + '</div>' + hueHtml + '</div>';
  5802. }
  5803. });
  5804. var DropZone = Widget.extend({
  5805. init: function (settings) {
  5806. var self = this;
  5807. settings = global$4.extend({
  5808. height: 100,
  5809. text: 'Drop an image here',
  5810. multiple: false,
  5811. accept: null
  5812. }, settings);
  5813. self._super(settings);
  5814. self.classes.add('dropzone');
  5815. if (settings.multiple) {
  5816. self.classes.add('multiple');
  5817. }
  5818. },
  5819. renderHtml: function () {
  5820. var self = this;
  5821. var attrs, elm;
  5822. var cfg = self.settings;
  5823. attrs = {
  5824. id: self._id,
  5825. hidefocus: '1'
  5826. };
  5827. elm = funcs.create('div', attrs, '<span>' + this.translate(cfg.text) + '</span>');
  5828. if (cfg.height) {
  5829. funcs.css(elm, 'height', cfg.height + 'px');
  5830. }
  5831. if (cfg.width) {
  5832. funcs.css(elm, 'width', cfg.width + 'px');
  5833. }
  5834. elm.className = self.classes;
  5835. return elm.outerHTML;
  5836. },
  5837. postRender: function () {
  5838. var self = this;
  5839. var toggleDragClass = function (e) {
  5840. e.preventDefault();
  5841. self.classes.toggle('dragenter');
  5842. self.getEl().className = self.classes;
  5843. };
  5844. var filter = function (files) {
  5845. var accept = self.settings.accept;
  5846. if (typeof accept !== 'string') {
  5847. return files;
  5848. }
  5849. var re = new RegExp('(' + accept.split(/\s*,\s*/).join('|') + ')$', 'i');
  5850. return global$4.grep(files, function (file) {
  5851. return re.test(file.name);
  5852. });
  5853. };
  5854. self._super();
  5855. self.$el.on('dragover', function (e) {
  5856. e.preventDefault();
  5857. });
  5858. self.$el.on('dragenter', toggleDragClass);
  5859. self.$el.on('dragleave', toggleDragClass);
  5860. self.$el.on('drop', function (e) {
  5861. e.preventDefault();
  5862. if (self.state.get('disabled')) {
  5863. return;
  5864. }
  5865. var files = filter(e.dataTransfer.files);
  5866. self.value = function () {
  5867. if (!files.length) {
  5868. return null;
  5869. } else if (self.settings.multiple) {
  5870. return files;
  5871. } else {
  5872. return files[0];
  5873. }
  5874. };
  5875. if (files.length) {
  5876. self.fire('change', e);
  5877. }
  5878. });
  5879. },
  5880. remove: function () {
  5881. this.$el.off();
  5882. this._super();
  5883. }
  5884. });
  5885. var Path = Widget.extend({
  5886. init: function (settings) {
  5887. var self = this;
  5888. if (!settings.delimiter) {
  5889. settings.delimiter = '\xBB';
  5890. }
  5891. self._super(settings);
  5892. self.classes.add('path');
  5893. self.canFocus = true;
  5894. self.on('click', function (e) {
  5895. var index;
  5896. var target = e.target;
  5897. if (index = target.getAttribute('data-index')) {
  5898. self.fire('select', {
  5899. value: self.row()[index],
  5900. index: index
  5901. });
  5902. }
  5903. });
  5904. self.row(self.settings.row);
  5905. },
  5906. focus: function () {
  5907. var self = this;
  5908. self.getEl().firstChild.focus();
  5909. return self;
  5910. },
  5911. row: function (row) {
  5912. if (!arguments.length) {
  5913. return this.state.get('row');
  5914. }
  5915. this.state.set('row', row);
  5916. return this;
  5917. },
  5918. renderHtml: function () {
  5919. var self = this;
  5920. return '<div id="' + self._id + '" class="' + self.classes + '">' + self._getDataPathHtml(self.state.get('row')) + '</div>';
  5921. },
  5922. bindStates: function () {
  5923. var self = this;
  5924. self.state.on('change:row', function (e) {
  5925. self.innerHtml(self._getDataPathHtml(e.value));
  5926. });
  5927. return self._super();
  5928. },
  5929. _getDataPathHtml: function (data) {
  5930. var self = this;
  5931. var parts = data || [];
  5932. var i, l, html = '';
  5933. var prefix = self.classPrefix;
  5934. for (i = 0, l = parts.length; i < l; i++) {
  5935. html += (i > 0 ? '<div class="' + prefix + 'divider" aria-hidden="true"> ' + self.settings.delimiter + ' </div>' : '') + '<div role="button" class="' + prefix + 'path-item' + (i === l - 1 ? ' ' + prefix + 'last' : '') + '" data-index="' + i + '" tabindex="-1" id="' + self._id + '-' + i + '" aria-level="' + (i + 1) + '">' + parts[i].name + '</div>';
  5936. }
  5937. if (!html) {
  5938. html = '<div class="' + prefix + 'path-item">\xA0</div>';
  5939. }
  5940. return html;
  5941. }
  5942. });
  5943. var ElementPath = Path.extend({
  5944. postRender: function () {
  5945. var self = this, editor = self.settings.editor;
  5946. function isHidden(elm) {
  5947. if (elm.nodeType === 1) {
  5948. if (elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus')) {
  5949. return true;
  5950. }
  5951. if (elm.getAttribute('data-mce-type') === 'bookmark') {
  5952. return true;
  5953. }
  5954. }
  5955. return false;
  5956. }
  5957. if (editor.settings.elementpath !== false) {
  5958. self.on('select', function (e) {
  5959. editor.focus();
  5960. editor.selection.select(this.row()[e.index].element);
  5961. editor.nodeChanged();
  5962. });
  5963. editor.on('nodeChange', function (e) {
  5964. var outParents = [];
  5965. var parents = e.parents;
  5966. var i = parents.length;
  5967. while (i--) {
  5968. if (parents[i].nodeType === 1 && !isHidden(parents[i])) {
  5969. var args = editor.fire('ResolveName', {
  5970. name: parents[i].nodeName.toLowerCase(),
  5971. target: parents[i]
  5972. });
  5973. if (!args.isDefaultPrevented()) {
  5974. outParents.push({
  5975. name: args.name,
  5976. element: parents[i]
  5977. });
  5978. }
  5979. if (args.isPropagationStopped()) {
  5980. break;
  5981. }
  5982. }
  5983. }
  5984. self.row(outParents);
  5985. });
  5986. }
  5987. return self._super();
  5988. }
  5989. });
  5990. var FormItem = Container.extend({
  5991. Defaults: {
  5992. layout: 'flex',
  5993. align: 'center',
  5994. defaults: { flex: 1 }
  5995. },
  5996. renderHtml: function () {
  5997. var self = this, layout = self._layout, prefix = self.classPrefix;
  5998. self.classes.add('formitem');
  5999. layout.preRender(self);
  6000. return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + (self.settings.title ? '<div id="' + self._id + '-title" class="' + prefix + 'title">' + self.settings.title + '</div>' : '') + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</div>';
  6001. }
  6002. });
  6003. var Form = Container.extend({
  6004. Defaults: {
  6005. containerCls: 'form',
  6006. layout: 'flex',
  6007. direction: 'column',
  6008. align: 'stretch',
  6009. flex: 1,
  6010. padding: 15,
  6011. labelGap: 30,
  6012. spacing: 10,
  6013. callbacks: {
  6014. submit: function () {
  6015. this.submit();
  6016. }
  6017. }
  6018. },
  6019. preRender: function () {
  6020. var self = this, items = self.items();
  6021. if (!self.settings.formItemDefaults) {
  6022. self.settings.formItemDefaults = {
  6023. layout: 'flex',
  6024. autoResize: 'overflow',
  6025. defaults: { flex: 1 }
  6026. };
  6027. }
  6028. items.each(function (ctrl) {
  6029. var formItem;
  6030. var label = ctrl.settings.label;
  6031. if (label) {
  6032. formItem = new FormItem(global$4.extend({
  6033. items: {
  6034. type: 'label',
  6035. id: ctrl._id + '-l',
  6036. text: label,
  6037. flex: 0,
  6038. forId: ctrl._id,
  6039. disabled: ctrl.disabled()
  6040. }
  6041. }, self.settings.formItemDefaults));
  6042. formItem.type = 'formitem';
  6043. ctrl.aria('labelledby', ctrl._id + '-l');
  6044. if (typeof ctrl.settings.flex === 'undefined') {
  6045. ctrl.settings.flex = 1;
  6046. }
  6047. self.replace(ctrl, formItem);
  6048. formItem.add(ctrl);
  6049. }
  6050. });
  6051. },
  6052. submit: function () {
  6053. return this.fire('submit', { data: this.toJSON() });
  6054. },
  6055. postRender: function () {
  6056. var self = this;
  6057. self._super();
  6058. self.fromJSON(self.settings.data);
  6059. },
  6060. bindStates: function () {
  6061. var self = this;
  6062. self._super();
  6063. function recalcLabels() {
  6064. var maxLabelWidth = 0;
  6065. var labels = [];
  6066. var i, labelGap, items;
  6067. if (self.settings.labelGapCalc === false) {
  6068. return;
  6069. }
  6070. if (self.settings.labelGapCalc === 'children') {
  6071. items = self.find('formitem');
  6072. } else {
  6073. items = self.items();
  6074. }
  6075. items.filter('formitem').each(function (item) {
  6076. var labelCtrl = item.items()[0], labelWidth = labelCtrl.getEl().clientWidth;
  6077. maxLabelWidth = labelWidth > maxLabelWidth ? labelWidth : maxLabelWidth;
  6078. labels.push(labelCtrl);
  6079. });
  6080. labelGap = self.settings.labelGap || 0;
  6081. i = labels.length;
  6082. while (i--) {
  6083. labels[i].settings.minWidth = maxLabelWidth + labelGap;
  6084. }
  6085. }
  6086. self.on('show', recalcLabels);
  6087. recalcLabels();
  6088. }
  6089. });
  6090. var FieldSet = Form.extend({
  6091. Defaults: {
  6092. containerCls: 'fieldset',
  6093. layout: 'flex',
  6094. direction: 'column',
  6095. align: 'stretch',
  6096. flex: 1,
  6097. padding: '25 15 5 15',
  6098. labelGap: 30,
  6099. spacing: 10,
  6100. border: 1
  6101. },
  6102. renderHtml: function () {
  6103. var self = this, layout = self._layout, prefix = self.classPrefix;
  6104. self.preRender();
  6105. layout.preRender(self);
  6106. return '<fieldset id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + (self.settings.title ? '<legend id="' + self._id + '-title" class="' + prefix + 'fieldset-title">' + self.settings.title + '</legend>' : '') + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + (self.settings.html || '') + layout.renderHtml(self) + '</div>' + '</fieldset>';
  6107. }
  6108. });
  6109. var unique$1 = 0;
  6110. var generate = function (prefix) {
  6111. var date = new Date();
  6112. var time = date.getTime();
  6113. var random = Math.floor(Math.random() * 1000000000);
  6114. unique$1++;
  6115. return prefix + '_' + random + unique$1 + String(time);
  6116. };
  6117. var fromHtml = function (html, scope) {
  6118. var doc = scope || domGlobals.document;
  6119. var div = doc.createElement('div');
  6120. div.innerHTML = html;
  6121. if (!div.hasChildNodes() || div.childNodes.length > 1) {
  6122. domGlobals.console.error('HTML does not have a single root node', html);
  6123. throw new Error('HTML must have a single root node');
  6124. }
  6125. return fromDom(div.childNodes[0]);
  6126. };
  6127. var fromTag = function (tag, scope) {
  6128. var doc = scope || domGlobals.document;
  6129. var node = doc.createElement(tag);
  6130. return fromDom(node);
  6131. };
  6132. var fromText = function (text, scope) {
  6133. var doc = scope || domGlobals.document;
  6134. var node = doc.createTextNode(text);
  6135. return fromDom(node);
  6136. };
  6137. var fromDom = function (node) {
  6138. if (node === null || node === undefined) {
  6139. throw new Error('Node cannot be null or undefined');
  6140. }
  6141. return { dom: constant(node) };
  6142. };
  6143. var fromPoint = function (docElm, x, y) {
  6144. var doc = docElm.dom();
  6145. return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
  6146. };
  6147. var Element = {
  6148. fromHtml: fromHtml,
  6149. fromTag: fromTag,
  6150. fromText: fromText,
  6151. fromDom: fromDom,
  6152. fromPoint: fromPoint
  6153. };
  6154. var cached = function (f) {
  6155. var called = false;
  6156. var r;
  6157. return function () {
  6158. var args = [];
  6159. for (var _i = 0; _i < arguments.length; _i++) {
  6160. args[_i] = arguments[_i];
  6161. }
  6162. if (!called) {
  6163. called = true;
  6164. r = f.apply(null, args);
  6165. }
  6166. return r;
  6167. };
  6168. };
  6169. var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
  6170. var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
  6171. var COMMENT = domGlobals.Node.COMMENT_NODE;
  6172. var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
  6173. var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
  6174. var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
  6175. var ELEMENT = domGlobals.Node.ELEMENT_NODE;
  6176. var TEXT = domGlobals.Node.TEXT_NODE;
  6177. var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
  6178. var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
  6179. var ENTITY = domGlobals.Node.ENTITY_NODE;
  6180. var NOTATION = domGlobals.Node.NOTATION_NODE;
  6181. var Immutable = function () {
  6182. var fields = [];
  6183. for (var _i = 0; _i < arguments.length; _i++) {
  6184. fields[_i] = arguments[_i];
  6185. }
  6186. return function () {
  6187. var values = [];
  6188. for (var _i = 0; _i < arguments.length; _i++) {
  6189. values[_i] = arguments[_i];
  6190. }
  6191. if (fields.length !== values.length) {
  6192. throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments');
  6193. }
  6194. var struct = {};
  6195. each(fields, function (name, i) {
  6196. struct[name] = constant(values[i]);
  6197. });
  6198. return struct;
  6199. };
  6200. };
  6201. var node = function () {
  6202. var f = Global$1.getOrDie('Node');
  6203. return f;
  6204. };
  6205. var compareDocumentPosition = function (a, b, match) {
  6206. return (a.compareDocumentPosition(b) & match) !== 0;
  6207. };
  6208. var documentPositionPreceding = function (a, b) {
  6209. return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
  6210. };
  6211. var documentPositionContainedBy = function (a, b) {
  6212. return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
  6213. };
  6214. var Node = {
  6215. documentPositionPreceding: documentPositionPreceding,
  6216. documentPositionContainedBy: documentPositionContainedBy
  6217. };
  6218. var firstMatch = function (regexes, s) {
  6219. for (var i = 0; i < regexes.length; i++) {
  6220. var x = regexes[i];
  6221. if (x.test(s)) {
  6222. return x;
  6223. }
  6224. }
  6225. return undefined;
  6226. };
  6227. var find$1 = function (regexes, agent) {
  6228. var r = firstMatch(regexes, agent);
  6229. if (!r) {
  6230. return {
  6231. major: 0,
  6232. minor: 0
  6233. };
  6234. }
  6235. var group = function (i) {
  6236. return Number(agent.replace(r, '$' + i));
  6237. };
  6238. return nu(group(1), group(2));
  6239. };
  6240. var detect = function (versionRegexes, agent) {
  6241. var cleanedAgent = String(agent).toLowerCase();
  6242. if (versionRegexes.length === 0) {
  6243. return unknown();
  6244. }
  6245. return find$1(versionRegexes, cleanedAgent);
  6246. };
  6247. var unknown = function () {
  6248. return nu(0, 0);
  6249. };
  6250. var nu = function (major, minor) {
  6251. return {
  6252. major: major,
  6253. minor: minor
  6254. };
  6255. };
  6256. var Version = {
  6257. nu: nu,
  6258. detect: detect,
  6259. unknown: unknown
  6260. };
  6261. var edge = 'Edge';
  6262. var chrome = 'Chrome';
  6263. var ie = 'IE';
  6264. var opera = 'Opera';
  6265. var firefox = 'Firefox';
  6266. var safari = 'Safari';
  6267. var isBrowser = function (name, current) {
  6268. return function () {
  6269. return current === name;
  6270. };
  6271. };
  6272. var unknown$1 = function () {
  6273. return nu$1({
  6274. current: undefined,
  6275. version: Version.unknown()
  6276. });
  6277. };
  6278. var nu$1 = function (info) {
  6279. var current = info.current;
  6280. var version = info.version;
  6281. return {
  6282. current: current,
  6283. version: version,
  6284. isEdge: isBrowser(edge, current),
  6285. isChrome: isBrowser(chrome, current),
  6286. isIE: isBrowser(ie, current),
  6287. isOpera: isBrowser(opera, current),
  6288. isFirefox: isBrowser(firefox, current),
  6289. isSafari: isBrowser(safari, current)
  6290. };
  6291. };
  6292. var Browser = {
  6293. unknown: unknown$1,
  6294. nu: nu$1,
  6295. edge: constant(edge),
  6296. chrome: constant(chrome),
  6297. ie: constant(ie),
  6298. opera: constant(opera),
  6299. firefox: constant(firefox),
  6300. safari: constant(safari)
  6301. };
  6302. var windows$1 = 'Windows';
  6303. var ios = 'iOS';
  6304. var android = 'Android';
  6305. var linux = 'Linux';
  6306. var osx = 'OSX';
  6307. var solaris = 'Solaris';
  6308. var freebsd = 'FreeBSD';
  6309. var isOS = function (name, current) {
  6310. return function () {
  6311. return current === name;
  6312. };
  6313. };
  6314. var unknown$2 = function () {
  6315. return nu$2({
  6316. current: undefined,
  6317. version: Version.unknown()
  6318. });
  6319. };
  6320. var nu$2 = function (info) {
  6321. var current = info.current;
  6322. var version = info.version;
  6323. return {
  6324. current: current,
  6325. version: version,
  6326. isWindows: isOS(windows$1, current),
  6327. isiOS: isOS(ios, current),
  6328. isAndroid: isOS(android, current),
  6329. isOSX: isOS(osx, current),
  6330. isLinux: isOS(linux, current),
  6331. isSolaris: isOS(solaris, current),
  6332. isFreeBSD: isOS(freebsd, current)
  6333. };
  6334. };
  6335. var OperatingSystem = {
  6336. unknown: unknown$2,
  6337. nu: nu$2,
  6338. windows: constant(windows$1),
  6339. ios: constant(ios),
  6340. android: constant(android),
  6341. linux: constant(linux),
  6342. osx: constant(osx),
  6343. solaris: constant(solaris),
  6344. freebsd: constant(freebsd)
  6345. };
  6346. var DeviceType = function (os, browser, userAgent) {
  6347. var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
  6348. var isiPhone = os.isiOS() && !isiPad;
  6349. var isAndroid3 = os.isAndroid() && os.version.major === 3;
  6350. var isAndroid4 = os.isAndroid() && os.version.major === 4;
  6351. var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true;
  6352. var isTouch = os.isiOS() || os.isAndroid();
  6353. var isPhone = isTouch && !isTablet;
  6354. var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
  6355. return {
  6356. isiPad: constant(isiPad),
  6357. isiPhone: constant(isiPhone),
  6358. isTablet: constant(isTablet),
  6359. isPhone: constant(isPhone),
  6360. isTouch: constant(isTouch),
  6361. isAndroid: os.isAndroid,
  6362. isiOS: os.isiOS,
  6363. isWebView: constant(iOSwebview)
  6364. };
  6365. };
  6366. var detect$1 = function (candidates, userAgent) {
  6367. var agent = String(userAgent).toLowerCase();
  6368. return find(candidates, function (candidate) {
  6369. return candidate.search(agent);
  6370. });
  6371. };
  6372. var detectBrowser = function (browsers, userAgent) {
  6373. return detect$1(browsers, userAgent).map(function (browser) {
  6374. var version = Version.detect(browser.versionRegexes, userAgent);
  6375. return {
  6376. current: browser.name,
  6377. version: version
  6378. };
  6379. });
  6380. };
  6381. var detectOs = function (oses, userAgent) {
  6382. return detect$1(oses, userAgent).map(function (os) {
  6383. var version = Version.detect(os.versionRegexes, userAgent);
  6384. return {
  6385. current: os.name,
  6386. version: version
  6387. };
  6388. });
  6389. };
  6390. var UaString = {
  6391. detectBrowser: detectBrowser,
  6392. detectOs: detectOs
  6393. };
  6394. var contains = function (str, substr) {
  6395. return str.indexOf(substr) !== -1;
  6396. };
  6397. var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
  6398. var checkContains = function (target) {
  6399. return function (uastring) {
  6400. return contains(uastring, target);
  6401. };
  6402. };
  6403. var browsers = [
  6404. {
  6405. name: 'Edge',
  6406. versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
  6407. search: function (uastring) {
  6408. return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
  6409. }
  6410. },
  6411. {
  6412. name: 'Chrome',
  6413. versionRegexes: [
  6414. /.*?chrome\/([0-9]+)\.([0-9]+).*/,
  6415. normalVersionRegex
  6416. ],
  6417. search: function (uastring) {
  6418. return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
  6419. }
  6420. },
  6421. {
  6422. name: 'IE',
  6423. versionRegexes: [
  6424. /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
  6425. /.*?rv:([0-9]+)\.([0-9]+).*/
  6426. ],
  6427. search: function (uastring) {
  6428. return contains(uastring, 'msie') || contains(uastring, 'trident');
  6429. }
  6430. },
  6431. {
  6432. name: 'Opera',
  6433. versionRegexes: [
  6434. normalVersionRegex,
  6435. /.*?opera\/([0-9]+)\.([0-9]+).*/
  6436. ],
  6437. search: checkContains('opera')
  6438. },
  6439. {
  6440. name: 'Firefox',
  6441. versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
  6442. search: checkContains('firefox')
  6443. },
  6444. {
  6445. name: 'Safari',
  6446. versionRegexes: [
  6447. normalVersionRegex,
  6448. /.*?cpu os ([0-9]+)_([0-9]+).*/
  6449. ],
  6450. search: function (uastring) {
  6451. return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
  6452. }
  6453. }
  6454. ];
  6455. var oses = [
  6456. {
  6457. name: 'Windows',
  6458. search: checkContains('win'),
  6459. versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
  6460. },
  6461. {
  6462. name: 'iOS',
  6463. search: function (uastring) {
  6464. return contains(uastring, 'iphone') || contains(uastring, 'ipad');
  6465. },
  6466. versionRegexes: [
  6467. /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
  6468. /.*cpu os ([0-9]+)_([0-9]+).*/,
  6469. /.*cpu iphone os ([0-9]+)_([0-9]+).*/
  6470. ]
  6471. },
  6472. {
  6473. name: 'Android',
  6474. search: checkContains('android'),
  6475. versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
  6476. },
  6477. {
  6478. name: 'OSX',
  6479. search: checkContains('os x'),
  6480. versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
  6481. },
  6482. {
  6483. name: 'Linux',
  6484. search: checkContains('linux'),
  6485. versionRegexes: []
  6486. },
  6487. {
  6488. name: 'Solaris',
  6489. search: checkContains('sunos'),
  6490. versionRegexes: []
  6491. },
  6492. {
  6493. name: 'FreeBSD',
  6494. search: checkContains('freebsd'),
  6495. versionRegexes: []
  6496. }
  6497. ];
  6498. var PlatformInfo = {
  6499. browsers: constant(browsers),
  6500. oses: constant(oses)
  6501. };
  6502. var detect$2 = function (userAgent) {
  6503. var browsers = PlatformInfo.browsers();
  6504. var oses = PlatformInfo.oses();
  6505. var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);
  6506. var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
  6507. var deviceType = DeviceType(os, browser, userAgent);
  6508. return {
  6509. browser: browser,
  6510. os: os,
  6511. deviceType: deviceType
  6512. };
  6513. };
  6514. var PlatformDetection = { detect: detect$2 };
  6515. var detect$3 = cached(function () {
  6516. var userAgent = domGlobals.navigator.userAgent;
  6517. return PlatformDetection.detect(userAgent);
  6518. });
  6519. var PlatformDetection$1 = { detect: detect$3 };
  6520. var ELEMENT$1 = ELEMENT;
  6521. var DOCUMENT$1 = DOCUMENT;
  6522. var bypassSelector = function (dom) {
  6523. return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;
  6524. };
  6525. var all = function (selector, scope) {
  6526. var base = scope === undefined ? domGlobals.document : scope.dom();
  6527. return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);
  6528. };
  6529. var one = function (selector, scope) {
  6530. var base = scope === undefined ? domGlobals.document : scope.dom();
  6531. return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);
  6532. };
  6533. var regularContains = function (e1, e2) {
  6534. var d1 = e1.dom();
  6535. var d2 = e2.dom();
  6536. return d1 === d2 ? false : d1.contains(d2);
  6537. };
  6538. var ieContains = function (e1, e2) {
  6539. return Node.documentPositionContainedBy(e1.dom(), e2.dom());
  6540. };
  6541. var browser = PlatformDetection$1.detect().browser;
  6542. var contains$1 = browser.isIE() ? ieContains : regularContains;
  6543. var spot = Immutable('element', 'offset');
  6544. var descendants = function (scope, selector) {
  6545. return all(selector, scope);
  6546. };
  6547. var trim = global$4.trim;
  6548. var hasContentEditableState = function (value) {
  6549. return function (node) {
  6550. if (node && node.nodeType === 1) {
  6551. if (node.contentEditable === value) {
  6552. return true;
  6553. }
  6554. if (node.getAttribute('data-mce-contenteditable') === value) {
  6555. return true;
  6556. }
  6557. }
  6558. return false;
  6559. };
  6560. };
  6561. var isContentEditableTrue = hasContentEditableState('true');
  6562. var isContentEditableFalse = hasContentEditableState('false');
  6563. var create$4 = function (type, title, url, level, attach) {
  6564. return {
  6565. type: type,
  6566. title: title,
  6567. url: url,
  6568. level: level,
  6569. attach: attach
  6570. };
  6571. };
  6572. var isChildOfContentEditableTrue = function (node) {
  6573. while (node = node.parentNode) {
  6574. var value = node.contentEditable;
  6575. if (value && value !== 'inherit') {
  6576. return isContentEditableTrue(node);
  6577. }
  6578. }
  6579. return false;
  6580. };
  6581. var select = function (selector, root) {
  6582. return map(descendants(Element.fromDom(root), selector), function (element) {
  6583. return element.dom();
  6584. });
  6585. };
  6586. var getElementText = function (elm) {
  6587. return elm.innerText || elm.textContent;
  6588. };
  6589. var getOrGenerateId = function (elm) {
  6590. return elm.id ? elm.id : generate('h');
  6591. };
  6592. var isAnchor = function (elm) {
  6593. return elm && elm.nodeName === 'A' && (elm.id || elm.name);
  6594. };
  6595. var isValidAnchor = function (elm) {
  6596. return isAnchor(elm) && isEditable(elm);
  6597. };
  6598. var isHeader = function (elm) {
  6599. return elm && /^(H[1-6])$/.test(elm.nodeName);
  6600. };
  6601. var isEditable = function (elm) {
  6602. return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm);
  6603. };
  6604. var isValidHeader = function (elm) {
  6605. return isHeader(elm) && isEditable(elm);
  6606. };
  6607. var getLevel = function (elm) {
  6608. return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0;
  6609. };
  6610. var headerTarget = function (elm) {
  6611. var headerId = getOrGenerateId(elm);
  6612. var attach = function () {
  6613. elm.id = headerId;
  6614. };
  6615. return create$4('header', getElementText(elm), '#' + headerId, getLevel(elm), attach);
  6616. };
  6617. var anchorTarget = function (elm) {
  6618. var anchorId = elm.id || elm.name;
  6619. var anchorText = getElementText(elm);
  6620. return create$4('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop);
  6621. };
  6622. var getHeaderTargets = function (elms) {
  6623. return map(filter(elms, isValidHeader), headerTarget);
  6624. };
  6625. var getAnchorTargets = function (elms) {
  6626. return map(filter(elms, isValidAnchor), anchorTarget);
  6627. };
  6628. var getTargetElements = function (elm) {
  6629. var elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm);
  6630. return elms;
  6631. };
  6632. var hasTitle = function (target) {
  6633. return trim(target.title).length > 0;
  6634. };
  6635. var find$2 = function (elm) {
  6636. var elms = getTargetElements(elm);
  6637. return filter(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle);
  6638. };
  6639. var LinkTargets = { find: find$2 };
  6640. var getActiveEditor = function () {
  6641. return window.tinymce ? window.tinymce.activeEditor : global$5.activeEditor;
  6642. };
  6643. var history = {};
  6644. var HISTORY_LENGTH = 5;
  6645. var clearHistory = function () {
  6646. history = {};
  6647. };
  6648. var toMenuItem = function (target) {
  6649. return {
  6650. title: target.title,
  6651. value: {
  6652. title: { raw: target.title },
  6653. url: target.url,
  6654. attach: target.attach
  6655. }
  6656. };
  6657. };
  6658. var toMenuItems = function (targets) {
  6659. return global$4.map(targets, toMenuItem);
  6660. };
  6661. var staticMenuItem = function (title, url) {
  6662. return {
  6663. title: title,
  6664. value: {
  6665. title: title,
  6666. url: url,
  6667. attach: noop
  6668. }
  6669. };
  6670. };
  6671. var isUniqueUrl = function (url, targets) {
  6672. var foundTarget = exists(targets, function (target) {
  6673. return target.url === url;
  6674. });
  6675. return !foundTarget;
  6676. };
  6677. var getSetting = function (editorSettings, name, defaultValue) {
  6678. var value = name in editorSettings ? editorSettings[name] : defaultValue;
  6679. return value === false ? null : value;
  6680. };
  6681. var createMenuItems = function (term, targets, fileType, editorSettings) {
  6682. var separator = { title: '-' };
  6683. var fromHistoryMenuItems = function (history) {
  6684. var historyItems = history.hasOwnProperty(fileType) ? history[fileType] : [];
  6685. var uniqueHistory = filter(historyItems, function (url) {
  6686. return isUniqueUrl(url, targets);
  6687. });
  6688. return global$4.map(uniqueHistory, function (url) {
  6689. return {
  6690. title: url,
  6691. value: {
  6692. title: url,
  6693. url: url,
  6694. attach: noop
  6695. }
  6696. };
  6697. });
  6698. };
  6699. var fromMenuItems = function (type) {
  6700. var filteredTargets = filter(targets, function (target) {
  6701. return target.type === type;
  6702. });
  6703. return toMenuItems(filteredTargets);
  6704. };
  6705. var anchorMenuItems = function () {
  6706. var anchorMenuItems = fromMenuItems('anchor');
  6707. var topAnchor = getSetting(editorSettings, 'anchor_top', '#top');
  6708. var bottomAchor = getSetting(editorSettings, 'anchor_bottom', '#bottom');
  6709. if (topAnchor !== null) {
  6710. anchorMenuItems.unshift(staticMenuItem('<top>', topAnchor));
  6711. }
  6712. if (bottomAchor !== null) {
  6713. anchorMenuItems.push(staticMenuItem('<bottom>', bottomAchor));
  6714. }
  6715. return anchorMenuItems;
  6716. };
  6717. var join = function (items) {
  6718. return foldl(items, function (a, b) {
  6719. var bothEmpty = a.length === 0 || b.length === 0;
  6720. return bothEmpty ? a.concat(b) : a.concat(separator, b);
  6721. }, []);
  6722. };
  6723. if (editorSettings.typeahead_urls === false) {
  6724. return [];
  6725. }
  6726. return fileType === 'file' ? join([
  6727. filterByQuery(term, fromHistoryMenuItems(history)),
  6728. filterByQuery(term, fromMenuItems('header')),
  6729. filterByQuery(term, anchorMenuItems())
  6730. ]) : filterByQuery(term, fromHistoryMenuItems(history));
  6731. };
  6732. var addToHistory = function (url, fileType) {
  6733. var items = history[fileType];
  6734. if (!/^https?/.test(url)) {
  6735. return;
  6736. }
  6737. if (items) {
  6738. if (indexOf(items, url).isNone()) {
  6739. history[fileType] = items.slice(0, HISTORY_LENGTH).concat(url);
  6740. }
  6741. } else {
  6742. history[fileType] = [url];
  6743. }
  6744. };
  6745. var filterByQuery = function (term, menuItems) {
  6746. var lowerCaseTerm = term.toLowerCase();
  6747. var result = global$4.grep(menuItems, function (item) {
  6748. return item.title.toLowerCase().indexOf(lowerCaseTerm) !== -1;
  6749. });
  6750. return result.length === 1 && result[0].title === term ? [] : result;
  6751. };
  6752. var getTitle = function (linkDetails) {
  6753. var title = linkDetails.title;
  6754. return title.raw ? title.raw : title;
  6755. };
  6756. var setupAutoCompleteHandler = function (ctrl, editorSettings, bodyElm, fileType) {
  6757. var autocomplete = function (term) {
  6758. var linkTargets = LinkTargets.find(bodyElm);
  6759. var menuItems = createMenuItems(term, linkTargets, fileType, editorSettings);
  6760. ctrl.showAutoComplete(menuItems, term);
  6761. };
  6762. ctrl.on('autocomplete', function () {
  6763. autocomplete(ctrl.value());
  6764. });
  6765. ctrl.on('selectitem', function (e) {
  6766. var linkDetails = e.value;
  6767. ctrl.value(linkDetails.url);
  6768. var title = getTitle(linkDetails);
  6769. if (fileType === 'image') {
  6770. ctrl.fire('change', {
  6771. meta: {
  6772. alt: title,
  6773. attach: linkDetails.attach
  6774. }
  6775. });
  6776. } else {
  6777. ctrl.fire('change', {
  6778. meta: {
  6779. text: title,
  6780. attach: linkDetails.attach
  6781. }
  6782. });
  6783. }
  6784. ctrl.focus();
  6785. });
  6786. ctrl.on('click', function (e) {
  6787. if (ctrl.value().length === 0 && e.target.nodeName === 'INPUT') {
  6788. autocomplete('');
  6789. }
  6790. });
  6791. ctrl.on('PostRender', function () {
  6792. ctrl.getRoot().on('submit', function (e) {
  6793. if (!e.isDefaultPrevented()) {
  6794. addToHistory(ctrl.value(), fileType);
  6795. }
  6796. });
  6797. });
  6798. };
  6799. var statusToUiState = function (result) {
  6800. var status = result.status, message = result.message;
  6801. if (status === 'valid') {
  6802. return {
  6803. status: 'ok',
  6804. message: message
  6805. };
  6806. } else if (status === 'unknown') {
  6807. return {
  6808. status: 'warn',
  6809. message: message
  6810. };
  6811. } else if (status === 'invalid') {
  6812. return {
  6813. status: 'warn',
  6814. message: message
  6815. };
  6816. } else {
  6817. return {
  6818. status: 'none',
  6819. message: ''
  6820. };
  6821. }
  6822. };
  6823. var setupLinkValidatorHandler = function (ctrl, editorSettings, fileType) {
  6824. var validatorHandler = editorSettings.filepicker_validator_handler;
  6825. if (validatorHandler) {
  6826. var validateUrl_1 = function (url) {
  6827. if (url.length === 0) {
  6828. ctrl.statusLevel('none');
  6829. return;
  6830. }
  6831. validatorHandler({
  6832. url: url,
  6833. type: fileType
  6834. }, function (result) {
  6835. var uiState = statusToUiState(result);
  6836. ctrl.statusMessage(uiState.message);
  6837. ctrl.statusLevel(uiState.status);
  6838. });
  6839. };
  6840. ctrl.state.on('change:value', function (e) {
  6841. validateUrl_1(e.value);
  6842. });
  6843. }
  6844. };
  6845. var FilePicker = ComboBox.extend({
  6846. Statics: { clearHistory: clearHistory },
  6847. init: function (settings) {
  6848. var self = this, editor = getActiveEditor(), editorSettings = editor.settings;
  6849. var actionCallback, fileBrowserCallback, fileBrowserCallbackTypes;
  6850. var fileType = settings.filetype;
  6851. settings.spellcheck = false;
  6852. fileBrowserCallbackTypes = editorSettings.file_picker_types || editorSettings.file_browser_callback_types;
  6853. if (fileBrowserCallbackTypes) {
  6854. fileBrowserCallbackTypes = global$4.makeMap(fileBrowserCallbackTypes, /[, ]/);
  6855. }
  6856. if (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType]) {
  6857. fileBrowserCallback = editorSettings.file_picker_callback;
  6858. if (fileBrowserCallback && (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType])) {
  6859. actionCallback = function () {
  6860. var meta = self.fire('beforecall').meta;
  6861. meta = global$4.extend({ filetype: fileType }, meta);
  6862. fileBrowserCallback.call(editor, function (value, meta) {
  6863. self.value(value).fire('change', { meta: meta });
  6864. }, self.value(), meta);
  6865. };
  6866. } else {
  6867. fileBrowserCallback = editorSettings.file_browser_callback;
  6868. if (fileBrowserCallback && (!fileBrowserCallbackTypes || fileBrowserCallbackTypes[fileType])) {
  6869. actionCallback = function () {
  6870. fileBrowserCallback(self.getEl('inp').id, self.value(), fileType, window);
  6871. };
  6872. }
  6873. }
  6874. }
  6875. if (actionCallback) {
  6876. settings.icon = 'browse';
  6877. settings.onaction = actionCallback;
  6878. }
  6879. self._super(settings);
  6880. self.classes.add('filepicker');
  6881. setupAutoCompleteHandler(self, editorSettings, editor.getBody(), fileType);
  6882. setupLinkValidatorHandler(self, editorSettings, fileType);
  6883. }
  6884. });
  6885. var FitLayout = AbsoluteLayout.extend({
  6886. recalc: function (container) {
  6887. var contLayoutRect = container.layoutRect(), paddingBox = container.paddingBox;
  6888. container.items().filter(':visible').each(function (ctrl) {
  6889. ctrl.layoutRect({
  6890. x: paddingBox.left,
  6891. y: paddingBox.top,
  6892. w: contLayoutRect.innerW - paddingBox.right - paddingBox.left,
  6893. h: contLayoutRect.innerH - paddingBox.top - paddingBox.bottom
  6894. });
  6895. if (ctrl.recalc) {
  6896. ctrl.recalc();
  6897. }
  6898. });
  6899. }
  6900. });
  6901. var FlexLayout = AbsoluteLayout.extend({
  6902. recalc: function (container) {
  6903. var i, l, items, contLayoutRect, contPaddingBox, contSettings, align, pack, spacing, totalFlex, availableSpace, direction;
  6904. var ctrl, ctrlLayoutRect, ctrlSettings, flex;
  6905. var maxSizeItems = [];
  6906. var size, maxSize, ratio, rect, pos, maxAlignEndPos;
  6907. var sizeName, minSizeName, posName, maxSizeName, beforeName, innerSizeName, deltaSizeName, contentSizeName;
  6908. var alignAxisName, alignInnerSizeName, alignSizeName, alignMinSizeName, alignBeforeName, alignAfterName;
  6909. var alignDeltaSizeName, alignContentSizeName;
  6910. var max = Math.max, min = Math.min;
  6911. items = container.items().filter(':visible');
  6912. contLayoutRect = container.layoutRect();
  6913. contPaddingBox = container.paddingBox;
  6914. contSettings = container.settings;
  6915. direction = container.isRtl() ? contSettings.direction || 'row-reversed' : contSettings.direction;
  6916. align = contSettings.align;
  6917. pack = container.isRtl() ? contSettings.pack || 'end' : contSettings.pack;
  6918. spacing = contSettings.spacing || 0;
  6919. if (direction === 'row-reversed' || direction === 'column-reverse') {
  6920. items = items.set(items.toArray().reverse());
  6921. direction = direction.split('-')[0];
  6922. }
  6923. if (direction === 'column') {
  6924. posName = 'y';
  6925. sizeName = 'h';
  6926. minSizeName = 'minH';
  6927. maxSizeName = 'maxH';
  6928. innerSizeName = 'innerH';
  6929. beforeName = 'top';
  6930. deltaSizeName = 'deltaH';
  6931. contentSizeName = 'contentH';
  6932. alignBeforeName = 'left';
  6933. alignSizeName = 'w';
  6934. alignAxisName = 'x';
  6935. alignInnerSizeName = 'innerW';
  6936. alignMinSizeName = 'minW';
  6937. alignAfterName = 'right';
  6938. alignDeltaSizeName = 'deltaW';
  6939. alignContentSizeName = 'contentW';
  6940. } else {
  6941. posName = 'x';
  6942. sizeName = 'w';
  6943. minSizeName = 'minW';
  6944. maxSizeName = 'maxW';
  6945. innerSizeName = 'innerW';
  6946. beforeName = 'left';
  6947. deltaSizeName = 'deltaW';
  6948. contentSizeName = 'contentW';
  6949. alignBeforeName = 'top';
  6950. alignSizeName = 'h';
  6951. alignAxisName = 'y';
  6952. alignInnerSizeName = 'innerH';
  6953. alignMinSizeName = 'minH';
  6954. alignAfterName = 'bottom';
  6955. alignDeltaSizeName = 'deltaH';
  6956. alignContentSizeName = 'contentH';
  6957. }
  6958. availableSpace = contLayoutRect[innerSizeName] - contPaddingBox[beforeName] - contPaddingBox[beforeName];
  6959. maxAlignEndPos = totalFlex = 0;
  6960. for (i = 0, l = items.length; i < l; i++) {
  6961. ctrl = items[i];
  6962. ctrlLayoutRect = ctrl.layoutRect();
  6963. ctrlSettings = ctrl.settings;
  6964. flex = ctrlSettings.flex;
  6965. availableSpace -= i < l - 1 ? spacing : 0;
  6966. if (flex > 0) {
  6967. totalFlex += flex;
  6968. if (ctrlLayoutRect[maxSizeName]) {
  6969. maxSizeItems.push(ctrl);
  6970. }
  6971. ctrlLayoutRect.flex = flex;
  6972. }
  6973. availableSpace -= ctrlLayoutRect[minSizeName];
  6974. size = contPaddingBox[alignBeforeName] + ctrlLayoutRect[alignMinSizeName] + contPaddingBox[alignAfterName];
  6975. if (size > maxAlignEndPos) {
  6976. maxAlignEndPos = size;
  6977. }
  6978. }
  6979. rect = {};
  6980. if (availableSpace < 0) {
  6981. rect[minSizeName] = contLayoutRect[minSizeName] - availableSpace + contLayoutRect[deltaSizeName];
  6982. } else {
  6983. rect[minSizeName] = contLayoutRect[innerSizeName] - availableSpace + contLayoutRect[deltaSizeName];
  6984. }
  6985. rect[alignMinSizeName] = maxAlignEndPos + contLayoutRect[alignDeltaSizeName];
  6986. rect[contentSizeName] = contLayoutRect[innerSizeName] - availableSpace;
  6987. rect[alignContentSizeName] = maxAlignEndPos;
  6988. rect.minW = min(rect.minW, contLayoutRect.maxW);
  6989. rect.minH = min(rect.minH, contLayoutRect.maxH);
  6990. rect.minW = max(rect.minW, contLayoutRect.startMinWidth);
  6991. rect.minH = max(rect.minH, contLayoutRect.startMinHeight);
  6992. if (contLayoutRect.autoResize && (rect.minW !== contLayoutRect.minW || rect.minH !== contLayoutRect.minH)) {
  6993. rect.w = rect.minW;
  6994. rect.h = rect.minH;
  6995. container.layoutRect(rect);
  6996. this.recalc(container);
  6997. if (container._lastRect === null) {
  6998. var parentCtrl = container.parent();
  6999. if (parentCtrl) {
  7000. parentCtrl._lastRect = null;
  7001. parentCtrl.recalc();
  7002. }
  7003. }
  7004. return;
  7005. }
  7006. ratio = availableSpace / totalFlex;
  7007. for (i = 0, l = maxSizeItems.length; i < l; i++) {
  7008. ctrl = maxSizeItems[i];
  7009. ctrlLayoutRect = ctrl.layoutRect();
  7010. maxSize = ctrlLayoutRect[maxSizeName];
  7011. size = ctrlLayoutRect[minSizeName] + ctrlLayoutRect.flex * ratio;
  7012. if (size > maxSize) {
  7013. availableSpace -= ctrlLayoutRect[maxSizeName] - ctrlLayoutRect[minSizeName];
  7014. totalFlex -= ctrlLayoutRect.flex;
  7015. ctrlLayoutRect.flex = 0;
  7016. ctrlLayoutRect.maxFlexSize = maxSize;
  7017. } else {
  7018. ctrlLayoutRect.maxFlexSize = 0;
  7019. }
  7020. }
  7021. ratio = availableSpace / totalFlex;
  7022. pos = contPaddingBox[beforeName];
  7023. rect = {};
  7024. if (totalFlex === 0) {
  7025. if (pack === 'end') {
  7026. pos = availableSpace + contPaddingBox[beforeName];
  7027. } else if (pack === 'center') {
  7028. pos = Math.round(contLayoutRect[innerSizeName] / 2 - (contLayoutRect[innerSizeName] - availableSpace) / 2) + contPaddingBox[beforeName];
  7029. if (pos < 0) {
  7030. pos = contPaddingBox[beforeName];
  7031. }
  7032. } else if (pack === 'justify') {
  7033. pos = contPaddingBox[beforeName];
  7034. spacing = Math.floor(availableSpace / (items.length - 1));
  7035. }
  7036. }
  7037. rect[alignAxisName] = contPaddingBox[alignBeforeName];
  7038. for (i = 0, l = items.length; i < l; i++) {
  7039. ctrl = items[i];
  7040. ctrlLayoutRect = ctrl.layoutRect();
  7041. size = ctrlLayoutRect.maxFlexSize || ctrlLayoutRect[minSizeName];
  7042. if (align === 'center') {
  7043. rect[alignAxisName] = Math.round(contLayoutRect[alignInnerSizeName] / 2 - ctrlLayoutRect[alignSizeName] / 2);
  7044. } else if (align === 'stretch') {
  7045. rect[alignSizeName] = max(ctrlLayoutRect[alignMinSizeName] || 0, contLayoutRect[alignInnerSizeName] - contPaddingBox[alignBeforeName] - contPaddingBox[alignAfterName]);
  7046. rect[alignAxisName] = contPaddingBox[alignBeforeName];
  7047. } else if (align === 'end') {
  7048. rect[alignAxisName] = contLayoutRect[alignInnerSizeName] - ctrlLayoutRect[alignSizeName] - contPaddingBox.top;
  7049. }
  7050. if (ctrlLayoutRect.flex > 0) {
  7051. size += ctrlLayoutRect.flex * ratio;
  7052. }
  7053. rect[sizeName] = size;
  7054. rect[posName] = pos;
  7055. ctrl.layoutRect(rect);
  7056. if (ctrl.recalc) {
  7057. ctrl.recalc();
  7058. }
  7059. pos += size + spacing;
  7060. }
  7061. }
  7062. });
  7063. var FlowLayout = Layout$1.extend({
  7064. Defaults: {
  7065. containerClass: 'flow-layout',
  7066. controlClass: 'flow-layout-item',
  7067. endClass: 'break'
  7068. },
  7069. recalc: function (container) {
  7070. container.items().filter(':visible').each(function (ctrl) {
  7071. if (ctrl.recalc) {
  7072. ctrl.recalc();
  7073. }
  7074. });
  7075. },
  7076. isNative: function () {
  7077. return true;
  7078. }
  7079. });
  7080. var descendant = function (scope, selector) {
  7081. return one(selector, scope);
  7082. };
  7083. var toggleFormat = function (editor, fmt) {
  7084. return function () {
  7085. editor.execCommand('mceToggleFormat', false, fmt);
  7086. };
  7087. };
  7088. var addFormatChangedListener = function (editor, name, changed) {
  7089. var handler = function (state) {
  7090. changed(state, name);
  7091. };
  7092. if (editor.formatter) {
  7093. editor.formatter.formatChanged(name, handler);
  7094. } else {
  7095. editor.on('init', function () {
  7096. editor.formatter.formatChanged(name, handler);
  7097. });
  7098. }
  7099. };
  7100. var postRenderFormatToggle = function (editor, name) {
  7101. return function (e) {
  7102. addFormatChangedListener(editor, name, function (state) {
  7103. e.control.active(state);
  7104. });
  7105. };
  7106. };
  7107. var register = function (editor) {
  7108. var alignFormats = [
  7109. 'alignleft',
  7110. 'aligncenter',
  7111. 'alignright',
  7112. 'alignjustify'
  7113. ];
  7114. var defaultAlign = 'alignleft';
  7115. var alignMenuItems = [
  7116. {
  7117. text: 'Left',
  7118. icon: 'alignleft',
  7119. onclick: toggleFormat(editor, 'alignleft')
  7120. },
  7121. {
  7122. text: 'Center',
  7123. icon: 'aligncenter',
  7124. onclick: toggleFormat(editor, 'aligncenter')
  7125. },
  7126. {
  7127. text: 'Right',
  7128. icon: 'alignright',
  7129. onclick: toggleFormat(editor, 'alignright')
  7130. },
  7131. {
  7132. text: 'Justify',
  7133. icon: 'alignjustify',
  7134. onclick: toggleFormat(editor, 'alignjustify')
  7135. }
  7136. ];
  7137. editor.addMenuItem('align', {
  7138. text: 'Align',
  7139. menu: alignMenuItems
  7140. });
  7141. editor.addButton('align', {
  7142. type: 'menubutton',
  7143. icon: defaultAlign,
  7144. menu: alignMenuItems,
  7145. onShowMenu: function (e) {
  7146. var menu = e.control.menu;
  7147. global$4.each(alignFormats, function (formatName, idx) {
  7148. menu.items().eq(idx).each(function (item) {
  7149. return item.active(editor.formatter.match(formatName));
  7150. });
  7151. });
  7152. },
  7153. onPostRender: function (e) {
  7154. var ctrl = e.control;
  7155. global$4.each(alignFormats, function (formatName, idx) {
  7156. addFormatChangedListener(editor, formatName, function (state) {
  7157. ctrl.icon(defaultAlign);
  7158. if (state) {
  7159. ctrl.icon(formatName);
  7160. }
  7161. });
  7162. });
  7163. }
  7164. });
  7165. global$4.each({
  7166. alignleft: [
  7167. 'Align left',
  7168. 'JustifyLeft'
  7169. ],
  7170. aligncenter: [
  7171. 'Align center',
  7172. 'JustifyCenter'
  7173. ],
  7174. alignright: [
  7175. 'Align right',
  7176. 'JustifyRight'
  7177. ],
  7178. alignjustify: [
  7179. 'Justify',
  7180. 'JustifyFull'
  7181. ],
  7182. alignnone: [
  7183. 'No alignment',
  7184. 'JustifyNone'
  7185. ]
  7186. }, function (item, name) {
  7187. editor.addButton(name, {
  7188. active: false,
  7189. tooltip: item[0],
  7190. cmd: item[1],
  7191. onPostRender: postRenderFormatToggle(editor, name)
  7192. });
  7193. });
  7194. };
  7195. var Align = { register: register };
  7196. var getFirstFont = function (fontFamily) {
  7197. return fontFamily ? fontFamily.split(',')[0] : '';
  7198. };
  7199. var findMatchingValue = function (items, fontFamily) {
  7200. var font = fontFamily ? fontFamily.toLowerCase() : '';
  7201. var value;
  7202. global$4.each(items, function (item) {
  7203. if (item.value.toLowerCase() === font) {
  7204. value = item.value;
  7205. }
  7206. });
  7207. global$4.each(items, function (item) {
  7208. if (!value && getFirstFont(item.value).toLowerCase() === getFirstFont(font).toLowerCase()) {
  7209. value = item.value;
  7210. }
  7211. });
  7212. return value;
  7213. };
  7214. var createFontNameListBoxChangeHandler = function (editor, items) {
  7215. return function () {
  7216. var self = this;
  7217. self.state.set('value', null);
  7218. editor.on('init nodeChange', function (e) {
  7219. var fontFamily = editor.queryCommandValue('FontName');
  7220. var match = findMatchingValue(items, fontFamily);
  7221. self.value(match ? match : null);
  7222. if (!match && fontFamily) {
  7223. self.text(getFirstFont(fontFamily));
  7224. }
  7225. });
  7226. };
  7227. };
  7228. var createFormats = function (formats) {
  7229. formats = formats.replace(/;$/, '').split(';');
  7230. var i = formats.length;
  7231. while (i--) {
  7232. formats[i] = formats[i].split('=');
  7233. }
  7234. return formats;
  7235. };
  7236. var getFontItems = function (editor) {
  7237. var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats';
  7238. var fonts = createFormats(editor.settings.font_formats || defaultFontsFormats);
  7239. return global$4.map(fonts, function (font) {
  7240. return {
  7241. text: { raw: font[0] },
  7242. value: font[1],
  7243. textStyle: font[1].indexOf('dings') === -1 ? 'font-family:' + font[1] : ''
  7244. };
  7245. });
  7246. };
  7247. var registerButtons = function (editor) {
  7248. editor.addButton('fontselect', function () {
  7249. var items = getFontItems(editor);
  7250. return {
  7251. type: 'listbox',
  7252. text: 'Font Family',
  7253. tooltip: 'Font Family',
  7254. values: items,
  7255. fixedWidth: true,
  7256. onPostRender: createFontNameListBoxChangeHandler(editor, items),
  7257. onselect: function (e) {
  7258. if (e.control.settings.value) {
  7259. editor.execCommand('FontName', false, e.control.settings.value);
  7260. }
  7261. }
  7262. };
  7263. });
  7264. };
  7265. var register$1 = function (editor) {
  7266. registerButtons(editor);
  7267. };
  7268. var FontSelect = { register: register$1 };
  7269. var round = function (number, precision) {
  7270. var factor = Math.pow(10, precision);
  7271. return Math.round(number * factor) / factor;
  7272. };
  7273. var toPt = function (fontSize, precision) {
  7274. if (/[0-9.]+px$/.test(fontSize)) {
  7275. return round(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';
  7276. }
  7277. return fontSize;
  7278. };
  7279. var findMatchingValue$1 = function (items, pt, px) {
  7280. var value;
  7281. global$4.each(items, function (item) {
  7282. if (item.value === px) {
  7283. value = px;
  7284. } else if (item.value === pt) {
  7285. value = pt;
  7286. }
  7287. });
  7288. return value;
  7289. };
  7290. var createFontSizeListBoxChangeHandler = function (editor, items) {
  7291. return function () {
  7292. var self = this;
  7293. editor.on('init nodeChange', function (e) {
  7294. var px, pt, precision, match;
  7295. px = editor.queryCommandValue('FontSize');
  7296. if (px) {
  7297. for (precision = 3; !match && precision >= 0; precision--) {
  7298. pt = toPt(px, precision);
  7299. match = findMatchingValue$1(items, pt, px);
  7300. }
  7301. }
  7302. self.value(match ? match : null);
  7303. if (!match) {
  7304. self.text(pt);
  7305. }
  7306. });
  7307. };
  7308. };
  7309. var getFontSizeItems = function (editor) {
  7310. var defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';
  7311. var fontsizeFormats = editor.settings.fontsize_formats || defaultFontsizeFormats;
  7312. return global$4.map(fontsizeFormats.split(' '), function (item) {
  7313. var text = item, value = item;
  7314. var values = item.split('=');
  7315. if (values.length > 1) {
  7316. text = values[0];
  7317. value = values[1];
  7318. }
  7319. return {
  7320. text: text,
  7321. value: value
  7322. };
  7323. });
  7324. };
  7325. var registerButtons$1 = function (editor) {
  7326. editor.addButton('fontsizeselect', function () {
  7327. var items = getFontSizeItems(editor);
  7328. return {
  7329. type: 'listbox',
  7330. text: 'Font Sizes',
  7331. tooltip: 'Font Sizes',
  7332. values: items,
  7333. fixedWidth: true,
  7334. onPostRender: createFontSizeListBoxChangeHandler(editor, items),
  7335. onclick: function (e) {
  7336. if (e.control.settings.value) {
  7337. editor.execCommand('FontSize', false, e.control.settings.value);
  7338. }
  7339. }
  7340. };
  7341. });
  7342. };
  7343. var register$2 = function (editor) {
  7344. registerButtons$1(editor);
  7345. };
  7346. var FontSizeSelect = { register: register$2 };
  7347. var hideMenuObjects = function (editor, menu) {
  7348. var count = menu.length;
  7349. global$4.each(menu, function (item) {
  7350. if (item.menu) {
  7351. item.hidden = hideMenuObjects(editor, item.menu) === 0;
  7352. }
  7353. var formatName = item.format;
  7354. if (formatName) {
  7355. item.hidden = !editor.formatter.canApply(formatName);
  7356. }
  7357. if (item.hidden) {
  7358. count--;
  7359. }
  7360. });
  7361. return count;
  7362. };
  7363. var hideFormatMenuItems = function (editor, menu) {
  7364. var count = menu.items().length;
  7365. menu.items().each(function (item) {
  7366. if (item.menu) {
  7367. item.visible(hideFormatMenuItems(editor, item.menu) > 0);
  7368. }
  7369. if (!item.menu && item.settings.menu) {
  7370. item.visible(hideMenuObjects(editor, item.settings.menu) > 0);
  7371. }
  7372. var formatName = item.settings.format;
  7373. if (formatName) {
  7374. item.visible(editor.formatter.canApply(formatName));
  7375. }
  7376. if (!item.visible()) {
  7377. count--;
  7378. }
  7379. });
  7380. return count;
  7381. };
  7382. var createFormatMenu = function (editor) {
  7383. var count = 0;
  7384. var newFormats = [];
  7385. var defaultStyleFormats = [
  7386. {
  7387. title: 'Headings',
  7388. items: [
  7389. {
  7390. title: 'Heading 1',
  7391. format: 'h1'
  7392. },
  7393. {
  7394. title: 'Heading 2',
  7395. format: 'h2'
  7396. },
  7397. {
  7398. title: 'Heading 3',
  7399. format: 'h3'
  7400. },
  7401. {
  7402. title: 'Heading 4',
  7403. format: 'h4'
  7404. },
  7405. {
  7406. title: 'Heading 5',
  7407. format: 'h5'
  7408. },
  7409. {
  7410. title: 'Heading 6',
  7411. format: 'h6'
  7412. }
  7413. ]
  7414. },
  7415. {
  7416. title: 'Inline',
  7417. items: [
  7418. {
  7419. title: 'Bold',
  7420. icon: 'bold',
  7421. format: 'bold'
  7422. },
  7423. {
  7424. title: 'Italic',
  7425. icon: 'italic',
  7426. format: 'italic'
  7427. },
  7428. {
  7429. title: 'Underline',
  7430. icon: 'underline',
  7431. format: 'underline'
  7432. },
  7433. {
  7434. title: 'Strikethrough',
  7435. icon: 'strikethrough',
  7436. format: 'strikethrough'
  7437. },
  7438. {
  7439. title: 'Superscript',
  7440. icon: 'superscript',
  7441. format: 'superscript'
  7442. },
  7443. {
  7444. title: 'Subscript',
  7445. icon: 'subscript',
  7446. format: 'subscript'
  7447. },
  7448. {
  7449. title: 'Code',
  7450. icon: 'code',
  7451. format: 'code'
  7452. }
  7453. ]
  7454. },
  7455. {
  7456. title: 'Blocks',
  7457. items: [
  7458. {
  7459. title: 'Paragraph',
  7460. format: 'p'
  7461. },
  7462. {
  7463. title: 'Blockquote',
  7464. format: 'blockquote'
  7465. },
  7466. {
  7467. title: 'Div',
  7468. format: 'div'
  7469. },
  7470. {
  7471. title: 'Pre',
  7472. format: 'pre'
  7473. }
  7474. ]
  7475. },
  7476. {
  7477. title: 'Alignment',
  7478. items: [
  7479. {
  7480. title: 'Left',
  7481. icon: 'alignleft',
  7482. format: 'alignleft'
  7483. },
  7484. {
  7485. title: 'Center',
  7486. icon: 'aligncenter',
  7487. format: 'aligncenter'
  7488. },
  7489. {
  7490. title: 'Right',
  7491. icon: 'alignright',
  7492. format: 'alignright'
  7493. },
  7494. {
  7495. title: 'Justify',
  7496. icon: 'alignjustify',
  7497. format: 'alignjustify'
  7498. }
  7499. ]
  7500. }
  7501. ];
  7502. var createMenu = function (formats) {
  7503. var menu = [];
  7504. if (!formats) {
  7505. return;
  7506. }
  7507. global$4.each(formats, function (format) {
  7508. var menuItem = {
  7509. text: format.title,
  7510. icon: format.icon
  7511. };
  7512. if (format.items) {
  7513. menuItem.menu = createMenu(format.items);
  7514. } else {
  7515. var formatName = format.format || 'custom' + count++;
  7516. if (!format.format) {
  7517. format.name = formatName;
  7518. newFormats.push(format);
  7519. }
  7520. menuItem.format = formatName;
  7521. menuItem.cmd = format.cmd;
  7522. }
  7523. menu.push(menuItem);
  7524. });
  7525. return menu;
  7526. };
  7527. var createStylesMenu = function () {
  7528. var menu;
  7529. if (editor.settings.style_formats_merge) {
  7530. if (editor.settings.style_formats) {
  7531. menu = createMenu(defaultStyleFormats.concat(editor.settings.style_formats));
  7532. } else {
  7533. menu = createMenu(defaultStyleFormats);
  7534. }
  7535. } else {
  7536. menu = createMenu(editor.settings.style_formats || defaultStyleFormats);
  7537. }
  7538. return menu;
  7539. };
  7540. editor.on('init', function () {
  7541. global$4.each(newFormats, function (format) {
  7542. editor.formatter.register(format.name, format);
  7543. });
  7544. });
  7545. return {
  7546. type: 'menu',
  7547. items: createStylesMenu(),
  7548. onPostRender: function (e) {
  7549. editor.fire('renderFormatsMenu', { control: e.control });
  7550. },
  7551. itemDefaults: {
  7552. preview: true,
  7553. textStyle: function () {
  7554. if (this.settings.format) {
  7555. return editor.formatter.getCssText(this.settings.format);
  7556. }
  7557. },
  7558. onPostRender: function () {
  7559. var self = this;
  7560. self.parent().on('show', function () {
  7561. var formatName, command;
  7562. formatName = self.settings.format;
  7563. if (formatName) {
  7564. self.disabled(!editor.formatter.canApply(formatName));
  7565. self.active(editor.formatter.match(formatName));
  7566. }
  7567. command = self.settings.cmd;
  7568. if (command) {
  7569. self.active(editor.queryCommandState(command));
  7570. }
  7571. });
  7572. },
  7573. onclick: function () {
  7574. if (this.settings.format) {
  7575. toggleFormat(editor, this.settings.format)();
  7576. }
  7577. if (this.settings.cmd) {
  7578. editor.execCommand(this.settings.cmd);
  7579. }
  7580. }
  7581. }
  7582. };
  7583. };
  7584. var registerMenuItems = function (editor, formatMenu) {
  7585. editor.addMenuItem('formats', {
  7586. text: 'Formats',
  7587. menu: formatMenu
  7588. });
  7589. };
  7590. var registerButtons$2 = function (editor, formatMenu) {
  7591. editor.addButton('styleselect', {
  7592. type: 'menubutton',
  7593. text: 'Formats',
  7594. menu: formatMenu,
  7595. onShowMenu: function () {
  7596. if (editor.settings.style_formats_autohide) {
  7597. hideFormatMenuItems(editor, this.menu);
  7598. }
  7599. }
  7600. });
  7601. };
  7602. var register$3 = function (editor) {
  7603. var formatMenu = createFormatMenu(editor);
  7604. registerMenuItems(editor, formatMenu);
  7605. registerButtons$2(editor, formatMenu);
  7606. };
  7607. var Formats = { register: register$3 };
  7608. var defaultBlocks = 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre';
  7609. var createFormats$1 = function (formats) {
  7610. formats = formats.replace(/;$/, '').split(';');
  7611. var i = formats.length;
  7612. while (i--) {
  7613. formats[i] = formats[i].split('=');
  7614. }
  7615. return formats;
  7616. };
  7617. var createListBoxChangeHandler = function (editor, items, formatName) {
  7618. return function () {
  7619. var self = this;
  7620. editor.on('nodeChange', function (e) {
  7621. var formatter = editor.formatter;
  7622. var value = null;
  7623. global$4.each(e.parents, function (node) {
  7624. global$4.each(items, function (item) {
  7625. if (formatName) {
  7626. if (formatter.matchNode(node, formatName, { value: item.value })) {
  7627. value = item.value;
  7628. }
  7629. } else {
  7630. if (formatter.matchNode(node, item.value)) {
  7631. value = item.value;
  7632. }
  7633. }
  7634. if (value) {
  7635. return false;
  7636. }
  7637. });
  7638. if (value) {
  7639. return false;
  7640. }
  7641. });
  7642. self.value(value);
  7643. });
  7644. };
  7645. };
  7646. var lazyFormatSelectBoxItems = function (editor, blocks) {
  7647. return function () {
  7648. var items = [];
  7649. global$4.each(blocks, function (block) {
  7650. items.push({
  7651. text: block[0],
  7652. value: block[1],
  7653. textStyle: function () {
  7654. return editor.formatter.getCssText(block[1]);
  7655. }
  7656. });
  7657. });
  7658. return {
  7659. type: 'listbox',
  7660. text: blocks[0][0],
  7661. values: items,
  7662. fixedWidth: true,
  7663. onselect: function (e) {
  7664. if (e.control) {
  7665. var fmt = e.control.value();
  7666. toggleFormat(editor, fmt)();
  7667. }
  7668. },
  7669. onPostRender: createListBoxChangeHandler(editor, items)
  7670. };
  7671. };
  7672. };
  7673. var buildMenuItems = function (editor, blocks) {
  7674. return global$4.map(blocks, function (block) {
  7675. return {
  7676. text: block[0],
  7677. onclick: toggleFormat(editor, block[1]),
  7678. textStyle: function () {
  7679. return editor.formatter.getCssText(block[1]);
  7680. }
  7681. };
  7682. });
  7683. };
  7684. var register$4 = function (editor) {
  7685. var blocks = createFormats$1(editor.settings.block_formats || defaultBlocks);
  7686. editor.addMenuItem('blockformats', {
  7687. text: 'Blocks',
  7688. menu: buildMenuItems(editor, blocks)
  7689. });
  7690. editor.addButton('formatselect', lazyFormatSelectBoxItems(editor, blocks));
  7691. };
  7692. var FormatSelect = { register: register$4 };
  7693. var createCustomMenuItems = function (editor, names) {
  7694. var items, nameList;
  7695. if (typeof names === 'string') {
  7696. nameList = names.split(' ');
  7697. } else if (global$4.isArray(names)) {
  7698. return flatten$1(global$4.map(names, function (names) {
  7699. return createCustomMenuItems(editor, names);
  7700. }));
  7701. }
  7702. items = global$4.grep(nameList, function (name) {
  7703. return name === '|' || name in editor.menuItems;
  7704. });
  7705. return global$4.map(items, function (name) {
  7706. return name === '|' ? { text: '-' } : editor.menuItems[name];
  7707. });
  7708. };
  7709. var isSeparator = function (menuItem) {
  7710. return menuItem && menuItem.text === '-';
  7711. };
  7712. var trimMenuItems = function (menuItems) {
  7713. var menuItems2 = filter(menuItems, function (menuItem, i, menuItems) {
  7714. return !isSeparator(menuItem) || !isSeparator(menuItems[i - 1]);
  7715. });
  7716. return filter(menuItems2, function (menuItem, i, menuItems) {
  7717. return !isSeparator(menuItem) || i > 0 && i < menuItems.length - 1;
  7718. });
  7719. };
  7720. var createContextMenuItems = function (editor, context) {
  7721. var outputMenuItems = [{ text: '-' }];
  7722. var menuItems = global$4.grep(editor.menuItems, function (menuItem) {
  7723. return menuItem.context === context;
  7724. });
  7725. global$4.each(menuItems, function (menuItem) {
  7726. if (menuItem.separator === 'before') {
  7727. outputMenuItems.push({ text: '|' });
  7728. }
  7729. if (menuItem.prependToContext) {
  7730. outputMenuItems.unshift(menuItem);
  7731. } else {
  7732. outputMenuItems.push(menuItem);
  7733. }
  7734. if (menuItem.separator === 'after') {
  7735. outputMenuItems.push({ text: '|' });
  7736. }
  7737. });
  7738. return outputMenuItems;
  7739. };
  7740. var createInsertMenu = function (editor) {
  7741. var insertButtonItems = editor.settings.insert_button_items;
  7742. if (insertButtonItems) {
  7743. return trimMenuItems(createCustomMenuItems(editor, insertButtonItems));
  7744. } else {
  7745. return trimMenuItems(createContextMenuItems(editor, 'insert'));
  7746. }
  7747. };
  7748. var registerButtons$3 = function (editor) {
  7749. editor.addButton('insert', {
  7750. type: 'menubutton',
  7751. icon: 'insert',
  7752. menu: [],
  7753. oncreatemenu: function () {
  7754. this.menu.add(createInsertMenu(editor));
  7755. this.menu.renderNew();
  7756. }
  7757. });
  7758. };
  7759. var register$5 = function (editor) {
  7760. registerButtons$3(editor);
  7761. };
  7762. var InsertButton = { register: register$5 };
  7763. var registerFormatButtons = function (editor) {
  7764. global$4.each({
  7765. bold: 'Bold',
  7766. italic: 'Italic',
  7767. underline: 'Underline',
  7768. strikethrough: 'Strikethrough',
  7769. subscript: 'Subscript',
  7770. superscript: 'Superscript'
  7771. }, function (text, name) {
  7772. editor.addButton(name, {
  7773. active: false,
  7774. tooltip: text,
  7775. onPostRender: postRenderFormatToggle(editor, name),
  7776. onclick: toggleFormat(editor, name)
  7777. });
  7778. });
  7779. };
  7780. var registerCommandButtons = function (editor) {
  7781. global$4.each({
  7782. outdent: [
  7783. 'Decrease indent',
  7784. 'Outdent'
  7785. ],
  7786. indent: [
  7787. 'Increase indent',
  7788. 'Indent'
  7789. ],
  7790. cut: [
  7791. 'Cut',
  7792. 'Cut'
  7793. ],
  7794. copy: [
  7795. 'Copy',
  7796. 'Copy'
  7797. ],
  7798. paste: [
  7799. 'Paste',
  7800. 'Paste'
  7801. ],
  7802. help: [
  7803. 'Help',
  7804. 'mceHelp'
  7805. ],
  7806. selectall: [
  7807. 'Select all',
  7808. 'SelectAll'
  7809. ],
  7810. visualaid: [
  7811. 'Visual aids',
  7812. 'mceToggleVisualAid'
  7813. ],
  7814. newdocument: [
  7815. 'New document',
  7816. 'mceNewDocument'
  7817. ],
  7818. removeformat: [
  7819. 'Clear formatting',
  7820. 'RemoveFormat'
  7821. ],
  7822. remove: [
  7823. 'Remove',
  7824. 'Delete'
  7825. ]
  7826. }, function (item, name) {
  7827. editor.addButton(name, {
  7828. tooltip: item[0],
  7829. cmd: item[1]
  7830. });
  7831. });
  7832. };
  7833. var registerCommandToggleButtons = function (editor) {
  7834. global$4.each({
  7835. blockquote: [
  7836. 'Blockquote',
  7837. 'mceBlockQuote'
  7838. ],
  7839. subscript: [
  7840. 'Subscript',
  7841. 'Subscript'
  7842. ],
  7843. superscript: [
  7844. 'Superscript',
  7845. 'Superscript'
  7846. ]
  7847. }, function (item, name) {
  7848. editor.addButton(name, {
  7849. active: false,
  7850. tooltip: item[0],
  7851. cmd: item[1],
  7852. onPostRender: postRenderFormatToggle(editor, name)
  7853. });
  7854. });
  7855. };
  7856. var registerButtons$4 = function (editor) {
  7857. registerFormatButtons(editor);
  7858. registerCommandButtons(editor);
  7859. registerCommandToggleButtons(editor);
  7860. };
  7861. var registerMenuItems$1 = function (editor) {
  7862. global$4.each({
  7863. bold: [
  7864. 'Bold',
  7865. 'Bold',
  7866. 'Meta+B'
  7867. ],
  7868. italic: [
  7869. 'Italic',
  7870. 'Italic',
  7871. 'Meta+I'
  7872. ],
  7873. underline: [
  7874. 'Underline',
  7875. 'Underline',
  7876. 'Meta+U'
  7877. ],
  7878. strikethrough: [
  7879. 'Strikethrough',
  7880. 'Strikethrough'
  7881. ],
  7882. subscript: [
  7883. 'Subscript',
  7884. 'Subscript'
  7885. ],
  7886. superscript: [
  7887. 'Superscript',
  7888. 'Superscript'
  7889. ],
  7890. removeformat: [
  7891. 'Clear formatting',
  7892. 'RemoveFormat'
  7893. ],
  7894. newdocument: [
  7895. 'New document',
  7896. 'mceNewDocument'
  7897. ],
  7898. cut: [
  7899. 'Cut',
  7900. 'Cut',
  7901. 'Meta+X'
  7902. ],
  7903. copy: [
  7904. 'Copy',
  7905. 'Copy',
  7906. 'Meta+C'
  7907. ],
  7908. paste: [
  7909. 'Paste',
  7910. 'Paste',
  7911. 'Meta+V'
  7912. ],
  7913. selectall: [
  7914. 'Select all',
  7915. 'SelectAll',
  7916. 'Meta+A'
  7917. ]
  7918. }, function (item, name) {
  7919. editor.addMenuItem(name, {
  7920. text: item[0],
  7921. icon: name,
  7922. shortcut: item[2],
  7923. cmd: item[1]
  7924. });
  7925. });
  7926. editor.addMenuItem('codeformat', {
  7927. text: 'Code',
  7928. icon: 'code',
  7929. onclick: toggleFormat(editor, 'code')
  7930. });
  7931. };
  7932. var register$6 = function (editor) {
  7933. registerButtons$4(editor);
  7934. registerMenuItems$1(editor);
  7935. };
  7936. var SimpleControls = { register: register$6 };
  7937. var toggleUndoRedoState = function (editor, type) {
  7938. return function () {
  7939. var self = this;
  7940. var checkState = function () {
  7941. var typeFn = type === 'redo' ? 'hasRedo' : 'hasUndo';
  7942. return editor.undoManager ? editor.undoManager[typeFn]() : false;
  7943. };
  7944. self.disabled(!checkState());
  7945. editor.on('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', function () {
  7946. self.disabled(editor.readonly || !checkState());
  7947. });
  7948. };
  7949. };
  7950. var registerMenuItems$2 = function (editor) {
  7951. editor.addMenuItem('undo', {
  7952. text: 'Undo',
  7953. icon: 'undo',
  7954. shortcut: 'Meta+Z',
  7955. onPostRender: toggleUndoRedoState(editor, 'undo'),
  7956. cmd: 'undo'
  7957. });
  7958. editor.addMenuItem('redo', {
  7959. text: 'Redo',
  7960. icon: 'redo',
  7961. shortcut: 'Meta+Y',
  7962. onPostRender: toggleUndoRedoState(editor, 'redo'),
  7963. cmd: 'redo'
  7964. });
  7965. };
  7966. var registerButtons$5 = function (editor) {
  7967. editor.addButton('undo', {
  7968. tooltip: 'Undo',
  7969. onPostRender: toggleUndoRedoState(editor, 'undo'),
  7970. cmd: 'undo'
  7971. });
  7972. editor.addButton('redo', {
  7973. tooltip: 'Redo',
  7974. onPostRender: toggleUndoRedoState(editor, 'redo'),
  7975. cmd: 'redo'
  7976. });
  7977. };
  7978. var register$7 = function (editor) {
  7979. registerMenuItems$2(editor);
  7980. registerButtons$5(editor);
  7981. };
  7982. var UndoRedo = { register: register$7 };
  7983. var toggleVisualAidState = function (editor) {
  7984. return function () {
  7985. var self = this;
  7986. editor.on('VisualAid', function (e) {
  7987. self.active(e.hasVisual);
  7988. });
  7989. self.active(editor.hasVisual);
  7990. };
  7991. };
  7992. var registerMenuItems$3 = function (editor) {
  7993. editor.addMenuItem('visualaid', {
  7994. text: 'Visual aids',
  7995. selectable: true,
  7996. onPostRender: toggleVisualAidState(editor),
  7997. cmd: 'mceToggleVisualAid'
  7998. });
  7999. };
  8000. var register$8 = function (editor) {
  8001. registerMenuItems$3(editor);
  8002. };
  8003. var VisualAid = { register: register$8 };
  8004. var setupEnvironment = function () {
  8005. Widget.tooltips = !global$1.iOS;
  8006. Control$1.translate = function (text) {
  8007. return global$5.translate(text);
  8008. };
  8009. };
  8010. var setupUiContainer = function (editor) {
  8011. if (editor.settings.ui_container) {
  8012. global$1.container = descendant(Element.fromDom(domGlobals.document.body), editor.settings.ui_container).fold(constant(null), function (elm) {
  8013. return elm.dom();
  8014. });
  8015. }
  8016. };
  8017. var setupRtlMode = function (editor) {
  8018. if (editor.rtl) {
  8019. Control$1.rtl = true;
  8020. }
  8021. };
  8022. var setupHideFloatPanels = function (editor) {
  8023. editor.on('mousedown progressstate', function () {
  8024. FloatPanel.hideAll();
  8025. });
  8026. };
  8027. var setup = function (editor) {
  8028. setupRtlMode(editor);
  8029. setupHideFloatPanels(editor);
  8030. setupUiContainer(editor);
  8031. setupEnvironment();
  8032. FormatSelect.register(editor);
  8033. Align.register(editor);
  8034. SimpleControls.register(editor);
  8035. UndoRedo.register(editor);
  8036. FontSizeSelect.register(editor);
  8037. FontSelect.register(editor);
  8038. Formats.register(editor);
  8039. VisualAid.register(editor);
  8040. InsertButton.register(editor);
  8041. };
  8042. var FormatControls = { setup: setup };
  8043. var GridLayout = AbsoluteLayout.extend({
  8044. recalc: function (container) {
  8045. var settings, rows, cols, items, contLayoutRect, width, height, rect, ctrlLayoutRect, ctrl, x, y, posX, posY, ctrlSettings, contPaddingBox, align, spacingH, spacingV, alignH, alignV, maxX, maxY;
  8046. var colWidths = [];
  8047. var rowHeights = [];
  8048. var ctrlMinWidth, ctrlMinHeight, availableWidth, availableHeight, reverseRows, idx;
  8049. settings = container.settings;
  8050. items = container.items().filter(':visible');
  8051. contLayoutRect = container.layoutRect();
  8052. cols = settings.columns || Math.ceil(Math.sqrt(items.length));
  8053. rows = Math.ceil(items.length / cols);
  8054. spacingH = settings.spacingH || settings.spacing || 0;
  8055. spacingV = settings.spacingV || settings.spacing || 0;
  8056. alignH = settings.alignH || settings.align;
  8057. alignV = settings.alignV || settings.align;
  8058. contPaddingBox = container.paddingBox;
  8059. reverseRows = 'reverseRows' in settings ? settings.reverseRows : container.isRtl();
  8060. if (alignH && typeof alignH === 'string') {
  8061. alignH = [alignH];
  8062. }
  8063. if (alignV && typeof alignV === 'string') {
  8064. alignV = [alignV];
  8065. }
  8066. for (x = 0; x < cols; x++) {
  8067. colWidths.push(0);
  8068. }
  8069. for (y = 0; y < rows; y++) {
  8070. rowHeights.push(0);
  8071. }
  8072. for (y = 0; y < rows; y++) {
  8073. for (x = 0; x < cols; x++) {
  8074. ctrl = items[y * cols + x];
  8075. if (!ctrl) {
  8076. break;
  8077. }
  8078. ctrlLayoutRect = ctrl.layoutRect();
  8079. ctrlMinWidth = ctrlLayoutRect.minW;
  8080. ctrlMinHeight = ctrlLayoutRect.minH;
  8081. colWidths[x] = ctrlMinWidth > colWidths[x] ? ctrlMinWidth : colWidths[x];
  8082. rowHeights[y] = ctrlMinHeight > rowHeights[y] ? ctrlMinHeight : rowHeights[y];
  8083. }
  8084. }
  8085. availableWidth = contLayoutRect.innerW - contPaddingBox.left - contPaddingBox.right;
  8086. for (maxX = 0, x = 0; x < cols; x++) {
  8087. maxX += colWidths[x] + (x > 0 ? spacingH : 0);
  8088. availableWidth -= (x > 0 ? spacingH : 0) + colWidths[x];
  8089. }
  8090. availableHeight = contLayoutRect.innerH - contPaddingBox.top - contPaddingBox.bottom;
  8091. for (maxY = 0, y = 0; y < rows; y++) {
  8092. maxY += rowHeights[y] + (y > 0 ? spacingV : 0);
  8093. availableHeight -= (y > 0 ? spacingV : 0) + rowHeights[y];
  8094. }
  8095. maxX += contPaddingBox.left + contPaddingBox.right;
  8096. maxY += contPaddingBox.top + contPaddingBox.bottom;
  8097. rect = {};
  8098. rect.minW = maxX + (contLayoutRect.w - contLayoutRect.innerW);
  8099. rect.minH = maxY + (contLayoutRect.h - contLayoutRect.innerH);
  8100. rect.contentW = rect.minW - contLayoutRect.deltaW;
  8101. rect.contentH = rect.minH - contLayoutRect.deltaH;
  8102. rect.minW = Math.min(rect.minW, contLayoutRect.maxW);
  8103. rect.minH = Math.min(rect.minH, contLayoutRect.maxH);
  8104. rect.minW = Math.max(rect.minW, contLayoutRect.startMinWidth);
  8105. rect.minH = Math.max(rect.minH, contLayoutRect.startMinHeight);
  8106. if (contLayoutRect.autoResize && (rect.minW !== contLayoutRect.minW || rect.minH !== contLayoutRect.minH)) {
  8107. rect.w = rect.minW;
  8108. rect.h = rect.minH;
  8109. container.layoutRect(rect);
  8110. this.recalc(container);
  8111. if (container._lastRect === null) {
  8112. var parentCtrl = container.parent();
  8113. if (parentCtrl) {
  8114. parentCtrl._lastRect = null;
  8115. parentCtrl.recalc();
  8116. }
  8117. }
  8118. return;
  8119. }
  8120. if (contLayoutRect.autoResize) {
  8121. rect = container.layoutRect(rect);
  8122. rect.contentW = rect.minW - contLayoutRect.deltaW;
  8123. rect.contentH = rect.minH - contLayoutRect.deltaH;
  8124. }
  8125. var flexV;
  8126. if (settings.packV === 'start') {
  8127. flexV = 0;
  8128. } else {
  8129. flexV = availableHeight > 0 ? Math.floor(availableHeight / rows) : 0;
  8130. }
  8131. var totalFlex = 0;
  8132. var flexWidths = settings.flexWidths;
  8133. if (flexWidths) {
  8134. for (x = 0; x < flexWidths.length; x++) {
  8135. totalFlex += flexWidths[x];
  8136. }
  8137. } else {
  8138. totalFlex = cols;
  8139. }
  8140. var ratio = availableWidth / totalFlex;
  8141. for (x = 0; x < cols; x++) {
  8142. colWidths[x] += flexWidths ? flexWidths[x] * ratio : ratio;
  8143. }
  8144. posY = contPaddingBox.top;
  8145. for (y = 0; y < rows; y++) {
  8146. posX = contPaddingBox.left;
  8147. height = rowHeights[y] + flexV;
  8148. for (x = 0; x < cols; x++) {
  8149. if (reverseRows) {
  8150. idx = y * cols + cols - 1 - x;
  8151. } else {
  8152. idx = y * cols + x;
  8153. }
  8154. ctrl = items[idx];
  8155. if (!ctrl) {
  8156. break;
  8157. }
  8158. ctrlSettings = ctrl.settings;
  8159. ctrlLayoutRect = ctrl.layoutRect();
  8160. width = Math.max(colWidths[x], ctrlLayoutRect.startMinWidth);
  8161. ctrlLayoutRect.x = posX;
  8162. ctrlLayoutRect.y = posY;
  8163. align = ctrlSettings.alignH || (alignH ? alignH[x] || alignH[0] : null);
  8164. if (align === 'center') {
  8165. ctrlLayoutRect.x = posX + width / 2 - ctrlLayoutRect.w / 2;
  8166. } else if (align === 'right') {
  8167. ctrlLayoutRect.x = posX + width - ctrlLayoutRect.w;
  8168. } else if (align === 'stretch') {
  8169. ctrlLayoutRect.w = width;
  8170. }
  8171. align = ctrlSettings.alignV || (alignV ? alignV[x] || alignV[0] : null);
  8172. if (align === 'center') {
  8173. ctrlLayoutRect.y = posY + height / 2 - ctrlLayoutRect.h / 2;
  8174. } else if (align === 'bottom') {
  8175. ctrlLayoutRect.y = posY + height - ctrlLayoutRect.h;
  8176. } else if (align === 'stretch') {
  8177. ctrlLayoutRect.h = height;
  8178. }
  8179. ctrl.layoutRect(ctrlLayoutRect);
  8180. posX += width + spacingH;
  8181. if (ctrl.recalc) {
  8182. ctrl.recalc();
  8183. }
  8184. }
  8185. posY += height + spacingV;
  8186. }
  8187. }
  8188. });
  8189. var Iframe = Widget.extend({
  8190. renderHtml: function () {
  8191. var self = this;
  8192. self.classes.add('iframe');
  8193. self.canFocus = false;
  8194. return '<iframe id="' + self._id + '" class="' + self.classes + '" tabindex="-1" src="' + (self.settings.url || 'javascript:\'\'') + '" frameborder="0"></iframe>';
  8195. },
  8196. src: function (src) {
  8197. this.getEl().src = src;
  8198. },
  8199. html: function (html, callback) {
  8200. var self = this, body = this.getEl().contentWindow.document.body;
  8201. if (!body) {
  8202. global$3.setTimeout(function () {
  8203. self.html(html);
  8204. });
  8205. } else {
  8206. body.innerHTML = html;
  8207. if (callback) {
  8208. callback();
  8209. }
  8210. }
  8211. return this;
  8212. }
  8213. });
  8214. var InfoBox = Widget.extend({
  8215. init: function (settings) {
  8216. var self = this;
  8217. self._super(settings);
  8218. self.classes.add('widget').add('infobox');
  8219. self.canFocus = false;
  8220. },
  8221. severity: function (level) {
  8222. this.classes.remove('error');
  8223. this.classes.remove('warning');
  8224. this.classes.remove('success');
  8225. this.classes.add(level);
  8226. },
  8227. help: function (state) {
  8228. this.state.set('help', state);
  8229. },
  8230. renderHtml: function () {
  8231. var self = this, prefix = self.classPrefix;
  8232. return '<div id="' + self._id + '" class="' + self.classes + '">' + '<div id="' + self._id + '-body">' + self.encode(self.state.get('text')) + '<button role="button" tabindex="-1">' + '<i class="' + prefix + 'ico ' + prefix + 'i-help"></i>' + '</button>' + '</div>' + '</div>';
  8233. },
  8234. bindStates: function () {
  8235. var self = this;
  8236. self.state.on('change:text', function (e) {
  8237. self.getEl('body').firstChild.data = self.encode(e.value);
  8238. if (self.state.get('rendered')) {
  8239. self.updateLayoutRect();
  8240. }
  8241. });
  8242. self.state.on('change:help', function (e) {
  8243. self.classes.toggle('has-help', e.value);
  8244. if (self.state.get('rendered')) {
  8245. self.updateLayoutRect();
  8246. }
  8247. });
  8248. return self._super();
  8249. }
  8250. });
  8251. var Label = Widget.extend({
  8252. init: function (settings) {
  8253. var self = this;
  8254. self._super(settings);
  8255. self.classes.add('widget').add('label');
  8256. self.canFocus = false;
  8257. if (settings.multiline) {
  8258. self.classes.add('autoscroll');
  8259. }
  8260. if (settings.strong) {
  8261. self.classes.add('strong');
  8262. }
  8263. },
  8264. initLayoutRect: function () {
  8265. var self = this, layoutRect = self._super();
  8266. if (self.settings.multiline) {
  8267. var size = funcs.getSize(self.getEl());
  8268. if (size.width > layoutRect.maxW) {
  8269. layoutRect.minW = layoutRect.maxW;
  8270. self.classes.add('multiline');
  8271. }
  8272. self.getEl().style.width = layoutRect.minW + 'px';
  8273. layoutRect.startMinH = layoutRect.h = layoutRect.minH = Math.min(layoutRect.maxH, funcs.getSize(self.getEl()).height);
  8274. }
  8275. return layoutRect;
  8276. },
  8277. repaint: function () {
  8278. var self = this;
  8279. if (!self.settings.multiline) {
  8280. self.getEl().style.lineHeight = self.layoutRect().h + 'px';
  8281. }
  8282. return self._super();
  8283. },
  8284. severity: function (level) {
  8285. this.classes.remove('error');
  8286. this.classes.remove('warning');
  8287. this.classes.remove('success');
  8288. this.classes.add(level);
  8289. },
  8290. renderHtml: function () {
  8291. var self = this;
  8292. var targetCtrl, forName, forId = self.settings.forId;
  8293. var text = self.settings.html ? self.settings.html : self.encode(self.state.get('text'));
  8294. if (!forId && (forName = self.settings.forName)) {
  8295. targetCtrl = self.getRoot().find('#' + forName)[0];
  8296. if (targetCtrl) {
  8297. forId = targetCtrl._id;
  8298. }
  8299. }
  8300. if (forId) {
  8301. return '<label id="' + self._id + '" class="' + self.classes + '"' + (forId ? ' for="' + forId + '"' : '') + '>' + text + '</label>';
  8302. }
  8303. return '<span id="' + self._id + '" class="' + self.classes + '">' + text + '</span>';
  8304. },
  8305. bindStates: function () {
  8306. var self = this;
  8307. self.state.on('change:text', function (e) {
  8308. self.innerHtml(self.encode(e.value));
  8309. if (self.state.get('rendered')) {
  8310. self.updateLayoutRect();
  8311. }
  8312. });
  8313. return self._super();
  8314. }
  8315. });
  8316. var Toolbar$1 = Container.extend({
  8317. Defaults: {
  8318. role: 'toolbar',
  8319. layout: 'flow'
  8320. },
  8321. init: function (settings) {
  8322. var self = this;
  8323. self._super(settings);
  8324. self.classes.add('toolbar');
  8325. },
  8326. postRender: function () {
  8327. var self = this;
  8328. self.items().each(function (ctrl) {
  8329. ctrl.classes.add('toolbar-item');
  8330. });
  8331. return self._super();
  8332. }
  8333. });
  8334. var MenuBar = Toolbar$1.extend({
  8335. Defaults: {
  8336. role: 'menubar',
  8337. containerCls: 'menubar',
  8338. ariaRoot: true,
  8339. defaults: { type: 'menubutton' }
  8340. }
  8341. });
  8342. function isChildOf$1(node, parent) {
  8343. while (node) {
  8344. if (parent === node) {
  8345. return true;
  8346. }
  8347. node = node.parentNode;
  8348. }
  8349. return false;
  8350. }
  8351. var MenuButton = Button.extend({
  8352. init: function (settings) {
  8353. var self = this;
  8354. self._renderOpen = true;
  8355. self._super(settings);
  8356. settings = self.settings;
  8357. self.classes.add('menubtn');
  8358. if (settings.fixedWidth) {
  8359. self.classes.add('fixed-width');
  8360. }
  8361. self.aria('haspopup', true);
  8362. self.state.set('menu', settings.menu || self.render());
  8363. },
  8364. showMenu: function (toggle) {
  8365. var self = this;
  8366. var menu;
  8367. if (self.menu && self.menu.visible() && toggle !== false) {
  8368. return self.hideMenu();
  8369. }
  8370. if (!self.menu) {
  8371. menu = self.state.get('menu') || [];
  8372. self.classes.add('opened');
  8373. if (menu.length) {
  8374. menu = {
  8375. type: 'menu',
  8376. animate: true,
  8377. items: menu
  8378. };
  8379. } else {
  8380. menu.type = menu.type || 'menu';
  8381. menu.animate = true;
  8382. }
  8383. if (!menu.renderTo) {
  8384. self.menu = global$b.create(menu).parent(self).renderTo();
  8385. } else {
  8386. self.menu = menu.parent(self).show().renderTo();
  8387. }
  8388. self.fire('createmenu');
  8389. self.menu.reflow();
  8390. self.menu.on('cancel', function (e) {
  8391. if (e.control.parent() === self.menu) {
  8392. e.stopPropagation();
  8393. self.focus();
  8394. self.hideMenu();
  8395. }
  8396. });
  8397. self.menu.on('select', function () {
  8398. self.focus();
  8399. });
  8400. self.menu.on('show hide', function (e) {
  8401. if (e.type === 'hide' && e.control.parent() === self) {
  8402. self.classes.remove('opened-under');
  8403. }
  8404. if (e.control === self.menu) {
  8405. self.activeMenu(e.type === 'show');
  8406. self.classes.toggle('opened', e.type === 'show');
  8407. }
  8408. self.aria('expanded', e.type === 'show');
  8409. }).fire('show');
  8410. }
  8411. self.menu.show();
  8412. self.menu.layoutRect({ w: self.layoutRect().w });
  8413. self.menu.repaint();
  8414. self.menu.moveRel(self.getEl(), self.isRtl() ? [
  8415. 'br-tr',
  8416. 'tr-br'
  8417. ] : [
  8418. 'bl-tl',
  8419. 'tl-bl'
  8420. ]);
  8421. var menuLayoutRect = self.menu.layoutRect();
  8422. var selfBottom = self.$el.offset().top + self.layoutRect().h;
  8423. if (selfBottom > menuLayoutRect.y && selfBottom < menuLayoutRect.y + menuLayoutRect.h) {
  8424. self.classes.add('opened-under');
  8425. }
  8426. self.fire('showmenu');
  8427. },
  8428. hideMenu: function () {
  8429. var self = this;
  8430. if (self.menu) {
  8431. self.menu.items().each(function (item) {
  8432. if (item.hideMenu) {
  8433. item.hideMenu();
  8434. }
  8435. });
  8436. self.menu.hide();
  8437. }
  8438. },
  8439. activeMenu: function (state) {
  8440. this.classes.toggle('active', state);
  8441. },
  8442. renderHtml: function () {
  8443. var self = this, id = self._id, prefix = self.classPrefix;
  8444. var icon = self.settings.icon, image;
  8445. var text = self.state.get('text');
  8446. var textHtml = '';
  8447. image = self.settings.image;
  8448. if (image) {
  8449. icon = 'none';
  8450. if (typeof image !== 'string') {
  8451. image = domGlobals.window.getSelection ? image[0] : image[1];
  8452. }
  8453. image = ' style="background-image: url(\'' + image + '\')"';
  8454. } else {
  8455. image = '';
  8456. }
  8457. if (text) {
  8458. self.classes.add('btn-has-text');
  8459. textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
  8460. }
  8461. icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
  8462. self.aria('role', self.parent() instanceof MenuBar ? 'menuitem' : 'button');
  8463. return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1" aria-labelledby="' + id + '">' + '<button id="' + id + '-open" role="presentation" type="button" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>';
  8464. },
  8465. postRender: function () {
  8466. var self = this;
  8467. self.on('click', function (e) {
  8468. if (e.control === self && isChildOf$1(e.target, self.getEl())) {
  8469. self.focus();
  8470. self.showMenu(!e.aria);
  8471. if (e.aria) {
  8472. self.menu.items().filter(':visible')[0].focus();
  8473. }
  8474. }
  8475. });
  8476. self.on('mouseenter', function (e) {
  8477. var overCtrl = e.control;
  8478. var parent = self.parent();
  8479. var hasVisibleSiblingMenu;
  8480. if (overCtrl && parent && overCtrl instanceof MenuButton && overCtrl.parent() === parent) {
  8481. parent.items().filter('MenuButton').each(function (ctrl) {
  8482. if (ctrl.hideMenu && ctrl !== overCtrl) {
  8483. if (ctrl.menu && ctrl.menu.visible()) {
  8484. hasVisibleSiblingMenu = true;
  8485. }
  8486. ctrl.hideMenu();
  8487. }
  8488. });
  8489. if (hasVisibleSiblingMenu) {
  8490. overCtrl.focus();
  8491. overCtrl.showMenu();
  8492. }
  8493. }
  8494. });
  8495. return self._super();
  8496. },
  8497. bindStates: function () {
  8498. var self = this;
  8499. self.state.on('change:menu', function () {
  8500. if (self.menu) {
  8501. self.menu.remove();
  8502. }
  8503. self.menu = null;
  8504. });
  8505. return self._super();
  8506. },
  8507. remove: function () {
  8508. this._super();
  8509. if (this.menu) {
  8510. this.menu.remove();
  8511. }
  8512. }
  8513. });
  8514. function Throbber (elm, inline) {
  8515. var self = this;
  8516. var state;
  8517. var classPrefix = Control$1.classPrefix;
  8518. var timer;
  8519. self.show = function (time, callback) {
  8520. function render() {
  8521. if (state) {
  8522. global$7(elm).append('<div class="' + classPrefix + 'throbber' + (inline ? ' ' + classPrefix + 'throbber-inline' : '') + '"></div>');
  8523. if (callback) {
  8524. callback();
  8525. }
  8526. }
  8527. }
  8528. self.hide();
  8529. state = true;
  8530. if (time) {
  8531. timer = global$3.setTimeout(render, time);
  8532. } else {
  8533. render();
  8534. }
  8535. return self;
  8536. };
  8537. self.hide = function () {
  8538. var child = elm.lastChild;
  8539. global$3.clearTimeout(timer);
  8540. if (child && child.className.indexOf('throbber') !== -1) {
  8541. child.parentNode.removeChild(child);
  8542. }
  8543. state = false;
  8544. return self;
  8545. };
  8546. }
  8547. var Menu = FloatPanel.extend({
  8548. Defaults: {
  8549. defaultType: 'menuitem',
  8550. border: 1,
  8551. layout: 'stack',
  8552. role: 'application',
  8553. bodyRole: 'menu',
  8554. ariaRoot: true
  8555. },
  8556. init: function (settings) {
  8557. var self = this;
  8558. settings.autohide = true;
  8559. settings.constrainToViewport = true;
  8560. if (typeof settings.items === 'function') {
  8561. settings.itemsFactory = settings.items;
  8562. settings.items = [];
  8563. }
  8564. if (settings.itemDefaults) {
  8565. var items = settings.items;
  8566. var i = items.length;
  8567. while (i--) {
  8568. items[i] = global$4.extend({}, settings.itemDefaults, items[i]);
  8569. }
  8570. }
  8571. self._super(settings);
  8572. self.classes.add('menu');
  8573. if (settings.animate && global$1.ie !== 11) {
  8574. self.classes.add('animate');
  8575. }
  8576. },
  8577. repaint: function () {
  8578. this.classes.toggle('menu-align', true);
  8579. this._super();
  8580. this.getEl().style.height = '';
  8581. this.getEl('body').style.height = '';
  8582. return this;
  8583. },
  8584. cancel: function () {
  8585. var self = this;
  8586. self.hideAll();
  8587. self.fire('select');
  8588. },
  8589. load: function () {
  8590. var self = this;
  8591. var time, factory;
  8592. function hideThrobber() {
  8593. if (self.throbber) {
  8594. self.throbber.hide();
  8595. self.throbber = null;
  8596. }
  8597. }
  8598. factory = self.settings.itemsFactory;
  8599. if (!factory) {
  8600. return;
  8601. }
  8602. if (!self.throbber) {
  8603. self.throbber = new Throbber(self.getEl('body'), true);
  8604. if (self.items().length === 0) {
  8605. self.throbber.show();
  8606. self.fire('loading');
  8607. } else {
  8608. self.throbber.show(100, function () {
  8609. self.items().remove();
  8610. self.fire('loading');
  8611. });
  8612. }
  8613. self.on('hide close', hideThrobber);
  8614. }
  8615. self.requestTime = time = new Date().getTime();
  8616. self.settings.itemsFactory(function (items) {
  8617. if (items.length === 0) {
  8618. self.hide();
  8619. return;
  8620. }
  8621. if (self.requestTime !== time) {
  8622. return;
  8623. }
  8624. self.getEl().style.width = '';
  8625. self.getEl('body').style.width = '';
  8626. hideThrobber();
  8627. self.items().remove();
  8628. self.getEl('body').innerHTML = '';
  8629. self.add(items);
  8630. self.renderNew();
  8631. self.fire('loaded');
  8632. });
  8633. },
  8634. hideAll: function () {
  8635. var self = this;
  8636. this.find('menuitem').exec('hideMenu');
  8637. return self._super();
  8638. },
  8639. preRender: function () {
  8640. var self = this;
  8641. self.items().each(function (ctrl) {
  8642. var settings = ctrl.settings;
  8643. if (settings.icon || settings.image || settings.selectable) {
  8644. self._hasIcons = true;
  8645. return false;
  8646. }
  8647. });
  8648. if (self.settings.itemsFactory) {
  8649. self.on('postrender', function () {
  8650. if (self.settings.itemsFactory) {
  8651. self.load();
  8652. }
  8653. });
  8654. }
  8655. self.on('show hide', function (e) {
  8656. if (e.control === self) {
  8657. if (e.type === 'show') {
  8658. global$3.setTimeout(function () {
  8659. self.classes.add('in');
  8660. }, 0);
  8661. } else {
  8662. self.classes.remove('in');
  8663. }
  8664. }
  8665. });
  8666. return self._super();
  8667. }
  8668. });
  8669. var ListBox = MenuButton.extend({
  8670. init: function (settings) {
  8671. var self = this;
  8672. var values, selected, selectedText, lastItemCtrl;
  8673. function setSelected(menuValues) {
  8674. for (var i = 0; i < menuValues.length; i++) {
  8675. selected = menuValues[i].selected || settings.value === menuValues[i].value;
  8676. if (selected) {
  8677. selectedText = selectedText || menuValues[i].text;
  8678. self.state.set('value', menuValues[i].value);
  8679. return true;
  8680. }
  8681. if (menuValues[i].menu) {
  8682. if (setSelected(menuValues[i].menu)) {
  8683. return true;
  8684. }
  8685. }
  8686. }
  8687. }
  8688. self._super(settings);
  8689. settings = self.settings;
  8690. self._values = values = settings.values;
  8691. if (values) {
  8692. if (typeof settings.value !== 'undefined') {
  8693. setSelected(values);
  8694. }
  8695. if (!selected && values.length > 0) {
  8696. selectedText = values[0].text;
  8697. self.state.set('value', values[0].value);
  8698. }
  8699. self.state.set('menu', values);
  8700. }
  8701. self.state.set('text', settings.text || selectedText);
  8702. self.classes.add('listbox');
  8703. self.on('select', function (e) {
  8704. var ctrl = e.control;
  8705. if (lastItemCtrl) {
  8706. e.lastControl = lastItemCtrl;
  8707. }
  8708. if (settings.multiple) {
  8709. ctrl.active(!ctrl.active());
  8710. } else {
  8711. self.value(e.control.value());
  8712. }
  8713. lastItemCtrl = ctrl;
  8714. });
  8715. },
  8716. value: function (value) {
  8717. if (arguments.length === 0) {
  8718. return this.state.get('value');
  8719. }
  8720. if (typeof value === 'undefined') {
  8721. return this;
  8722. }
  8723. function valueExists(values) {
  8724. return exists(values, function (a) {
  8725. return a.menu ? valueExists(a.menu) : a.value === value;
  8726. });
  8727. }
  8728. if (this.settings.values) {
  8729. if (valueExists(this.settings.values)) {
  8730. this.state.set('value', value);
  8731. } else if (value === null) {
  8732. this.state.set('value', null);
  8733. }
  8734. } else {
  8735. this.state.set('value', value);
  8736. }
  8737. return this;
  8738. },
  8739. bindStates: function () {
  8740. var self = this;
  8741. function activateMenuItemsByValue(menu, value) {
  8742. if (menu instanceof Menu) {
  8743. menu.items().each(function (ctrl) {
  8744. if (!ctrl.hasMenus()) {
  8745. ctrl.active(ctrl.value() === value);
  8746. }
  8747. });
  8748. }
  8749. }
  8750. function getSelectedItem(menuValues, value) {
  8751. var selectedItem;
  8752. if (!menuValues) {
  8753. return;
  8754. }
  8755. for (var i = 0; i < menuValues.length; i++) {
  8756. if (menuValues[i].value === value) {
  8757. return menuValues[i];
  8758. }
  8759. if (menuValues[i].menu) {
  8760. selectedItem = getSelectedItem(menuValues[i].menu, value);
  8761. if (selectedItem) {
  8762. return selectedItem;
  8763. }
  8764. }
  8765. }
  8766. }
  8767. self.on('show', function (e) {
  8768. activateMenuItemsByValue(e.control, self.value());
  8769. });
  8770. self.state.on('change:value', function (e) {
  8771. var selectedItem = getSelectedItem(self.state.get('menu'), e.value);
  8772. if (selectedItem) {
  8773. self.text(selectedItem.text);
  8774. } else {
  8775. self.text(self.settings.text);
  8776. }
  8777. });
  8778. return self._super();
  8779. }
  8780. });
  8781. var toggleTextStyle = function (ctrl, state) {
  8782. var textStyle = ctrl._textStyle;
  8783. if (textStyle) {
  8784. var textElm = ctrl.getEl('text');
  8785. textElm.setAttribute('style', textStyle);
  8786. if (state) {
  8787. textElm.style.color = '';
  8788. textElm.style.backgroundColor = '';
  8789. }
  8790. }
  8791. };
  8792. var MenuItem = Widget.extend({
  8793. Defaults: {
  8794. border: 0,
  8795. role: 'menuitem'
  8796. },
  8797. init: function (settings) {
  8798. var self = this;
  8799. var text;
  8800. self._super(settings);
  8801. settings = self.settings;
  8802. self.classes.add('menu-item');
  8803. if (settings.menu) {
  8804. self.classes.add('menu-item-expand');
  8805. }
  8806. if (settings.preview) {
  8807. self.classes.add('menu-item-preview');
  8808. }
  8809. text = self.state.get('text');
  8810. if (text === '-' || text === '|') {
  8811. self.classes.add('menu-item-sep');
  8812. self.aria('role', 'separator');
  8813. self.state.set('text', '-');
  8814. }
  8815. if (settings.selectable) {
  8816. self.aria('role', 'menuitemcheckbox');
  8817. self.classes.add('menu-item-checkbox');
  8818. settings.icon = 'selected';
  8819. }
  8820. if (!settings.preview && !settings.selectable) {
  8821. self.classes.add('menu-item-normal');
  8822. }
  8823. self.on('mousedown', function (e) {
  8824. e.preventDefault();
  8825. });
  8826. if (settings.menu && !settings.ariaHideMenu) {
  8827. self.aria('haspopup', true);
  8828. }
  8829. },
  8830. hasMenus: function () {
  8831. return !!this.settings.menu;
  8832. },
  8833. showMenu: function () {
  8834. var self = this;
  8835. var settings = self.settings;
  8836. var menu;
  8837. var parent = self.parent();
  8838. parent.items().each(function (ctrl) {
  8839. if (ctrl !== self) {
  8840. ctrl.hideMenu();
  8841. }
  8842. });
  8843. if (settings.menu) {
  8844. menu = self.menu;
  8845. if (!menu) {
  8846. menu = settings.menu;
  8847. if (menu.length) {
  8848. menu = {
  8849. type: 'menu',
  8850. items: menu
  8851. };
  8852. } else {
  8853. menu.type = menu.type || 'menu';
  8854. }
  8855. if (parent.settings.itemDefaults) {
  8856. menu.itemDefaults = parent.settings.itemDefaults;
  8857. }
  8858. menu = self.menu = global$b.create(menu).parent(self).renderTo();
  8859. menu.reflow();
  8860. menu.on('cancel', function (e) {
  8861. e.stopPropagation();
  8862. self.focus();
  8863. menu.hide();
  8864. });
  8865. menu.on('show hide', function (e) {
  8866. if (e.control.items) {
  8867. e.control.items().each(function (ctrl) {
  8868. ctrl.active(ctrl.settings.selected);
  8869. });
  8870. }
  8871. }).fire('show');
  8872. menu.on('hide', function (e) {
  8873. if (e.control === menu) {
  8874. self.classes.remove('selected');
  8875. }
  8876. });
  8877. menu.submenu = true;
  8878. } else {
  8879. menu.show();
  8880. }
  8881. menu._parentMenu = parent;
  8882. menu.classes.add('menu-sub');
  8883. var rel = menu.testMoveRel(self.getEl(), self.isRtl() ? [
  8884. 'tl-tr',
  8885. 'bl-br',
  8886. 'tr-tl',
  8887. 'br-bl'
  8888. ] : [
  8889. 'tr-tl',
  8890. 'br-bl',
  8891. 'tl-tr',
  8892. 'bl-br'
  8893. ]);
  8894. menu.moveRel(self.getEl(), rel);
  8895. menu.rel = rel;
  8896. rel = 'menu-sub-' + rel;
  8897. menu.classes.remove(menu._lastRel).add(rel);
  8898. menu._lastRel = rel;
  8899. self.classes.add('selected');
  8900. self.aria('expanded', true);
  8901. }
  8902. },
  8903. hideMenu: function () {
  8904. var self = this;
  8905. if (self.menu) {
  8906. self.menu.items().each(function (item) {
  8907. if (item.hideMenu) {
  8908. item.hideMenu();
  8909. }
  8910. });
  8911. self.menu.hide();
  8912. self.aria('expanded', false);
  8913. }
  8914. return self;
  8915. },
  8916. renderHtml: function () {
  8917. var self = this;
  8918. var id = self._id;
  8919. var settings = self.settings;
  8920. var prefix = self.classPrefix;
  8921. var text = self.state.get('text');
  8922. var icon = self.settings.icon, image = '', shortcut = settings.shortcut;
  8923. var url = self.encode(settings.url), iconHtml = '';
  8924. function convertShortcut(shortcut) {
  8925. var i, value, replace = {};
  8926. if (global$1.mac) {
  8927. replace = {
  8928. alt: '&#x2325;',
  8929. ctrl: '&#x2318;',
  8930. shift: '&#x21E7;',
  8931. meta: '&#x2318;'
  8932. };
  8933. } else {
  8934. replace = { meta: 'Ctrl' };
  8935. }
  8936. shortcut = shortcut.split('+');
  8937. for (i = 0; i < shortcut.length; i++) {
  8938. value = replace[shortcut[i].toLowerCase()];
  8939. if (value) {
  8940. shortcut[i] = value;
  8941. }
  8942. }
  8943. return shortcut.join('+');
  8944. }
  8945. function escapeRegExp(str) {
  8946. return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  8947. }
  8948. function markMatches(text) {
  8949. var match = settings.match || '';
  8950. return match ? text.replace(new RegExp(escapeRegExp(match), 'gi'), function (match) {
  8951. return '!mce~match[' + match + ']mce~match!';
  8952. }) : text;
  8953. }
  8954. function boldMatches(text) {
  8955. return text.replace(new RegExp(escapeRegExp('!mce~match['), 'g'), '<b>').replace(new RegExp(escapeRegExp(']mce~match!'), 'g'), '</b>');
  8956. }
  8957. if (icon) {
  8958. self.parent().classes.add('menu-has-icons');
  8959. }
  8960. if (settings.image) {
  8961. image = ' style="background-image: url(\'' + settings.image + '\')"';
  8962. }
  8963. if (shortcut) {
  8964. shortcut = convertShortcut(shortcut);
  8965. }
  8966. icon = prefix + 'ico ' + prefix + 'i-' + (self.settings.icon || 'none');
  8967. iconHtml = text !== '-' ? '<i class="' + icon + '"' + image + '></i>\xA0' : '';
  8968. text = boldMatches(self.encode(markMatches(text)));
  8969. url = boldMatches(self.encode(markMatches(url)));
  8970. return '<div id="' + id + '" class="' + self.classes + '" tabindex="-1">' + iconHtml + (text !== '-' ? '<span id="' + id + '-text" class="' + prefix + 'text">' + text + '</span>' : '') + (shortcut ? '<div id="' + id + '-shortcut" class="' + prefix + 'menu-shortcut">' + shortcut + '</div>' : '') + (settings.menu ? '<div class="' + prefix + 'caret"></div>' : '') + (url ? '<div class="' + prefix + 'menu-item-link">' + url + '</div>' : '') + '</div>';
  8971. },
  8972. postRender: function () {
  8973. var self = this, settings = self.settings;
  8974. var textStyle = settings.textStyle;
  8975. if (typeof textStyle === 'function') {
  8976. textStyle = textStyle.call(this);
  8977. }
  8978. if (textStyle) {
  8979. var textElm = self.getEl('text');
  8980. if (textElm) {
  8981. textElm.setAttribute('style', textStyle);
  8982. self._textStyle = textStyle;
  8983. }
  8984. }
  8985. self.on('mouseenter click', function (e) {
  8986. if (e.control === self) {
  8987. if (!settings.menu && e.type === 'click') {
  8988. self.fire('select');
  8989. global$3.requestAnimationFrame(function () {
  8990. self.parent().hideAll();
  8991. });
  8992. } else {
  8993. self.showMenu();
  8994. if (e.aria) {
  8995. self.menu.focus(true);
  8996. }
  8997. }
  8998. }
  8999. });
  9000. self._super();
  9001. return self;
  9002. },
  9003. hover: function () {
  9004. var self = this;
  9005. self.parent().items().each(function (ctrl) {
  9006. ctrl.classes.remove('selected');
  9007. });
  9008. self.classes.toggle('selected', true);
  9009. return self;
  9010. },
  9011. active: function (state) {
  9012. toggleTextStyle(this, state);
  9013. if (typeof state !== 'undefined') {
  9014. this.aria('checked', state);
  9015. }
  9016. return this._super(state);
  9017. },
  9018. remove: function () {
  9019. this._super();
  9020. if (this.menu) {
  9021. this.menu.remove();
  9022. }
  9023. }
  9024. });
  9025. var Radio = Checkbox.extend({
  9026. Defaults: {
  9027. classes: 'radio',
  9028. role: 'radio'
  9029. }
  9030. });
  9031. var ResizeHandle = Widget.extend({
  9032. renderHtml: function () {
  9033. var self = this, prefix = self.classPrefix;
  9034. self.classes.add('resizehandle');
  9035. if (self.settings.direction === 'both') {
  9036. self.classes.add('resizehandle-both');
  9037. }
  9038. self.canFocus = false;
  9039. return '<div id="' + self._id + '" class="' + self.classes + '">' + '<i class="' + prefix + 'ico ' + prefix + 'i-resize"></i>' + '</div>';
  9040. },
  9041. postRender: function () {
  9042. var self = this;
  9043. self._super();
  9044. self.resizeDragHelper = new DragHelper(this._id, {
  9045. start: function () {
  9046. self.fire('ResizeStart');
  9047. },
  9048. drag: function (e) {
  9049. if (self.settings.direction !== 'both') {
  9050. e.deltaX = 0;
  9051. }
  9052. self.fire('Resize', e);
  9053. },
  9054. stop: function () {
  9055. self.fire('ResizeEnd');
  9056. }
  9057. });
  9058. },
  9059. remove: function () {
  9060. if (this.resizeDragHelper) {
  9061. this.resizeDragHelper.destroy();
  9062. }
  9063. return this._super();
  9064. }
  9065. });
  9066. function createOptions(options) {
  9067. var strOptions = '';
  9068. if (options) {
  9069. for (var i = 0; i < options.length; i++) {
  9070. strOptions += '<option value="' + options[i] + '">' + options[i] + '</option>';
  9071. }
  9072. }
  9073. return strOptions;
  9074. }
  9075. var SelectBox = Widget.extend({
  9076. Defaults: {
  9077. classes: 'selectbox',
  9078. role: 'selectbox',
  9079. options: []
  9080. },
  9081. init: function (settings) {
  9082. var self = this;
  9083. self._super(settings);
  9084. if (self.settings.size) {
  9085. self.size = self.settings.size;
  9086. }
  9087. if (self.settings.options) {
  9088. self._options = self.settings.options;
  9089. }
  9090. self.on('keydown', function (e) {
  9091. var rootControl;
  9092. if (e.keyCode === 13) {
  9093. e.preventDefault();
  9094. self.parents().reverse().each(function (ctrl) {
  9095. if (ctrl.toJSON) {
  9096. rootControl = ctrl;
  9097. return false;
  9098. }
  9099. });
  9100. self.fire('submit', { data: rootControl.toJSON() });
  9101. }
  9102. });
  9103. },
  9104. options: function (state) {
  9105. if (!arguments.length) {
  9106. return this.state.get('options');
  9107. }
  9108. this.state.set('options', state);
  9109. return this;
  9110. },
  9111. renderHtml: function () {
  9112. var self = this;
  9113. var options, size = '';
  9114. options = createOptions(self._options);
  9115. if (self.size) {
  9116. size = ' size = "' + self.size + '"';
  9117. }
  9118. return '<select id="' + self._id + '" class="' + self.classes + '"' + size + '>' + options + '</select>';
  9119. },
  9120. bindStates: function () {
  9121. var self = this;
  9122. self.state.on('change:options', function (e) {
  9123. self.getEl().innerHTML = createOptions(e.value);
  9124. });
  9125. return self._super();
  9126. }
  9127. });
  9128. function constrain(value, minVal, maxVal) {
  9129. if (value < minVal) {
  9130. value = minVal;
  9131. }
  9132. if (value > maxVal) {
  9133. value = maxVal;
  9134. }
  9135. return value;
  9136. }
  9137. function setAriaProp(el, name, value) {
  9138. el.setAttribute('aria-' + name, value);
  9139. }
  9140. function updateSliderHandle(ctrl, value) {
  9141. var maxHandlePos, shortSizeName, sizeName, stylePosName, styleValue, handleEl;
  9142. if (ctrl.settings.orientation === 'v') {
  9143. stylePosName = 'top';
  9144. sizeName = 'height';
  9145. shortSizeName = 'h';
  9146. } else {
  9147. stylePosName = 'left';
  9148. sizeName = 'width';
  9149. shortSizeName = 'w';
  9150. }
  9151. handleEl = ctrl.getEl('handle');
  9152. maxHandlePos = (ctrl.layoutRect()[shortSizeName] || 100) - funcs.getSize(handleEl)[sizeName];
  9153. styleValue = maxHandlePos * ((value - ctrl._minValue) / (ctrl._maxValue - ctrl._minValue)) + 'px';
  9154. handleEl.style[stylePosName] = styleValue;
  9155. handleEl.style.height = ctrl.layoutRect().h + 'px';
  9156. setAriaProp(handleEl, 'valuenow', value);
  9157. setAriaProp(handleEl, 'valuetext', '' + ctrl.settings.previewFilter(value));
  9158. setAriaProp(handleEl, 'valuemin', ctrl._minValue);
  9159. setAriaProp(handleEl, 'valuemax', ctrl._maxValue);
  9160. }
  9161. var Slider = Widget.extend({
  9162. init: function (settings) {
  9163. var self = this;
  9164. if (!settings.previewFilter) {
  9165. settings.previewFilter = function (value) {
  9166. return Math.round(value * 100) / 100;
  9167. };
  9168. }
  9169. self._super(settings);
  9170. self.classes.add('slider');
  9171. if (settings.orientation === 'v') {
  9172. self.classes.add('vertical');
  9173. }
  9174. self._minValue = isNumber$1(settings.minValue) ? settings.minValue : 0;
  9175. self._maxValue = isNumber$1(settings.maxValue) ? settings.maxValue : 100;
  9176. self._initValue = self.state.get('value');
  9177. },
  9178. renderHtml: function () {
  9179. var self = this, id = self._id, prefix = self.classPrefix;
  9180. return '<div id="' + id + '" class="' + self.classes + '">' + '<div id="' + id + '-handle" class="' + prefix + 'slider-handle" role="slider" tabindex="-1"></div>' + '</div>';
  9181. },
  9182. reset: function () {
  9183. this.value(this._initValue).repaint();
  9184. },
  9185. postRender: function () {
  9186. var self = this;
  9187. var minValue, maxValue, screenCordName, stylePosName, sizeName, shortSizeName;
  9188. function toFraction(min, max, val) {
  9189. return (val + min) / (max - min);
  9190. }
  9191. function fromFraction(min, max, val) {
  9192. return val * (max - min) - min;
  9193. }
  9194. function handleKeyboard(minValue, maxValue) {
  9195. function alter(delta) {
  9196. var value;
  9197. value = self.value();
  9198. value = fromFraction(minValue, maxValue, toFraction(minValue, maxValue, value) + delta * 0.05);
  9199. value = constrain(value, minValue, maxValue);
  9200. self.value(value);
  9201. self.fire('dragstart', { value: value });
  9202. self.fire('drag', { value: value });
  9203. self.fire('dragend', { value: value });
  9204. }
  9205. self.on('keydown', function (e) {
  9206. switch (e.keyCode) {
  9207. case 37:
  9208. case 38:
  9209. alter(-1);
  9210. break;
  9211. case 39:
  9212. case 40:
  9213. alter(1);
  9214. break;
  9215. }
  9216. });
  9217. }
  9218. function handleDrag(minValue, maxValue, handleEl) {
  9219. var startPos, startHandlePos, maxHandlePos, handlePos, value;
  9220. self._dragHelper = new DragHelper(self._id, {
  9221. handle: self._id + '-handle',
  9222. start: function (e) {
  9223. startPos = e[screenCordName];
  9224. startHandlePos = parseInt(self.getEl('handle').style[stylePosName], 10);
  9225. maxHandlePos = (self.layoutRect()[shortSizeName] || 100) - funcs.getSize(handleEl)[sizeName];
  9226. self.fire('dragstart', { value: value });
  9227. },
  9228. drag: function (e) {
  9229. var delta = e[screenCordName] - startPos;
  9230. handlePos = constrain(startHandlePos + delta, 0, maxHandlePos);
  9231. handleEl.style[stylePosName] = handlePos + 'px';
  9232. value = minValue + handlePos / maxHandlePos * (maxValue - minValue);
  9233. self.value(value);
  9234. self.tooltip().text('' + self.settings.previewFilter(value)).show().moveRel(handleEl, 'bc tc');
  9235. self.fire('drag', { value: value });
  9236. },
  9237. stop: function () {
  9238. self.tooltip().hide();
  9239. self.fire('dragend', { value: value });
  9240. }
  9241. });
  9242. }
  9243. minValue = self._minValue;
  9244. maxValue = self._maxValue;
  9245. if (self.settings.orientation === 'v') {
  9246. screenCordName = 'screenY';
  9247. stylePosName = 'top';
  9248. sizeName = 'height';
  9249. shortSizeName = 'h';
  9250. } else {
  9251. screenCordName = 'screenX';
  9252. stylePosName = 'left';
  9253. sizeName = 'width';
  9254. shortSizeName = 'w';
  9255. }
  9256. self._super();
  9257. handleKeyboard(minValue, maxValue);
  9258. handleDrag(minValue, maxValue, self.getEl('handle'));
  9259. },
  9260. repaint: function () {
  9261. this._super();
  9262. updateSliderHandle(this, this.value());
  9263. },
  9264. bindStates: function () {
  9265. var self = this;
  9266. self.state.on('change:value', function (e) {
  9267. updateSliderHandle(self, e.value);
  9268. });
  9269. return self._super();
  9270. }
  9271. });
  9272. var Spacer = Widget.extend({
  9273. renderHtml: function () {
  9274. var self = this;
  9275. self.classes.add('spacer');
  9276. self.canFocus = false;
  9277. return '<div id="' + self._id + '" class="' + self.classes + '"></div>';
  9278. }
  9279. });
  9280. var SplitButton = MenuButton.extend({
  9281. Defaults: {
  9282. classes: 'widget btn splitbtn',
  9283. role: 'button'
  9284. },
  9285. repaint: function () {
  9286. var self = this;
  9287. var elm = self.getEl();
  9288. var rect = self.layoutRect();
  9289. var mainButtonElm, menuButtonElm;
  9290. self._super();
  9291. mainButtonElm = elm.firstChild;
  9292. menuButtonElm = elm.lastChild;
  9293. global$7(mainButtonElm).css({
  9294. width: rect.w - funcs.getSize(menuButtonElm).width,
  9295. height: rect.h - 2
  9296. });
  9297. global$7(menuButtonElm).css({ height: rect.h - 2 });
  9298. return self;
  9299. },
  9300. activeMenu: function (state) {
  9301. var self = this;
  9302. global$7(self.getEl().lastChild).toggleClass(self.classPrefix + 'active', state);
  9303. },
  9304. renderHtml: function () {
  9305. var self = this;
  9306. var id = self._id;
  9307. var prefix = self.classPrefix;
  9308. var image;
  9309. var icon = self.state.get('icon');
  9310. var text = self.state.get('text');
  9311. var settings = self.settings;
  9312. var textHtml = '', ariaPressed;
  9313. image = settings.image;
  9314. if (image) {
  9315. icon = 'none';
  9316. if (typeof image !== 'string') {
  9317. image = domGlobals.window.getSelection ? image[0] : image[1];
  9318. }
  9319. image = ' style="background-image: url(\'' + image + '\')"';
  9320. } else {
  9321. image = '';
  9322. }
  9323. icon = settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
  9324. if (text) {
  9325. self.classes.add('btn-has-text');
  9326. textHtml = '<span class="' + prefix + 'txt">' + self.encode(text) + '</span>';
  9327. }
  9328. ariaPressed = typeof settings.active === 'boolean' ? ' aria-pressed="' + settings.active + '"' : '';
  9329. return '<div id="' + id + '" class="' + self.classes + '" role="button"' + ariaPressed + ' tabindex="-1">' + '<button type="button" hidefocus="1" tabindex="-1">' + (icon ? '<i class="' + icon + '"' + image + '></i>' : '') + textHtml + '</button>' + '<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' + (self._menuBtnText ? (icon ? '\xA0' : '') + self._menuBtnText : '') + ' <i class="' + prefix + 'caret"></i>' + '</button>' + '</div>';
  9330. },
  9331. postRender: function () {
  9332. var self = this, onClickHandler = self.settings.onclick;
  9333. self.on('click', function (e) {
  9334. var node = e.target;
  9335. if (e.control === this) {
  9336. while (node) {
  9337. if (e.aria && e.aria.key !== 'down' || node.nodeName === 'BUTTON' && node.className.indexOf('open') === -1) {
  9338. e.stopImmediatePropagation();
  9339. if (onClickHandler) {
  9340. onClickHandler.call(this, e);
  9341. }
  9342. return;
  9343. }
  9344. node = node.parentNode;
  9345. }
  9346. }
  9347. });
  9348. delete self.settings.onclick;
  9349. return self._super();
  9350. }
  9351. });
  9352. var StackLayout = FlowLayout.extend({
  9353. Defaults: {
  9354. containerClass: 'stack-layout',
  9355. controlClass: 'stack-layout-item',
  9356. endClass: 'break'
  9357. },
  9358. isNative: function () {
  9359. return true;
  9360. }
  9361. });
  9362. var TabPanel = Panel.extend({
  9363. Defaults: {
  9364. layout: 'absolute',
  9365. defaults: { type: 'panel' }
  9366. },
  9367. activateTab: function (idx) {
  9368. var activeTabElm;
  9369. if (this.activeTabId) {
  9370. activeTabElm = this.getEl(this.activeTabId);
  9371. global$7(activeTabElm).removeClass(this.classPrefix + 'active');
  9372. activeTabElm.setAttribute('aria-selected', 'false');
  9373. }
  9374. this.activeTabId = 't' + idx;
  9375. activeTabElm = this.getEl('t' + idx);
  9376. activeTabElm.setAttribute('aria-selected', 'true');
  9377. global$7(activeTabElm).addClass(this.classPrefix + 'active');
  9378. this.items()[idx].show().fire('showtab');
  9379. this.reflow();
  9380. this.items().each(function (item, i) {
  9381. if (idx !== i) {
  9382. item.hide();
  9383. }
  9384. });
  9385. },
  9386. renderHtml: function () {
  9387. var self = this;
  9388. var layout = self._layout;
  9389. var tabsHtml = '';
  9390. var prefix = self.classPrefix;
  9391. self.preRender();
  9392. layout.preRender(self);
  9393. self.items().each(function (ctrl, i) {
  9394. var id = self._id + '-t' + i;
  9395. ctrl.aria('role', 'tabpanel');
  9396. ctrl.aria('labelledby', id);
  9397. tabsHtml += '<div id="' + id + '" class="' + prefix + 'tab" ' + 'unselectable="on" role="tab" aria-controls="' + ctrl._id + '" aria-selected="false" tabIndex="-1">' + self.encode(ctrl.settings.title) + '</div>';
  9398. });
  9399. return '<div id="' + self._id + '" class="' + self.classes + '" hidefocus="1" tabindex="-1">' + '<div id="' + self._id + '-head" class="' + prefix + 'tabs" role="tablist">' + tabsHtml + '</div>' + '<div id="' + self._id + '-body" class="' + self.bodyClasses + '">' + layout.renderHtml(self) + '</div>' + '</div>';
  9400. },
  9401. postRender: function () {
  9402. var self = this;
  9403. self._super();
  9404. self.settings.activeTab = self.settings.activeTab || 0;
  9405. self.activateTab(self.settings.activeTab);
  9406. this.on('click', function (e) {
  9407. var targetParent = e.target.parentNode;
  9408. if (targetParent && targetParent.id === self._id + '-head') {
  9409. var i = targetParent.childNodes.length;
  9410. while (i--) {
  9411. if (targetParent.childNodes[i] === e.target) {
  9412. self.activateTab(i);
  9413. }
  9414. }
  9415. }
  9416. });
  9417. },
  9418. initLayoutRect: function () {
  9419. var self = this;
  9420. var rect, minW, minH;
  9421. minW = funcs.getSize(self.getEl('head')).width;
  9422. minW = minW < 0 ? 0 : minW;
  9423. minH = 0;
  9424. self.items().each(function (item) {
  9425. minW = Math.max(minW, item.layoutRect().minW);
  9426. minH = Math.max(minH, item.layoutRect().minH);
  9427. });
  9428. self.items().each(function (ctrl) {
  9429. ctrl.settings.x = 0;
  9430. ctrl.settings.y = 0;
  9431. ctrl.settings.w = minW;
  9432. ctrl.settings.h = minH;
  9433. ctrl.layoutRect({
  9434. x: 0,
  9435. y: 0,
  9436. w: minW,
  9437. h: minH
  9438. });
  9439. });
  9440. var headH = funcs.getSize(self.getEl('head')).height;
  9441. self.settings.minWidth = minW;
  9442. self.settings.minHeight = minH + headH;
  9443. rect = self._super();
  9444. rect.deltaH += headH;
  9445. rect.innerH = rect.h - rect.deltaH;
  9446. return rect;
  9447. }
  9448. });
  9449. var TextBox = Widget.extend({
  9450. init: function (settings) {
  9451. var self = this;
  9452. self._super(settings);
  9453. self.classes.add('textbox');
  9454. if (settings.multiline) {
  9455. self.classes.add('multiline');
  9456. } else {
  9457. self.on('keydown', function (e) {
  9458. var rootControl;
  9459. if (e.keyCode === 13) {
  9460. e.preventDefault();
  9461. self.parents().reverse().each(function (ctrl) {
  9462. if (ctrl.toJSON) {
  9463. rootControl = ctrl;
  9464. return false;
  9465. }
  9466. });
  9467. self.fire('submit', { data: rootControl.toJSON() });
  9468. }
  9469. });
  9470. self.on('keyup', function (e) {
  9471. self.state.set('value', e.target.value);
  9472. });
  9473. }
  9474. },
  9475. repaint: function () {
  9476. var self = this;
  9477. var style, rect, borderBox, borderW, borderH = 0, lastRepaintRect;
  9478. style = self.getEl().style;
  9479. rect = self._layoutRect;
  9480. lastRepaintRect = self._lastRepaintRect || {};
  9481. var doc = domGlobals.document;
  9482. if (!self.settings.multiline && doc.all && (!doc.documentMode || doc.documentMode <= 8)) {
  9483. style.lineHeight = rect.h - borderH + 'px';
  9484. }
  9485. borderBox = self.borderBox;
  9486. borderW = borderBox.left + borderBox.right + 8;
  9487. borderH = borderBox.top + borderBox.bottom + (self.settings.multiline ? 8 : 0);
  9488. if (rect.x !== lastRepaintRect.x) {
  9489. style.left = rect.x + 'px';
  9490. lastRepaintRect.x = rect.x;
  9491. }
  9492. if (rect.y !== lastRepaintRect.y) {
  9493. style.top = rect.y + 'px';
  9494. lastRepaintRect.y = rect.y;
  9495. }
  9496. if (rect.w !== lastRepaintRect.w) {
  9497. style.width = rect.w - borderW + 'px';
  9498. lastRepaintRect.w = rect.w;
  9499. }
  9500. if (rect.h !== lastRepaintRect.h) {
  9501. style.height = rect.h - borderH + 'px';
  9502. lastRepaintRect.h = rect.h;
  9503. }
  9504. self._lastRepaintRect = lastRepaintRect;
  9505. self.fire('repaint', {}, false);
  9506. return self;
  9507. },
  9508. renderHtml: function () {
  9509. var self = this;
  9510. var settings = self.settings;
  9511. var attrs, elm;
  9512. attrs = {
  9513. id: self._id,
  9514. hidefocus: '1'
  9515. };
  9516. global$4.each([
  9517. 'rows',
  9518. 'spellcheck',
  9519. 'maxLength',
  9520. 'size',
  9521. 'readonly',
  9522. 'min',
  9523. 'max',
  9524. 'step',
  9525. 'list',
  9526. 'pattern',
  9527. 'placeholder',
  9528. 'required',
  9529. 'multiple'
  9530. ], function (name) {
  9531. attrs[name] = settings[name];
  9532. });
  9533. if (self.disabled()) {
  9534. attrs.disabled = 'disabled';
  9535. }
  9536. if (settings.subtype) {
  9537. attrs.type = settings.subtype;
  9538. }
  9539. elm = funcs.create(settings.multiline ? 'textarea' : 'input', attrs);
  9540. elm.value = self.state.get('value');
  9541. elm.className = self.classes.toString();
  9542. return elm.outerHTML;
  9543. },
  9544. value: function (value) {
  9545. if (arguments.length) {
  9546. this.state.set('value', value);
  9547. return this;
  9548. }
  9549. if (this.state.get('rendered')) {
  9550. this.state.set('value', this.getEl().value);
  9551. }
  9552. return this.state.get('value');
  9553. },
  9554. postRender: function () {
  9555. var self = this;
  9556. self.getEl().value = self.state.get('value');
  9557. self._super();
  9558. self.$el.on('change', function (e) {
  9559. self.state.set('value', e.target.value);
  9560. self.fire('change', e);
  9561. });
  9562. },
  9563. bindStates: function () {
  9564. var self = this;
  9565. self.state.on('change:value', function (e) {
  9566. if (self.getEl().value !== e.value) {
  9567. self.getEl().value = e.value;
  9568. }
  9569. });
  9570. self.state.on('change:disabled', function (e) {
  9571. self.getEl().disabled = e.value;
  9572. });
  9573. return self._super();
  9574. },
  9575. remove: function () {
  9576. this.$el.off();
  9577. this._super();
  9578. }
  9579. });
  9580. var getApi = function () {
  9581. return {
  9582. Selector: Selector,
  9583. Collection: Collection$2,
  9584. ReflowQueue: ReflowQueue,
  9585. Control: Control$1,
  9586. Factory: global$b,
  9587. KeyboardNavigation: KeyboardNavigation,
  9588. Container: Container,
  9589. DragHelper: DragHelper,
  9590. Scrollable: Scrollable,
  9591. Panel: Panel,
  9592. Movable: Movable,
  9593. Resizable: Resizable,
  9594. FloatPanel: FloatPanel,
  9595. Window: Window,
  9596. MessageBox: MessageBox,
  9597. Tooltip: Tooltip,
  9598. Widget: Widget,
  9599. Progress: Progress,
  9600. Notification: Notification,
  9601. Layout: Layout$1,
  9602. AbsoluteLayout: AbsoluteLayout,
  9603. Button: Button,
  9604. ButtonGroup: ButtonGroup,
  9605. Checkbox: Checkbox,
  9606. ComboBox: ComboBox,
  9607. ColorBox: ColorBox,
  9608. PanelButton: PanelButton,
  9609. ColorButton: ColorButton,
  9610. ColorPicker: ColorPicker,
  9611. Path: Path,
  9612. ElementPath: ElementPath,
  9613. FormItem: FormItem,
  9614. Form: Form,
  9615. FieldSet: FieldSet,
  9616. FilePicker: FilePicker,
  9617. FitLayout: FitLayout,
  9618. FlexLayout: FlexLayout,
  9619. FlowLayout: FlowLayout,
  9620. FormatControls: FormatControls,
  9621. GridLayout: GridLayout,
  9622. Iframe: Iframe,
  9623. InfoBox: InfoBox,
  9624. Label: Label,
  9625. Toolbar: Toolbar$1,
  9626. MenuBar: MenuBar,
  9627. MenuButton: MenuButton,
  9628. MenuItem: MenuItem,
  9629. Throbber: Throbber,
  9630. Menu: Menu,
  9631. ListBox: ListBox,
  9632. Radio: Radio,
  9633. ResizeHandle: ResizeHandle,
  9634. SelectBox: SelectBox,
  9635. Slider: Slider,
  9636. Spacer: Spacer,
  9637. SplitButton: SplitButton,
  9638. StackLayout: StackLayout,
  9639. TabPanel: TabPanel,
  9640. TextBox: TextBox,
  9641. DropZone: DropZone,
  9642. BrowseButton: BrowseButton
  9643. };
  9644. };
  9645. var appendTo = function (target) {
  9646. if (target.ui) {
  9647. global$4.each(getApi(), function (ref, key) {
  9648. target.ui[key] = ref;
  9649. });
  9650. } else {
  9651. target.ui = getApi();
  9652. }
  9653. };
  9654. var registerToFactory = function () {
  9655. global$4.each(getApi(), function (ref, key) {
  9656. global$b.add(key, ref);
  9657. });
  9658. };
  9659. var Api = {
  9660. appendTo: appendTo,
  9661. registerToFactory: registerToFactory
  9662. };
  9663. Api.registerToFactory();
  9664. Api.appendTo(window.tinymce ? window.tinymce : {});
  9665. global.add('inlite', function (editor) {
  9666. var panel = create$3();
  9667. FormatControls.setup(editor);
  9668. Buttons.addToEditor(editor, panel);
  9669. return ThemeApi.get(editor, panel);
  9670. });
  9671. function Theme () {
  9672. }
  9673. return Theme;
  9674. }(window));
  9675. })();