説明なし

theme.js 308KB

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